Cosa significa avere un "nome file con byte NULL in istanze serializzate"?

6

Stavo visualizzando questa pagina , che ha reindirizzato a questa vulnerabilità perché sono uno sviluppatore Java e io m consapevole della libreria interessata.

Fondamentalmente la vulnerabilità dice:

It was discovered that Apache Commons FileUpload incorrectly handled file names with NULL bytes in serialized instances. An attacker could use this issue to possibly write to arbitrary files.

Volevo solo sapere cosa significa questa affermazione?

...file names with NULL bytes in serialized instances.

    
posta Muhammad Gelbana 23.11.2013 - 21:17
fonte

2 risposte

12

Un byte null è un byte con il valore zero, cioè 0x00 in hex.

Ci sono state vulnerabilità di sicurezza legate a byte null. Questi si verificano perché C utilizza byte null come terminatore di stringa. Altre lingue (Java, PHP, ecc.) Non hanno un terminatore di stringhe; memorizzano la lunghezza di ogni stringa separatamente.

Ora, considera un'applicazione Web Java che accetta i caricamenti di file. Forse vogliamo consentire agli utenti di caricare file .jpg , ma nient'altro. Infatti, se un utente può caricare un file .jsp questa sarà una seria vulnerabilità alla sicurezza.

Ciò che un hacker potrebbe provare è caricare hack.jsp<NUL>.jpg Pensa a come verrà elaborato. Per prima cosa, Java guarderà il nome del file, vedrà che termina in .jpg e permetterà il caricamento. Quindi chiama la libreria del sistema operativo, che è scritta in C. C vede il carattere <NUL> come terminatore di stringa, quindi salva il file come hack.jsp

Molte lingue risolvono questo problema disabilitando esplicitamente i byte nei nomi dei file. So che Python e PHP fanno questo. Tuttavia, se la tua lingua non lo fa per te, devi farlo da solo. Ulteriori informazioni - OWASP: Injection Null-Byte

Non so in che modo esattamente "istanze serializzate" sono correlate a questo, ma penso che questo ti dia un'idea di cosa sta succedendo.

    
risposta data 23.11.2013 - 22:34
fonte
3

Ogni carattere ha un valore numerico dettato dal set di caratteri corrispondente. Quindi, ad esempio, in genere A è 65 e a è 97 . Ma se il numero è 0 , allora non è realmente un personaggio, è un "nulla"; che in pratica significa non un carattere .

In C e C ++, questo carattere "null" è usato per indicare la fine di una stringa. Quindi "HELLO" è memorizzato in questo modo:

 H   E   L   L   O  
72  69  76  76  79  00 

Il 00 alla fine dice "fermati qui". Ma non tutti i framework usano C-string e il loro formato "null terminator"; in effetti la maggior parte non lo fa. Invece, la lunghezza della stringa è archiviata in primo piano e il contenuto effettivo può contenere qualsiasi cosa, inclusi questi caratteri null - caratteri il cui valore numerico è 0 .

Quindi, in questo caso, se il nome contiene uno di questi caratteri null , la maggior parte del codice non vi preoccuperà; I null byte sono consentiti. Ma quando il nome arriva al codice di FileUpload, quel null finisce per creare confusione. Parte del codice pensa che il nome termini con il byte null , mentre altri bit pensano che il byte null sia solo un'altra lettera. Questa confusione, in cui due bit di codice non concordano su cosa sia effettivamente il nome, porta quindi a una vulnerabilità della sicurezza.

    
risposta data 24.11.2013 - 07:28
fonte

Leggi altre domande sui tag