Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
com
- Se puoi farlo senza interrompere le app esistenti, scarta il primo 1K circa del flusso di
crittografia: crittografa semplicemente un blocco da 1K e gettalo via, quindi avvia la vera
crittografia.
Successivamente, chiediti: "Perché stiamo usando RC4 e non un codice a blocchi?" La solita ragione è che
RC4 è veloce, e lo è, ma quando tutto è stato detto e fatto, quando si tiene conto del traffico di rete, dell'I/O
del disco, di altra crittografia a chiave pubblica, dei controlli di controllo degli accessi e così via, le prestazioni
aumentano di RC4 su AES è trascurabile nelle applicazioni del mondo reale. Se hai bisogno di utilizzare un
cifrario a blocchi, come AES, in una modalità simile a un cifrario a flusso, puoi farlo selezionando la modalità di
concatenamento. Ad esempio, è possibile utilizzare la modalità CTR (contatore) se disponibile o la modalità
CFB (feedback di cifratura) o OFB (feedback di output), che garantiscono tutte alcune capacità simili a cifratura
a flusso a una cifratura a blocchi. Ma per favore fai molta attenzione quando usi queste modalità di
concatenamento specializzate.
Un altro motivo per cui potresti voler utilizzare un cifrario a flusso è perché desideri un accesso
casuale ai dati. Se stai utilizzando una cifratura a blocchi e una delle modalità di feedback, può essere
difficile accedere ai dati nel mezzo del flusso di crittografia perché i dati in bloccoNinfluenza la chiave
utilizzata per il bloccoN+1. La risposta all'enigma dell'accesso casuale è crittografare i dati in blocchi
ragionevolmente grandi; nella crittografia agile introdotta in Office 2007 SP2, abbiamo usato una
dimensione del blocco di 4096. Questa è una dimensione conveniente perché rappresenta una pagina
di memoria su un sistema a 32 bit. Ogni blocco ottiene una nuova chiave generata. Otterrai comunque i
vantaggi crittografici del concatenamento della crittografia, ma puoi anche ottenere prestazioni
ragionevoli.
Un terzo motivo è che se i dati sono danneggiati, potresti provare a recuperare alcuni
dei dati dell'utente. Con RC4, perderai un byte. Con un cifrario a blocchi, perderai almeno
un blocco, forse tutti i blocchi rimanenti. Se adotti l'approccio di Office, non perderai tutti i
dati.
Concatenazione hash
La redenzione per sapere correttamente se due cose non sono cambiate è eseguirne l'hashing
individualmente, quindi puoi prendere un hash dei due hash risultanti o semplicemente
archiviare entrambi gli hash. Questo è esattamente il modo in cui funziona una firma digitale: un
elemento di riferimento all'interno del manifest memorizza un hash di un flusso di dati esterno. Il
manifest conterrà in genere un certo numero di riferimenti. Il manifest e il resto degli oggetti
firmati all'interno del file avranno riferimenti costruiti per verificare che il manifest non sia
cambiato e ciò che finisce per essere firmato è l'hash del set di riferimenti di primo livello. Un
altro percorso per la redenzione è che potresti inserire un valore fisso tra i due valori e se
qualcuno tenta di spostare qualcosa dall'uno all'altro, la posizione del separatore cambiata
cambierà il valore di output dell'hash.
La soluzione a un attacco di estensione della lunghezza è semplice: basta usare un HMAC e
utilizzare il segreto o l'hash del segreto come chiave. Invece di
Usa questo:
Laddove il segreto viene utilizzato come chiave per l'HMAC, l'HMAC è progettato per affrontare esattamente
questo tipo di problema.
Quando si crittografa un flusso di dati, utilizzare un sale decisamente nuovo per ogni nuovo
flusso: spesso è possibile utilizzare semplicemente il sale come vettore di inizializzazione quando
si genera la chiave di crittografia dall'output KDF. Un caso limite che devi assicurarti di aver
coperto è se modifichi parte del flusso, devi generare nuovo sale, generare una nuova chiave di
crittografia e riscrivere l'intero flusso.
Se stai programmando in un'altra lingua, non è difficile implementare il tuo codice, oppure puoi
prendere il codice di esempio da www.codeplex.com/offcrypto. Guarda nel codice di esempio della
crittografia AES; dovresti essere in grado di portarlo facilmente in qualsiasi lingua ti piaccia. Oppure
puoi trovare una libreria che implementa una delle numerose solide funzioni KDF.
Quando hai un codice che ti piace, considera di aumentare il conteggio delle iterazioni fino a quando il
tempo per eseguire una derivazione è il tempo che puoi gestire senza infastidire l'utente. È improbabile che
venga notato qualcosa di meno di ¼ di secondo.
Un'ultima nota, le versioni di Windows precedenti a Windows 7 non includono una funzione
di derivazione della chiave basata su RFC 2898, ma CryptoAPI fornisce una funzione simile,
CryptDeriveKey, che deriva una chiave da un hash della password.
La funzione di derivazione della chiave basata su RFC 2898 in Windows 7 è BCryptDeriveKey
PBKDF2.
OpenSSL, a partire dalla versione 0.9.8.X, non supporta nemmeno una funzione di derivazione delle chiavi basata
su RFC 2898, ma esiste una funzione "in qualche modo documentata":
1. Genera un set casuale di dati, non il sale che usi per nient'altro.
2. Ottenere l'hash dei dati dal passaggio 1.
3. Crittografare i dati e archiviarli.
4. Crittografare l'hash dei dati (dal passaggio 2) e archiviarlo.
5. Memorizza anche informazioni aggiuntive: l'algoritmo di crittografia salt utilizzato nel KDF,
l'algoritmo di hashing utilizzato dal KDF, il conteggio delle iterazioni, ecc.
332 24 peccati capitali della sicurezza del software
Per verificare la password, decifra i dati casuali, esegui l'hash e confrontali con l'hash
decrittografato che hai memorizzato con essa. Esistono molti modi per creare un verificatore di
password: questo è solo uno che abbiamo utilizzato. Il codice per farlo è anche su www .
codeplex.com/offcrypto.
ALTRE RISORSE
- “MD5 considerato dannoso oggi: creazione di un certificato CA non autorizzato" di
Sotirov, A. et al.: www.win.tue.nl/hashclash/rogue-ca/
- “Deploying New Hash Functions” di Bellovin & Rescorla:
www.cs.columbia.edu/~smb/talks/talk-newhash-nist.pdf
Peccato 21: usare la crittografia sbagliata 333
- RFC 4772, "Implicazioni sulla sicurezza dell'utilizzo del Data Encryption Standard (DES)":
www.rfc-editor.org/rfc/rfc4772.txt
- “[MS-OFFCRYPTO]: specifica della struttura di crittografia dei documenti di Office”:
http://msdn.microsoft.com/en-us/library/cc313071.aspx
- “Office Crypto KDF Details” di David LeBlanc: http://blogs.msdn.com/
david_leblanc/archive/2008/12/05/office-crypto-kdf-details.aspx
- “Con la crittografia a 256 bit, le password di Acrobat 9 sono ancora facili da decifrare”
di Dancho Danchev: http://blogs.zdnet.com/security/?p=2271
RIEPILOGO
- Fareutilizzare SSL 3 o TLS1 per la protezione del canale.
- Prendere in considerazioneeliminare gradualmente DES, 2-key 3DES e SHA-1 nel codice esistente.
335
Questa pagina è stata lasciata vuota intenzionalmente
22
Non riuscire a proteggere
Traffico di rete
337
338 24 peccati capitali della sicurezza del software
RIFERIMENTI CWE
CWE offre la seguente debolezza che riassume una variante di questo peccato:
LINGUE INTERESSATE
Tutte le lingue sono soggette a questo problema perché la mancata protezione del traffico di rete è un problema di
progettazione.
Peccato 22: mancata protezione del traffico di rete
339
IL PECCATO SPIEGATO
Troppi programmatori pensano che una volta che i dati vengono scaricati sulla rete, sarà molto
difficile per un utente malintenzionato fare qualcosa di nefasto, oltre a leggerli. Spesso lo
sviluppatore non si preoccupa della riservatezza a livello di rete perché non è stato un requisito
esplicito da parte dei clienti. Ma esistono strumenti là fuori che possono reindirizzare il traffico e
persino dare all'attaccante la possibilità di manipolare il flusso di dati.
Il modello mentale che la maggior parte delle persone ha è che i dati vengono inviati a monte troppo
rapidamente perché un utente malintenzionato possa entrare nel mezzo, quindi passano da un router all'altro, dove
sono al sicuro. Quei programmatori che hanno interruttori sulle loro reti spesso si sentono più sicuri che non ci
saranno problemi.
Nel mondo reale, se gli aggressori hanno un punto d'appoggio sulla LAN locale per entrambi i lati
di una comunicazione, possono avere buone possibilità di lanciare un attacco basato sulla rete,
sfruttando la mancanza di sicurezza nel protocollo di rete. Se gli aggressori si trovano sullo stesso
segmento di rete condiviso di uno degli endpoint (ad esempio, collegati a un hub), vedono tutto il
traffico su quel segmento e di solito possono organizzarsi per intercettarlo tutto. Anche se gli
aggressori sono collegati a uno switch (un hub in cui le singole porte non vedono il traffico reciproco),
esiste una tecnica chiamata spoofing ARP (Address Resolution Protocol), in cui gli aggressori fingono di
essere il gateway e reindirizzano tutto il traffico a se stessi . Possono quindi inviare il traffico dopo
averlo elaborato.
Esistono molte altre tecniche che raggiungono lo stesso obiettivo; ad esempio, molti switch
possono essere inondati da ARPmodalità promiscuadove fondamentalmente finiscono per
comportarsi come hub. Se riesci a vedere le richieste DHCP, hai abbastanza informazioni per
formare una risposta che dica alla vittima che il tuo sistema è ora il gateway, e anche se la
risposta effettiva arriva prima, puoi costringere la vittima a rinegoziare. Se la rete supporta IPv6,
il Neighbor Discovery Protocol può essere utilizzato per trovare gli altri host e puoi quindi
convincerli che sei il router!
Come funziona un attacco ARP? ARP è un protocollo per la mappatura degli indirizzi di livello 2
(codice di autenticazione del messaggio Ethernet o MAC) agli indirizzi di livello 3 (protocollo Internet o
IP) (il livello 1 è il trasporto fisico effettivo, in genere impulsi su un filo). Gli aggressori pubblicizzano
semplicemente l'indirizzo della scheda di rete (noto come indirizzo MAC [Media Access Control]) come
indirizzo appartenente all'IP del gateway. Una volta che le macchine vedono il cambiamento,
inizieranno a instradare tutto il loro traffico attraverso un utente malintenzionato. Lo spoofing ARP non
ha una soluzione pratica e universale a breve termine, perché devono esserci servizi fondamentali a
livello Ethernet che solo ora iniziano a essere discussi all'interno degli organismi di standardizzazione.
Tutti questi problemi peggiorano sulla maggior parte delle reti wireless, a meno che la rete non sia
stata protetta utilizzando i più recenti protocolli di sicurezza wireless, che richiedono che entrambi i
sistemi si autentichino l'uno con l'altro. Sebbene ciò sia comune nelle reti wireless aziendali di grandi
dimensioni, lo stesso approccio può essere utilizzato sulle reti cablate per fornire lo stesso livello di
protezione, ma è molto raro vedere questo livello di sicurezza nella pratica.
340 24 peccati capitali della sicurezza del software
Anche a livello di router, probabilmente non è sicuro presumere che non ci siano vettori di attacco.
I router più diffusi sono programmi C/C++ grandi e complessi e possono essere soggetti a buffer
overflow e altri peccati che affliggono le applicazioni C/C++ che consentirebbero a un utente
malintenzionato di eseguire codice arbitrario su un router. A peggiorare le cose, molti router vengono
forniti con password predefinite (vedi Sin 19) e anche se sono disponibili controlli di accesso sofisticati
per le interfacce di gestione, gli amministratori spesso non impostano la sicurezza o non lo fanno in
modo coerente. Come con qualsiasi software, i fornitori di router dovrebbero cercare di migliorare i
propri processi utilizzando tecniche all'avanguardia per il ciclo di vita dello sviluppo del software che
migliorano la sicurezza. Ci sono stati overflow del buffer nei router prima. Vedi, ad esempio, dal
dizionario Common Vulnerabilities and Exposures (CVE) (su http://cve.mitre.org): CVE-2002-0813,
CVE-2003-0100 e CVE-2003-0647. In effetti, ci sono molti aggressori specializzati nella compromissione
dei router: anche se non c'è vulnerabilità diretta, ci sono sempre attacchi per indovinare la password e
mentre un router può essere configurato per consentire solo l'amministrazione da un insieme ristretto
di indirizzi, raramente sistemati in quel modo.
In effetti, una volta c'era un gruppo numeroso e ben noto di ricercatori di sicurezza molto acuti a
cui è stata compromessa la rete perché qualcuno si è preso la briga di assumere il controllo del loro
provider di servizi Internet e di fiutare il loro traffico fino a quando non sono riusciti a entrare. Le reti
fanno tutto tipo di cose maleducate, e questo prima che le persone cattive decidano di rendere la vita
difficile. La scommessa più sicura è presumere che gli aggressori possano intromettersi in tutto il
traffico di rete e modificarlo.
Gli attacchi di rete possono assumere un'ampia varietà di forme, come descritto di seguito.
Un attacco di spoofing può essere difficile da realizzare, a seconda del trasporto e del
protocollo. Ad esempio, se è possibile prevedere un numero di sequenza iniziale TCP
Peccato 22: mancata protezione del traffico di rete
341
- ManomissioneL'attaccante modifica i dati sul filo, forse facendo qualcosa di innocuo come
cambiare un bit 1 in un bit 0. Nei protocolli basati su TCP, anche l'attaccante deve correggere
il checksum, ma il checksum è stato progettato per essere estremamente veloce perché i
router hanno legittimamente bisogno di ricalcolare e modificare i checksum al volo.
Se sei preoccupato per la sicurezza delle tue connessioni di rete, dovresti sapere quali
tipi di servizi devono fornire le tue applicazioni. Parleremo di questi servizi di base qui,
quindi parleremo di come raggiungere questi obiettivi nella sezione "Fasi di riscatto" più
avanti in questo capitolo. Per proteggerti dagli attacchi che abbiamo appena elencato, in
genere vorrai fornire questi servizi di sicurezza di base:
- Autenticazione inizialeLa tua applicazione deve garantire che i due endpoint siano
d'accordo su con chi stanno parlando. L'autenticazione può coinvolgere il client che
autentica il server, il server che autentica il client o entrambi. Sono disponibili
diverse tecniche di autenticazione, a seconda del design dell'applicazione. Un
esempio di un'implementazione comune utilizzata per le applicazioni Web potrebbe
essere l'autenticazione del server presso il client con SSL/TLS e quindi
l'autenticazione del client presso il server con una password.
342 24 peccati capitali della sicurezza del software
Ci sono casi in cui vuoi comunque assicurarti che tutti i dati siano autentici e che vada bene
senza crittografia. Di solito non ha senso mantenere la riservatezza senza un controllo di
integrità sia iniziale che continuo. Ad esempio, quando un utente malintenzionato utilizza
una modalità di cifratura a flusso come RC4 (questo include anche le modalità operative
popolari per le cifrature a blocchi), l'attaccante può capovolgere bit casuali nel testo cifrato e,
senza un adeguato controllo dell'integrità del messaggio, in genere non si potrebbe mai
Sapere. Se gli aggressori conoscono il formato dei dati, possono fare cose ancora più crudeli
capovolgendo bit specifici.
Sebbene RC4 abbia alcune buone proprietà in termini di crittografia del traffico di rete,
non è più qualcosa che raccomanderemmo a causa del problema con il bit flipping,
chiavi che sono relativamente deboli per gli standard moderni, nonché alcuni problemi
crittografici più arcani. Inoltre, è noto che le reti capovolgono i bit in modo alquanto
casuale anche senza che gli aggressori creino problemi. Il controllo dell'integrità
dovrebbe far parte di qualsiasi solida conversazione di rete.
Peccati correlati
Sebbene sia fin troppo comune omettere semplicemente la sicurezza in un'applicazione, è spesso
il caso che i protocolli basati su PKI, come Secure Sockets Layer/Transport Layer Security (SSL/
TLS), siano utilizzati in modo errato (Sin 23) e non siano corretti spesso vengono utilizzati anche
algoritmi crittografici (Sin 21). Uno degli errori più comuni è confondere SSL utilizzando un
certificato autofirmato con la crittografia: SSL su un certificato autofirmato è soggetto ad attacchi
MITM e equivale effettivamente a offuscamento. L'autenticazione è anche una parte importante
della connettività di rete sicura ed è anche un punto di errore comune (ad esempio, Sins 22 e 18).
Inoltre, per molti protocolli di rete sicuri sono richiesti numeri casuali crittograficamente forti (Sin
20).
Peccato 22: mancata protezione del traffico di rete
343
Ad esempio, un argomento comune è "prevediamo che questa porta sarà disponibile solo
dietro un firewall". In pratica, la maggior parte degli incidenti di sicurezza della rete ha qualche
elemento interno, che si tratti di un dipendente scontento o corrotto, amico di un dipendente,
custode, cliente o fornitore che visita il luogo di lavoro o così via. Inoltre, non è raro assumere un
firewall, solo per avere una politica locale diversa. E quante persone conosci che hanno avuto
problemi di connettività di rete, quindi disabilitano i loro firewall e una volta risolto il problema si
dimenticano di riattivarli? In una rete di grandi dimensioni con molti punti di ingresso, il concetto
di rete interna protetta è obsoleto. Le grandi reti interne dovrebbero essere pensate come
ambienti semi-pubblici e semi-ostili.
formato complessivo. Un problema difficile nel testare le applicazioni può essere vedere come
apportare modifiche che non testano alcuni protocolli o trasporti sottostanti. Ad esempio, il semplice
capovolgimento casuale di bit in un pacchetto di rete testerà lo stack TCP, non l'applicazione.
È anche abbastanza semplice determinare dal punto di vista del test se stai visualizzando dati
crittografati con SSL. È possibile utilizzare ssldump (www.rtfm.com/ssldump/) per rilevare il
traffico crittografato con SSL.
In definitiva, testare per vedere se le persone stanno usando gli algoritmi giusti e li usano nel
modo giusto è un compito incredibilmente difficile da fare, specialmente se stai solo facendo test black-
box. Pertanto, per controlli più sofisticati (assicurandosi che le persone utilizzino buone modalità,
materiale chiave forte e simili), è molto più efficace eseguire semplicemente la progettazione e la
revisione del codice.
ESEMPIO PECCATI
Internet ha trascorso la sua infanzia come progetto di ricerca. C'era una fiducia diffusa e
non si pensava molto alla sicurezza. Certo, c'erano password sugli account di accesso, ma
non è stato fatto molto oltre a questo. Di conseguenza, la maggior parte dei protocolli più
vecchi e importanti non ha una sicurezza significativa.
TCP/IP
Il protocollo Internet (IP) e i protocolli basati su di esso, ovvero TCP (Transmission Control Protocol),
ICMP e UDP, non forniscono alcuna garanzia per i servizi di sicurezza di base come la riservatezza e
l'autenticazione continua dei messaggi. TCP utilizza checksum che hanno lo scopo di proteggere dalla
corruzione casuale della rete, ma non è crittograficamente forte e può essere facilmente ripristinato e
spesso viene ripristinato quando i dispositivi devono riscrivere parti di un'intestazione di pacchetto per
un tunnel o un proxy. Infatti, essere in grado di ricalcolare un checksum in modo che i pacchetti
possano essere modificati al volo dai dispositivi di rete senza una significativa perdita di prestazioni è
assolutamente in base alla progettazione.
IPv6 affronta questi problemi aggiungendo servizi di sicurezza opzionali. Questi servizi
di sicurezza (noti come IPSec) sono stati considerati così utili che sono stati ampiamente
implementati sulle tradizionali reti IPv4. Ma oggi sono generalmente utilizzati per reti
private virtuali aziendali (VPN) e simili e non sono ancora utilizzati universalmente, come
originariamente previsto.
La posta elettronica è un altro esempio in cui i protocolli non hanno tradizionalmente protetto i dati in
transito. Sebbene ora esistano versioni ottimizzate per SSL di SMTP, Post Office Protocol 3 (POP3) e IMAP, non
sono sempre utilizzate e potrebbero non essere sempre supportate da alcuni popolari lettori di posta
elettronica, sebbene alcuni supportino almeno la crittografia e l'autenticazione per il trasferimento interno
della posta. Spesso puoi mettere uno sniffer su una rete locale e leggere la posta elettronica del tuo collega.
Alcuni dei più popolari server di posta elettronica di livello aziendale lo fanno
Peccato 22: mancata protezione del traffico di rete
345
comunicare in modo sicuro con i client, almeno fintanto che i messaggi rimangono all'interno
della rete aziendale e molti lettori di posta moderni supportano l'esecuzione di POP, IMAP e
SMTP su SSL.
E*COMMERCIO
L'algoritmo di crittografia originale di E*TRADE prevedeva l'XORing dei dati con un valore fisso. Questo
è un approccio facile da implementare, ma è anche facile da rompere. Un buon crittoanalista dilettante
può capire che questo è ciò che sta accadendo solo raccogliendo ed esaminando abbastanza dati che
escono in rete. Non ci vogliono molti dati o tempo per capire cosa sia la cosiddetta "chiave di
crittografia" e rompere completamente lo schema. A peggiorare le cose, XOR non spera nemmeno di
fornire un'autenticazione continua dei messaggi, quindi è stato facile per gli aggressori esperti lanciare
tutti gli attacchi di cui abbiamo parlato in questo capitolo.
FASI DI RISCATTO
In generale, si consiglia di utilizzare SSL/TLS per qualsiasi connessione di rete, se possibile,
oppure un altro protocollo ben noto, come Kerberos. Assicurati di utilizzare SSL (e qualsiasi
protocollo basato su PKI) in conformità con la nostra guida in Sin 23.
Se la tua applicazione non consente SSL/TLS, un approccio consiste nel creare un proxy locale per
implementare la sicurezza, come Stunnel. Un'altra alternativa consiste nell'utilizzare IPSec o qualche altra
tecnologia VPN per ridurre l'esposizione ai problemi di rete. Uno dei motivi addotti da alcune persone per
evitare SSL/TLS è l'overhead di autenticazione. SSL utilizza la crittografia a chiave pubblica che può essere
costosa e può potenzialmente lasciarti esposto ad attacchi di negazione del servizio. Se questa è una grande
preoccupazione, ci sono sicuramente soluzioni a livello di rete, come il bilanciamento del carico, che puoi
usare.
Ecco alcune indicazioni di base:
Molti noti protocolli di autenticazione hanno proprietà diverse, a seconda del trasporto.
Ad esempio, Kerberos può normalmente autenticare il server, ma l'autenticazione del
server non è disponibile quando si accede tramite HTTP e, come accennato in precedenza,
NTLM su HTTP è soggetto ad attacchi di riproduzione quando non è vulnerabile
346 24 peccati capitali della sicurezza del software
per ripetere gli attacchi quando viene utilizzato su trasporti ordinari, come TCP/IP. Assicurati di
comprendere le sfumature di come si comporta la tua scelta di autenticazione per il trasporto
con cui stai lavorando.
ALTRE RISORSE
- Lo strumento ssldump per esaminare il traffico di rete SSL: www.rtfm.com/ssldump
- Il proxy SSL di Stunnel: www.stunnel.org/
RIEPILOGO
- Fareutilizzare protocolli di sicurezza collaudati come SSL/TLS e IPSec.
- Fareutilizzare un forte meccanismo di autenticazione iniziale.
- Farecrittografare tutti i dati per i quali la privacy è una preoccupazione. Err sul lato della privacy.
- Nonchiavi hardcode e non pensare che XORing con una stringa fissa sia un
meccanismo di crittografia.
- Prendere in considerazioneutilizzando tecnologie a livello di rete per ridurre ulteriormente
l'esposizione ogni volta che ha senso, come firewall, VPN e bilanciatori di carico.
23
Uso improprio di PKI,
Soprattutto SSL
347
348 24 peccati capitali della sicurezza del software
Il primo punto dell'elenco è l'obiettivo principale di questo capitolo, mentre gli altri due punti
sono l'argomento di Sin 21, sotto il titolo "Utilizzo della primitiva crittografica errata".
Quando crei un'applicazione che utilizza SSL, devi considerare quale di queste proprietà di
sicurezza richiede la tua applicazione. Probabilmente li vuoi tutti e tre. È anche importante capire
che tutte queste proprietà di sicurezza sono facoltative!
SSL sembra semplice. Per la maggior parte dei programmatori, sembra un drop-in trasparente per
i socket TCP, dove puoi semplicemente sostituire i normali socket TCP con i socket SSL, aggiungere un
semplice login che viene eseguito sulla connessione SSL e farla finita. Naturalmente, tutto questo è
molto semplice quando si utilizza HTTPS (HTTP, o Hypertext Transfer Protocol, su SSL), poiché il
browser si occupa di tutto il lavoro sporco. Ma se stai aggiungendo il supporto SSL alla tua
applicazione, devi essere consapevole dei peccati.
RIFERIMENTI CWE
Il punto debole principale per questo peccato è CWE-295: Problemi con i certificati, e sotto questo ci sono i
problemi che delineiamo nel resto di questo capitolo, inclusi
Peccato 23: uso improprio di PKI, in particolare SSL
349
- CWE-296: mancato rispetto della catena di fiducia nella convalida del certificato
LINGUE INTERESSATE
I problemi SSL sono in genere problemi di progettazione e non un problema con alcun linguaggio di
programmazione sottostante. Pertanto, qualsiasi lingua può essere influenzata. Le API HTTPS tendono
ad essere meno problematiche dell'SSL generico, perché il protocollo HTTPS impone controlli di
autenticazione che il protocollo SSL generico lascia come facoltativo. Di conseguenza, le API SSL di
basso livello tendono a lasciare questa responsabilità all'utente.
IL PECCATO SPIEGATO
Oggi SSL è un protocollo basato sulla connessione. L'obiettivo principale di SSL è trasferire i
messaggi tra due parti su una rete "in modo sicuro". "Sicuro" è una parola interessante, perché
significa cose diverse per persone diverse perché dipende da quale delle tre proprietà di
sicurezza (autenticazione, crittografia del canale o controllo dell'integrità del canale) scelgono.
Indipendentemente dal fatto che un'applicazione scelga di utilizzare queste proprietà di sicurezza
è il punto cruciale di questo peccato.
Per arrivare al punto in cui due parti possono avere comunicazioni sicure arbitrarie con SSL,
le due parti devono prima autenticarsi a vicenda. Per lo meno, un'applicazione o l'utente di
un'applicazione deve sapere che sta realmente intrattenendo una conversazione privata con il
server corretto. Tuttavia, il server potrebbe essere disposto a parlare con utenti anonimi. In caso
contrario, il server vorrà autenticare il client. L'autenticazione client è un'opzione all'interno del
protocollo SSL.
Se non riesci a capirlo, immagina di acquistare un oggetto online; devi sapere che stai
davvero dando la tua carta di credito al sito web che pensi, ma il sito web accetterà carte di
credito da chiunque!
I passaggi di autenticazione all'interno di SSL utilizzano una PKI (vale a dire, utilizza i
certificati), ed è qui che le cose possono diventare peccaminose se non si eseguono i controlli PKI
appropriati. Non è intenzione di questo capitolo spiegare le viscere di PKI, o essere pedanti, i
certificati X.509 usati da SSL; il lettore è invitato a fare riferimento ad alcuni degli eccellenti
riferimenti nella sezione "Altre risorse" di questo capitolo. In particolare, dovresti leggere RFC
2459, "Internet X.509 Public Key Infrastructure: Certificate and CRL Profile". È asciutto ma
completo.
350 24 peccati capitali della sicurezza del software
Quindi, senza entrare in tutti i dettagli cruenti della PKI X.509, è importante che l'applicazione client
esegua i seguenti passaggi di convalida quando esegue l'autenticazione del server; il mancato rispetto di uno
di questi passaggi è peccaminoso la maggior parte delle volte:
- Verificare che il certificato del server sia firmato da una terza parte attendibile, nota come
autorità di certificazione (CA).
- Verificare che il certificato del server sia attualmente valido. Un certificato X.509 è valido
solo per un periodo di tempo; c'è un'ora di inizio e una data di scadenza nel certificato,
proprio come con una carta di credito.
È facile per gli sviluppatori perdere uno o più di questi passaggi, ma di gran lunga il passaggio più
comunemente ignorato è non eseguire un controllo di revoca.
Se il certificato non è valido perché una o più condizioni di cui sopra non sono soddisfatte, l'applicazione
dovrebbe considerare di rifiutare il certificato e fallire la fase di autenticazione. Il problema è che l'esecuzione
di ciascuno di questi passaggi può richiedere molto codice per funzionare correttamente e quindi molti
sviluppatori ignorano uno o più passaggi.
Peccati correlati
Sebbene questo capitolo si concentri sull'uso programmatico peccaminoso del protocollo SSL, ci sono alcuni
peccati correlati; in particolare la scarsa scelta della suite di cifratura SSL, che è trattata in Sin 21, e la pessima
generazione di chiavi, trattata in Sin 20.
- Il codice della libreria o dell'applicazione non riesce a controllare il certificato utilizzato dal
processo all'altra estremità del canale di comunicazione.
Peccato 23: uso improprio di PKI, in particolare SSL
351
- Il certificato è firmato da una CA nota, oppure c'è una catena di firme che
riconduce a quella CA.
- Il certificato e tutti i certificati della catena rientrano nel periodo di
validità.
- Il nome host viene confrontato con il sottocampo appropriato in almeno uno dei
campi DN o nell'estensione subjectAltName X.509 v3.
- L'utilizzo del certificato è corretto; probabilmente l'autenticazione del server o
l'autenticazione del client.
presa di importazione
s = socket.socket()
s.connect(('www.example.org', 123)) ssl =
socket.ssl(s)
Non è chiaro in superficie ciò che la libreria SSL controlla per impostazione predefinita. Nel caso di
Python, la risposta è che, secondo la documentazione, le librerie SSL non controllano assolutamente
nulla.
352 24 peccati capitali della sicurezza del software
Quando controlli per assicurarti che la revoca sia stata eseguita correttamente, dovresti verificare se
vengono utilizzati gli elenchi di revoca dei certificati (CRL) o l'OCSP (Online Certificate Status Protocol). Ancora
una volta, le API variano ampiamente, quindi è meglio ricercare l'API SSL effettivamente utilizzata da un
programma; ma la ricerca di "CRL" e "OCSP" senza distinzione tra maiuscole e minuscole funzionerà in un
pizzico.
Quando vengono utilizzati uno o entrambi questi meccanismi, le cose più importanti a cui prestare attenzione
sono le seguenti:
Fai attenzione al codice che guarda semplicemente "all'interno" del certificato per alcuni
dettagli come il DN e non esegue le operazioni di convalida della firma crittografica appropriate.
Il seguente codice è peccaminoso perché controlla solo per vedere se il certificato ha il testo "
www.esempio.com",e chiunque potrebbe rilasciare a se stesso un certificato con questo nome.
- Firmato da una CA non attendibile. Puoi farlo creando una CA radice casuale, magari
utilizzando Microsoft Certificate Manager o OpenSSL, e quindi utilizzandola per emettere un
certificato.
- Un certificato autofirmato. È possibile utilizzare lo strumento Microsoft selfcert.exe per eseguire questa operazione.
Peccato 23: uso improprio di PKI, in particolare SSL
353
Per testare il controllo CRL e il supporto OSCP, puoi semplicemente osservare tutto il traffico di rete
in uscita da un'applicazione per un lungo periodo di tempo, controllando i protocolli e gli indirizzi di
destinazione rispetto a un elenco di valori noti. Se OCSP è abilitato, dovrebbe esserci un controllo OCSP
per ogni autenticazione. Se il controllo CRL è abilitato e implementato correttamente, si verificherà
periodicamente, spesso una volta alla settimana. Quindi non sorprenderti se il tuo codice esegue un
controllo CRL e non vedi traffico di rete durante l'esecuzione del controllo, perché il CRL potrebbe
essere già stato recuperato e memorizzato nella cache, rendendo non necessario un salto di rete.
ESEMPIO PECCATI
È interessante notare che, nonostante questo peccato sia estremamente diffuso soprattutto nelle
applicazioni personalizzate, ci sono pochissime voci CVE. Ma ecco un paio di esempi.
CVE-2007-4680
CFNetwork in Apple Mac OS X non è riuscito a eseguire correttamente la convalida della certificazione; un tale
errore potrebbe portare ad attacchi man-in-the-middle e spoofing del server. Poiché il bug si trovava in un
componente comunemente condiviso, CFNetwork, molte applicazioni, incluso Safari, ne erano interessate.
CVE-2008-2420
Questo è un bug interessante in Stunnel che non controlla correttamente un CRL se il supporto OCSP è abilitato, il che
potrebbe consentire a un utente malintenzionato di utilizzare un certificato revocato.
354 24 peccati capitali della sicurezza del software
FASI DI RISCATTO
Quando è ragionevole utilizzare una PKI, come SSL, fallo, assicurandoti che quanto segue sia
vero:
evento.getPeerCertificates();
suite di cifratura corretta, ma in realtà non convalida la catena di fiducia. Quando si adotta
questo approccio, è necessario eseguire la convalida manualmente convalidando ogni certificato
nella catena con il relativo genitore e quindi, per il certificato radice, confrontarlo con un elenco
di certificati radice noti conservati nel computer. Ad esempio, per controllare un certificato foglia
quando sai già di avere un secondo certificato radice attendibile nell'array di certificati, puoi
procedere come segue:
Tentativo {
Si noti che questo codice non controlla per assicurarsi che la data su ciascuno dei certificati
sia valida. In questo caso, puoi controllare il certificato peer con quanto segue:
Tentativo {
((X509Extension)(certificates[0])).checkValidity(); } catch
(CertificateExpiredException e1) {
/* Convalida del certificato non riuscita. */
} catch (CertificateNotYetValidException e2) {
/* Convalida del certificato non riuscita. */
}
Il codice Microsoft .NET esegue automaticamente il controllo del nome host quando si chiama
SslStream.AuthenticateAsClient, quindi non è necessario aggiungere altro codice.
Peccato 23: uso improprio di PKI, in particolare SSL
357
A volte, potresti non volere la crittografia, ma un'autenticazione forte. Alcuni server SMTP lo
fanno per scopi di controllo dello spam; in realtà non si preoccupano molto della riservatezza,
sanno solo chi sta inviando tonnellate di e-mail.
ALTRE RISORSE
- HTTPS RFC: www.ietf.org/rfc/rfc2818.txt
- RFC 2459, "Internet X.509 Public Key Infrastructure: Certificate and CRL
Profile": www.ietf.org/rfc/rfc2459.txt
- La documentazione dell'API Java Secure Socket Extension (JSSE):
http://java.sun.com/products/jsse/
- La documentazione OpenSSL per la programmazione con SSL e TLS:
www.openssl.org/docs/ssl/ssl.html
- Centro informazioni SSL di VeriSign: www.signio.com/products-services/security-
services/ssl/ssl-information-center/
- Informazioni SslStream: http://msdn2.microsoft.com/library/
d50tfa1c(en-us,vs.80).aspx
RIEPILOGO
- Farecapire quali servizi richiedi da SSL.
- Farecapire cosa controllano le tue librerie SSL e cosa non controllano per impostazione predefinita.
- Il nome host viene confrontato con il sottocampo appropriato in almeno uno dei
campi DN o nell'estensione subjectAltName X.509 v3.
- L'utilizzo della chiave del certificato è corretto: autenticazione del server o
autenticazione del client.
- Farescaricare nuovi CRL una volta scaduti i CRL attuali e utilizzarli per convalidare
ulteriormente i certificati in una catena di fiducia.
- Nonfare affidamento sulla libreria SSL/TLS sottostante per convalidare correttamente una
connessione, a meno che non si utilizzi HTTPS.