[{"data":1,"prerenderedAt":568},["ShallowReactive",2],{"switcher-blog-pareja":3,"art-gitea-cve-2026-20896-docker-explotacion-activa-es":6},{"es":4,"en":5},"\u002Fes\u002Fblog\u002Fgitea-cve-2026-20896-docker-explotacion-activa\u002F","\u002Fen\u002Fblog\u002Fgitea-cve-2026-20896-docker-active-exploitation\u002F",{"id":7,"title":8,"author":9,"body":10,"date":552,"description":553,"extension":554,"image":555,"meta":556,"navigation":557,"pareja":558,"path":559,"seo":560,"stem":561,"tags":562,"__hash__":567},"blogEs\u002Fes\u002Fblog\u002Fgitea-cve-2026-20896-docker-explotacion-activa.md","Gitea CVE-2026-20896: la imagen Docker que dejaba entrar a cualquiera como admin","Paco Cubel",{"type":11,"value":12,"toc":535},"minimark",[13,18,27,46,50,68,78,82,134,144,148,159,163,173,184,197,201,204,209,252,258,262,273,308,315,319,337,354,370,374,381,415,418,422,425,447,451,454,483,489,493,500,503,507,531],[14,15,17],"h2",{"id":16},"un-valor-por-defecto-que-no-debería-estar-ahí","Un valor por defecto que no debería estar ahí",[19,20,21,22,26],"p",{},"Si tienes tu propio Gitea corriendo en Docker para alojar el código de tu empresa —cada vez más pymes lo hacen para no depender de GitHub—, este te toca de cerca. La imagen oficial de Gitea venía con una configuración por defecto que, resumida, significaba esto: ",[23,24,25],"strong",{},"cualquier cliente de internet podía decirle al servidor «soy el administrador» y el servidor se lo creía",".",[19,28,29,30,33,34,37,38,41,42,45],{},"Se le ha asignado ",[23,31,32],{},"CVE-2026-20896",", con una puntuación CVSS de ",[23,35,36],{},"9.8 sobre 10",". Está parcheado desde la versión ",[23,39,40],{},"1.26.3",", pero lo que ha encendido las alarmas esta semana es otra cosa: ",[23,43,44],{},"Sysdig ha detectado los primeros sondeos reales contra servidores Gitea expuestos en internet",". Todavía en fase de reconocimiento, pero ya con nombre y apellidos.",[14,47,49],{"id":48},"en-una-frase","En una frase",[19,51,52,53,57,58,64,65,26],{},"Gitea permite autenticar usuarios a través de un proxy inverso: el proxy valida al usuario y le pasa a Gitea una cabecera ",[54,55,56],"code",{},"X-WEBAUTH-USER"," con el nombre de la cuenta. El problema es que ",[23,59,60,61],{},"la imagen Docker venía configurada con ",[54,62,63],{},"REVERSE_PROXY_TRUSTED_PROXIES=*",", es decir, confiaba en esa cabecera ",[23,66,67],{},"viniera de donde viniera",[19,69,70,71,74,75,26],{},"Traducido: si tenías activada la autenticación por proxy inverso, un atacante podía mandar directamente una petición con ",[54,72,73],{},"X-WEBAUTH-USER: admin"," y ",[23,76,77],{},"entrar como el administrador sin contraseña, sin token, sin nada",[14,79,81],{"id":80},"a-quién-afecta","A quién afecta",[83,84,85,103,124],"ul",{},[86,87,88,91,92,95,96,98,99,102],"li",{},[23,89,90],{},"Versiones",": imágenes Docker de Gitea ",[23,93,94],{},"hasta la 1.26.2 incluida",". A partir de ",[23,97,40],{}," el comodín ",[54,100,101],{},"*"," se ha quitado y la autenticación por proxy pasa a ser opt-in explícito.",[86,104,105,108,109,112,113,116,117,120,121,123],{},[23,106,107],{},"Condición clave",": te afecta si despliegas Gitea con la ",[23,110,111],{},"imagen Docker"," y tienes activada la ",[23,114,115],{},"autenticación por proxy inverso"," (",[54,118,119],{},"ENABLE_REVERSE_PROXY_AUTHENTICATION","). Si no usas ese modo de login, el vector directo no aplica —pero aun así conviene actualizar y revisar la config, porque el valor ",[54,122,101],{}," no debería estar nunca.",[86,125,126,129,130,133],{},[23,127,128],{},"Superficie",": hay unas ",[23,131,132],{},"6.200 instancias de Gitea expuestas directamente a internet",". No todas con el reverse-proxy auth activo, pero suficientes para que valga la pena escanear a lo bruto. Y eso es exactamente lo que está pasando.",[19,135,136,139,140,143],{},[23,137,138],{},"Qué se ve ya en la práctica:"," Sysdig rastreó el primer intento a un nodo de salida de ProtonVPN (",[54,141,142],{},"159.26.98[.]241","). De momento es reconocimiento automatizado —escaneo de puertos HTTP(S), fingerprinting de Gitea e intentos de bypass con la cabecera—, sin explotación completa todavía. Los detectaron pronto. Pero cuando un fallo de 9.8 empieza a sondearse, la ventana para actualizar tranquilo se cierra rápido.",[14,145,147],{"id":146},"un-apunte-honesto-sobre-las-fechas","Un apunte honesto sobre las fechas",[19,149,150,151,154,155,158],{},"Que no te vendan humo con esto: ",[23,152,153],{},"el fallo se corrigió en la 1.26.3 a finales de junio"," y el aviso se hizo público a principios de julio. Lo nuevo de esta semana ",[23,156,157],{},"no es la vulnerabilidad, es que ya se está sondeando activamente",". Es una diferencia importante: si actualizaste en junio, estás cubierto y esto es solo un recordatorio de verificar. Si tu Gitea lleva meses sin tocarse, es urgente.",[14,160,162],{"id":161},"cómo-funciona-el-fallo","Cómo funciona el fallo",[19,164,165,166,169,170,172],{},"La autenticación por proxy inverso es una función legítima y útil: montas un proxy delante (nginx, Traefik, Authelia…), el proxy valida al usuario contra tu SSO, y le dice a Gitea «este que viene es ",[54,167,168],{},"juan","» mediante la cabecera ",[54,171,56],{},". Gitea confía en el proxy y no vuelve a pedir contraseña.",[19,174,175,176,179,180,183],{},"Todo el modelo se sostiene sobre una premisa: ",[23,177,178],{},"esa cabecera solo puede ponerla tu proxy de confianza",". Para eso existe ",[54,181,182],{},"REVERSE_PROXY_TRUSTED_PROXIES",", que debería contener la IP (o rango) de tu proxy y nada más.",[19,185,186,187,189,190,193,194,196],{},"La imagen Docker la traía como ",[54,188,101],{},". Con el comodín, Gitea aceptaba la cabecera de cualquier IP de origen. El atacante ni siquiera necesita pasar por tu proxy: ",[23,191,192],{},"habla directamente con Gitea y se inventa la cabecera",". ",[54,195,73],{}," y dentro.",[14,198,200],{"id":199},"qué-tienes-que-hacer-hoy","Qué tienes que hacer hoy",[19,202,203],{},"Sin rodeos. Esto es lo que hemos revisado estos días en las máquinas de clientes que corren Gitea.",[205,206,208],"h3",{"id":207},"_1-comprobar-tu-versión","1. Comprobar tu versión",[210,211,216],"pre",{"className":212,"code":213,"language":214,"meta":215,"style":215},"language-bash shiki shiki-themes github-dark-high-contrast","docker exec \u003Cnombre_contenedor_gitea> gitea --version\n","bash","",[54,217,218],{"__ignoreMap":215},[219,220,223,227,231,235,238,242,245,248],"span",{"class":221,"line":222},"line",1,[219,224,226],{"class":225},"s_sBn","docker",[219,228,230],{"class":229},"sTRMh"," exec",[219,232,234],{"class":233},"sWyjQ"," \u003C",[219,236,237],{"class":229},"nombre_contenedor_gite",[219,239,241],{"class":240},"sMAXC","a",[219,243,244],{"class":233},">",[219,246,247],{"class":229}," gitea",[219,249,251],{"class":250},"sCcAr"," --version\n",[19,253,254,255,257],{},"Si estás por debajo de ",[23,256,40],{},", sigue leyendo.",[205,259,261],{"id":260},"_2-actualizar-la-imagen","2. Actualizar la imagen",[19,263,264,265,268,269,272],{},"Edita tu ",[54,266,267],{},"docker-compose.yml"," para fijar la versión parcheada (o ",[54,270,271],{},"1-latest"," si prefieres seguir la rama 1.x) y recrea el contenedor:",[210,274,276],{"className":212,"code":275,"language":214,"meta":215,"style":215},"# docker-compose.yml -> image: gitea\u002Fgitea:1.26.3\ndocker compose pull\ndocker compose up -d\n",[54,277,278,284,295],{"__ignoreMap":215},[219,279,280],{"class":221,"line":222},[219,281,283],{"class":282},"sQrFR","# docker-compose.yml -> image: gitea\u002Fgitea:1.26.3\n",[219,285,287,289,292],{"class":221,"line":286},2,[219,288,226],{"class":225},[219,290,291],{"class":229}," compose",[219,293,294],{"class":229}," pull\n",[219,296,298,300,302,305],{"class":221,"line":297},3,[219,299,226],{"class":225},[219,301,291],{"class":229},[219,303,304],{"class":229}," up",[219,306,307],{"class":250}," -d\n",[19,309,310,311,314],{},"Verifica después con el mismo ",[54,312,313],{},"gitea --version"," que ya estás en la 1.26.3 o superior.",[205,316,318],{"id":317},"_3-revisar-tu-configuración-de-proxy-de-confianza","3. Revisar tu configuración de proxy de confianza",[19,320,321,322,332,333,336],{},"Actualizar la imagen quita el default peligroso, pero ",[23,323,324,325,328,329,331],{},"comprueba que tu ",[54,326,327],{},"app.ini"," no lo haya fijado a ",[54,330,101],{}," por tu cuenta",". Busca en la sección ",[54,334,335],{},"[security]",":",[210,338,342],{"className":339,"code":340,"language":341,"meta":215,"style":215},"language-ini shiki shiki-themes github-dark-high-contrast","[security]\nREVERSE_PROXY_TRUSTED_PROXIES = 127.0.0.1, 172.18.0.0\u002F16   ; SOLO la IP\u002Frango de tu proxy real\n","ini",[54,343,344,349],{"__ignoreMap":215},[219,345,346],{"class":221,"line":222},[219,347,348],{},"[security]\n",[219,350,351],{"class":221,"line":286},[219,352,353],{},"REVERSE_PROXY_TRUSTED_PROXIES = 127.0.0.1, 172.18.0.0\u002F16   ; SOLO la IP\u002Frango de tu proxy real\n",[19,355,356,357,359,360,363,364,366,367,26],{},"Si lo tenías como ",[54,358,101],{},", cámbialo por la IP concreta de tu proxy inverso. Si ",[23,361,362],{},"no usas"," autenticación por proxy, asegúrate de que ",[54,365,119],{}," está a ",[54,368,369],{},"false",[205,371,373],{"id":372},"_4-blindaje-en-el-proxy-inverso-aunque-ya-hayas-actualizado","4. Blindaje en el proxy inverso (aunque ya hayas actualizado)",[19,375,376,377,380],{},"Este es el cinturón y tirantes que aplicamos siempre: ",[23,378,379],{},"que sea tu propio proxy quien borre o reescriba la cabecera"," en toda petición entrante, de modo que un cliente jamás pueda inyectarla. En nginx:",[210,382,386],{"className":383,"code":384,"language":385,"meta":215,"style":215},"language-nginx shiki shiki-themes github-dark-high-contrast","location \u002F {\n    # El cliente NO decide quién es: limpiamos la cabecera y la pone (si toca) el proxy\n    proxy_set_header X-WEBAUTH-USER \"\";\n    proxy_pass http:\u002F\u002F127.0.0.1:3000;\n}\n","nginx",[54,387,388,393,398,403,409],{"__ignoreMap":215},[219,389,390],{"class":221,"line":222},[219,391,392],{},"location \u002F {\n",[219,394,395],{"class":221,"line":286},[219,396,397],{},"    # El cliente NO decide quién es: limpiamos la cabecera y la pone (si toca) el proxy\n",[219,399,400],{"class":221,"line":297},[219,401,402],{},"    proxy_set_header X-WEBAUTH-USER \"\";\n",[219,404,406],{"class":221,"line":405},4,[219,407,408],{},"    proxy_pass http:\u002F\u002F127.0.0.1:3000;\n",[219,410,412],{"class":221,"line":411},5,[219,413,414],{},"}\n",[19,416,417],{},"Si usas la autenticación por proxy de verdad, esa línea la sobreescribe tu módulo de auth con el usuario ya validado. Si no la usas, la dejas vacía y cierras el vector de raíz. Barato y definitivo.",[205,419,421],{"id":420},"_5-auditar-accesos-previos","5. Auditar accesos previos",[19,423,424],{},"Si tu Gitea estuvo expuesto con la config vulnerable, asume que pudo tocarse. Revisa:",[83,426,427,437,440],{},[86,428,429,430,433,434,26],{},"El log de Gitea (",[54,431,432],{},"gitea.log"," o la salida del contenedor) buscando ",[23,435,436],{},"logins por reverse-proxy de usuarios o IPs que no cuadran",[86,438,439],{},"Acciones administrativas inesperadas: usuarios nuevos, tokens de acceso creados, claves SSH o deploy keys añadidas, webhooks nuevos.",[86,441,442,443,446],{},"Si encuentras algo raro, asume compromiso: ",[23,444,445],{},"rota tokens, claves de despliegue y secretos de CI\u002FCD"," que vivieran en esos repos.",[14,448,450],{"id":449},"lo-que-hacemos-nosotros","Lo que hacemos nosotros",[19,452,453],{},"En Atenea Systems, cuando montamos un Gitea (o cualquier servicio self-hosted detrás de proxy), partimos de dos reglas que habrían neutralizado este fallo antes de que existiera:",[455,456,457,477],"ol",{},[86,458,459,462,463,466,467,466,470,473,474,476],{},[23,460,461],{},"Nada de comodines en listas de confianza."," ",[54,464,465],{},"TRUSTED_PROXIES",", ",[54,468,469],{},"allow",[54,471,472],{},"X-Forwarded-*","… siempre con IPs o rangos concretos. El ",[54,475,101],{}," es cómodo el día del despliegue y una bomba de relojería el resto del año.",[86,478,479,482],{},[23,480,481],{},"El proxy limpia las cabeceras sensibles en la entrada."," El cliente no dicta identidad. Esa cabecera la pone quien tiene que ponerla, nunca quien llega de fuera.",[19,484,485,486,488],{},"Con esas dos costumbres, la imagen podía venir como viniera: el atacante que manda ",[54,487,73],{}," se topa con un proxy que se la borra antes de que Gitea la vea.",[14,490,492],{"id":491},"la-lección-de-siempre","La lección de siempre",[19,494,495,496,499],{},"Los defaults de una imagen no son tu configuración de seguridad. Un ",[54,497,498],{},"docker pull"," cómodo puede traerte un comodín que no pusiste tú y que te deja la puerta abierta. Merece la pena, al montar cualquier servicio, dedicar diez minutos a leer qué trae por defecto en materia de confianza y autenticación —especialmente cabeceras y proxies.",[19,501,502],{},"Si tienes un Gitea (u otro self-hosted) montado hace tiempo y no recuerdas la última vez que revisaste su config, es justo el momento. Si quieres que le echemos un ojo nosotros, hablamos.",[14,504,506],{"id":505},"referencias","Referencias",[83,508,509,517,524],{},[86,510,511],{},[241,512,516],{"href":513,"rel":514},"https:\u002F\u002Fthehackernews.com\u002F2026\u002F07\u002Fthreat-actors-probe-gitea-docker-flaw.html",[515],"nofollow","Threat Actors Probe Gitea Docker Flaw CVE-2026-20896 13 Days After Disclosure — The Hacker News",[86,518,519],{},[241,520,523],{"href":521,"rel":522},"https:\u002F\u002Fwww.securityweek.com\u002Fcritical-gitea-flaw-under-active-exploitation-researchers-warn\u002F",[515],"Critical Gitea Flaw Under Active Exploitation, Researchers Warn — SecurityWeek",[86,525,526],{},[241,527,530],{"href":528,"rel":529},"https:\u002F\u002Fmondoo.com\u002Fvulnerability-intelligence\u002Fvulnerability\u002FCVE-2026-20896",[515],"CVE-2026-20896 — Mondoo Vulnerability Intelligence",[532,533,534],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s_sBn, html code.shiki .s_sBn{--shiki-default:#FFB757}html pre.shiki code .sTRMh, html code.shiki .sTRMh{--shiki-default:#ADDCFF}html pre.shiki code .sWyjQ, html code.shiki .sWyjQ{--shiki-default:#FF9492}html pre.shiki code .sMAXC, html code.shiki .sMAXC{--shiki-default:#F0F3F6}html pre.shiki code .sCcAr, html code.shiki .sCcAr{--shiki-default:#91CBFF}html pre.shiki code .sQrFR, html code.shiki .sQrFR{--shiki-default:#BDC4CC}",{"title":215,"searchDepth":286,"depth":286,"links":536},[537,538,539,540,541,542,549,550,551],{"id":16,"depth":286,"text":17},{"id":48,"depth":286,"text":49},{"id":80,"depth":286,"text":81},{"id":146,"depth":286,"text":147},{"id":161,"depth":286,"text":162},{"id":199,"depth":286,"text":200,"children":543},[544,545,546,547,548],{"id":207,"depth":297,"text":208},{"id":260,"depth":297,"text":261},{"id":317,"depth":297,"text":318},{"id":372,"depth":297,"text":373},{"id":420,"depth":297,"text":421},{"id":449,"depth":286,"text":450},{"id":491,"depth":286,"text":492},{"id":505,"depth":286,"text":506},"2026-07-09","Un fallo crítico (CVSS 9.8) en las imágenes Docker de Gitea permitía suplantar a cualquier usuario, incluido el administrador, con una simple cabecera HTTP. Ya hay sondeos activos en internet contra ~6.200 instancias. Te contamos qué es, si te afecta y qué tienes que hacer hoy.","md","\u002Fog\u002Fog-default.png",{},true,"gitea-cve-2026-20896-docker-active-exploitation","\u002Fes\u002Fblog\u002Fgitea-cve-2026-20896-docker-explotacion-activa",{"title":8,"description":553},"es\u002Fblog\u002Fgitea-cve-2026-20896-docker-explotacion-activa",[563,564,565,566],"Seguridad","Docker","Servidores","CVE","x0KQqRqj3L0DPo8zQaaxgTXVSTwIhok_AUziygD6PAM",1784782835098]