Se, come circa 10 milioni di altre persone, sei uno sviluppatore Java, probabilmente vuoi sapere come mantenere sicuro il codice Java. Gli sviluppatori avranno sempre bisogno di rimanere in cima a suggerimenti e best practice per affrontare i problemi di sicurezza Java.
Java è il linguaggio di programmazione più popolare oggi, con una buona ragione. Il codice Java è multipiattaforma. La programmazione Java è ampiamente insegnata nei dipartimenti di informatica dell’università. Così tanti programmatori con gli occhi ansiosi entrano nei loro primi lavori pronti a codificare in Java. E il design orientato agli oggetti di Java rende semplice riutilizzare il codice.
Eppure, nonostante la popolarità di Java, si sarebbe fatica a trovare qualcuno che avrebbe sostenuto Java è il linguaggio di programmazione più sicuro là fuori. I problemi di sicurezza Java sono reali. Java è stato progettato per essere sicuro come la maggior parte degli altri linguaggi di programmazione popolari e offre funzionalità come SecurityManager per migliorare la sicurezza in determinati contesti. Tuttavia, le applicazioni Java sono soggette a una serie di potenziali vulnerabilità di sicurezza, inclusi, ma non limitati a, vari attacchi di iniezione.
È fondamentale per gli sviluppatori e gli amministratori Java tenere a mente le vulnerabilità di sicurezza Java più comuni durante la scrittura e la distribuzione di applicazioni Java. La programmazione Security-first è particolarmente importante nel caso di Java perché la natura multipiattaforma del codice Java significa che i framework di sicurezza a livello di sistema operativo non possono sempre essere affidabili per mantenere le applicazioni sicure.
Né ci si dovrebbe aspettare che gli utenti finali siano in grado di gestire efficacemente le minacce alla sicurezza Java. Certo, puoi incolpare i tuoi utenti per l’esecuzione di codice Java non attendibile o la disabilitazione degli aggiornamenti automatici ai loro runtime Java, ma alla fine, l’onere di scrivere applicazioni Java sicure e isolare il codice all’interno di un ambiente Java che potrebbe non essere sicuro spetta agli sviluppatori.
Problemi comuni di sicurezza Java
I programmatori Java dovrebbero tenere a mente le seguenti sfide di sicurezza quando progettano e scrivono applicazioni Java.
SQL injection
SQL injection si verificano quando un utente malintenzionato inserisce codice di query SQL dannoso in un modulo. Se l’applicazione non riesce a rilevare il codice dannoso e lo trasmette a un database, il database potrebbe essere modificato in modo dannoso o i dati sensibili potrebbero essere esposti a parti non autorizzate.
La proliferazione di strumenti automatizzati per SQL injection rende gli attacchi SQL injection una sfida di sicurezza diffusa per le applicazioni Java e, del resto, praticamente qualsiasi altro tipo di applicazione che potrebbe connettersi a un database oggi.
La soluzione agli attacchi SQL injection in Java è abbastanza semplice: Assicurati che la tua app validi correttamente l’input e impedisca che il codice dannoso venga aggiunto ai dati già accettati in un modulo. Come regola generale e ove possibile, evitare le query dinamiche per mitigare il rischio di iniezioni SQL nelle applicazioni Java. La classe PreparedStatement di Java può anche essere utile per prevenire attacchi SQL.
Java LDAP injection
Injection attacks that exploit Lightweight Directory Access Protocol (LDAP) statements represent another common attack on Java applications. Anche in questo caso, la convalida dell’input è la chiave per prevenire gli attacchi.
In particolare, gli sviluppatori Java possono contrastare la maggior parte dei tipi di attacchi di iniezione LDAP se sfuggono ai caratteri speciali LDAP.
Altri tipi di attacchi Java injection
Abbiamo già trattato le iniezioni SQL e le iniezioni LDAP, ma gli attacchi di iniezione nelle applicazioni Java non finiscono qui. Iniezioni di stringhe di connessione, iniezioni XSS (cross-site scripting) e altri tipi di attacchi sono tutti possibili.
Questi tipi di attacchi non si applicano a tutte le applicazioni Java-XSS è davvero solo un rischio serio con le applicazioni web, per esempio-ma sono un altro promemoria del perché la convalida dell’input è così importante.
Vulnerabilità SecurityManager
SecurityManager è progettato in modo da poter eseguire bytecode non attendibili in modo sicuro all’interno delle applicazioni Java. SecurityManager sandbox il bytecode al fine di prevenire gli attacchi.
Questo rende SecurityManager una grande risorsa per la sicurezza Java-a condizione, ovviamente, che funzioni correttamente. Il rischio principale di SecurityManager è la cronologia delle vulnerabilità di sicurezza che si sono manifestate all’interno di SecurityManager stesso. Queste vulnerabilità a volte consentono al codice isolato di uscire dalla sandbox ed eseguire attacchi.
In una certa misura, la gestione dei problemi di sicurezza SecurityManager e Java è un problema non per gli sviluppatori ma per gli amministratori di sistema, che devono mantenere aggiornati i runtime Java. Tuttavia, gli sviluppatori possono fare la loro parte ed evitare sandbox quando possibile. In altre parole, non fidarti ciecamente di SecurityManager. Se devi usarlo in un’applicazione, usalo. Ma se è possibile ottenere le funzionalità necessarie senza di essa, mitigare i rischi per la sicurezza Java ed evitarlo.
Malicious JARs
Quando un’applicazione Java carica JARs in fase di runtime, a volte, un hacker può ingannare l’applicazione nel collegare JARs malicious. Questo è un vecchio problema di sicurezza, e Java ha introdotto una serie di controlli nel corso degli anni per aiutare a prevenirlo.
Alcune di queste funzionalità di mitigazione degli attacchi agiscono da sole, ma gli sviluppatori possono trarne il massimo vantaggio firmando JAR. In questo modo, le firme vengono verificate in fase di esecuzione e impediscono le intrusioni. I programmatori possono anche mitigare la minaccia rappresentata dai JAR dannosi limitando i privilegi di accesso di classi specifiche in modo che, se viene caricato il codice dannoso, le politiche di sicurezza naturali limiteranno i danni che il codice dannoso può causare.