it-swarm.dev

Come vengono trovati zero giorni?

Credo che recentemente sia trapelato che il NSA ha una lunga lista di exploit zero day su vari software "per una giornata piovosa", cioè: per ogni volta che sarebbe utile a loro.

La domanda è: come trovano questi zero giorni? Qualcuno deve sedersi fisicamente a un computer e provare un sacco di cose casuali (ad esempio: esecuzione di codice remoto codificata in base64 all'interno di uno script in un PDF), o ci sono sistemi automatizzati che attivamente testano pezzi di software per buchi dove funzionerebbe l'escalation dei privilegi o l'esecuzione di codice in modalità remota?

53
Naftuli Kay

I giorni zero si trovano esattamente allo stesso modo di qualsiasi altro tipo di buca. Ciò che rende un buco di sicurezza un "giorno zero" si basa esclusivamente su chi è a conoscenza dell'esistenza del buco, non su altre caratteristiche tecniche.

I buchi vengono trovati, di solito, da persone curiose che notano un comportamento funky o immaginano un possibile bug e quindi provano a vedere se il programmatore è caduto per questo . Ad esempio, posso immaginare che qualsiasi codice che gestisce il contenuto delle stringhe e si sforza di essere impermeabile alle differenze maiuscole (ovvero gestisce "A" come equivalente a "a") può incorrere in un problema se eseguito su un computer turco (perché in lingua turca, la minuscola per "I" è "ı", non "i") che può portare a bug divertenti, persino a buchi di sicurezza (ad esempio se alcune parti di il sistema controlla l'equivalenza della stringa in modo sensibile alle impostazioni locali, mentre altri no). Quindi, posso provare a configurare il mio computer con un'impostazione locale turca e vedere se il software che scelgo come target inizia a fare cose strane (oltre a parlare turco).

Parte della ricerca di bug può essere automatizzata provando molte "combinazioni insolite". Questo è noto come fuzzing . Può aiutare come primo passo, trovare combinazioni di input che innescano crash; tutto ciò che provoca l'arresto anomalo del sistema di destinazione deve essere studiato, poiché gli arresti anomali di solito significano corruzione della memoria e talvolta la corruzione della memoria può essere abusata di cose ingegnose come il codice remoto esecuzione. Tuttavia, tali indagini devono ancora essere condotte dal cervello umano.

(Se esistesse un modo completamente automatico per rilevare falle di sicurezza, gli sviluppatori di software lo userebbero per produrre codice privo di bug.)

71
Thomas Pornin

Per aggiungere all'eccellente risposta di Thomas Pornin, in genere le vulnerabilità zero-day si trovano attraverso il controllo del codice sorgente, il reverse engineering e il fuzzing (o il test fuzz).

La scelta della tecnica di solito dipende dalle informazioni disponibili. Ad esempio, se il software è open source, selezionare il codice sorgente e cercare le vulnerabilità è il modo preferito. Le vulnerabilità rilevate tramite il controllo del codice sorgente sono in genere più facili da sfruttare poiché è possibile esaminare e comprendere tutti i rami di esecuzione osservando il codice sorgente. Il processo di verifica del codice sorgente può essere semplice come l'approvazione di chiamate a funzioni pericolose come strcpy o può essere complesso come il test automatizzato di copertura del codice che cerca l'esecuzione e l'analisi di ogni codice di filiale.

Se il codice sorgente non è disponibile, l'opzione successiva per il ricercatore di vulnerabilità è quella di decodificare l'applicazione e analizzare il codice di basso livello. Quando un'applicazione viene analizzata tramite un debugger o più preferibilmente tramite un decompilatore come IDA, i blocchi di codice e Assembly mnemonics vengono mappati su strutture di routine di linguaggio di livello relativamente alto che sono facili da analizzare. Il ricercatore di vulnerabilità può quindi seguire il flusso di esecuzione e analizzare il comportamento staticamente o dinamicamente per trovare diversi bug di sicurezza. Ad esempio, l'allocazione di un buffer di dimensioni fisse e quindi l'inserimento di input controllato dall'utente nel buffer allocato di solito significa che può essere sfruttato attraverso un exploit di overflow del buffer.

Il metodo finale per trovare nuove vulnerabilità nel software è attraverso il test fuzz. Questo può anche essere considerato come ricerca di bug attraverso il bruteforcing poiché l'input casuale viene generato e fornito a tutte le interfacce di input disponibili dell'applicazione nella speranza che una stringa appositamente predisposta (come una stringa troppo lunga o una stringa con caratteri speciali) possa causare il software in crash. Una volta che il software è andato in crash, il test fuzz si interrompe e consente al ricercatore di vulnerabilità di analizzare l'input su cui l'applicazione si è arrestata in modo anomalo. Se l'arresto anomalo può essere attivato in modo affidabile (ad esempio ogni volta che un determinato set di byte fornito all'applicazione provoca un arresto anomalo) e il flusso di esecuzione potrebbe essere deviato ai dati controllati dall'utente in una memoria eseguibile, il bug viene classificato come remoto bug di esecuzione del codice. Altrimenti, se l'arresto anomalo è un bug affidabile, non può essere convertito in esecuzione di codice, quindi viene classificato come un bug denial of service.

20
void_in