Il buffer overflow è probabilmente la forma più conosciuta di vulnerabilità nella sicurezza dei software.

La gran parte degli sviluppatori è ben consapevole del problema, tuttavia, l’ampia casistica con cui può manifestarsi il fenomeno, unita all’alta percentuale di errori cui sono soggette le tecniche di rilevamento, ne rende alquanto difficile l’individuazione.

Ma cosa significa e come ci si difende da un buffer overflow?

In questo articolo gli esperti di Cyberment, azienda leader specializzata in consulenza di sicurezza informatica, esamina nel dettaglio caratteristiche, conseguenze e modalità di prevenzione del buffer overflow.

Cosa sono le vulnerabilità buffer overflow

“Una vulnerabilità buffer overflow (anche chiamata buffer overrun) si verifica quando ad un programma si fornisce un surplus di dati rispetto alla sua effettiva capacità di memoria.

Come conseguenza, questo potrebbe segnalare errori o comportarsi in modo anomalo.

L’errore del software si concentra sui buffer, ovvero dispositivi di memorizzazione provvisoria di dati.

Il buffer overflow, dunque, si verifica quando la dimensione dei dati nel buffer supera la sua effettiva portata di archiviazione. Le informazioni in surplus, di conseguenza, traboccano in posizioni di memoria adiacenti, corrompendo o sovrascrivendo i dati ivi presenti.

Per tale motivo, attacchi di tipo buffer overflow possono comportare conseguenze anche molto gravi.

Spesso, infatti, consentono all’hacker di ottenere perfino l’accesso alla shell (SSH), il che equivale al pieno controllo del sistema operativo.

Qualora il cybercriminale non riesca pienamente nel suo intento, mediante un attacco di questo genere gli sarà possibile interrompere l’esecuzione dei programmi, causando per l’utente l’improvvisa negazione del servizio.

 Come funziona il buffer overflow

Le tecniche di buffer overflow utilizzate dagli hacker possono variare in base all’architettura di rete o al sistema operativo utilizzati dalla vittima.

In ogni caso, i dati extra che trasmetterà al programma conterranno probabilmente codice dannoso in grado di

  • innescare output anomali
  • e inviare nuove istruzioni all’applicazione.

Inoltre, nel caso in cui l’aggressore conosca il layout di memoria di un programma, potrebbe anche essere in grado di inserire intenzionalmente dati che non possono essere archiviati dal buffer. Ciò gli consentirà di sovrascrivere le posizioni di memoria che contengono il codice eseguibile e sostituirlo con script malevoli attraverso cui assumere il controllo del sistema.

Tipologie di buffer overflow

Esistono diverse tipologie di attacchi buffer overflow. Presentiamo qui di seguito una panoramica delle metodologie d’attacco più di diffuse.

Stack-based buffer overflow

Questa è la forma più comune di attacco. L’approccio basato sullo stack si verifica quando un utente malintenzionato invia dati contenenti codice dannoso ad un’applicazione che li memorizza in uno stack buffer.

Ciò sovrascrive i dati e concede il controllo dei trasferimenti all’attaccante.

Heap-based buffer overflow

Un attacco basato su heap è più difficile da eseguire rispetto all’approccio basato su stack. Implica che l’attacco debba inondare lo spazio di memoria di un programma al di là di quello che utilizza per le operazioni di runtime.

Format String Attack

Questo avviene quando un’applicazione elabora i dati di input come un comando o non li convalida in modo efficace.

Ciò consente all’attaccante di:

  • eseguire il codice
  • leggere i dati nello stack
  • o causare guasti nel programma

minacciando, di conseguenza, la sicurezza e la stabilità del sistema.

Gli attacchi di buffer overflow sono in genere causati da errori di codifica ed errori nello sviluppo delle applicazioni. In questi casi, l’applicativo non colloca i buffer di dimensioni adeguate e non riesce a verificare i problemi di overflow.

