¿El hecho de anular la referencia a un puntero nulo en C representa un riesgo de seguridad si el programa no es un demonio, sino un pequeño script presentado como un proceso separado para cada solicitud?

4

El siguiente código es parte de un programa que se genera en cada solicitud del script ruby on rails de nginx:

static void time_t_to_dos_time(time_t user_supplied_time_t, int *dos_date, int *dos_time)
{
    struct tm *t = localtime(&user_supplied_time_t);

    *dos_time = t->tm_sec / 2 + t->tm_min * 32 + t->tm_hour * 2048;
    *dos_date = t->tm_mday + (t->tm_mon + 1) * 32 +
        (t->tm_year + 1900 - 1980) * 512;
}

localtime devuelve 0 si el valor es demasiado grande para caber en un struct tm . Entonces, cuando el programa intenta leer t->tm_sec , intentará leer la dirección de memoria 0.
En ese caso, el programa genera inmediatamente SIGSEGV y el servidor devuelve:

HTTP/1.1 502 Bad Gateway
Content-Length: 13
Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'
Strict-Transport-Security: max-age=31536000
Vary: Authorization,Accept-Encoding
X-Content-Type-Options: nosniff
X-Frame-Options: deny
X-XSS-Protection: 1; mode=block
Date: Tue, 28 Jun 2016 12:59:10 GMT

502: Failure

Me parece que es un error simple sin ningún problema de seguridad, ya que el programa está diseñado para ejecutarse solo en ese sitio web.
¿Sería esto correcto?

    
pregunta user2284570 28.06.2016 - 15:02
fuente

2 respuestas

2

La anulación de un puntero nulo puede ser un riesgo de seguridad en algunas arquitecturas y sistemas operativos, y si se trata de un demonio o un controlador o si la función o el método en sí accede al sistema de archivos no es el único factor determinante en la evaluación de riesgos. Uno no puede enumerar fácilmente todas las explotaciones de operaciones indeterminadas solo con el código fuente.

En el código provisto, el nulo está en el RHS (lado derecho) de la asignación en el AST correspondiente (árbol de símbolos abstractos) en los seis casos. Eso significa que no se puede violar la seguridad dentro de la función debido a una t nula.

Hay un pequeño riesgo, pero implica más que la falta de referencia mencionada. Implica el uso posterior del espacio de direcciones al que apuntan los dos últimos argumentos. Si los resultados no válidos colocados en el destino de esos punteros podrían causar una violación de la seguridad, es importante probar t antes de anular la referencia.

    
respondido por el Douglas Daseeco 24.01.2017 - 02:25
fuente
2

No realizar ninguna comprobación si un puntero dado es NULL puede no ser explotable en absoluto, pero no creo que en su caso sea importante si el programa se ejecuta como demonio o no. La pregunta crucial aquí es más si el usuario controla o no los datos que pueden llevar a una falta de referencia al puntero nulo.

En cualquier caso, es posible que desee solucionar este problema. Es nunca una buena idea dejar un error en el código que puede bloquear un programa una vez que lo haya identificado y una solución no sea costosa. Las circunstancias que ahora llevan a la conclusión "no explotable" podrían cambiar eventualmente o el npd podría causar daños a su servidor. Entonces, si fuera usted, simplemente agregaría un if (t == NULL) para arreglar esto.

Por cierto, si tal error conduce a la ejecución del código, entonces no importa si esto sucede en el daemon o en un subproceso. Lo único que importa es el usuario del sistema operativo. La ejecución del código siempre es mala, incluso si es con un usuario de SO limitado.

    
respondido por el kaidentity 24.01.2017 - 12:19
fuente

Lea otras preguntas en las etiquetas