Codigo esclusivamente in lingue di alto livello in cui l'overflow del buffer non è un problema, quindi mi scuso per non avere un esempio di codice per te.
Esempio; quando scrive una stringa nella memoria ricevuta sulla rete: (dati non regolabili)
- Viene assegnato uno spazio di memoria per memorizzare la stringa in entrata.
- Una stringa viene letta dalla rete in blocchi. In molti casi la lunghezza non è nota.
-
La stringa viene scritta nella posizione iniziale dell'allocazione precedente. I dati aggiuntivi vengono aggiunti in quel punto fino a trovare il delimitatore desiderato (ovvero \n
in una richiesta HTTP)
-
Se la stringa è troppo lunga, i dati fuoriescono oltre lo spazio allocato, eventualmente sovrascrivendo la memoria aggiuntiva allocata per un altro scopo. Questo spesso produce un crash sicuro; ma in circostanze specifiche tali attacchi possono avere conseguenze disastrose, specialmente se la stringa iniettata verrà interpretata come codice eseguibile.
-
Un'applicazione sicura allocherà un buffer più grande, se necessario. Ciò si verifica automaticamente in un linguaggio di alto livello.
-
In alternativa puoi troncare o rifiutare i dati oltre la lunghezza massima.
Ulteriori esempi possono essere trovati su Wikipedia
Ci sono anche attacchi di sola lettura che possono essere eseguiti su programmi non sicuri:
-
Se un buffer è allocato, ma la scrittura è incompleta, (cioè la stringa ricevuta è più corta della lunghezza prevista), allora ci saranno dati casuali rimasti in quel buffer. Se il buffer è in seguito accessibile dall'attaccante, la memoria casuale può essere rubata.
La maggior parte dei linguaggi di alto livello eliminerà i buffer allocati, ma questo è meno efficiente, quindi alcune lingue offrono un'opzione (o predefinita) per saltare il passaggio di azzeramento.
-
Le vulnerabilità di overflow di interi potrebbero essere utilizzate per bypassare i controlli di lunghezza più avanti nel programma. Se si utilizza un valore intero modificato maliziosamente per leggere le posizioni di memoria o per impostare il limite di lunghezza di un'operazione di lettura, è possibile che la memoria casuale venga rubata.
Si verificherebbe un overflow dei numeri interi se la matematica viene eseguita prima della convalida. Ad esempio, if(requestedDataLength + someModifier < limit)
deve essere modificato in if(requestedDataLength < limit - someModifier)
.
L'overflow integer può essere utilizzato per attacchi non correlati all'allocazione del buffer. Molti linguaggi di alto livello sono interessati dall'overflow dei numeri interi, ma questo è meno comune.
Le conseguenze potrebbero variare, ma nel peggiore dei casi potrebbe comportare il furto di credenziali di accesso sensibili o dati sensibili.
In un linguaggio di alto livello, l'allocazione del buffer e la gestione della lunghezza sono automatici e queste vulnerabilità normalmente non possono verificarsi.