Comprendere una dimostrazione del concetto

0

Ho trovato questo rapporto su una vulnerabilità di overflow del buffer in websocify . Non capisco come questa linea

$ curl http://example.com/$(python -c 'print "A"*5000')

attiva la vulnerabilità. Penso che l'indirizzo verrà espanso a http://example.com/AAAAAA... . Non so come websockify si riferisca a questo.

    
posta robert 30.03.2017 - 17:29
fonte

1 risposta

1

Utilizzo del codice dal bollettino:

ws_ctx_t *do_handshake(int sock) {
    char handshake[4096], response[4096], sha1[29], trailer[17];
    [...]
    offset = 0;
    for (i = 0; i < 10; i++) {
        len = ws_recv(ws_ctx, handshake+offset, 4096);
        if (len == 0) {
            handler_emsg("Client closed during handshake\n");
            return NULL;
        }
        offset += len;
        handshake[offset] = 0;
        if (strstr(handshake, "\r\n\r\n")) {
            break;
        }
        usleep(10);
    }
    [...]
}
  • offset = 0
  • ws_recv (ws_ctx, handshake + 0, 4096) = > 4096
  • offset = 4096
  • handshake [4096] = 0; // fuori dai limiti di scrittura.
  • no double-CRLF trovato, loop
  • ws_recv (ws_ctx, handshake + 4096, 4096) = > scrivere interamente fuori dai limiti.

Sembra che il ciclo sia stato progettato partendo dal presupposto che si verificherebbe solo a causa della ricezione di dati non sufficienti. Lanciava gocce di dati su di esso in ogni caso, ma dopo il primo passaggio non aveva più memoria correttamente vincolata.

Il terzo parametro avrebbe dovuto essere 4096 - offset , che rappresenta la quantità di spazio rimanente, non lo spazio totale del buffer (poiché ws_recv non ha ottenuto il buffer totale a meno di offset == 0). (O avevano bisogno di riallocare, eccetera).

    
risposta data 30.03.2017 - 17:57
fonte

Leggi altre domande sui tag