¿La apertura de un archivo arbitrario en un idioma (como Python) representa un riesgo para la seguridad?

2

Por ejemplo, si un cliente envía un archivo a un servidor y el servidor abre el archivo en modo de lectura con Python:

with open(uploaded_file, "r") as f:
    # Do something

¿Se podría abusar del acto de abrir un archivo con un archivo ingenioso del cliente? ¿Depende del idioma utilizado por el servidor?

    
pregunta JGut 11.02.2018 - 11:27
fuente

2 respuestas

4

No.

Si el nombre de archivo está controlado por el usuario, entonces puede abrirse a vulnerabilidades (por ejemplo, un atacante podría intentar leer los archivos de configuración con la contraseña de la base de datos). Pero solo abrir un identificador de archivo para un archivo cargado no puede hacer mucho.

Tal vez si el mecanismo subyacente tratara de leer todo el archivo con fines de almacenamiento en búfer, podría llenar la RAM y bloquear el proceso, pero Python no hace eso: para leer todo el archivo, primero debe llamar a f.read() - pero eso es justo lo que haces con eso, y no abrir el archivo. Sólo abrir el archivo es inofensivo.

    
respondido por el Luc 11.02.2018 - 13:44
fuente
2

Los sistemas operativos generalmente tienen un número limitado de archivos que pueden abrir a la vez (específicamente, un número limitado de descriptores de archivos o fd s en sistemas similares a Unix, o HANDLE s en Windows). Si permite que las personas abran un número arbitrario de personas sin cerrarlas, entonces podría ser posible agotar ese límite, lo que evitaría que el sistema operativo abra más archivos y probablemente cause un mal funcionamiento o incluso una falla. Sin embargo, sería difícil explotarlo por algo más que la denegación de servicio. Además, los programas pueden tener cuotas (por debajo del límite del sistema) de cuántos archivos pueden abrir, por lo que un solo programa de comportamiento incorrecto no puede hacer demasiado, y todos los archivos de un proceso se publican cuando el proceso termina, por lo que normalmente es fácil suficiente para restaurar la función (de hecho, la mayoría de los programas se bloquearían en poco tiempo).

Sin embargo, si está permitiendo que la gente le diga a su servidor que abra un archivo, sería una buena idea tener un límite de cuántos se pueden abrir a la vez y cerrar el archivo (automáticamente, si el usuario no lo hace). t Indíquele que suceda primero) en el menor tiempo posible.

Otro riesgo podría ser abrir conexiones de red, dependiendo de qué sistema operativo esté ejecutando y qué tipos de ruta acepta. Por ejemplo, si el sistema acepta rutas de estilo de red de Windows ( \server\share\path\to\file ) o SMB (el protocolo de red de Windows, implementado en Unix-like en el kit de herramientas de Samba) rutas ( smb://server/share/path ), u otras formas de acceder a cualquier tipo de red El sistema de archivos que aún no está montado (o "asignado" para usar el antiguo término de Windows) al sistema de archivos local, podría causar que su servidor abra una conexión de red a la caja de un atacante y posiblemente intente autenticar. Esto podría revelar información sobre el servidor y podría proporcionar un vector para que los atacantes intenten comprometer el servidor a través de respuestas maliciosas.

Por lo tanto, también debes restringir los nombres de los archivos a cosas en las que puedas estar seguro de que no son rutas remotas. En general, probablemente debería evitar dejar que se especifiquen las rutas; solo permite nombres de archivos solamente. Sin embargo, esos son los únicos dos riesgos en los que puedo pensar. De lo contrario, es bastante seguro.

    
respondido por el CBHacking 11.02.2018 - 15:55
fuente

Lea otras preguntas en las etiquetas