{"id":314,"date":"2026-05-15T08:10:36","date_gmt":"2026-05-15T12:10:36","guid":{"rendered":"https:\/\/juredev.com\/blog\/?p=314"},"modified":"2026-05-15T21:13:41","modified_gmt":"2026-05-16T01:13:41","slug":"como-parchear-la-vulnerabilidad-critica-de-nginx-en-debian-13-y-alpine-linux","status":"publish","type":"post","link":"https:\/\/juredev.com\/blog\/2026\/05\/como-parchear-la-vulnerabilidad-critica-de-nginx-en-debian-13-y-alpine-linux\/","title":{"rendered":"C\u00f3mo parchear la vulnerabilidad cr\u00edtica de NGINX en Debian 13 y Alpine Linux"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Gu\u00eda paso a paso con errores reales del proceso de actualizaci\u00f3n, cambios de sintaxis en HTTP\/2 y diferencias entre gestores de paquetes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En mayo de 2026 se public\u00f3 una <a href=\"https:\/\/cybernews.com\/security\/nginx-vulnerability-exposes-millions-of-websites\/\">vulnerabilidad cr\u00edtica en NGINX<\/a> que afecta a millones de servidores. Esta gu\u00eda documenta el proceso real de actualizaci\u00f3n en dos entornos distintos, Debian 13 y Alpine Linux, incluyendo los problemas encontrados y c\u00f3mo resolverlos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La vulnerabilidad: CVE-2026-42945 (NGINX Rift)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El detonante de esta actualizaci\u00f3n fue <strong>NGINX Rift<\/strong>, un heap buffer overflow cr\u00edtico que llevaba 18 a\u00f1os sin detectarse en el c\u00f3digo de NGINX. El fallo vive en <code>ngx_http_rewrite_module<\/code>, incluido en toda instalaci\u00f3n est\u00e1ndar de NGINX, y se activa cuando una directiva <code>rewrite<\/code> combina capturas PCRE sin nombre (la sintaxis <code>$1<\/code>, <code>$2<\/code>) con un string de reemplazo que contiene un signo de pregunta, seguido de otro <code>rewrite<\/code>, <code>if<\/code> o <code>set<\/code>. NGINX calcula el tama\u00f1o del buffer con un m\u00e9todo de escape pero escribe el resultado usando otro, lo que permite que los bytes escritos fuera del buffer sean controlados por el atacante.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F5 lo califica con <strong>CVSS v4 9.2<\/strong> (<strong>Cr\u00edtico<\/strong>). Si oper\u00e1s una instancia NGINX expuesta a internet con reglas de rewrite no triviales, configuraciones PHP, WordPress permalinks, API gateways, esto es relevante hoy. La correcci\u00f3n est\u00e1 disponible a partir de la versi\u00f3n 1.30.1.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Actualizaci\u00f3n de NGINX en Debian 13<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Estado<\/th><th class=\"has-text-align-center\" data-align=\"center\">Versi\u00f3n<\/th><\/tr><\/thead><tbody><tr><td>Vulnerable<\/td><td class=\"has-text-align-center\" data-align=\"center\">1.26.3<\/td><\/tr><tr><td>Corregida<\/td><td class=\"has-text-align-center\" data-align=\"center\">1.30.1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">1. Verificar la versi\u00f3n instalada<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de comenzar, conviene revisar qu\u00e9 versi\u00f3n de NGINX est\u00e1 ejecut\u00e1ndose y desde qu\u00e9 repositorio proviene.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nginx -v\napt policy nginx<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. Instalar dependencias y agregar el repositorio oficial<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Aunque Debian incluye NGINX en sus repositorios oficiales, las versiones suelen ser m\u00e1s conservadoras. Para obtener r\u00e1pidamente una versi\u00f3n corregida, se utiliza el repositorio oficial de NGINX.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Instalar dependencias necesarias<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring -y<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Importar la clave GPG oficial<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -fsSL https:\/\/nginx.org\/keys\/nginx_signing.key | \\\nsudo gpg --dearmor -o \/usr\/share\/keyrings\/nginx-archive-keyring.gpg<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Agregar el repositorio estable<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"deb &#91;signed-by=\/usr\/share\/keyrings\/nginx-archive-keyring.gpg] \\\nhttps:\/\/nginx.org\/packages\/debian `lsb_release -cs` nginx\" | \\\nsudo tee \/etc\/apt\/sources.list.d\/nginx.list<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Actualizar \u00edndices de paquetes<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. Instalar la versi\u00f3n corregida<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install nginx<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Recomendaci\u00f3n<\/strong>: Si ya tienes virtual hosts, certificados SSL o configuraciones personalizadas, selecciona mantener la versi\u00f3n local instalada cuando Debian pregunte sobre archivos de configuraci\u00f3n existentes. De lo contrario podr\u00edas sobrescribir configuraciones productivas.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">4. Iniciar y habilitar el servicio<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Problema encontrado<\/strong>: Despu\u00e9s de instalar desde el repositorio oficial, el servicio no qued\u00f3 iniciado autom\u00e1ticamente. Es necesario levantarlo manualmente.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl start nginx\nsudo systemctl enable nginx\nsudo systemctl status nginx<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5. Validar configuraci\u00f3n y versi\u00f3n<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nginx -t\nnginx -v<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La salida esperada de <code>nginx -t<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>syntax is ok\ntest is successful<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Advertencia HTTP\/2 en versiones recientes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A partir de NGINX 1.25.1, el soporte HTTP\/2 se desacopl\u00f3 de la directiva <code>listen<\/code> para permitir mayor flexibilidad en la configuraci\u00f3n. La sintaxis antigua sigue funcionando pero genera advertencias.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para localizar configuraciones con la sintaxis antigua:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo grep -E \"listen.*http2\" -R \/etc\/nginx\/<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>Sintaxis<\/th><\/tr><\/thead><tbody><tr><td><strong>Antigua<\/strong><\/td><td><code>listen 443 ssl http2;<\/code><\/td><\/tr><tr><td><strong>Nueva (recomendada)<\/strong><\/td><td><code>listen 443 ssl;<\/code> + <code>http2 on;<\/code> (dentro del bloque <code>server<\/code>)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code># Nueva sintaxis\nlisten 443 ssl;\nhttp2 on;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Resumen r\u00e1pido &#8211; Debian 13<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring -y\n\ncurl -fsSL https:\/\/nginx.org\/keys\/nginx_signing.key | \\\nsudo gpg --dearmor -o \/usr\/share\/keyrings\/nginx-archive-keyring.gpg\n\necho \"deb &#91;signed-by=\/usr\/share\/keyrings\/nginx-archive-keyring.gpg] \\\nhttps:\/\/nginx.org\/packages\/debian `lsb_release -cs` nginx\" | \\\nsudo tee \/etc\/apt\/sources.list.d\/nginx.list\n\nsudo apt update &amp;&amp; sudo apt install nginx\n\nsudo systemctl start nginx\nsudo systemctl enable nginx\nsudo nginx -t &amp;&amp; nginx -v<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Actualizaci\u00f3n de NGINX en Alpine Linux<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Estado<\/th><th class=\"has-text-align-center\" data-align=\"center\">Versi\u00f3n<\/th><\/tr><\/thead><tbody><tr><td>Vulnerable (rama estable)<\/td><td class=\"has-text-align-center\" data-align=\"center\">1.28.3-r1<\/td><\/tr><tr><td>Corregida (rama edge)<\/td><td class=\"has-text-align-center\" data-align=\"center\">1.30.1-r0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">En Alpine la rama estable a\u00fan ofrec\u00eda una versi\u00f3n vulnerable, por lo que fue necesario recurrir temporalmente a la rama edge. La clave es hacerlo de forma controlada usando una etiqueta (@edge) para limitar exclusivamente qu\u00e9 paquetes se instalan desde ah\u00ed, sin desestabilizar el resto del sistema.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Agregar el repositorio Edge con etiqueta restringida<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>vi \/etc\/apk\/repositories<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Agregar al final del archivo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@edge https:\/\/dl-cdn.alpinelinux.org\/alpine\/edge\/main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Guardar y salir: <code>ESC<\/code> &#8211;&gt; <code>:wq<\/code> &#8211;&gt; <code>ENTER<\/code><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>\u00bfPor qu\u00e9 usar la etiqueta <\/strong><code>@edge<\/code><strong>?<\/strong> Sin ella, Alpine podr\u00eda actualizar otros paquetes del sistema desde la rama <code>edge<\/code>, lo cual puede introducir inestabilidad. La etiqueta restringe su uso \u00fanicamente a los paquetes que la especifiquen expl\u00edcitamente.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">2. Actualizar \u00edndices e instalar desde Edge<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apk update\nsudo apk add nginx@edge<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Problema encontrado:<\/strong> Si el repositorio no fue agregado correctamente con <code>@edge<\/code>, Alpine devuelve:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>WARNING: The repository tag for world dependency 'nginx@edge' does not exist<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verificar con <code>cat \/etc\/apk\/repositories<\/code> que la l\u00ednea tiene exactamente el prefijo <code>@edge<\/code> y que el comando usa <code>nginx@edge<\/code>. Ambos deben coincidir.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">3. Reiniciar y validar<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo rc-service nginx restart\nsudo nginx -v\nsudo nginx -t<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Archivo <code>.apk-new<\/code> generado autom\u00e1ticamente<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Durante la instalaci\u00f3n, Alpine puede generar <code>\/etc\/nginx\/nginx.conf.apk-new<\/code>. Esto es normal: el gestor crea ese archivo como respaldo cuando detecta una configuraci\u00f3n modificada localmente. Si <code>nginx -t<\/code> devuelve validaci\u00f3n exitosa, el archivo puede ignorarse o compararse manualmente m\u00e1s adelante.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Recomendaciones finales<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s de aplicar actualizaciones cr\u00edticas en NGINX:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Verifica siempre la versi\u00f3n activa con <code>nginx -v<\/code><\/li>\n\n\n\n<li>Ejecuta <code>nginx -t<\/code> antes de reiniciar servicios productivos<\/li>\n\n\n\n<li>Revisa cambios de sintaxis entre versiones mayores (especialmente HTTP\/2)<\/li>\n\n\n\n<li>Comprueba que el servicio realmente qued\u00f3 iniciado y habilitado<\/li>\n\n\n\n<li>En Alpine, evita habilitar repositorios <code>edge<\/code> globalmente sin etiquetas restrictivas<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Parchear es solo el primer paso<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Actualizar NGINX parece una tarea simple, pero en escenarios reales aparecen detalles operativos que no siempre est\u00e1n en la documentaci\u00f3n oficial: repositorios sin el parche, servicios que no reinician autom\u00e1ticamente, cambios de sintaxis silenciosos y diferencias entre gestores de paquetes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Documentar estos hallazgos facilita repetir el procedimiento en m\u00faltiples servidores o automatizarlo mediante Ansible, Terraform o pipelines de CI\/CD.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gu\u00eda paso a paso con errores reales del proceso de actualizaci\u00f3n, cambios de sintaxis en HTTP\/2 y diferencias entre gestores de paquetes. En mayo de 2026 se public\u00f3 una vulnerabilidad cr\u00edtica en NGINX que afecta a millones de servidores. Esta gu\u00eda documenta el proceso real de actualizaci\u00f3n en dos entornos distintos, Debian 13 y Alpine [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[24,28],"class_list":["post-314","post","type-post","status-publish","format-standard","hentry","category-guia","tag-linux","tag-seguridad"],"_links":{"self":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/314","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/comments?post=314"}],"version-history":[{"count":0,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/314\/revisions"}],"wp:attachment":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/media?parent=314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/categories?post=314"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/tags?post=314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}