Come prevenire gli attacchi di overflow del buffer
Passaggio 1
Scrivi il codice di sicurezza per evitare attacchi di overflow. In C, ci sono una serie di funzioni di vulnerabilità che gli hacker possono sfruttare per riempire eccessivamente i buffer. Riduci al minimo l'utilizzo di strcpy (), strcat (), sprintf () e vsprintf (), che non controlla i limiti. Se possibile, evita l'uso di gets (), che non specifica quanti caratteri devono essere letti e quindi lascia il tuo codice vulnerabile. Se si utilizza scanf (), assicurarsi di specificare una larghezza per il formato% s per evitare overflow.
Passaggio 2
Verificare se è possibile utilizzare trampolini per evitare l'overflow del buffer. Poiché l'overflow del buffer si verifica in stack di memoria e non nel codice, la soluzione più semplice sembra essere quella di impedire agli stack di eseguire qualsiasi codice inserendo un piccolo snippet di codice per proibire queste azioni. Questo è possibile in Linux, ma è molto difficile. Solo pochi compilatori utilizzano i piccoli pezzi di codice chiamati trampolini, che fungono da barriera tra il codice di chiamata della funzione e la funzione stessa. Pertanto, se il codice dannoso tenta di sostituire un buffer, il trampolino può intercettare e neutralizzare i tentativi degli hacker.
Passaggio 3
Implementa strumenti di compilazione per fornire avvisi quando si utilizza codice che ti rende vulnerabile agli attacchi. Alcuni di questi strumenti genereranno un codice che vieta agli estranei di accedere a indirizzi illegali e di disattivare il codice che tenta tale esecuzione. Prodotti come StackShield e StackGuard sono di grande aiuto. StackSheild analizzerà l'indirizzo di ritorno di una funzione e la interromperà in caso di irregolarità. StackGuard inserisce una parola delle Canarie nell'indirizzo del mittente e controlla se la parola è stata alterata, terminando una funzione quando ce l'ha.
Passaggio 4
Installa strumenti come libsafe per controllare la sicurezza in un ambiente dinamico, in fase di esecuzione. Libsafe gira su Linux e controlla l'indirizzo di ritorno più vicino di uno stack frame, quindi si assicura che l'indirizzo non venga sovrascritto. Libsafe sostituirà anche funzioni non sicure, come gets (), strcpy () e scanf ().