El 13 de mayo se corrigió una vulnerabilidad en el popular servidor web nginx para sistemas de alta carga: CVE-2026-42945, que podría llevar a una ejecución remota de código (RCE). La vulnerabilidad apareció hace 18 años (en 2008) en la versión 0.6.27.
Para explotarla, debe haber una combinación específica de directivas en la configuración del servidor, no necesariamente presentes en todos los casos, pero que pueden aparecer ocasionalmente, por ejemplo:
rewrite ^(.*) /new?c=1;
set $myvar $1;
return 200 $myvar;
Detalles importantes:
- primero va la directiva rewrite, donde (el primer argumento) la expresión regular con un parámetro capturado (algo entre paréntesis) se reemplaza por (el segundo argumento) una ruta que contiene un signo de interrogación;
- la directiva set (también podría ser un segundo rewrite o if), que utiliza el parámetro capturado de la ruta reescrita (en este caso, $1).
La vulnerabilidad funciona así:
- la primera directiva rewrite, al encontrar el signo de interrogación, establece una bandera interna is_args, que significa "ahora estamos recopilando parámetros GET para la URL reemplazada, debemos escapar todo", y (en esto radica el error) se olvida de restablecer esta bandera al final de su ejecución;
- la directiva set siguiente, al formar el valor para $myvar, aplica erróneamente la bandera is_args establecida anteriormente, y escribe en my_var el valor escapado del parámetro capturado $1; el problema es que el buffer para $myvar se asigna antes, aún antes de realizar las sustituciones, y su longitud se calcula con is_args=0, es decir, el valor escapado resulta ser más largo que el buffer asignado, lo que provoca que la escritura ocurra fuera del buffer asignado en otras estructuras de datos del servidor. Para que esto ocurra, basta con enviar una solicitud con caracteres que deben ser escapados, como señales de "más", en el lugar donde se captura el parámetro de la expresión regular.
Si en el host no hay ALSR, esta vulnerabilidad puede ser explotada para la ejecución remota de código con los permisos del proceso de nginx, hay PoC (no es un exploit en sí, es una demostración en una sandbox).
La vulnerabilidad se ha corregido en la rama estable de nginx 1.30.1, y en la nueva versión de desarrollo 1.31.0. enlace al commit.
Es notable que hace 14 años (en 2012) se corrigió un error similar en otro lugar cercano. en otro lugar cercano.
——-
En el sitio de F5 hay una recomendación para neutralizar temporalmente la vulnerabilidad en caso de no poder actualizar rápidamente la versión de nginx: se deben reemplazar los parámetros posicionales por parámetros con nombre, y en este caso, según ellos, la vulnerabilidad no se manifestará. Ejemplo de allí:
era: rewrite ^\/users\/([0-9]+)\/profile\/(.*)$ \/profile.php?id=$1&tab=$2 last;
ahora: rewrite ^\/users\/(?[0-9]+)\/profile\/(?
La información sobre la vulnerabilidad fue proporcionada por Zhenpeng (Leo) Lin de DepthFirst. Además, él también informó sobre los siguientes problemas que también fueron corregidos:
- CVE-2026-40701 (commit) use-after-free al usar ssl_verify_client+ssl_ocsp (aparentemente sin RCE)
- CVE-2026-42934 (commit) lectura fuera de los límites del búfer en el analizador utf-8 bajo circunstancias específicas, puede llevar a una pequeña filtración de datos o a un fallo del proceso de trabajo
- CVE-2026-42946 (commit) asignación excesiva de memoria y lectura fuera de los límites del búfer al usar módulos scgi/uwsgi, el problema se manifiesta en presencia de un backend malicioso (upstream) a través de los protocolos especificados, o durante un ataque mitm en la comunicación con el backend, puede llevar a la lectura de memoria de nginx o al fallo del proceso de trabajo
Fuente: linux.org.ru
