La sicurezza linguistica può essere interpretata in modo più ampio rispetto alla semplice sicurezza. Ma poiché questo è un sito di sicurezza, limitiamoci alla sicurezza.
Chiaramente, la selezione della lingua ha un significato significativo se si otterranno certi tipi di vulnerabilità. Scrivi un programma non banale in C e sarà pieno di errori di corruzione della memoria (buffer overflow, use-after-free, ecc.).
Ci sono un paio di definizioni utili:
Memory-safe - Questo significa che un programma all'interno della lingua non può accedere alla memoria al di fuori delle allocazioni. Non oltrepassare un buffer o utilizzare un'assegnazione dopo che è stata liberata. È difficile provare automaticamente un linguaggio come C. Memory: la sicurezza viene in genere ottenuta attraverso la garbage collection e l'uso di una sicurezza di tipo più restrittiva.
Tipo sicuro - Non confondere questo con solo non rovinare i tuoi tipi in lingue non sicure. Questa è una garanzia che va oltre la sicurezza della memoria in quanto non è possibile utilizzare un tipo in modo inappropriato rispetto al tipo effettivo dell'oggetto. Ad esempio, non puoi trattare un puntatore come un numero intero.
È interessante notare che da 1.5 Java non è sicuro per il tipo vaniglia. È sicuro dal punto di vista del tipo rispetto ai tipi non elaborati, come usato dalla JVM e dal linguaggio Java 1.4 e precedenti. Non è sicuro per quanto riguarda il sistema di tipo linguistico completo inclusi i farmaci generici. Ciò non sembra affatto importante, in gran parte perché per accedere ad un oggetto il bytecode deve eseguire un controllo di tipo non elaborato.
Le librerie di vulnerabilità per la corruzione senza memoria diventano più importanti. Ad esempio, l'iniezione è una classe di vulnerabilità incredibilmente popolare, ma non c'è davvero alcuna scusa per non averne affatto.
Il codice mobile (ovvero il codice mobile e non attendibile) è una cosa completamente diversa. La sicurezza può essere ottenuta tramite una sandbox (come il NaCl di Google), un Object-Capability Model (gergo che in sostanza significa OOP in un ambiente sicuro per tipo) o una combinazione degli altri due.
Come per Java SE 1.7 vs 1.2. Non c'è stato molto cambiamento. 1.2 è molto diverso da 1.1, e 1.0 era di nuovo un po 'diverso (anche se in realtà prima di prestare attenzione a questo genere di cose).
Problemi specifici nella lingua Java che causano vulnerabilità:
-
static
(per i campi, quando non è immutabile) è un modo a una parola chiave per introdurre le vulnerabilità e distruggere la qualità del codice.
- Supporto incredibilmente scarso per i tipi di valore (immutabili)
- I metodi di serializzazione di oggetti e Java (che sto includendo come parte della lingua a causa della parola chiave
transient
e un'implementazione che non è nemmeno possibile in bytecode) sono ambigui.
- Possibilità di visualizzare i campi non inizializzati (anche se zerod) a cui può essere fornita un'interpretazione non sicura.
- Tutti i tipi interi hanno un overflow. Sebbene Java sia sicuro per la memoria, ciò raramente conta. È importante per la convalida degli argomenti sul codice nativo / intrinseco o sulla gestione delle risorse.