Perché non provoca un overflow del buffer quando una stringa di grandi dimensioni viene convalidata per la lunghezza?

1

So che molti attacchi di overflow del buffer sui server vengono condotti inviando stringhe di input molto grandi attraverso un modulo HTML ecc. La tecnica di mitigazione per questo, consiste nel convalidare la lunghezza della stringa e assicurarsi che non sia molto lungo. Tuttavia, immagino che la stringa debba essere caricata in un buffer di dimensioni fisse in memoria per verificarne la lunghezza in primo luogo. Perché questo non può causare un buffer overflow?

    
posta Magnus 26.10.2016 - 17:51
fonte

1 risposta

3

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)

  1. Viene assegnato uno spazio di memoria per memorizzare la stringa in entrata.
  2. Una stringa viene letta dalla rete in blocchi. In molti casi la lunghezza non è nota.
  3. 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.

    
risposta data 26.10.2016 - 18:14
fonte

Leggi altre domande sui tag