Introduzione all'overflow del buffer

L'overflow del buffer è anche noto come sovraccarico del buffer, è uno stato del computer in cui un'applicazione tenta di memorizzare più dati nella memoria buffer rispetto alla dimensione della memoria. Ciò porta alla memorizzazione dei dati in una memoria adiacente che a volte può sovrascrivere i dati esistenti, causando potenziali perdite di dati e talvolta anche un arresto anomalo del sistema. È un errore di programmazione comune che la maggior parte degli sviluppatori commette inconsapevolmente. Questo viene spesso sfruttato dagli hacker per ottenere l'accesso a dati non richiesti.

Cos'è la memoria buffer?

Ottima domanda Una memoria buffer, o buffer, è semplicemente una parte sequenziale della RAM messa da parte per conservare temporaneamente i dati mentre vengono trasferiti da un posto a un altro - il luogo di solito è un dispositivo di input o output. Questo viene fatto per compensare la differenza nelle velocità alle quali operano i dispositivi.

Ad esempio, quando dai alcuni documenti per la stampa, il tuo ultimo processore i7 è abbastanza veloce da eseguire il comando di stampa in nanosecondi, mentre la povera vecchia stampante non è dotata di quel processore veloce. Pertanto, i documenti vengono conservati nella memoria buffer e passati alla stampante a una velocità accettata dalla stampante. Ciò libera la RAM della CPU per altre attività.

Attacco di overflow del buffer

Ora che una vulnerabilità è stata identificata con i computer, gli hacker sono tenuti a sfruttarla e provare ad attaccare vari sistemi attraverso attacchi di buffer overflow. Ora sorge la domanda, come fa un hacker a eseguire un simile attacco e quali sono le conseguenze?

In un attacco di overflow del buffer, i dati aggiuntivi includono istruzioni intese ad attivare attività dannose come corruzione di file, modifica dei dati, invio di informazioni private su Internet, ecc. Un utente malintenzionato trarrebbe semplicemente vantaggio da qualsiasi programma in attesa di un determinato utente inserire e iniettare i dati in eccesso nel buffer.

L'attacco di overflow del buffer può essere principalmente classificato in due tipi

  • Basato su stack : quando l'attacco è su allocazione di memoria basata su stack. È più semplice da sfruttare ed è quindi più soggetto agli attacchi.
  • Basato su heap : quando l'attacco è sull'allocazione di memoria basata su heap. Non è così facile da sfruttare ed è quindi molto meno frequente.

Le lingue più vulnerabili agli attacchi di overflow del buffer sono C, C ++, Fortran e Assembly in quanto utilizzano tecniche di allocazione della memoria basate su stack.

La cura

Una volta che i dati sono corrotti, semplicemente non esiste una cura per ripristinare i dati originali. Inoltre, l'intensità dell'attacco determina in gran parte la cura. Se l'attacco è scarso e interessa solo una parte della memoria di una macchina isolata, un semplice formato di sistema può essere la cura. Considerando che, se l'attacco è diffuso e ha compromesso i dati su più macchine, la formattazione dell'intera rete non sarebbe utile a meno che il programma che inietta il codice dannoso non sia riparato.

Prevenire è meglio che curare

Come sviluppatori, è nostra responsabilità verificare la presenza di buffer overflow nel nostro codice. Se gli overflow del buffer vengono gestiti nel codice stesso, la sicurezza del sistema non viene ostacolata da attacchi buffer overflow.

Di seguito sono riportati alcuni semplici passaggi precauzionali che possono aiutare a prevenire gli overflow del buffer.

  • La gestione delle eccezioni deve essere sfruttata per rilevare overflow del buffer e impedire l'esecuzione di codice in caso di esso.
  • Allocare dimensioni sufficientemente grandi da bufferizzare in modo che i grandi volumi di dati non previsti vengano gestiti in modo adeguato.
  • Evitare di utilizzare funzioni di libreria o metodi di terze parti che non sono sottoposti a controllo associato per overflow del buffer. Esempi comuni di tali funzioni da evitare sono gets (), scanf (), strcpy () Questi sono principalmente in linguaggio C / C ++.
  • Il test del codice dovrebbe tenere conto di tali vulnerabilità e testare rigorosamente il codice e correggere i bug che possono causare un overflow.
  • I moderni linguaggi di programmazione, i sistemi operativi e i compilatori di codice si sono evoluti per interrompere l'esecuzione del comando in caso di overflow del buffer. Questo è diventato il modo più affidabile per rilevare automaticamente buffer overflow.

Provate voi stessi…

Hai capito così tanto di Buffer Overflow e Buffer Attacks, perché non provare a codificare qualcosa di malizioso da solo?

Dichiarazione di non responsabilità: il seguente programma è solo a scopo illustrativo e non deve essere utilizzato per causare danni di qualsiasi tipo. Qualsiasi somiglianza con codice dannoso è semplicemente casuale. Inoltre, al giorno d'oggi i sistemi operativi sono abbastanza intelligenti da disporre di controlli preventivi sugli attacchi buffer.

Di seguito è riportato il programma C che può causare un potenziale sovraccarico del buffer. Perché la scelta della lingua C? Questo perché i linguaggi di programmazione più avanzati sono stati sviluppati per gestire i sovraccarichi del buffer solo durante il tempo di compilazione. Anche se al giorno d'oggi i compilatori di C hanno anche alcuni controlli in atto per evitare il rilevamento di overflow del buffer. Quindi, vedresti solo un messaggio di errore che indica che è stato rilevato un sovraccarico del buffer.

#include
#include
#include
int main(int argc, char *argv())
(
char mybuffer(8);
// copy the user input to mybuffer, without any bound checking
printf("Storing user input to mybuffer…\n");
strcpy(mybuffer, argv(1));
printf("mybuffer content= %s\n", mybuffer);
return 0;
)

Cosa è successo quando 123456789 è stato fornito come argomento della riga di comando al programma? Il programma ha generato un errore che viene generato quando il compilatore rileva un overflow del buffer. Oggigiorno i compilatori e i sistemi operativi hanno un livello di protezione aggiunto. Questo livello non è altro che variabili chiamate Canarie che vengono avviate a determinati valori al momento della compilazione. Queste variabili vengono quindi memorizzate nel buffer in unità di memoria adiacenti. Quindi, ogni volta che il buffer trabocca, i dati extra fluiscono nella memoria adiacente e corrompono il valore delle Canarie. Non appena viene rilevato un canarino corrotto, il sistema interrompe l'esecuzione.

Un altro esempio in linguaggio C ++:

#include
using namespace std;
int main()
(
char buf(8);
cin>>buf;
return 0;
)

Ingresso - 123456789

Uscita -

Conclusione - Overflow del buffer

Quindi, ormai sono sicuro che avresti compreso l'importanza della gestione del buffer nel tuo programma. Includere questa pratica per verificare i limiti del buffer durante la scrittura e testare il codice. Questo ti aiuterà a scrivere un codice sicuro.

Articoli consigliati

Questa è stata una guida a What is Buffer Overflow. Qui abbiamo discusso della definizione, prevenzione, memoria, attacco in Buffer Overflow. Puoi anche consultare i nostri altri articoli suggeriti per saperne di più -

  1. Che cos'è JavaScript?
  2. Cos'è Django?
  3. Che cos'è SQL Developer?
  4. Che cos'è Azure?

Categoria: