Che cos'è un buffer overflow?

In un programma informatico, le variabili sono allocate con blocchi di memoria di dimensioni fisse. Dopo l'allocazione di questa memoria, il programma può memorizzare e recuperare i dati da queste posizioni. I buffer overflow si verificano quando la quantità di dati scritti in uno di questi blocchi di memoria supera la sua dimensione. Di conseguenza, la memoria allocata per altri scopi viene sovrascritta, il che può avere diversi effetti sul programma.

Download the eBook Richiedi una Demo

Che cos'è un buffer overflow?

Un attacco di overflow del buffer

Un attacco di buffer overflow è un cyberattacco comune che sfrutta deliberatamente una vulnerabilità di buffer overflow in cui i dati controllati dall'utente vengono scritti in memoria. Inviando più dati di quelli che possono essere inseriti nel blocco di memoria allocato, l'aggressore può sovrascrivere i dati in altre parti della memoria.

Gli aggressori possono eseguire attacchi di buffer overflow per vari motivi, come la sovrascrittura di codice o dati critici per mandare in crash il programma, l'iniezione di codice dannoso da eseguire nel programma o la modifica di valori critici, cambiando il flusso di esecuzione del programma.

Minaccia di overflow del buffer

Gli attacchi di buffer overflow possono essere utilizzati per raggiungere diversi obiettivi, tra cui:

  • Denial of Service (DoS) Attacks: All'interno dello spazio di memoria di un'applicazione ci sono puntatori, codice e altri dati che sono fondamentali per la capacità di esecuzione del programma. La sovrascrittura di questi dati potrebbe causare l'arresto del programma, con conseguente attacco DoS.
  • Esecuzione di codice: Un obiettivo comune degli exploit di buffer overflow è quello di forzare l'applicazione vulnerabile a eseguire il codice fornito dall'attaccante. Ciò consente all'aggressore di eseguire codice sul sistema interessato con lo stesso accesso e le stesse autorizzazioni dell'applicazione sfruttata.
  • Bypass del controllo di accesso: Lo sfruttamento dei buffer overflow per l'esecuzione di codice può elevare l'accesso di un aggressore al sistema di destinazione. Questo accesso ampliato può poi essere utilizzato per eseguire attacchi successivi.

Tipi di attacchi di buffer overflow

Un attacco di buffer overflow può essere eseguito in diversi modi, ma alcuni degli esempi più comuni includono:

  • Overflow del buffer basato sullo stack: Lo stack del programma contiene dati critici del flusso di controllo di un'applicazione, come i puntatori di ritorno delle funzioni, ed è un obiettivo comune degli attacchi di buffer overflow. La sovrascrittura di un puntatore di ritorno può far sì che il programma salti ai dati controllati dall'aggressore e li esegua come codice, consentendo all'aggressore di eseguire codice con le stesse autorizzazioni dell'applicazione.
  • Overflow del buffer basato sull'heap: L'heap del programma viene utilizzato per allocare dinamicamente la memoria alle variabili la cui dimensione non è definita al momento della compilazione del programma. Sfruttando una vulnerabilità di buffer overflow e inondando l'heap del sistema, un aggressore può sovrascrivere i dati critici dell'applicazione.
  • Attacchi alle stringhe di formato: Le funzioni della famiglia printf in C/C++ possono utilizzare stringhe di formato, che consentono la lettura e la scrittura della memoria. Se i dati forniti dall'utente vengono interpretati come una stringa di formato, possono essere utilizzati per perdere o modificare valori sensibili.

Esempi di attacchi di overflow del buffer

Le vulnerabilità di buffer overflow sono comuni in C/C++ e si verificano quando un programma alloca una porzione di memoria di dimensioni fisse e poi vi copia i dati in modo insicuro. Il seguente esempio di codice contiene una vulnerabilità di overflow del buffer:

char buf[BUFSIZE];

gets(buf);

In questo esempio di codice, la variabile buf ha una dimensione fissa di BUFSIZE. Tuttavia, la funzione gets leggerà i dati e li memorizzerà all'interno di buf fino a raggiungere il terminatore nullo (0x00). Un aggressore può sfruttarlo per sovrascrivere i dati oltre la fine di buf.

Gli attacchi alle stringhe di formato sono un caso particolare di buffer overflow. Il seguente esempio di codice contiene una vulnerabilità della stringa di formato.

#include <stdio.h>

void main(int argc, char **argv)

{

 printf(argv[1]);

}

In questo esempio, il programma prende l'input fornito dall'utente da argv[1] e lo stampa sul terminale. Tuttavia, se l'input dell'utente contiene una stringa di formato, questo potrebbe consentire a un aggressore di leggere o modificare la memoria del sistema.

Come prevenire i buffer overflow

Le vulnerabilità di overflow del buffer possono essere prevenute da:

  • Eseguire la convalida dell'ingresso: Le vulnerabilità di buffer overflow si verificano quando un programma fa delle ipotesi sull'input fornito dall'utente senza convalidare tali ipotesi. Controllare la lunghezza dei dati o copiare solo un certo numero di byte in una posizione di memoria può aiutare a evitare gli overflow del buffer.
  • Abilitazione della protezione della memoria di runtime: La maggior parte dei computer dispone di protezioni integrate contro i buffer overflow, come Address Space Layout Randomization (ASLR), Data Execution Prevention (DEP) e Structured Exception Handling Overwrite Protection. L'attivazione di queste protezioni rende gli attacchi di buffer overflow molto più difficili da eseguire.
  • Evitare le funzioni vulnerabili: I buffer overflow sono resi possibili da funzioni vulnerabili come gets, scanf e strcpy in C/C++. Le vulnerabilità di overflow del buffer possono essere evitate utilizzando correttamente le versioni sicure di queste funzioni.
  • Utilizzare linguaggi sicuri per la memoria: I buffer overflow si verificano nei linguaggi di programmazione con variabili di dimensioni fisse e senza protezioni della memoria. L'uso di altri linguaggi di programmazione, come Python, Java o C#, rende i buffer overflow difficili o impossibili.
  • Prevenire lo sfruttamento delle vulnerabilità: applicazione web Firewall (WAF) e le soluzioni di Application Web and API Protection (WAAP) possono identificare e bloccare i tentativi di sfruttamento delle vulnerabilità di buffer overflow. Questo riduce il rischio che gli attacchi di buffer overflow rappresentano per la sicurezza delle applicazioni aziendali (AppSec).

Protezione da buffer overflow con CloudGuard AppSec

Lo sfruttamento delle vulnerabilità di buffer overflow può causare crash del programma, fughe di dati o l'esecuzione di codice dannoso sui sistemi di un'organizzazione. Scopra come CloudGuard AppSec può aiutarla a proteggersi dagli attacchi di buffer overflow e da altre minacce in questo eBook. Quindi, si iscriva a una demo gratuita per vedere di persona come CloudGuard AppSec può migliorare la sicurezza delle sue applicazioni cloud.

×
  Feedback
Questo sito Web utilizza i cookie per motivi funzionali e a scopo di analisi e marketing. Continuando a utilizzare il sito Web, accetti implicitamente l'uso dei cookie. Per ulteriori informazioni, si prega di leggere la nostra Informativa sui cookie.
OK