Acerca de una vulnerabilidad en ...



Hace un a帽o, 21 de marzo de 2019, en un programa de recompensas de errores Mail.ru en HackerOne lleg贸 un muy buen informe de errores de maxarr . Al incrustar un byte cero (ASCII 0) en el par谩metro POST de una de las solicitudes de API de correo web que devolvi贸 un redireccionamiento HTTP, se vieron fragmentos de memoria no inicializada en los datos de redireccionamiento, en los que fragmentos de par谩metros GET y encabezados de otras solicitudes El mismo servidor.

Esta es una vulnerabilidad cr铆tica porque Las solicitudes incluyen cookies de sesi贸n. Unas horas m谩s tarde, se realiz贸 una correcci贸n temporal, que filtr贸 un byte cero (como result贸 m谩s tarde, esto no fue suficiente, porque exist铆a la posibilidad de inyectar CRLF / ASCII 13, 10, que le permite manipular los encabezados y los datos de la respuesta HTTP, esto es menos cr铆tico, pero sigue siendo desagradable) Al mismo tiempo, el problema se remiti贸 a analistas de seguridad y desarrolladores para encontrar y eliminar las causas del error.

Mail.ru mail es una aplicaci贸n muy complicada, una gran cantidad de componentes front-end / back-end diferentes, tanto de c贸digo abierto (muchas gracias a todos los desarrolladores de software libre) como de nuestro propio desarrollo, pueden participar en la respuesta. Fue posible excluir todos los componentes excepto nginx y openresty y localizar el problema antes de llamar a ngx.req.set_uri ()en un script OpenResty que no se comport贸 como se esperaba (pegue un byte cero o avance de l铆nea a trav茅s de par谩metros GET de reescribir a ngx_http_rewrite_module, que, seg煤n la documentaci贸n, se usa y, al parecer, deber铆a funcionar absolutamente de la misma manera). Se eliminaron las posibles consecuencias, se agreg贸 el filtrado m谩s estricto y se verific贸 que el filtrado elimina todos los vectores posibles. Pero el mecanismo que condujo a la p茅rdida de contenido de la memoria sigui贸 siendo un misterio. Un mes despu茅s, el informe de error se cerr贸 seg煤n lo autorizado, y el an谩lisis de las causas del error se pospuso hasta tiempos mejores.

OpenResty es un complemento muy popular que le permite escribir scripts Lua dentro de nginx, y se usa en varios proyectos de Mail.ru, por lo que el problema no se consider贸 resuelto. Y despu茅s de un tiempo, sin embargo, volvieron a ella para comprender las verdaderas causas, las posibles consecuencias y hacer recomendaciones para los desarrolladores. El c贸digo fuente fue excavado por Denis Denisov y Nikolai Ermishkin . Result贸 que:

  • nginx rewrite directory traversal ( SSRF) , , Nginx Amplify Gixy (, , ). OpenResty , .

    :

    location ~ /rewrite {
        rewrite ^.*$ $arg_x;
    }
    
    location / {
        root html;
        index index.html index.htm;
    }




    curl localhost:8337/rewrite?x=/../../../../../../../etc/passwd
    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    ...


  • nginx , , rewrite . nginx , , , , , . .

    (^@ )
    
    location ~ /memleak {
        rewrite ^.*$ "^@asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdasdf";
    }
    
    location / {
        root html;
        index index.html index.htm;
    }



    curl localhost:8337/secret -vv
    ...
    curl localhost:8337/memleak -vv
    ...
    Location: http://localhost:8337/secret
    ...

  • Nginx GET- rewrite GET-. nginx . POST . OpenResty GET POST , POST OpenResty .

    :

    location ~ /memleak {
        rewrite_by_lua_block {
            ngx.req.read_body();
            local args, err = ngx.req.get_post_args();
            ngx.req.set_uri( args["url"], true );
        }
    }
    
    location / {
        root html;
        index index.html index.htm;
    }
    


    :

    curl localhost:8337 -d "url=secret" -vv
    ...
    curl localhost:8337 -d "url=%00asdfasdfasdfasdfasdfasdfasdfasdf" -vv
    ...
    Location: http://localhost:8337/{... secret...}
    ...



El problema se inform贸 a los desarrolladores de nginx y OpenResty, los desarrolladores no consideran el problema como un error de seguridad en nginx, porque en nginx en s铆 no hay forma de explotar el error mediante la inyecci贸n de caracteres especiales, la soluci贸n para revelar el contenido de la memoria se public贸 el 16 de diciembre. En los 4 meses transcurridos desde el informe, no se realizaron cambios en OpenResty, aunque se entendi贸 que se necesitaba una versi贸n segura de la funci贸n ngx.req.set_uri (). El 18 de marzo de 2020, publicamos la informaci贸n; el 21 de marzo, OpenResty lanz贸 la versi贸n 1.15.8.3 , que agrega una verificaci贸n de URI.

Portswigger escribi贸 Tom茅 un buen art铆culo de OpenResty y Nginx (aunque el comentario de que solo se revela un peque帽o fragmento de memoria es incorrecto y enga帽oso, esto est谩 determinado por la longitud de la l铆nea que sigue al byte cero y, en ausencia de restricciones de longitud obvias, puede ser controlado por el atacante).

Entonces, 驴cu谩l fue el error y qu茅 hacer para evitarlo?


驴Hubo un error en nginx? S铆, lo fue, porque una p茅rdida de memoria es un error de todos modos.

驴Hubo un error en OpenResty? S铆, al menos el tema de la seguridad de la funcionalidad ofrecida por OpenResty no ha sido investigado ni documentado.

驴Se ha cometido un error de configuraci贸n / uso de OpenResty? S铆, porque en ausencia de una indicaci贸n expl铆cita, se hizo una suposici贸n no verificada sobre la seguridad de la funcionalidad utilizada.

驴Cu谩l de estos errores es una vulnerabilidad de seguridad de recompensa de $ 10,000?Para nosotros, esto generalmente no es importante. En cualquier software, especialmente en la uni贸n de varios componentes, especialmente aquellos proporcionados por diferentes proyectos y desarrolladores, nadie puede garantizar que todas las caracter铆sticas de su trabajo sean conocidas y documentadas y que no haya errores. Por lo tanto, cualquier vulnerabilidad de seguridad surge exactamente donde afecta la seguridad.

En cualquier caso, es una buena pr谩ctica normalizar o limitar / filtrar los datos de entrada, que van a cualquier m贸dulo / API externo, si no hay indicaciones expl铆citas y un claro entendimiento de que esto no es necesario.

Errata


De acuerdo con la experiencia del art铆culo anterior , para preservar la pureza del lenguaje:

una recompensa de errores - concurso de b煤squeda de errores
informe de errores -
redirecci贸n de notificaci贸n de error - redirecci贸n
opensorsny - c贸digo abierto
conocido como errata - trabajo en los errores

All Articles