¿Qué significa tener un “nombre de archivo con bytes NULOS en instancias serializadas”?

6

Estaba navegando this page , que redirigió a esta vulnerabilidad porque soy un desarrollador de Java y yo Estoy al tanto de la biblioteca afectada.

Básicamente, la vulnerabilidad dice:

  

Se descubrió que Apache Commons FileUpload se manejó incorrectamente   nombres de archivos con bytes nulos en instancias serializadas. Un atacante podria   Utilice este problema para escribir en archivos arbitrarios.

Simplemente no quiero saber qué significa esta declaración?

  

... nombres de archivos con bytes nulos en instancias serializadas.

    
pregunta Muhammad Gelbana 23.11.2013 - 21:17
fuente

2 respuestas

12

Un byte nulo es un byte con el valor cero, es decir, 0x00 en hexadecimal.

Ha habido una vulnerabilidad de seguridad relacionada con los bytes nulos. Esto ocurre porque C usa bytes nulos como terminador de cadena. Otros idiomas (Java, PHP, etc.) no tienen un terminador de cadena; almacenan la longitud de cada cadena por separado.

Ahora, considere una aplicación web Java que acepta cargas de archivos. Tal vez queremos permitir que los usuarios carguen archivos .jpg , pero nada más. De hecho, si un usuario puede cargar un archivo .jsp , esta será una vulnerabilidad de seguridad grave.

Lo que un hacker podría intentar es cargar hack.jsp<NUL>.jpg . Vamos a pensar cómo se procesará esto. Primero, Java mirará el nombre del archivo, verá que termina en .jpg y permitirá la carga. Luego llama a la biblioteca del sistema operativo, que está escrita en C. C ve el carácter <NUL> como el terminador de cadena, por lo que guarda el archivo como hack.jsp

Muchos idiomas solucionan esto al deshabilitar explícitamente los bytes en los nombres de archivos. Sé que Python y PHP hacen esto. Sin embargo, si su idioma no lo hace por usted, debe hacerlo usted mismo. Más información - OWASP: Inyección de byte nulo

No sé exactamente cómo se relacionan las "instancias seriadas" con esto, pero creo que esto te da una idea de lo que está pasando.

    
respondido por el paj28 23.11.2013 - 22:34
fuente
3

Cada carácter tiene un valor numérico según lo dictado por el conjunto de caracteres correspondiente. Entonces, por ejemplo, típicamente A es 65 y a es 97 . Pero si el número es 0 , entonces realmente no es un carácter, es un "nulo"; que básicamente significa no un carácter .

En C y C ++, este carácter "nulo" se usa para indicar el final de una cadena. Así que "HOLA" se almacena así:

 H   E   L   L   O  
72  69  76  76  79  00 

El 00 en el final dice "para aquí". Pero no todos los marcos usan cadenas en C y su formato de "terminador nulo"; de hecho, la mayoría no lo hacen. En su lugar, la longitud de la cadena se almacena por adelantado y el contenido real puede contener cualquier cosa, incluidos estos caracteres null : caracteres cuyo valor numérico es 0 .

Entonces, en este caso, si el nombre contiene uno de estos caracteres null , a la mayoría del código no le importará; Se permiten nulos bytes. Pero cuando el nombre llega al código de FileUpload, ese nulo termina causando cierta confusión. Algunos de los códigos piensan que el nombre termina con el byte nulo , mientras que otros bits piensan que el byte nulo es solo otra letra. Esa confusión, donde dos bits de código no están de acuerdo sobre cuál es el nombre en realidad, conduce a una vulnerabilidad de seguridad.

    
respondido por el tylerl 24.11.2013 - 07:28
fuente

Lea otras preguntas en las etiquetas