Intero in eccesso

Un intero overflow ( integer overflow ) è, in informatica , una condizione che si verifica quando un'operazione matematica produce un valore numerico maggiore del rappresentabile nello spazio di archiviazione disponibile. Ad esempio, aggiungendo uno al numero più grande che può essere rappresentato si ottiene un overflow di numeri interi. L'overflow intero è numerato CWE-190 nell'enumerazione Common Weakness .

Il più famoso superamento intero degli ultimi anni è molto probabilmente quello che ha causato la distruzione del razzo Ariane 5 , durante il suo primo volo , il4 giugno 1996.

Origine

Il numero di bit in uno spazio di archiviazione determina il valore massimo che può essere rappresentato lì. I numeri più comuni di bit per gli spazi di archiviazione e i valori massimi associati sono:

8 bit: valore massimo rappresentabile = 2 8 - 1 = 255; 16 bit: valore massimo rappresentabile = 2 16 - 1 = 65.535; 32 bit: più comune nei personal computer, il valore massimo rappresentabile = 2 32 - 1 = 4 294 967 295; 64 bit: valore massimo rappresentabile = 2 64 - 1 = 18 446 744 073 709 552 000; 128 bit: valore massimo rappresentabile = 2 128 - 1 = 340 282 366 920 938 500 000 000 000 000 000 000 000 000

Poiché un'operazione matematica può produrre un risultato maggiore del valore massimo rappresentabile, può verificarsi l'impossibilità di registrare il risultato dell'operazione. Questa condizione di errore si traduce in un messaggio di errore o nel troncamento del risultato che è quindi errato.

Ad esempio, il linguaggio C comprende diversi tipi numerici che consentono di scegliere la dimensione della memoria da allocare in base ai numeri più grandi che si desidera rappresentare.

Esempio

L'esempio che segue è tratto da una vera e propria vulnerabilità che interessa OpenSSH (versioni 2.9.9 a 3.3) e avente il seguente CVE numero di identificazione : CVE-2002-0639.

Il frammento di codice sorgente di seguito, preso da OpenSSH, è in linguaggio C , i commenti sono stati aggiunti per chiarezza.

// extrait un entier d'un paquet reçu par OpenSSH. nresp = packet_get_int(); if (nresp > 0) { // alloue un tampon de: nresp * 4 octets response = xmalloc(nresp*sizeof(char*)); for (i = 0; i < nresp; i++) response[i] = packet_get_string(NULL); }

Nel codice mostrato sopra, viene preso un numero intero da un pacchetto ricevuto da OpenSSH. Questo intero viene quindi moltiplicato per la dimensione ( sizeof ) di un puntatore char , che di solito è di 4 byte su un sistema a 32 bit. Il risultato di questa moltiplicazione viene quindi passato come parametro alla funzione xmalloc (simile a malloc ) che viene utilizzata per allocare un buffer .

Se l'intero ricevuto nel pacchetto ( variabile nresp) ha un valore di 1.073.741.824, il risultato dell'operazione "  nresp*sizeof(char*) " è equivalente a:

1.073.741.824 × 4 = 4.294.967.296.

Il valore massimo rappresentabile di un intero a 32 bit è 2 32 - 1, il troncamento avviene quindi a 2 32 . xmallocVale quindi il parametro passato alla funzione nel codice (dove %è l'operatore modulo ):

(1073741824 * 4) % 232 = 0

sia nella scrittura matematica standard

(1.073.741.824 × 4) ≡ 0 [2 32 ]

Poiché nella maggior parte dei casi le allocazioni di memoria consentono un'allocazione di 0 byte, la funzione xmallocrestituisce un puntatore valido a un buffer di 0 byte. Il ciclo che segue direttamente la funzione di allocazione aggiungerà dati a questo buffer a 0 byte causando un overflow dell'heap .

Riferimenti

  1. (it) "  CWE-190: Integer Overflow o Wraparound  " , Common Weakness Enumeration .
  2. (in) "  CVE-2002-0639  " , Vulnerabilità ed esposizioni comuni .

Vedi anche