Casistiche simili sono particolarmente problematiche nei linguaggi di programmazione C e C ++, in quanto non sono provvisti di un sistema di protezione integrata. 

Come prevenire il sovraccarico del buffer

Quasi tutte le applicazioni ed i server web sono vulnerabili agli attacchi buffer overflow.

Gli ambienti scritti in linguaggi come Java e Python sono gli unici potenzialmente immuni agli attacchi, ad eccezione degli overflow nel loro interprete.

Gli sviluppatori di applicazioni possono prevenire la minaccia inserendo misure di sicurezza nel loro codice di sviluppo, nonché utilizzare linguaggi di programmazione che includono protezione integrata e test per rilevare e correggere errori.

Tra le principali raccomandazioni per prevenire il sovraccarico del buffer si annoverano:

  • evitare funzioni di libreria standard che non sono state controllate
  • e assicurarsi di rispettare i limiti che vengono applicati in fase di esecuzione.

Ciò verifica automaticamente che i dati scritti su un buffer siano entro i confini appropriati.

In sintesi, tra le tecniche più efficaci per contrastare un attacco di tipo buffer oveflow troviamo:

Address Space Layout Randomization (casualizzazione dello spazio degli indirizzi)

L’ASLR consiste nel rendere casuale l’indirizzo delle funzioni di libreria e le più importanti aree di memoria.

Così un attacco informatico che cerca di eseguire codice malevolo sul computer è costretto a cercare gli indirizzi del codice e dei dati che gli servono prima di poterli usare, provocando una serie di crash del programma dannoso.

Prevenzione dell’esecuzione dei dati

Questo metodo impedisce ad un attacco di poter eseguire codice in regioni non eseguibili distinguendo le aree di memoria come eseguibili o non eseguibili.

Structured Exception Handler Overwrite Protection (Gestione eccezioni strutturate)

Tutti i programmi implementano delle procedure per la gestione delle eccezioni, cioè quelle situazioni in cui si verificano particolari condizioni od eventi che alterano la normale esecuzione delle istruzioni. La funzionalità SEHOP, si occupa di esaminare in tempo reale quando viene generata un’eccezione in un qualunque programma in esecuzione. A questo punto, SEHOP provvede a verificare che la catena SEH non sia stata in alcun modo modificata.

Data Execution Prevention o DEP (prevenzione dell’esecuzione dei dati)

Grazie a questa tecnica, l’attaccante non può eseguire il codice se si trova nello spazio di memoria assegnato allo stack o all’heap e, in alcuni casi, anche in altre aree.

L’implementazione di misure di sicurezza sul codice di sviluppo e sui sistemi operativi, però, non è garanzia di successo. Quando viene scoperta una nuova vulnerabilità di buffer overflow, è fondamentale patchare rapidamente il software e assicurarsi che l’aggiornamento sia reso disponibile a tutti gli utenti.

Conclusioni

Analizziamo brevemente quanto fin qui illustrato in materia di buffer overflow:

  • Il buffer overflow si verifica quando ci sono in un buffer più dati di quanti se ne possano gestire, causando lo spostamento degli stessi nell’archivio adiacente
  • questa vulnerabilità può causare un arresto anomalo del sistema o, peggio, creare un punto di ingresso per un attacco informatico
  • i linguaggi di programmazione C e C ++ sono più vulnerabili a questo tipo di errore
  • le pratiche di sviluppo di app sicure dovrebbero includere test regolari per rilevare e correggere eventuali falle. Queste best practice dovrebbero includere: la protezione automatica a livello di codice e il controllo dei limiti in fase di esecuzione

Criticità come quella del buffer overflow non possono essere risolte autonomamente, per cui sarà necessario rivolgersi a consulenti esperti in ambito cybersecurity”.

 

https://cyberment.it/vulnerabilita-informatiche/buffer-overflow-cose-e-come-difendersi/

Twitter
Visit Us
LinkedIn
Share
YOUTUBE