Diventa Autore per CoreTech | Scopri di più
20/03/20 CoreTech Blog
Un overflow di numeri interi è un tipo di errore aritmetico di overflow quando il risultato di un'operazione di numero intero non rientra nello spazio di memoria allocato. Invece di un errore nel programma, di solito causa risultati imprevisti. Gli overflow di numeri interi sono stati elencati come l'errore software numero 8 più pericoloso nell'elenco CWE 2019 più recente, principalmente perché spesso portano a buffer overflow, che attualmente rappresentano l'errore software numero 1 più pericoloso secondo tale elenco.
Nella maggior parte dei linguaggi di programmazione, ai valori interi viene solitamente assegnato un certo numero di bit in memoria. Ad esempio, lo spazio riservato per un tipo di dati intero a 32 bit può memorizzare un numero intero senza segno compreso tra 0 e 4.294.967.295 o un numero intero con segno compreso tra -2,147,483,648 e 2,147,483,647. Nel caso di numeri interi con segno, il bit (primo) più significativo di solito indica se il numero intero è un valore positivo o negativo.
Tuttavia, cosa succede quando si esegue il calcolo 4.294.967.295 + 1 e si tenta di memorizzare il risultato che è maggiore del valore massimo per il tipo intero? Dipende completamente dalla lingua e dal compilatore. E, sfortunatamente, la maggior parte delle lingue e la maggior parte dei compilatori non generano alcun errore ed eseguono semplicemente un'operazione modulo, avvolgente o troncata, oppure hanno altri comportamenti indefiniti. Per l'esempio sopra, il risultato è spesso 0.
I risultati possono essere ancora più imprevisti per gli interi con segno. Quando si supera il valore massimo dell'intero con segno, il risultato diventa di solito un numero negativo. Ad esempio, 2.147.483.647 +1 è generalmente −2.147.483.648 . Quando si scende al di sotto del valore minimo (underflow), il risultato diventa di solito un numero positivo. Ad esempio, −2.147.483.648 - 1 è normalmente 2.147.483.647.
Oltre alle operazioni tipiche come addizione, sottrazione o moltiplicazione, possono verificarsi anche overflow di numeri interi a causa della tipografia. Ad esempio, un'operazione può trattare un numero intero come non firmato e un'altra operazione può trattare esattamente lo stesso numero intero come un segno, interpretando quindi il valore in modo errato.
La maggior parte delle condizioni di overflow dei numeri interi porta semplicemente a comportamenti errati del programma ma non causa alcuna vulnerabilità. Tuttavia, in alcuni casi, gli overflow di numeri interi possono avere gravi conseguenze:
Un eccellente esempio di overflow di numeri interi che porta a un overflow del buffer può essere trovato in una versione precedente di OpenSSH (3.3):
nresp = packet_get_int();
if (nresp > 0) {
response = xmalloc(nresp*sizeof(char*));
for (i = 0; i < nresp; i++)
response[i] = packet_get_string(NULL);
}
Se nresp è 1073741824 e sizeof(char*) è 4 (che è tipico), nresp*sizeof(char*) genera un overflow. Pertanto, xmalloc() riceve e alloca un buffer di 0 byte. Il ciclo successivo provoca un overflow del buffer di heap, che a sua volta può essere utilizzato da un utente malintenzionato per eseguire codice arbitrario.
Il problema maggiore anche con gli overflow di interi più elementari è che sono molto difficili da scoprire e prevenire. Non c'è errore, non c'è avviso, si ottiene semplicemente un risultato errato dell'operazione. L'unico modo per scoprirli è esaminare gli operandi prima dell'operazione o esaminare il risultato dopo (ad esempio, controllando se il risultato di addizione per due numeri positivi è più piccolo degli operandi).
A seconda della lingua, potresti essere in grado di imbatterti in librerie o meccanismi che ti aiutano a prevenire e scoprire overflow di numeri interi. Nel caso del compilatore GCC, ci sono funzioni integrate che verificano la presenza di overflow di numeri interi. Nel caso dei programmi C ++, esiste una libreria chiamata SafeInt che esegue operazioni sicure. Sfortunatamente, imporre l'uso di questa libreria in tutto il codice per tutte le operazioni aritmetiche potrebbe non essere facile.
Se vuoi saperne di più sugli overflow di numeri interi, ti consigliamo di dare un'occhiata al vasto articolo di Phrack di blexim .