{"id":181758,"date":"2026-05-21T08:08:40","date_gmt":"2026-05-21T15:08:40","guid":{"rendered":"https:\/\/unit42.paloaltonetworks.com\/?p=181758"},"modified":"2026-05-29T10:39:01","modified_gmt":"2026-05-29T17:39:01","slug":"monitoring-npm-supply-chain-attacks","status":"publish","type":"post","link":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/","title":{"rendered":"El panorama de amenazas de npm: superficie de ataque y mitigaciones (Actualizado el 21 de mayo)"},"content":{"rendered":"<h2><a id=\"post-181758-_heading=h.dhsk5mn7rtn\"><\/a>Resumen ejecutivo<\/h2>\n<p>La seguridad del ecosistema de npm alcanz\u00f3 un punto de inflexi\u00f3n cr\u00edtico en septiembre de 2025. El gusano <a href=\"https:\/\/unit42.paloaltonetworks.com\/es-la\/npm-supply-chain-attack\/\" target=\"_blank\" rel=\"noopener\">Shai-Hulud<\/a>, un malware autorreplicante que automatizaba la vulneraci\u00f3n y la redistribuci\u00f3n de paquetes maliciosos, marc\u00f3 el final de la era de ataques \u201cmenores\u201d a npm y el comienzo de un panorama de amenazas de grandes consecuencias.<\/p>\n<p>Desde aquel momento decisivo, Unit\u00a042 ha detectado una agresiva aceleraci\u00f3n en la frecuencia y la profundidad t\u00e9cnica de las vulneraciones de la cadena de suministro. Los ataques han pasado de ser una serie de incidentes aislados de \u201ctyposquatting\u201d a campa\u00f1as sistem\u00e1ticas de varios actores de amenazas para convertir en un arma la confianza que impulsa el desarrollo moderno de software.<\/p>\n<h3><a id=\"post-181758-_heading=h.dnreqqz25pgr\"><\/a>Campa\u00f1as de abril de 2026<\/h3>\n<p>En abril vimos dos campa\u00f1as: la primera comenz\u00f3 el 22 de abril de 2026 e incluy\u00f3 la cadena Shai-Hulud: The Third Coming. La segunda comenz\u00f3 el 29 de abril de 2026 y es conocida como Mini\u00a0Shai-Hulud.<\/p>\n<h3><a id=\"post-181758-_heading=h.8puepdiqzqv\"><\/a>Campa\u00f1as de mayo de 2026<\/h3>\n<p>En mayo de 2026, la campa\u00f1a de Mini Shai-Hulud continu\u00f3 con dos nuevas oleadas atribuidas a TeamPCP. Estas campa\u00f1as introdujeron dos elementos \u00fanicos. En una campa\u00f1a se utiliz\u00f3 una t\u00e9cnica de acceso inicial sin credenciales. En la otra campa\u00f1a, se alcanz\u00f3 el r\u00e9cord de paquetes publicados en una hora de entre todos los gusanos Shai-Hulud hasta la fecha. Las imitaciones han hecho m\u00e1s dif\u00edcil atribuir futuros ataques a TeamPCP.<\/p>\n<h3><a id=\"post-181758-_heading=h.q8o4czs0gc2e\"><\/a><strong>La nueva l\u00ednea de base para las amenazas a npm<\/strong><\/h3>\n<p>El incidente de Shai-Hulud demostr\u00f3 que el registro de npm pod\u00eda utilizarse como multiplicador de fuerza para la distribuci\u00f3n de malware. En los meses siguientes, observamos tres cambios fundamentales en las t\u00e1cticas, t\u00e9cnicas y procedimientos (TTP) de los adversarios:<\/p>\n<ul>\n<li><strong>Propagaci\u00f3n por gusanos:<\/strong> las cargas maliciosas ahora priorizan el robo de tokens de npm y los <a href=\"https:\/\/docs.github.com\/en\/authentication\/keeping-your-account-and-data-secure\/managing-your-personal-access-tokens\" target=\"_blank\" rel=\"noopener\">tokens de acceso personal<\/a> (PAT) de GitHub para infectar autom\u00e1ticamente y volver a publicar paquetes leg\u00edtimos, como se vio en el caso de <a href=\"https:\/\/unit42.paloaltonetworks.com\/es-la\/axios-supply-chain-attack\/\" target=\"_blank\" rel=\"noopener\">la vulneraci\u00f3n Axios<\/a> de marzo de 2026.<\/li>\n<li><strong>Persistencia a nivel de infraestructura:<\/strong> los atacantes ya no se limitan a robar datos. Se est\u00e1n incrustando en los canales de CI\/CD para conseguir un acceso indetectable y a largo plazo a los entornos empresariales.<\/li>\n<li><strong>Cargas \u00fatiles multietapa:<\/strong> siguiendo la plantilla de septiembre de 2025, los ataques actuales suelen implementar dependencias \u201cdurmientes\u201d latentes que solo se activan en condiciones del entorno espec\u00edficas para eludir los esc\u00e1neres automatizados.<\/li>\n<\/ul>\n<h3><a id=\"post-181758-_heading=h.dcc5422bcgtc\"><\/a>Los ataques a npm analizados en su conjunto<\/h3>\n<p>Las vulneraciones de npm tienen temas en com\u00fan. En la era posterior a Shai-Hulud, creemos que es \u00fatil considerar la superficie de ataque como un todo.<\/p>\n<p>En este art\u00edculo, se combinar\u00e1 lo siguiente:<\/p>\n<ol>\n<li><strong>Detalles de incidentes importantes:<\/strong> an\u00e1lisis en tiempo real de paquetes comprometidos significativos (por ejemplo, <em>Shai-Hulud\u00a02.0<\/em>, <em>Axios<\/em>, <a href=\"https:\/\/www.sonatype.com\/blog\/npm-chalk-and-debug-packages-hit-in-software-supply-chain-attack\" target=\"_blank\" rel=\"noopener\"><em>Chalk\/Debug<\/em><\/a>)<\/li>\n<li><strong>Correlaci\u00f3n entre campa\u00f1as:<\/strong> identificaci\u00f3n de la infraestructura o fragmentos de c\u00f3digo en com\u00fan que vinculan ataques dispares a los mismos actores de amenazas.<\/li>\n<li><strong>Manuales de remediaci\u00f3n:<\/strong> orientaci\u00f3n pr\u00e1ctica para rotar credenciales y purgar dependencias maliciosas de cach\u00e9s locales y basadas en la nube.<\/li>\n<\/ol>\n<h3>Shai-Hulud: una nueva ola<\/h3>\n<p>Se identific\u00f3 un paquete de npm malicioso publicado como <span style=\"font-family: 'courier new', courier, monospace;\">@bitwarden\/cli<\/span>, versi\u00f3n\u00a0<span style=\"font-family: 'courier new', courier, monospace;\">2026.4.0<\/span>, como parte de una campa\u00f1a m\u00e1s amplia atribuida a <a href=\"https:\/\/unit42.paloaltonetworks.com\/es-la\/teampcp-supply-chain-attacks\/\" target=\"_blank\" rel=\"noopener\">TeamPCP<\/a> que ataca la cadena de suministro. El paquete suplanta el gestor leg\u00edtimo <a href=\"https:\/\/www.npmjs.com\/package\/@bitwarden\/cli\" target=\"_blank\" rel=\"noopener\">de contrase\u00f1as Bitwarden con interfaz de l\u00ednea de comandos (CLI)<\/a>.<\/p>\n<p>Luego de la instalaci\u00f3n, ejecuta una carga \u00fatil multietapa que roba credenciales de proveedores de la nube, sistemas CI\/CD y estaciones de trabajo de desarrolladores. Luego, se autopropaga mediante la inserci\u00f3n de puertas traseras en cada paquete de npm que la v\u00edctima puede publicar. Se ha <a href=\"https:\/\/www.ox.security\/blog\/shai-hulud-bitwarden-cli-supply-chain-attack\/\" target=\"_blank\" rel=\"noopener\">observado<\/a> que dentro de los repositorios p\u00fablicos de GitHub que se publicaron figuraba la cadena \u201cShai-Hulud: The Third Coming\u201d.<\/p>\n<p>Los atacantes implementaron la misma carga \u00fatil a trav\u00e9s de m\u00faltiples canales de distribuci\u00f3n <a href=\"https:\/\/www.google.com\/aclk?sa=L&amp;pf=1&amp;ai=DChsSEwjgsIfApIWUAxWrJUQIHQuBJeUYACICCAEQAhoCZHo&amp;co=1&amp;ase=2&amp;gclid=CjwKCAjwhqfPBhBWEiwAZo196ndAdYlfVK3Sg6rIZ1cndEnOLefhrnmU6p8FtKnPi8RNWcFjHQVJuBoCbCYQAvD_BwE&amp;ei=g8DqafHcBLTn5NoPlcn1mAc&amp;cid=CAASWuRo6pi-RMIWtUQUdBbczFzxF7ZtsP-bSGqzJxTSy-t_c4E4FeJjs9I7pR5ZQ16kCEmwMZOtyQ4ZRy8cFKTdFEHOtpVT0YCEC_wpn_-CApZ7WjxP44BYlXYJ9Q&amp;cce=2&amp;category=acrcp_v1_32&amp;sig=AOD64_1ExOo505GP6cCq0zBe3fbdywYT0Q&amp;q&amp;sqi=2&amp;nis=4&amp;adurl=https:\/\/checkmarx.com\/product\/application-security-platform\/?utm_source%3Dgoogle%26utm_medium%3Dcpc%26utm_campaign%3DAMS-AD-FY25Q1-Brand-Google-US%26utm_group%3DCheckmarx%26vector_id%3D22072530657%26vector_source%3DGOOGLE%26vector_campaign%3DAMS-AD-FY25Q1-Brand-Google-US%26utm_keyword%3Dcheckmarx%26utm_campaign%3DAMS-AD-FY25Q1-Brand-Google-US%26utm_source%3Dgoogle%26utm_medium%3Dcpc%26utm_term%3Dcheckmarx%26hsa_acc%3D2852355864%26hsa_cam%3D22072530657%26hsa_grp%3D172516267149%26hsa_ad%3D727402369648%26hsa_src%3Dg%26hsa_tgt%3Dkwd-327138679131%26hsa_kw%3Dcheckmarx%26hsa_mt%3De%26hsa_net%3Dadwords%26hsa_ver%3D3%26gad_source%3D1%26gad_campaignid%3D22072530657%26gbraid%3D0AAAAADihu0G1KSiAH4ynARqSy3ClF8LoZ%26gclid%3DCjwKCAjwhqfPBhBWEiwAZo196ndAdYlfVK3Sg6rIZ1cndEnOLefhrnmU6p8FtKnPi8RNWcFjHQVJuBoCbCYQAvD_BwE&amp;ved=2ahUKEwixqoDApIWUAxW0M1kFHZVkHXMQ0Qx6BAgMEAE\" target=\"_blank\" rel=\"noopener\">Checkmarx<\/a>:<\/p>\n<ul>\n<li>Im\u00e1genes de Docker Hub<\/li>\n<li>GitHub Actions<\/li>\n<li>Extensiones de VS\u00a0Code<\/li>\n<\/ul>\n<p>Esto indica que se trat\u00f3 de una campa\u00f1a coordinada para convertir en armas las credenciales comprometidas de herramientas para desarrolladores a fin de maximizar el \u00e1rea de impacto.<\/p>\n<p>Los clientes de Palo Alto Networks est\u00e1n mejor protegidos frente a las amenazas descritas en este art\u00edculo por medio de los siguientes productos y servicios:<\/p>\n<ul>\n<li><a href=\"https:\/\/docs.paloaltonetworks.com\/wildfire\" target=\"_blank\" rel=\"noopener\">Advanced WildFire<\/a><\/li>\n<li><a href=\"https:\/\/docs.paloaltonetworks.com\/pan-os\/10-1\/pan-os-new-features\/url-filtering-features\/advanced-url-filtering\" target=\"_blank\" rel=\"noopener\">Advanced URL Filtering<\/a> y <a href=\"https:\/\/docs.paloaltonetworks.com\/dns-security\" target=\"_blank\" rel=\"noopener\">Advanced DNS Security<\/a><\/li>\n<li><a href=\"https:\/\/www.paloaltonetworks.com\/cortex\/cloud\" target=\"_blank\" rel=\"noopener\">Cortex Cloud<\/a><\/li>\n<\/ul>\n<p>El <a href=\"https:\/\/start.paloaltonetworks.com\/contact-unit42.html\" target=\"_blank\" rel=\"noopener\">equipo de respuesta ante incidentes de Unit\u00a042<\/a> tambi\u00e9n puede involucrarse para ayudar con una intrusi\u00f3n o para proporcionar una evaluaci\u00f3n proactiva que permita reducir el riesgo.<\/p>\n<table style=\"width: 100.08%;\">\n<tbody>\n<tr>\n<td style=\"width: 35%;\"><strong>Temas relacionados con Unit 42<\/strong><\/td>\n<td style=\"width: 138.697%;\"><strong><a href=\"https:\/\/unit42.paloaltonetworks.com\/es-la\/tag\/supply-chain-es-la\/\" target=\"_blank\" rel=\"noopener\">Cadena de suministro<\/a>, <a href=\"https:\/\/unit42.paloaltonetworks.com\/es-la\/tag\/credential-harvesting-es-la\/\" target=\"_blank\" rel=\"noopener\">Recopilaci\u00f3n de credenciales<\/a>, <a href=\"https:\/\/unit42.paloaltonetworks.com\/es-la\/tag\/obfuscation\/\" target=\"_blank\" rel=\"noopener\">Ofuscaci\u00f3n<\/a>, <a href=\"https:\/\/unit42.paloaltonetworks.com\/es-la\/tag\/backdoor\/\" target=\"_blank\" rel=\"noopener\">Backdoor<\/a><\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><a id=\"post-181758-_heading=h.dzgtd2r2mmxf\"><\/a>Mayo de 2026: contin\u00faa la campa\u00f1a de Mini Shai-Hulud<\/h2>\n<p>Dos oleadas adicionales en mayo de 2026 extendieron la campa\u00f1a de Mini Shai-Hulud:<\/p>\n<ul>\n<li>Con la primera oleada, se introdujo una t\u00e9cnica de acceso inicial fundamentalmente nueva que no requiere credenciales robadas y que produjo los primeros paquetes\u00a0npm maliciosos con niveles de cadena de suministro v\u00e1lidos para artefactos de software (<a href=\"https:\/\/slsa.dev\/spec\/v0.1\/provenance\" target=\"_blank\" rel=\"noopener\">trazabilidad con SLSA<\/a>).<\/li>\n<li>La segunda oleada alcanz\u00f3 el r\u00e9cord de paquetes publicados en una hora entre todas las oleadas de Shai-Hulud.<\/li>\n<\/ul>\n<p>Ambas oleadas se atribuyen a TeamPCP, aunque la publicaci\u00f3n del c\u00f3digo fuente del gusano realizada el 12 de mayo ya ha generado imitaciones, lo que complica la atribuci\u00f3n de autor\u00eda en el futuro.<\/p>\n<h3><a id=\"post-181758-_heading=h.nzegead4p908\"><\/a>11 de mayo de 2026: Mini Shai-Hulud ataca de nuevo<\/h3>\n<p>El 11 de mayo, TeamPCP lanz\u00f3 un ataque coordinado a la cadena de suministro en los ecosistemas de npm y PyPI. El vector de acceso inicial fue el canal de CI de GitHub Actions de TanStack. En seis minutos, se publicaron 84\u00a0artefactos de paquetes maliciosos en 42\u00a0paquetes <span style=\"font-family: 'courier new', courier, monospace;\">@tanstack\/*<\/span>.<\/p>\n<p>El mecanismo de autorreplicaci\u00f3n del gusano se expandi\u00f3 r\u00e1pidamente. Al finalizar el d\u00eda, hab\u00edamos documentado 373\u00a0versiones maliciosas en 169\u00a0paquetes de npm m\u00e1s los paquetes de PyPI comprometidos.<\/p>\n<p>El impacto se expandi\u00f3 mucho m\u00e1s all\u00e1 de TanStack. La autorreplicaci\u00f3n del gusano propag\u00f3 la vulneraci\u00f3n a paquetes en m\u00faltiples industrias y ecosistemas:<\/p>\n<ul>\n<li><strong>Infraestructura empresarial<\/strong>: <span style=\"font-family: 'courier new', courier, monospace;\">@opensearch-project\/opensearch<\/span> (el cliente oficial de OpenSearch para JavaScript; versiones\u00a03.5.3\u20133.8.0) y 57\u00a0paquetes de automatizaci\u00f3n empresarial <span style=\"font-family: 'courier new', courier, monospace;\">@uipath\/*<\/span>.<\/li>\n<li><strong>Herramientas de IA<\/strong>: <span style=\"font-family: 'courier new', courier, monospace;\">@mistralai\/mistralai<\/span> y sus variantes de Azure\/GCP, que es el cliente oficial de Mistral\u00a0AI para TypeScript.<\/li>\n<li><strong>Ecosistemas especializados<\/strong>: 19\u00a0paquetes de datos de <span style=\"font-family: 'courier new', courier, monospace;\">aviaci\u00f3n @squawk\/*<\/span>, <span style=\"font-family: 'courier new', courier, monospace;\">intercom-client@7.0.4<\/span> (mensajer\u00eda del cliente) y docenas de otros a trav\u00e9s de <span style=\"font-family: 'courier new', courier, monospace;\">@tallyui, @draftlab, @beproduct, @mesadev<\/span> y varios paquetes no especificados.<\/li>\n<\/ul>\n<p>Solo <span style=\"font-family: 'courier new', courier, monospace;\">@tanstack\/react-router<\/span> tiene m\u00e1s de 12.7\u00a0millones descargas por semana. Estimamos que en la ventana de tiempo afectada hubo 520\u00a0millones de descargas acumuladas. Palo Alto Networks proporciona XDR y consultas\u00a0XQL para detectar esta actividad.<\/p>\n<h3><a id=\"post-181758-_heading=h.e49hav1fofp2\"><\/a>Un nuevo acceso inicial: no se necesitan credenciales robadas<\/h3>\n<p>Todas las oleadas anteriores de Shai-Hulud hab\u00edan comenzado con una credencial robada u obtenida mediante phishing. El ataque de TanStack no necesit\u00f3 ninguna de las dos. En cambio, se encadenaron tres debilidades de GitHub Actions, ya que ninguna era suficiente por s\u00ed sola.<\/p>\n<h4><a id=\"post-181758-_heading=h.2huk304i3lxx\"><\/a>Paso\u00a01: solicitud PWN<\/h4>\n<p>El 10 de mayo, el atacante cre\u00f3 un fork de <span style=\"font-family: 'courier new', courier, monospace;\">TanStack\/router<\/span> bajo la cuenta <span style=\"font-family: 'courier new', courier, monospace;\">zblgg\/configuration<\/span>, nombrado deliberadamente para que no apareciera en b\u00fasquedas de listas de forks. Se cre\u00f3 un commit malicioso bajo la identidad falsificada de claude <span style=\"font-family: 'courier new', courier, monospace;\">&lt;claude@users.noreply.github.com&gt;<\/span>, haci\u00e9ndose pasar por la aplicaci\u00f3n de Claude para GitHub desarrollada por Anthropic, y se agreg\u00f3 el prefijo <span style=\"font-family: 'courier new', courier, monospace;\">[skip ci]<\/span> para evitar que se ejecutara el CI en el push.<\/p>\n<p>Luego, una solicitud de pull (PR #7378) contra <span style=\"font-family: 'courier new', courier, monospace;\">TanStack\/router#main<\/span> activ\u00f3 <span style=\"font-family: 'courier new', courier, monospace;\">bundle-size.yml<\/span>, un flujo de trabajo que utilizaba el disparador <span style=\"font-family: 'courier new', courier, monospace;\">pull_request_target<\/span>, y obtuvo la referencia de fusi\u00f3n del fork. Esto permiti\u00f3 la ejecuci\u00f3n del c\u00f3digo del fork en el contexto del runner del repositorio base, con acceso completo a su \u00e1mbito de cach\u00e9.<\/p>\n<p>Los actores de amenazas utilizaron <a href=\"https:\/\/bun.com\/\" target=\"_blank\" rel=\"noopener\">Bun<\/a>, que es un entorno de ejecuci\u00f3n de JavaScript ligero y un administrador de paquetes alternativo a Node.js y npm, como se muestra en la Figura\u00a01. En el ataque se utiliz\u00f3 Bun para ejecutar la carga \u00fatil maliciosa <span style=\"font-family: 'courier new', courier, monospace;\">tanstack_runner.js<\/span>. Esto a su vez intent\u00f3 enumerar el sistema en busca de credenciales sensibles, incluida la invocaci\u00f3n de CLI de GitHub para capturar el token de autenticaci\u00f3n de GitHub (<span style=\"font-family: 'courier new', courier, monospace;\">gh auth token<\/span>).<\/p>\n<figure id=\"attachment_181759\" aria-describedby=\"caption-attachment-181759\" style=\"width: 1390px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-181759 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-144417-181758-1.png\" alt=\"\" width=\"1390\" height=\"119\" srcset=\"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-144417-181758-1.png 1390w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-144417-181758-1-786x67.png 786w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-144417-181758-1-768x66.png 768w\" sizes=\"(max-width: 1390px) 100vw, 1390px\" \/><figcaption id=\"caption-attachment-181759\" class=\"wp-caption-text\">Figura 1. Cadena de ejecuci\u00f3n de Mini Shai-Hulud contra TanStack en Windows.<\/figcaption><\/figure>\n<h5><a id=\"post-181758-_heading=h.4fwwcpmsl2c2\"><\/a>Kubernetes<\/h5>\n<p>En un entorno de Kubernetes alojado en Linux, Unit\u00a042 observ\u00f3 una actividad leg\u00edtima de creaci\u00f3n de contenedores <span style=\"font-family: 'courier new', courier, monospace;\">runc<\/span> asociada con un canal de compilaci\u00f3n que posteriormente recuper\u00f3 y ejecut\u00f3 el paquete de JavaScript comprometido. La invocaci\u00f3n de creaci\u00f3n de <span style=\"font-family: 'courier new', courier, monospace;\">runc<\/span> fue una actividad leg\u00edtima del runtime de Kubernetes asociada con el proceso de compilaci\u00f3n en contenedores.<\/p>\n<p>Durante la compilaci\u00f3n:<\/p>\n<ul>\n<li>El proyecto nuevamente recuper\u00f3 y ejecut\u00f3 de manera din\u00e1mica el runtime de Bun a trav\u00e9s de su cadena de dependencias pnpm.<\/li>\n<li>Posteriormente, ejecut\u00f3 la carga \u00fatil maliciosa de JavaScript <span style=\"font-family: 'courier new', courier, monospace;\">tanstack_runner.js<\/span>.<\/li>\n<li>Luego, continu\u00f3 como en el entorno de Windows.<\/li>\n<\/ul>\n<p>La l\u00ednea de proceso se muestra en la Figura\u00a02.<\/p>\n<figure id=\"attachment_181770\" aria-describedby=\"caption-attachment-181770\" style=\"width: 1169px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-181770 size-full lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-146703-181758-2.png\" alt=\"\" width=\"1169\" height=\"199\" srcset=\"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-146703-181758-2.png 1169w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-146703-181758-2-786x134.png 786w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-146703-181758-2-768x131.png 768w\" sizes=\"(max-width: 1169px) 100vw, 1169px\" \/><figcaption id=\"caption-attachment-181770\" class=\"wp-caption-text\">Figura 2: Cadena de ejecuci\u00f3n de Mini Shai-Hulud contra TanStack en Kubernetes alojado en Linux.<\/figcaption><\/figure>\n<h4><a id=\"post-181758-_heading=h.w2uqbbter7ju\"><\/a>Paso\u00a02: envenenamiento de la cach\u00e9 de GitHub Actions<\/h4>\n<p>El c\u00f3digo del fork escribi\u00f3 un almac\u00e9n de pnpm envenenado de 1.1\u00a0GB usando exactamente la misma clave de cach\u00e9 que <span style=\"font-family: 'courier new', courier, monospace;\">release.yml<\/span> buscar\u00eda posteriormente. La clave fue precomputada a partir del <span style=\"font-family: 'courier new', courier, monospace;\">pnpm-lock.yaml<\/span> p\u00fablico utilizando la misma f\u00f3rmula <span style=\"font-family: 'courier new', courier, monospace;\">hashFiles()<\/span> que usa el flujo de trabajo. La entrada de cach\u00e9 envenenada permaneci\u00f3 inactiva durante ocho horas.<\/p>\n<p>Un detalle cr\u00edtico: el guardado posterior al trabajo de <span style=\"font-family: 'courier new', courier, monospace;\">actions\/cache@v5<\/span> utiliza un token interno del runner, no el GITHUB_TOKEN del flujo de trabajo, por lo que establecer permissions: contents: read en el flujo de trabajo no previene la escritura en la cach\u00e9.<\/p>\n<h4><a id=\"post-181758-_heading=h.5vlwowasy02p\"><\/a>Paso\u00a03: extracci\u00f3n del token OpenID Connect (OIDC) de la memoria del runner<\/h4>\n<p>Cuando un mantenedor leg\u00edtimo hizo push en main, se activ\u00f3<span style=\"font-family: 'courier new', courier, monospace;\"> release.yml<\/span>, se restaur\u00f3 la cach\u00e9 envenenada y se ejecutaron binarios controlados por el atacante durante la fase de compilaci\u00f3n. Esos binarios leyeron <span style=\"font-family: 'courier new', courier, monospace;\">\/proc\/&lt;Runner.Worker&gt;\/mem<\/span> y extrajeron el token OIDC, creado \u00fanicamente en la memoria del runner cuando est\u00e1 habilitado <span style=\"font-family: 'courier new', courier, monospace;\">id-token: write<\/span>, y luego lo enviaron directamente a <span style=\"font-family: 'courier new', courier, monospace;\">registry.npmjs.org<\/span>.<\/p>\n<p>El paso Publicar paquetes del flujo de trabajo nunca se alcanz\u00f3; las pruebas fallaron y ese paso fue omitido. De todos modos, npm recibi\u00f3 84\u00a0publicaciones de paquetes v\u00e1lidas, firmadas y con atestaci\u00f3n de trazabilidad.<\/p>\n<p>Esta es la misma t\u00e9cnica de extracci\u00f3n de memoria <span style=\"font-family: 'courier new', courier, monospace;\">\/proc<\/span> documentada en la vulneraci\u00f3n de <span style=\"font-family: 'courier new', courier, monospace;\">tj-actions\/changed-files<\/span> de marzo de 2025, que se reutiliz\u00f3 en las oleadas de SAP y Bitwarden en abril de 2026.<\/p>\n<h3><a id=\"post-181758-_heading=h.jmk440xnbq\"><\/a>El problema de la trazabilidad con SLSA<\/h3>\n<p>Este es el primer caso documentado de un gusano que publica paquetes maliciosos de npm con una trazabilidad v\u00e1lida de SLSA Build Level\u00a03. Sigstore atestigu\u00f3 correctamente que los paquetes fueron construidos por <span style=\"font-family: 'courier new', courier, monospace;\">release.yml<\/span> desde <span style=\"font-family: 'courier new', courier, monospace;\">refs\/heads\/main<\/span> de <span style=\"font-family: 'courier new', courier, monospace;\">TanStack\/router<\/span>, porque as\u00ed fue. La trazabilidad de SLSA confirma <em>qu\u00e9 canal <\/em>compil\u00f3 un paquete, pero no <em>si el estado interno de ese canal estaba limpio<\/em>.<\/p>\n<p>La causa ra\u00edz es el mismo error de configuraci\u00f3n del \u00e1mbito de confianza de OIDC que se explot\u00f3 en la oleada <span style=\"font-family: 'courier new', courier, monospace;\">@cap-js wave<\/span> del 29 de abril. El enlace de editor de confianza confiaba en todo el repositorio, y no en un flujo de trabajo espec\u00edfico en una rama protegida.<\/p>\n<p>La verificaci\u00f3n de la trazabilidad es necesaria, pero ya no es suficiente. Por eso, resulta esencial analizar el comportamiento en el momento de la instalaci\u00f3n.<\/p>\n<h3><a id=\"post-181758-_heading=h.kz18mgq4f0fa\"><\/a>Carga \u00fatil y propagaci\u00f3n<\/h3>\n<p>La carga \u00fatil maliciosa, <span style=\"font-family: 'courier new', courier, monospace;\">router_init.js<\/span> (2.3\u00a0MB con ofuscaci\u00f3n), no se entreg\u00f3 a trav\u00e9s de un gancho de preinstalaci\u00f3n en los paquetes comprometidos. En cambio, cada tarball recibi\u00f3 una entrada inyectada de <span style=\"font-family: 'courier new', courier, monospace;\">optionalDependencies<\/span> que apunta a un commit hu\u00e9rfano en el fork del atacante.<\/p>\n<p>Este es un commit que GitHub muestra bajo la URL leg\u00edtima <span style=\"font-family: 'courier new', courier, monospace;\">TanStack\/router<\/span> debido al almacenamiento compartido de objetos de commit en la red de forks:<\/p>\n<pre class=\"lang:default decode:true\">\"optionalDependencies\": {\r\n  \"@tanstack\/setup\": \"github:tanstack\/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c\"\r\n}<\/pre>\n<p>La dependencia est\u00e1 dise\u00f1ada para fallar silenciosamente durante la instalaci\u00f3n. El c\u00f3digo malicioso se ejecuta en segundo plano mientras el proceso de instalaci\u00f3n parece normal, lo que deja un rastro casi nulo en los registros. La carga \u00fatil utiliza m\u00faltiples capas de ofuscaci\u00f3n y cifrado para resistir el an\u00e1lisis automatizado. Comparte el mismo cifrado personalizado que se document\u00f3 en las secciones de Bitwarden del 22 de abril y SAP del 29 de abril, lo que confirma la autor\u00eda compartida en las tres oleadas.<\/p>\n<p>En el caso de las v\u00edctimas secundarias infectadas a trav\u00e9s de la propagaci\u00f3n del gusano (por ejemplo, UiPath, Mistral\u00a0AI y OpenSearch), el mecanismo de entrega volvi\u00f3 al gancho de preinstalaci\u00f3n familiar de la oleada de SAP de abril.<\/p>\n<p>El patr\u00f3n ahora est\u00e1 bien establecido. Una vez que el gusano logra infiltrarse en un ecosistema, utiliza credenciales robadas para republicarse en los otros paquetes que mantiene la v\u00edctima, expandiendo r\u00e1pidamente su alcance a trav\u00e9s de proyectos y organizaciones no relacionados.<\/p>\n<h3><a id=\"post-181758-_heading=h.cm3ro6ckrq9v\"><\/a>El interruptor del hombre muerto: una advertencia cr\u00edtica sobre el orden de remediaci\u00f3n<\/h3>\n<p>La carga \u00fatil del 11 de mayo instala un servicio de fondo persistente que consulta <span style=\"font-family: 'courier new', courier, monospace;\">api.github.com\/user<\/span> con el token de GitHub robado cada 60\u00a0segundos. Si se revoca el token (HTTP\u00a040x), el servicio ejecuta <span style=\"font-family: 'courier new', courier, monospace;\">rm -rf ~\/<\/span>, destruyendo el directorio personal del usuario. El demonio se cierra autom\u00e1ticamente despu\u00e9s de 24\u00a0horas.<\/p>\n<h3><a id=\"post-181758-_heading=h.26j2jqplodub\"><\/a>12 de mayo de 2026: lanzamiento p\u00fablico del gusano<\/h3>\n<p>En la noche del 12 de mayo de 2026, el c\u00f3digo fuente completamente convertido en arma de Mini Shai-Hulud se public\u00f3 en repositorios p\u00fablicos de GitHub antes de ser retirado. La cadena de herramientas que incluye los scripts de envenenamiento de cach\u00e9 de CI, el extractor de tokens OIDC y el ladr\u00f3n de credenciales con su l\u00f3gica de propagaci\u00f3n ahora est\u00e1 disponible p\u00fablicamente.<\/p>\n<p>Mini Shai-Hulud ya no se limita a TeamPCP. Los futuros incidentes que utilicen esta cadena de herramientas podr\u00edan no compartir la infraestructura o las t\u00e9cnicas de TeamPCP y no deben atribuirse \u00fanicamente en base a la l\u00ednea de gusanos.<\/p>\n<h3><a id=\"post-181758-_heading=h.rdjtbsfrq4ky\"><\/a>19 de mayo de 2026: oleada @antv<\/h3>\n<p>El 19 de mayo de 2026, la cuenta del mantenedor de npm atool se vio comprometida como parte de una nueva oleada de Mini Shai-Hulud. En aproximadamente una hora, se publicaron 639\u00a0versiones de paquetes maliciosos en 323\u00a0paquetes \u00fanicos. Este es el mayor recuento de paquetes en una sola hora contabilizado en las oleadas de Shai-Hulud hasta la fecha.<\/p>\n<p>El alcance afectado abarca el ecosistema de visualizaci\u00f3n de datos @antv y bibliotecas relacionadas:<\/p>\n<ul>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">@antv\/g2, g6, x6, l7, s2, f2, g, g2plot, graphin, data-set y s2-vue<\/span><\/li>\n<li>Paquetes fuera del espacio de nombres <span style=\"font-family: 'courier new', courier, monospace;\">@antv<\/span>, incluidos <span style=\"font-family: 'courier new', courier, monospace;\">echarts-for-react<\/span> (aproximadamente 1.1\u00a0millones de descargas semanales), <span style=\"font-family: 'courier new', courier, monospace;\">timeago.js<\/span>, <span style=\"font-family: 'courier new', courier, monospace;\">size-sensor<\/span> y <span style=\"font-family: 'courier new', courier, monospace;\">canvas-nest.js<\/span><\/li>\n<\/ul>\n<p>Resulta significativa el \u00e1rea potencial de impacto en visualizaci\u00f3n de datos, graficaci\u00f3n, mapeo, creaci\u00f3n de cuadros y ecosistemas de componentes de React.<\/p>\n<h3><a id=\"post-181758-_heading=h.stdkh7a2ea0n\"><\/a>Mecanismo de infecci\u00f3n<\/h3>\n<p>A diferencia de la t\u00e9cnica de secuestro de canales de la oleada de TanStack, esta oleada regresa a un modelo m\u00e1s simple. Implica comprometer una cuenta del mantenedor y usarla para republicar paquetes directamente. Es el mismo enfoque visto en las campa\u00f1as de septiembre y noviembre de 2025.<\/p>\n<p>El atacante modific\u00f3 el <span style=\"font-family: 'courier new', courier, monospace;\">package.json<\/span> de cada paquete de tres maneras:<\/p>\n<ul>\n<li>Agregando un gancho de preinstalaci\u00f3n (\"<span style=\"font-family: 'courier new', courier, monospace;\">preinstall<\/span>\": \"<span style=\"font-family: 'courier new', courier, monospace;\">bun run index.js<\/span>\") que ejecuta la carga \u00fatil maliciosa a trav\u00e9s del entorno de ejecuci\u00f3n de Bun.<\/li>\n<li>Agrupando Bun como una dependencia para asegurar que est\u00e9 disponible en cualquier m\u00e1quina.<\/li>\n<li>Insertando una dependencia opcional basada en git que apunta a un commit hu\u00e9rfano en el repositorio leg\u00edtimo de <span style=\"font-family: 'courier new', courier, monospace;\">antvis\/G2<\/span> como una ruta de ejecuci\u00f3n de respaldo.<\/li>\n<\/ul>\n<p>A fin de garantizar que las versiones maliciosas llegaran a la mayor cantidad de objetivos posible, el atacante tambi\u00e9n aument\u00f3 los n\u00fameros de versi\u00f3n m\u00e1s all\u00e1 del \u00faltimo lanzamiento leg\u00edtimo (por ejemplo, <span style=\"font-family: 'courier new', courier, monospace;\">@antv\/s2-vue<\/span> salt\u00f3 de la versi\u00f3n real\u00a0<span style=\"font-family: 'courier new', courier, monospace;\">2.2.0<\/span> a <span style=\"font-family: 'courier new', courier, monospace;\">2.4.0<\/span>). Cualquier proyecto que use un rango de versi\u00f3n permisivo como <span style=\"font-family: 'courier new', courier, monospace;\">^2.x<\/span> autom\u00e1ticamente descargar\u00e1 la versi\u00f3n maliciosa en la pr\u00f3xima instalaci\u00f3n.<\/p>\n<h3><a id=\"post-181758-_heading=h.xl1irov0wn8\"><\/a>Capacidades de la carga \u00fatil<\/h3>\n<p>La carga \u00fatil ofuscada de 499\u00a0KB ejecuta seis recolectores de credenciales en paralelo, abarcando un amplio rango de objetivos:<\/p>\n<ul>\n<li><strong>Credenciales de desarrollador<\/strong>: tokens de GitHub, tokens de npm, claves\u00a0SSH, credenciales de Git y claves privadas<\/li>\n<li><strong>Nube e infraestructura<\/strong>: credenciales y par\u00e1metros de AWS, tokens de cuenta de servicio de Kubernetes, secretos de HashiCorp Vault y autenticaci\u00f3n de Docker<\/li>\n<li><strong>Plataformas de CI\/CD<\/strong>: tokens de m\u00e1s de 18\u00a0plataformas, como GitHub Actions, GitLab CI, CircleCI, Vercel y Netlify<\/li>\n<li><strong>Servicios de terceros<\/strong>: cadenas de conexi\u00f3n de bases de datos, claves API de Stripe, Slack y Twilio<\/li>\n<li><strong>Gestores de contrase\u00f1as (nuevos en esta oleada): <\/strong>la carga \u00fatil consulta directamente 1Password, Bitwarden, pass y gopass a trav\u00e9s de sus CLI locales<\/li>\n<\/ul>\n<p>Todos los datos robados est\u00e1n cifrados y se env\u00edan a un endpoint\u00a0C2 disfrazados como ingesta de trazas de OpenTelemetry (<span style=\"font-family: 'courier new', courier, monospace;\">t.m-kosche[.]com<\/span>), lo que significa que las herramientas de monitoreo de la red podr\u00edan clasificar el tr\u00e1fico como telemetr\u00eda de observabilidad leg\u00edtima.<\/p>\n<p>Un canal de respaldo exfiltra datos a repositorios de GitHub creados bajo la cuenta de la v\u00edctima, utilizando nombres tem\u00e1ticos de Dune y el marcador de campa\u00f1a revertido <span style=\"font-family: 'courier new', courier, monospace;\">Shai-Hulud: Here We Go Again<\/span> como la descripci\u00f3n.<\/p>\n<h2><a id=\"post-181758-_heading=h.9ipzg0h3kxv9\"><\/a>Abril de 2026 - Shai-Hulud: una nueva ola<\/h2>\n<h3><a id=\"post-181758-_heading=h.t2zchm3v9ivj\"><\/a>La ola de Mini\u00a0Shai-Hulud de fines de abril<\/h3>\n<p>Desde el 29\u00a0de abril de 2026, una nueva ola de ataques a la cadena de suministro (apodada <strong>Mini\u00a0Shai-Hulud)<\/strong> est\u00e1 atacando activamente el ecosistema de desarrolladores de SAP mediante cuatro paquetes de npm comprometidos. Las versiones afectadas son las siguientes:<\/p>\n<ul>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">@cap-js\/sqlite@2.2.2<\/span><\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">@cap-js\/postgres@2.2.2<\/span><\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">@cap-js\/db-service@2.10.1<\/span><\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">mbt@1.2.48<\/span><\/li>\n<\/ul>\n<p>Estos paquetes combinados tienen aproximadamente 570,000\u00a0descargas semanales, siendo <span style=\"font-family: 'courier new', courier, monospace;\">@cap-js\/sqlite<\/span> y <span style=\"font-family: 'courier new', courier, monospace;\">@cap-js\/db-service<\/span> los que acumulan unas 250,000 y 260,000\u00a0descargas, respectivamente.<\/p>\n<p>Los cuatro paquetes forman parte del modelo de programaci\u00f3n de aplicaciones en la nube (CAP) de SAP y de la cadena de herramientas de compilaci\u00f3n de aplicaciones multiobjetivo (MTA). Esto hace que los objetivos de este ataque sean los desarrolladores empresariales y los canales de CI\/CD con acceso a credenciales en la nube, tokens de GitHub y secretos de implementaci\u00f3n.<\/p>\n<p>La campa\u00f1a es una continuaci\u00f3n estructural estrecha de la vulneraci\u00f3n <span style=\"font-family: 'courier new', courier, monospace;\">@bitwarden\/cli@2026.4.0<\/span> de abril de 2026. Utiliza la misma cadena de herramientas, la misma ofuscaci\u00f3n y la misma l\u00f3gica de propagaci\u00f3n, que ahora se vuelve contra el ecosistema SAP.<\/p>\n<h3>Mecanismo de ataque<\/h3>\n<p>Cada paquete comprometido recibi\u00f3 dos archivos nuevos:<\/p>\n<ul>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">setup.mjs<\/span><\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">execution.js<\/span><\/li>\n<\/ul>\n<p>Estos archivos llegaron junto con un <span style=\"font-family: 'courier new', courier, monospace;\">package.json<\/span> modificado que a\u00f1ade un hook de ciclo de vida de preinstalaci\u00f3n (\u201c<span style=\"font-family: 'courier new', courier, monospace;\">preinstall<\/span>\u201d: \u201c<span style=\"font-family: 'courier new', courier, monospace;\">node setup.mjs<\/span>\u201d).<\/p>\n<p>Esto significa que el c\u00f3digo malicioso se ejecuta autom\u00e1ticamente durante el proceso de instalaci\u00f3n de npm, antes de que se complete la instalaci\u00f3n. El bootstrapper <span style=\"font-family: 'courier new', courier, monospace;\">setup.mjs<\/span> detecta el sistema operativo y la arquitectura del anfitri\u00f3n, y luego realiza las siguientes actividades:<\/p>\n<ul>\n<li>Descarga el tiempo de ejecuci\u00f3n de Bun JavaScript (v1.3.13) desde la versi\u00f3n oficial <span style=\"font-family: 'courier new', courier, monospace;\">github[.]com\/oven-sh\/bun<\/span>.<\/li>\n<li>Extrae el tiempo de ejecuci\u00f3n a un directorio temporal.<\/li>\n<li>Lo usa inmediatamente para ejecutar <span style=\"font-family: 'courier new', courier, monospace;\">execution.js<\/span>.<\/li>\n<\/ul>\n<h3>Capacidades de carga \u00fatil<\/h3>\n<p>El ladr\u00f3n de credenciales ofuscado de un solo archivo de 11.7\u00a0MB, <span style=\"font-family: 'courier new', courier, monospace;\">execution.js<\/span>, es un marco de propagaci\u00f3n. Realiza las siguientes actividades:<\/p>\n<ul>\n<li>Usa una capa de codificaci\u00f3n de cadenas personalizada denominada <strong>ctf-scramble-v2<\/strong> para ocultar cadenas sensibles del an\u00e1lisis est\u00e1tico.<\/li>\n<li>Incluye un mecanismo de desactivaci\u00f3n basado en configuraci\u00f3n regional rusa (salida silenciosa si la configuraci\u00f3n regional del sistema es \u2018ru\u2019).<\/li>\n<li>Se ejecuta como un demonio en m\u00e1quinas que no son CI para ejecutarse en segundo plano.<\/li>\n<\/ul>\n<p>Recoge la siguiente informaci\u00f3n:<\/p>\n<ul>\n<li>Tokens de GitHub (incluida la salida del token <span style=\"font-family: 'courier new', courier, monospace;\">gh\u00a0auth<\/span>)<\/li>\n<li>Tokens de npm de <span style=\"font-family: 'courier new', courier, monospace;\">.npmrc<\/span><\/li>\n<li>Bloques completos de variables de entorno<\/li>\n<li>Secretos de GitHub Actions<\/li>\n<li>Identidad AWS STS<\/li>\n<li>Par\u00e1metros de Secrets Manager y SSM<\/li>\n<li>Secretos de Azure Key Vault<\/li>\n<li>Valores de GCP Secret Manager<\/li>\n<li>Tokens de cuenta de servicio de Kubernetes<\/li>\n<li>Archivos de configuraci\u00f3n de Claude y MCP<\/li>\n<li>Billeteras Electrum<\/li>\n<li>Configuraciones de VPN<\/li>\n<\/ul>\n<p>Una ruta CI particularmente agresiva utiliza un ayudante Python incrustado que lee la memoria <span style=\"font-family: 'courier new', courier, monospace;\">\/proc<\/span> del proceso GitHub Actions <span style=\"font-family: 'courier new', courier, monospace;\">Runner.Worker<\/span> para extraer valores secretos enmascarados. Todos los datos recogidos est\u00e1n:<\/p>\n<ul>\n<li>Comprimidos<\/li>\n<li>Cifrados con AES-256-GCM, con una clave encapsulada mediante una clave p\u00fablica RSA integrada<\/li>\n<li>Exfiltrados a repositorios GitHub p\u00fablicos reci\u00e9n creados con nombres aleatorios de tem\u00e1tica Dune y la descripci\u00f3n \u201cHa aparecido un Mini\u00a0Shai-Hulud\u201d<\/li>\n<\/ul>\n<h3>Propagaci\u00f3n y dead drop de GitHub<\/h3>\n<p>La campa\u00f1a utiliza la API p\u00fablica de b\u00fasqueda de commits de GitHub como canal encubierto de comando y control (C2). El malware realiza las siguientes actividades:<\/p>\n<ul>\n<li>Buscar commits que contengan la palabra clave <span style=\"font-family: 'courier new', courier, monospace;\">OhNoWhatsGoingOnWithGitHub<\/span>.<\/li>\n<li>Descodificar mensajes de commit coincidentes como dead drop de tokens para recuperar tokens robados de GitHub.<\/li>\n<li>Utilizarlos para difundir.<\/li>\n<\/ul>\n<p>Una vez que se obtiene un token utilizable, la carga \u00fatil realiza lo siguiente:<\/p>\n<ul>\n<li>Se copia a s\u00ed misma en <span style=\"font-family: 'courier new', courier, monospace;\">execution[.]js<\/span>.<\/li>\n<li>Escribe <span style=\"font-family: 'courier new', courier, monospace;\">setup.mjs<\/span>.<\/li>\n<li>Establece \u201c<span style=\"font-family: 'courier new', courier, monospace;\">preinstall<\/span>\u201d: \u201c<span style=\"font-family: 'courier new', courier, monospace;\">node setup.mjs<\/span>\u201d en <span style=\"font-family: 'courier new', courier, monospace;\">package.json<\/span>.<\/li>\n<li>Incrementa la versi\u00f3n del parche.<\/li>\n<li>Vuelve a empaquetar el tarball para publicarlo.<\/li>\n<\/ul>\n<p>El malware tambi\u00e9n introduce los siguientes archivos directamente en los repositorios de la v\u00edctima:<\/p>\n<ul>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">.vscode\/setup.mjs<\/span><\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">.claude\/execution.js<\/span><\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">.claude\/settings.json<\/span><\/li>\n<\/ul>\n<p>El malware empuja los archivos anteriores utilizando commits cuyo autor es <span style=\"font-family: 'courier new', courier, monospace;\">claude &lt;claude@users.noreply.github.com&gt;<\/span> con el mensaje \u201cchore: <span style=\"font-family: 'courier new', courier, monospace;\">update dependencies<\/span>\u201d.<\/p>\n<p>Los tres enlaces forenses a <span style=\"font-family: 'courier new', courier, monospace;\">@bitwarden\/cli@2026.4.0<\/span> son lo suficientemente precisos como para indicar una autor\u00eda compartida o una cadena de herramientas directamente reutilizada.<\/p>\n<p><strong>1. El bootstrapper de preinstalaci\u00f3n <span style=\"font-family: 'courier new', courier, monospace;\">setup.mjs<\/span>.<\/strong> En la campa\u00f1a Bitwarden, <span style=\"font-family: 'courier new', courier, monospace;\">setup.mjs<\/span> era el artefacto de autorreplicaci\u00f3n que el gusano (<span style=\"font-family: 'courier new', courier, monospace;\">bw1.js<\/span>) inyectaba en cada paquete de npm que la v\u00edctima pod\u00eda publicar. Los paquetes SAP utilizan el mismo nombre de archivo como bootstrapper, y los dos tienen un claro linaje en com\u00fan: la misma versi\u00f3n de Bun (1.3.13), la misma l\u00f3gica de detecci\u00f3n Alpine\/musl y el mismo m\u00e9todo de descarga que sigue redirecciones.<\/p>\n<p><strong>2. El m\u00e9todo de ofuscaci\u00f3n decodeScramble \/ <span style=\"font-family: 'courier new', courier, monospace;\">ctf-scramble-v2<\/span>.<\/strong> La carga \u00fatil de Bitwarden codifica todas las cadenas sensibles utilizando un cifrado personalizado de permutaci\u00f3n ASCII con valor inicial. Se trata de una permutaci\u00f3n Fisher-Yates sobre una tabla ASCII de 128\u00a0caracteres controlada por un PRNG congruente lineal con valor inicial <span style=\"font-family: 'courier new', courier, monospace;\">0x3039<\/span> (<span style=\"font-family: 'courier new', courier, monospace;\">12345<\/span>). El SAP <span style=\"font-family: 'courier new', courier, monospace;\">execution.js<\/span> utiliza una capa expl\u00edcitamente denominada <span style=\"font-family: 'courier new', courier, monospace;\">ctf-scramble-v2<\/span>, que es el mismo esquema de sustituci\u00f3n determinista. Esto no es una biblioteca, es una implementaci\u00f3n a medida. Se reutiliza en ambas cargas \u00fatiles.<\/p>\n<p><strong>3. El patr\u00f3n de dead drop de commits de GitHub.<\/strong> El malware Bitwarden utilizaba la API p\u00fablica de b\u00fasqueda de commits de GitHub como canal\u00a0C2 encubierto. Incrust\u00f3 tokens robados en mensajes de commit que coincid\u00edan con <span style=\"font-family: 'courier new', courier, monospace;\">LongLiveTheResistanceAgainstMachines:&lt;base64&gt;<\/span> y los utiliz\u00f3 para iniciar nuevos canales de exfiltraci\u00f3n sin una infraestructura controlada por el atacante.<\/p>\n<p>Esta ola aplica exactamente el mismo patr\u00f3n bajo una nueva palabra clave (<span style=\"font-family: 'courier new', courier, monospace;\">OhNoWhatsGoingOnWithGitHub<\/span>) con mensajes de commit coincidentes decodificados como un dead drop de tokens. El mecanismo es id\u00e9ntico en su implementaci\u00f3n:<\/p>\n<ul>\n<li>Buscar en la API de GitHub commits que contengan la palabra clave.<\/li>\n<li>Analizar el cuerpo del mensaje de commit.<\/li>\n<li>Descodificar el token incrustado.<\/li>\n<li>Validarlo para acceder al repositorio.<\/li>\n<\/ul>\n<p>Rotar la palabra clave manteniendo intacta la t\u00e9cnica es un sello distintivo del mismo operador que actualiza una base de c\u00f3digo reutilizada.<\/p>\n<h3>El contexto m\u00e1s amplio de la campa\u00f1a Shai-Hulud<\/h3>\n<p>Seg\u00fan la <a href=\"https:\/\/checkmarx.com\/blog\/checkmarx-security-update-april-22\/\" target=\"_blank\" rel=\"noopener\">actualizaci\u00f3n de seguridad oficial de Checkmarx<\/a>, este paquete de npm es un componente de una campa\u00f1a m\u00e1s amplia de la cadena de suministro que comprometi\u00f3 simult\u00e1neamente m\u00faltiples canales de distribuci\u00f3n de Checkmarx:<\/p>\n<ul>\n<li><strong>Docker Hub:<\/strong> Im\u00e1genes <span style=\"font-family: 'courier new', courier, monospace;\">checkmarx\/kics<\/span> envenenadas (v2.1.20, v2.1.21, latest, alpine, debian).<\/li>\n<li><strong>GitHub Actions:<\/strong> <span style=\"font-family: 'courier new', courier, monospace;\">checkmarx\/ast-github-action<\/span> v2.3.35 malicioso.<\/li>\n<li><strong>Extensiones de VS\u00a0Code:<\/strong> <span style=\"font-family: 'courier new', courier, monospace;\">checkmarx\/ast-results<\/span> (v2.63, v2.66) y <span style=\"font-family: 'courier new', courier, monospace;\">checkmarx\/cx-dev-assist<\/span> (v1.17, v1.19) con puerta trasera.<\/li>\n<li><strong>npm:<\/strong> el paquete <span style=\"font-family: 'courier new', courier, monospace;\">@bitwarden\/cli<\/span> analizado en este informe.<\/li>\n<\/ul>\n<p>Seg\u00fan la revelaci\u00f3n de Checkmarx, todos los artefactos tienen la misma infraestructura\u00a0C2 (<span style=\"font-family: 'courier new', courier, monospace;\">audit.checkmarx[.]cx<\/span>), las mismas t\u00e9cnicas de ofuscaci\u00f3n y la misma l\u00f3gica de recolecci\u00f3n y propagaci\u00f3n de credenciales. La variante de la extensi\u00f3n VS\u00a0Code entregaba su carga \u00fatil (<span style=\"font-family: 'courier new', courier, monospace;\">mcpAddon.js<\/span>) desde un commit hu\u00e9rfano con fecha anterior en el propio repositorio GitHub de Checkmarx, por lo que la URL de descarga parec\u00eda confiable.<\/p>\n<p>TeamPCP (<span style=\"font-family: 'courier new', courier, monospace;\">@pcpcats<\/span>) se atribuy\u00f3 p\u00fablicamente el m\u00e9rito de la vulneraci\u00f3n. Seg\u00fan el <a href=\"https:\/\/socket.dev\/blog\/checkmarx-supply-chain-compromise\" target=\"_blank\" rel=\"noopener\">an\u00e1lisis de Socket<\/a>, el grupo ya hab\u00eda atacado la infraestructura de Checkmarx en marzo de 2026, junto con Trivy y LiteLLM, lo que sugiere una campa\u00f1a en curso contra los proveedores de herramientas de seguridad.<\/p>\n<h3><a id=\"post-181758-_heading=h.fcbzdz8ei73p\"><\/a>Descripci\u00f3n general del ataque<\/h3>\n<p>En la Tabla\u00a01, se muestran los atributos del ataque.<\/p>\n<table style=\"width: 99.6063%; height: 216px;\">\n<tbody>\n<tr style=\"height: 24px;\">\n<th style=\"width: 21.7518%; height: 24px;\"><strong>Atributo<\/strong><\/th>\n<th style=\"width: 135.182%; height: 24px;\"><strong>Detalle<\/strong><\/th>\n<\/tr>\n<\/tbody>\n<tbody>\n<tr style=\"height: 24px;\">\n<td style=\"width: 21.7518%; height: 24px;\">Paquete<\/td>\n<td style=\"width: 135.182%; height: 24px;\"><span style=\"font-family: 'courier new', courier, monospace;\">@bitwarden\/cli@2026.4.0<\/span><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 21.7518%; height: 24px;\">Desencadenador<\/td>\n<td style=\"width: 135.182%; height: 24px;\">script de ciclo de vida de <span style=\"font-family: 'courier new', courier, monospace;\">preinstalaci\u00f3n<\/span><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 21.7518%; height: 24px;\">Tiempo de ejecuci\u00f3n<\/td>\n<td style=\"width: 135.182%; height: 24px;\">Bun v1.3.13 (descargado durante la instalaci\u00f3n)<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 21.7518%; height: 24px;\">Servidor C2<\/td>\n<td style=\"width: 135.182%; height: 24px;\"><span style=\"font-family: 'courier new', courier, monospace;\">audit.checkmarx[.]cx:443 (94.154.172[.]43)<\/span><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 21.7518%; height: 24px;\">Ruta C2<\/td>\n<td style=\"width: 135.182%; height: 24px;\"><span style=\"font-family: 'courier new', courier, monospace;\">\/v1\/telemetry<\/span><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 21.7518%; height: 24px;\">C2 de respaldo<\/td>\n<td style=\"width: 135.182%; height: 24px;\">Din\u00e1mico, obtenido mediante dead drop de la API de b\u00fasqueda de GitHub<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 21.7518%; height: 24px;\">Exfiltraci\u00f3n<\/td>\n<td style=\"width: 135.182%; height: 24px;\">HTTPS POST (cifrado) + repositorios p\u00fablicos de GitHub<\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 21.7518%; height: 24px;\">Atribuci\u00f3n<\/td>\n<td style=\"width: 135.182%; height: 24px;\">TeamPCP (<span style=\"font-family: 'courier new', courier, monospace;\">@pcpcats<\/span>)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-size: 10pt;\">Tabla\u00a01. Atributos del ataque.<\/span><\/p>\n<p>El equipo de seguridad de Bitwarden <a href=\"https:\/\/community.bitwarden.com\/t\/bitwarden-statement-on-checkmarx-supply-chain-incident\/96127\" target=\"_blank\" rel=\"noopener\">proporcion\u00f3 la siguiente informaci\u00f3n<\/a>. Identificaron y contuvieron el paquete malicioso descrito en la Tabla\u00a01, que se distribuy\u00f3 brevemente a trav\u00e9s de la ruta de entrega de npm para <span style=\"font-family: 'courier new', courier, monospace;\">@bitwarden\/cli@2026.4.0<\/span> entre las 5:57\u00a0p.\u00a0m. y las 7:30\u00a0p.\u00a0m.\u00a0EST del 22 de abril de 2026, en relaci\u00f3n con el incidente m\u00e1s amplio de la cadena de suministro.<\/p>\n<p>Su investigaci\u00f3n no encontr\u00f3 pruebas de que se hubiera accedido a datos de b\u00f3vedas de usuarios finales o de que estos estuvieran en peligro, ni de que se hubieran puesto en peligro datos o sistemas de producci\u00f3n. Una vez detectado el problema, se realiz\u00f3 lo siguiente:<\/p>\n<ul>\n<li>Se revoc\u00f3 el acceso comprometido.<\/li>\n<li>Se volvi\u00f3 obsoleta la versi\u00f3n maliciosa de npm.<\/li>\n<li>Se iniciaron medidas correctoras de inmediato.<\/li>\n<\/ul>\n<p>El problema afectaba el mecanismo de distribuci\u00f3n de npm para la CLI durante esa ventana limitada, no la integridad de la base de c\u00f3digo leg\u00edtima de la CLI de Bitwarden ni los datos almacenados en la b\u00f3veda.<\/p>\n<p>Las personas que no descargaron el paquete de npm durante esa ventana de tiempo no se vieron afectadas. Bitwarden complet\u00f3 una revisi\u00f3n de los entornos internos, las rutas de lanzamiento y los sistemas relacionados. Por el momento, no encontraron m\u00e1s productos o entornos afectados.<\/p>\n<p>Se est\u00e1 realizando una <a href=\"https:\/\/community.bitwarden.com\/t\/bitwarden-statement-on-checkmarx-supply-chain-incident\/96127\" target=\"_blank\" rel=\"noopener\">CVE para la versi\u00f3n\u00a02026.4.0 de la CLI de Bitwarden<\/a> en relaci\u00f3n con este incidente.<\/p>\n<h3><a id=\"post-181758-_heading=h.lunnlv28srpk\"><\/a>Etapa\u00a01: Bootstrap - bw_setup.js<\/h3>\n<p>El package.json proporciona dos rutas de ejecuci\u00f3n para el script malicioso, como se muestra en la Figura 3.<\/p>\n<figure id=\"attachment_181781\" aria-describedby=\"caption-attachment-181781\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-181781 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-148676-181758-3.png\" alt=\"Captura de pantalla de un fragmento de c\u00f3digo en formato JSON. Incluye una secci\u00f3n \u201cscripts\u201d con un nodo de ejecuci\u00f3n de clave \u201cpreinstall\u201d y una secci\u00f3n \u201cbin\u201d con \u201cbw\u201d.\" width=\"800\" height=\"365\" srcset=\"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-148676-181758-3.png 810w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-148676-181758-3-786x359.png 786w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-148676-181758-3-768x351.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-181781\" class=\"wp-caption-text\">Figura 3. Rutas de ejecuci\u00f3n del script malicioso en el archivo <span style=\"font-family: 'courier new', courier, monospace;\">package.json<\/span>.<\/figcaption><\/figure>\n<p>El hook de <span style=\"font-family: 'courier new', courier, monospace;\">preinstall<\/span> se ejecuta autom\u00e1ticamente durante <span style=\"font-family: 'courier new', courier, monospace;\">npm install<\/span>. El campo \u2018<span style=\"font-family: 'courier new', courier, monospace;\">bin<\/span>\u2019 registra <span style=\"font-family: 'courier new', courier, monospace;\">bw_setup.js<\/span> como el comando \u2018bw\u2019, enlaz\u00e1ndolo simb\u00f3licamente en el PATH del usuario.<\/p>\n<p>Como la CLI leg\u00edtima de Bitwarden tambi\u00e9n utiliza \u2018<span style=\"font-family: 'courier new', courier, monospace;\">bw<\/span>\u2019 como su nombre binario, esto sirve como un disparador secundario. Incluso si se bloquea la <span style=\"font-family: 'courier new', courier, monospace;\">preinstall<\/span> (por ejemplo, mediante <span style=\"font-family: 'courier new', courier, monospace;\">--ignore-scripts<\/span>), el malware se ejecuta la pr\u00f3xima vez que el usuario o cualquier script invoque \u2018bw\u2019. La l\u00ednea shebang <span style=\"font-family: 'courier new', courier, monospace;\">#!\/usr\/bin\/env node<\/span> al inicio de bw_setup.js garantiza que se ejecute como un script Node.js cuando se llama directamente.<\/p>\n<p>El script bootstrap realiza tres acciones:<\/p>\n<ol>\n<li><strong>Detecci\u00f3n de plataformas<\/strong>: identifica el sistema operativo y la arquitectura (Linux, macOS, Windows; x64 o arm64), incluida la detecci\u00f3n de <span style=\"font-family: 'courier new', courier, monospace;\">musl<\/span> frente a <span style=\"font-family: 'courier new', courier, monospace;\">glibc<\/span> en Linux.<\/li>\n<li><strong>Descarga del entorno de ejecuci\u00f3n Bun<\/strong>: descarga el tiempo de ejecuci\u00f3n de Bun JavaScript (v1.3.13) desde la versi\u00f3n oficial <span style=\"font-family: 'courier new', courier, monospace;\">github[.]com\/oven-sh\/bun<\/span>. Esto es necesario porque la carga \u00fatil principal utiliza API espec\u00edficas de Bun (ejecuci\u00f3n de shell, E\/S de archivos, gzip) no disponibles en Node.js.<\/li>\n<li><strong>Ejecuci\u00f3n de la carga \u00fatil<\/strong>: ejecuta <span style=\"font-family: 'courier new', courier, monospace;\">bw1.js<\/span> usando el binario Bun reci\u00e9n descargado.<\/li>\n<\/ol>\n<p>Se incluye una implementaci\u00f3n de extracci\u00f3n ZIP personalizada para evitar cualquier dependencia, por lo que el bootstrap es totalmente aut\u00f3nomo.<\/p>\n<h3><a id=\"post-181758-_heading=h.xxjlm1gvn0wa\"><\/a>Etapa\u00a02: la carga \u00fatil - bw1.js<\/h3>\n<p>La carga \u00fatil es un archivo JavaScript de una sola l\u00ednea de aproximadamente 10\u00a0MB que contiene unas 285,000\u00a0l\u00edneas una vez formateado. Incluye kits de desarrollo de software (SDK) leg\u00edtimos (por ejemplo, AWS SDK, bibliotecas de cliente de Google Cloud, Azure Identity, Octokit, jsonwebtoken, tar) junto con el c\u00f3digo de orquestaci\u00f3n malicioso.<\/p>\n<h4><a id=\"post-181758-_heading=h.b0zkkopysbpn\"><\/a>T\u00e9cnicas de ofuscaci\u00f3n<\/h4>\n<p>El c\u00f3digo emplea m\u00faltiples capas de ofuscaci\u00f3n:<\/p>\n<ul>\n<li><strong>Rotaci\u00f3n de la tabla de cadenas:<\/strong> la funci\u00f3n\u00a0<span style=\"font-family: 'courier new', courier, monospace;\">_0x214e<\/span> resuelve \u00edndices hexadecimales a cadenas de una gran matriz rotada (<span style=\"font-family: 'courier new', courier, monospace;\">_0x1ee1<\/span>), rompiendo el an\u00e1lisis est\u00e1tico y simple de cadenas.<\/li>\n<li><strong>Cifrado de permutaci\u00f3n ASCII con valor inicial:<\/strong> las cadenas sensibles (dominios, rutas de archivos, comandos del shell) se codifican como matrices de \u00edndices num\u00e9ricos en una tabla ASCII permutada mediante Fisher-Yates. La permutaci\u00f3n utiliza un PRNG congruente con valor inicial <span style=\"font-family: 'courier new', courier, monospace;\">0x3039<\/span> (12345), como se muestra en la Figura 4.<\/li>\n<\/ul>\n<figure id=\"attachment_181792\" aria-describedby=\"caption-attachment-181792\" style=\"width: 1000px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-181792 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-150920-181758-4.png\" alt=\"Captura de pantalla de un fragmento que muestra una clase llamada PRNG con un constructor y los m\u00e9todos siguientes. El constructor establece un valor inicial, mientras que el m\u00e9todo \u2018next\u2019 recalcula ese valor utilizando una f\u00f3rmula espec\u00edfica y lo devuelve despu\u00e9s de dividirlo por un n\u00famero grande.\" width=\"1000\" height=\"364\" srcset=\"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-150920-181758-4.png 1444w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-150920-181758-4-786x286.png 786w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-150920-181758-4-768x280.png 768w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><figcaption id=\"caption-attachment-181792\" class=\"wp-caption-text\">Figura 4. Cifrado de permutaci\u00f3n ASCII con valor inicial.<\/figcaption><\/figure>\n<p>El conjunto ASCII de 128\u00a0caracteres se permuta de forma determinista, produciendo una tabla de sustituci\u00f3n en la que un \u00edndice con el valor hexadecimal 0x42 corresponde al car\u00e1cter ASCII \u2018<span style=\"font-family: 'courier new', courier, monospace;\">a<\/span>\u2019 y <span style=\"font-family: 'courier new', courier, monospace;\">0x6e<\/span> a \u2018<span style=\"font-family: 'courier new', courier, monospace;\">u<\/span>\u2019. Por ejemplo, el dominio\u00a0C2 se almacena como [<span style=\"font-family: 'courier new', courier, monospace;\">0x42, 0x6e, 0x36, 0x4b, 0x2b, 0x5c, 0xd, 0x57, 0x0, 0xd, 0x7, 0x26, 0x42, 0x3, 0x2a, 0x5c, 0xd, 0x2a<\/span>], que decodifica una cadena ASCII para el dominio <span style=\"font-family: 'courier new', courier, monospace;\">audit.checkmarx[.]cx<\/span>.<\/p>\n<ul>\n<li><strong>Cargas \u00fatiles incrustadas Gzip y Base64:<\/strong> varios blobs se almacenan como cadenas Base64 comprimidas con gzip, entre ellos una clave p\u00fablica RSA, un flujo de trabajo YAML de GitHub Actions, el cargador <span style=\"font-family: 'courier new', courier, monospace;\">setup.mjs<\/span> del gusano y una cadena manifesto.<\/li>\n<li><strong>Identificadores confusos:<\/strong> todos los nombres de variables y funciones se sustituyen por patrones hexadecimales como <span style=\"font-family: 'courier new', courier, monospace;\">_0x3865d8<\/span>.<\/li>\n<\/ul>\n<h4><a id=\"post-181758-_heading=h.ihmebzf9admg\"><\/a>Recogida de credenciales<\/h4>\n<p>La carga \u00fatil implementa m\u00faltiples clases de <span style=\"font-weight: 400; font-family: 'courier new', courier, monospace;\">provider<\/span>, cada una dirigida a una fuente de credenciales diferente. Cada proveedor escanea sus resultados con patrones regex para extraer tokens de npm y GitHub, como se muestra en la Figura 5.<\/p>\n<figure id=\"attachment_181803\" aria-describedby=\"caption-attachment-181803\" style=\"width: 900px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-181803 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-153063-181758-5.png\" alt=\"Captura de pantalla de un fragmento de c\u00f3digo que muestra dos expresiones regulares para detectar tokens: una para \u2018ghtoken\u2019 y otra para \u2018npmtoken\u2019, ambas siguiendo un patr\u00f3n espec\u00edfico.\" width=\"900\" height=\"254\" srcset=\"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-153063-181758-5.png 914w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-153063-181758-5-786x222.png 786w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-153063-181758-5-768x217.png 768w\" sizes=\"(max-width: 900px) 100vw, 900px\" \/><figcaption id=\"caption-attachment-181803\" class=\"wp-caption-text\">Figura 5. Patrones regex para extraer tokens de npm y GitHub.<\/figcaption><\/figure>\n<h5><a id=\"post-181758-_heading=h.gvn2tbfog0xu\"><\/a>Proveedor del sistema de archivos (Cn)<\/h5>\n<p>Lee los archivos sensibles de la estaci\u00f3n de trabajo del desarrollador, con listas de rutas por SO decodificadas a trav\u00e9s del codificador, como se muestra a continuaci\u00f3n en la Tabla\u00a02.<\/p>\n<table style=\"width: 97.7407%;\">\n<tbody>\n<tr>\n<th style=\"width: 15.0019%;\"><strong>Plataforma<\/strong><\/th>\n<th style=\"width: 84.3414%;\"><strong>Archivos espec\u00edficos<\/strong><\/th>\n<\/tr>\n<\/tbody>\n<tbody>\n<tr>\n<td style=\"width: 15.0019%;\">Linux<\/td>\n<td style=\"width: 84.3414%;\"><span style=\"font-family: 'courier new', courier, monospace;\">~\/.ssh\/id_*, ~\/.ssh\/keys, .git\/config, ~\/.npmrc, .npmrc, .env, ~\/.claude\/mcp.json, ~\/.claude.json, ~\/.kiro\/settings\/mcp.json<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 15.0019%;\">macOS<\/td>\n<td style=\"width: 84.3414%;\"><span style=\"font-family: 'courier new', courier, monospace;\">~\/.aws\/credentials, .git\/config, ~\/.npmrc, .npmrc, .env, ~\/.claude.json, .claude.json, ~\/.kiro\/settings\/mcp.json, .kiro\/settings\/mcp.json<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 15.0019%;\">Windows<\/td>\n<td style=\"width: 84.3414%;\">Rutas de almacenamiento de credenciales, <span style=\"font-family: 'courier new', courier, monospace;\">config.ini<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-size: 10pt;\">Tabla\u00a02. Listas de rutas del SO del malware.<\/span><\/p>\n<p>Se omiten los archivos de m\u00e1s de 5\u00a0MB, aproximadamente. Todos los dem\u00e1s se leen en su totalidad y se incluyen en la carga \u00fatil de exfiltraci\u00f3n.<\/p>\n<h5><a id=\"post-181758-_heading=h.su9ztc3qv1v4\"><\/a>Proveedor de Shell (un)<\/h5>\n<p>Esto ejecuta <span style=\"font-family: 'courier new', courier, monospace;\">gh auth<\/span> token a trav\u00e9s de <span style=\"font-family: 'courier new', courier, monospace;\">execSync<\/span> para obtener el token activo de la CLI de GitHub, y luego recoge el bloque de entorno process.env completo. Ambos son devueltos para el escaneo y la exfiltraci\u00f3n de token-regex. A diferencia de los proveedores en la nube que aparecen a continuaci\u00f3n, Shell Provider no utiliza ning\u00fan SDK, sino que se basa \u00fanicamente en el comando shell \u00fanico y las variables del entorno.<\/p>\n<h5><a id=\"post-181758-_heading=h.mg6sy4sn9cpl\"><\/a>Proveedor de GitHub Actions (Co)<\/h5>\n<p>Esto detecta entornos de CI\/CD a trav\u00e9s de <span style=\"font-family: 'courier new', courier, monospace;\">process.env.GITHUB_ACTIONS ===<\/span> \"<span style=\"font-family: 'courier new', courier, monospace;\">true<\/span>\" y extrae todos los secretos configurados analizando patrones <span style=\"font-family: 'courier new', courier, monospace;\">{\"value\":\"...\",\"isSecret\":true}<\/span> del contexto del ejecutor de acciones.<\/p>\n<h5><a id=\"post-181758-_heading=h.r0lfs96p7yh\"><\/a>Proveedor AWS SSM (ku)<\/h5>\n<p>Utiliza el SDK de AWS incluido (<span style=\"font-family: 'courier new', courier, monospace;\">SSMClient, DescribeParameters, GetParameter<\/span>) para enumerar y leer par\u00e1metros del almac\u00e9n de par\u00e1metros de AWS Systems Manager.<\/p>\n<h5><a id=\"post-181758-_heading=h.2e2np05kg5hs\"><\/a>Proveedor de Azure Key Vault (Rn)<\/h5>\n<p>Utiliza los SDK de Azure Identity y Key Vault para llamar a <span style=\"font-family: 'courier new', courier, monospace;\">getSecretsFromVault<\/span>, listando y leyendo secretos de todas las b\u00f3vedas accesibles.<\/p>\n<h5><a id=\"post-181758-_heading=h.oro9lwdq1z82\"><\/a>Proveedor de Google Cloud Secret Manager (uo)<\/h5>\n<p>Utiliza el cliente Google Cloud Secret Manager para <span style=\"font-family: 'courier new', courier, monospace;\">listSecrets<\/span> y <span style=\"font-family: 'courier new', courier, monospace;\">accessSecretVersion<\/span>, leyendo todos los secretos accesibles en todos los proyectos.<\/p>\n<h4><a id=\"post-181758-_heading=h.83jx52r17h23\"><\/a>Exfiltraci\u00f3n<\/h4>\n<p>Todas las credenciales recolectadas se procesan a trav\u00e9s de un sistema de exfiltraci\u00f3n de dos niveles.<\/p>\n<h5><a id=\"post-181758-_heading=h.ehns4d6y9a4z\"><\/a>Principal: HTTPS a C2 (Clase Cy)<\/h5>\n<ol>\n<li>Los resultados se serializan en JSON y se comprimen con gzip.<\/li>\n<li>Se genera una clave sim\u00e9trica AES-256-GCM aleatoria de 32\u00a0bytes.<\/li>\n<li>Los datos se cifran con AES-256-GCM.<\/li>\n<li>La clave sim\u00e9trica se cifra mediante RSA con una clave p\u00fablica de 4096\u00a0bits codificada (Fr).<\/li>\n<li>El sobre cifrado se env\u00eda a trav\u00e9s de <span style=\"font-family: 'courier new', courier, monospace;\">POST hxxps[:]\/\/audit.checkmarx[.]cx:443\/v1\/telemetry<\/span>.<\/li>\n<\/ol>\n<h5><a id=\"post-181758-_heading=h.eabbw5ep0105\"><\/a>Secundaria: repositorios p\u00fablicos de GitHub (Clase ky)<\/h5>\n<p>Usando tokens robados de GitHub, el malware realiza lo siguiente:<\/p>\n<ol>\n<li>Crea un nuevo repositorio p\u00fablico en la cuenta de la v\u00edctima con la descripci\u00f3n \"<span style=\"font-family: 'courier new', courier, monospace;\">Checkmarx Configuration Storage<\/span>\" y un nombre tem\u00e1tico de Dune (por ejemplo, <span style=\"font-family: 'courier new', courier, monospace;\">gesserit-melange-813<\/span>).<\/li>\n<li>Consigna los archivos de resultados encriptados en un directorio <span style=\"font-family: 'courier new', courier, monospace;\">results\/<\/span>.<\/li>\n<li>Incrusta los tokens robados en mensajes de commit con el formato <span style=\"font-family: 'courier new', courier, monospace;\">LongLiveTheResistanceAgainstMachines:&lt;base64_token&gt;<\/span>.<\/li>\n<\/ol>\n<p>Esta doble exfiltraci\u00f3n garantiza que los datos lleguen al atacante, aunque el dominio\u00a0C2 est\u00e9 bloqueado.<\/p>\n<h5><a id=\"post-181758-_heading=h.5jwtsg4k5hjq\"><\/a>Inyecci\u00f3n de flujo de trabajo de GitHub Actions (Clase u_)<\/h5>\n<p>Cuando el malware obtiene un token de GitHub con \u00e1mbitos de repositorio y flujo de trabajo, la clase\u00a0<span style=\"font-family: 'courier new', courier, monospace;\">u_<\/span> valida los \u00e1mbitos y, a continuaci\u00f3n:<\/p>\n<ul>\n<li>Enumera los repositorios a los que la v\u00edctima puede enviar mensajes, dando prioridad a los activos recientemente.<\/li>\n<li>Comprueba si cada repositorio tiene configurados los secretos de GitHub Actions (omite los repositorios que no los tengan).<\/li>\n<li>Crea una nueva rama y confirma <span style=\"font-family: 'courier new', courier, monospace;\">.github\/workflows\/format-check.yml<\/span>, un flujo de trabajo malicioso que vuelca todos los secretos, como se muestra a continuaci\u00f3n en la Figura 6.<\/li>\n<\/ul>\n<figure id=\"attachment_181814\" aria-describedby=\"caption-attachment-181814\" style=\"width: 1000px\" class=\"wp-caption alignnone\"><img  class=\"wp-image-181814 lozad\"  data-src=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-154991-181758-6.png\" alt=\"Captura de pantalla de un script de configuraci\u00f3n YAML para un flujo de trabajo de GitHub Actions. El nombre del flujo de trabajo es \u201cFormatter\u201d y utiliza las acciones \u201cactions\/checkout\u201d y \u201cupload-artifact\u201d. El flujo de trabajo est\u00e1 configurado para enviar los resultados a un archivo espec\u00edfico. \" width=\"1000\" height=\"552\" srcset=\"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-154991-181758-6.png 1764w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-154991-181758-6-786x434.png 786w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-154991-181758-6-1268x700.png 1268w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-154991-181758-6-768x424.png 768w, https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/05\/word-image-154991-181758-6-1536x848.png 1536w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><figcaption id=\"caption-attachment-181814\" class=\"wp-caption-text\">Figura 6. Contenido del archivo <span style=\"font-family: 'courier new', courier, monospace;\">format-check.yml<\/span>.<\/figcaption><\/figure>\n<ul>\n<li>Descarga el artefacto resultante que contiene todos los secretos serializados.<\/li>\n<li>Elimina la rama y el flujo de trabajo ejecutado para cubrir sus huellas.<\/li>\n<\/ul>\n<h4><a id=\"post-181758-_heading=h.egvtzvpo7akk\"><\/a>Propagaci\u00f3n del gusano en npm<\/h4>\n<p>Este es el componente autorreplicante. Cuando el malware encuentra un token de npm (<span style=\"font-family: 'courier new', courier, monospace;\">npm_...<\/span>), realiza las siguientes actividades.<\/p>\n<h5><a id=\"post-181758-_heading=h.ylozie7t3j5d\"><\/a>Validaci\u00f3n de tokens<\/h5>\n<p>Llama a la API de tokens de npm con <span style=\"font-family: 'courier new', courier, monospace;\">Authorization: Bearer &lt;token&gt;<\/span>, verifica que el token tiene permiso de <span style=\"font-family: 'courier new', courier, monospace;\">publish<\/span> (escritura) en el \u00e1mbito del paquete y que omite la autenticaci\u00f3n de dos factores (2FA).<\/p>\n<h5><a id=\"post-181758-_heading=h.orvfhepwleoc\"><\/a>Enumeraci\u00f3n de paquetes<\/h5>\n<p>Utiliza el token validado para realizar las siguientes actividades:<\/p>\n<ul>\n<li>Obtener del nombre de usuario de npm.<\/li>\n<li>Recorrer los recursos permitidos del token (orgs, \u00e1mbitos, paquetes espec\u00edficos).<\/li>\n<li>Consultar <span style=\"font-family: 'courier new', courier, monospace;\">\/-\/org\/&lt;user&gt;\/package<\/span> para los paquetes con permisos de escritura.<\/li>\n<li>Volver a <span style=\"font-family: 'courier new', courier, monospace;\">\/-\/v1\/search?text=maintainer:&lt;user&gt;<\/span> para los paquetes p\u00fablicos.<\/li>\n<\/ul>\n<h5><a id=\"post-181758-_heading=h.w4ixuy1xa40j\"><\/a>Descarga de tarballs y puertas traseras<\/h5>\n<p>Con cada paquete objetivo, realiza lo siguiente:<\/p>\n<ul>\n<li>Descarga el \u00faltimo tarball del registro de npm.<\/li>\n<li>Extrae a un directorio temporal.<\/li>\n<li>Copia el binario Bun en el paquete.<\/li>\n<li>Reescribe el <span style=\"font-family: 'courier new', courier, monospace;\">package.json<\/span>.\n<ul>\n<li>Borra todos los scripts.<\/li>\n<li>Establece \"<span style=\"font-family: 'courier new', courier, monospace;\">preinstall<\/span>\": \"<span style=\"font-family: 'courier new', courier, monospace;\">node setup.mjs<\/span>\" (decodificado del codificador).<\/li>\n<li>Aumenta la versi\u00f3n del parche (por ejemplo, <span style=\"font-family: 'courier new', courier, monospace;\">1.2.3 \u2192 1.2.4<\/span>).<\/li>\n<\/ul>\n<\/li>\n<li>Escribe setup.mjs con la carga \u00fatil completa del gusano (K$, una copia codificada en gzip+Base64 del malware).<\/li>\n<li>Vuelve a empaquetar el tarball.<\/li>\n<\/ul>\n<h5><a id=\"post-181758-_heading=h.mrf44ld7t468\"><\/a>Publicaci\u00f3n<\/h5>\n<p>Escribe un <span style=\"font-family: 'courier new', courier, monospace;\">.npmrc<\/span> con la l\u00ednea auth del token robado (<span style=\"font-family: 'courier new', courier, monospace;\">\/\/registry.npmjs[.]org\/:_authToken=&lt;token&gt;<\/span>) y ejecuta <span style=\"font-family: 'courier new', courier, monospace;\">bun publish &lt;tarball&gt;<\/span>.<\/p>\n<p>Cada nuevo paquete infectado activar\u00e1 la misma cadena de preinstalaci\u00f3n en cualquier desarrollador que lo instale, creando un vector de propagaci\u00f3n exponencial.<\/p>\n<h3><a id=\"post-181758-_heading=h.f5mxj838xnyr\"><\/a>Resiliencia de C2: el dead drop de GitHub<\/h3>\n<p>El malware implementa un mecanismo de respaldo para la resiliencia de C2 utilizando la API de b\u00fasqueda p\u00fablica de GitHub como canal de comando encubierto.<\/p>\n<p>Si el servidor\u00a0C2 primario (<span style=\"font-family: 'courier new', courier, monospace;\">audit.checkmarx[.]cx<\/span>) es inalcanzable, el malware realiza lo siguiente:<\/p>\n<ol>\n<li>Busca en los commits de GitHub la palabra clave <span style=\"font-family: 'courier new', courier, monospace;\">beautifulcastle<\/span> a trav\u00e9s de la API de b\u00fasqueda p\u00fablica.<\/li>\n<li>Encuentra un commit coincidente en <span style=\"font-family: 'courier new', courier, monospace;\">[helloworm00\/hello-world](hxxps[:]\/\/github[.]com\/helloworm00\/hello-world)<\/span> (commit <span style=\"font-family: 'courier new', courier, monospace;\">bc544f4<\/span>, fechado el 21 de abril, un d\u00eda antes del ataque principal).<\/li>\n<li>Analiza el cuerpo del mensaje de commit con la regex <span style=\"font-family: 'courier new', courier, monospace;\">\/beautifulcastle ([A-Za-z0-9+\/=]{1,30})\\.([A-Za-z0-9+\/=]{1,700})\/<\/span>.<\/li>\n<li>Decodifica el primer grupo de captura de Base64 para obtener un dominio.<\/li>\n<li>Verifica el segundo grupo de captura como una firma digital (RSA-4096 de 512 bytes) contra la clave p\u00fablica codificada <span style=\"font-family: 'courier new', courier, monospace;\">Er<\/span>. Esto garantiza que solo el atacante pueda dirigir el malware a un nuevo servidor C2.<\/li>\n<\/ol>\n<p>En el momento del an\u00e1lisis, el dead drop conten\u00eda un valor de marcador de posici\u00f3n (<span style=\"font-family: 'courier new', courier, monospace;\">hxxps[:]\/\/ejemplo[.]com<\/span>), lo que indicaba que estaba preparado para un uso futuro. El atacante puede rotar la infraestructura\u00a0C2 en cualquier momento creando un nuevo commit firmado en cualquier repositorio p\u00fablico de GitHub.<\/p>\n<p>Un segundo mecanismo de respaldo (funci\u00f3n\u00a0<span style=\"font-family: 'courier new', courier, monospace;\">Hr<\/span>) busca commits que coincidan con <span style=\"font-family: 'courier new', courier, monospace;\">LongLiveTheResistanceAgainstMachines:&lt;base64&gt;<\/span> para recuperar tokens de GitHub previamente robados de repos de exfiltraci\u00f3n, iniciando nuevos canales de exfiltraci\u00f3n basados en GitHub sin una infraestructura controlada por el atacante.<\/p>\n<h4><a id=\"post-181758-_heading=h.pe86anxewawy\"><\/a>Medidas antidetecci\u00f3n<\/h4>\n<ul>\n<li><strong>Mecanismo de desactivaci\u00f3n basado en configuraci\u00f3n regional rusa:<\/strong> La funci\u00f3n\u00a0<span style=\"font-family: 'courier new', courier, monospace;\">mz0<\/span> comprueba <span style=\"font-family: 'courier new', courier, monospace;\">Intl.DateTimeFormat().resolvedOptions().locale, LC_ALL, LC_MESSAGES, LANGUAGE y LANG<\/span> detectar configuraciones regionales rusas (<span style=\"font-family: 'courier new', courier, monospace;\">ru<\/span>). Si alguna coincide, el malware llama a <span style=\"font-family: 'courier new', courier, monospace;\">process.exit(0)<\/span> inmediatamente sin ejecutar.<\/li>\n<li><strong>Ejecuci\u00f3n como demonio:<\/strong> la funci\u00f3n <span style=\"font-family: 'courier new', courier, monospace;\">Ml0<\/span> reinicia el proceso separado con <span style=\"font-family: 'courier new', courier, monospace;\">__DAEMONIZED=1<\/span> en el entorno, permitiendo que el proceso principal salga limpiamente mientras la carga \u00fatil se ejecuta en segundo plano.<\/li>\n<li><strong>Archivo de bloqueo basado en PID: <\/strong><span style=\"font-family: 'courier new', courier, monospace;\">$l0<\/span> escribe <span style=\"font-family: 'courier new', courier, monospace;\">process.pid<\/span> en un archivo temporal y comprueba si una instancia anterior sigue viva mediante <span style=\"font-family: 'courier new', courier, monospace;\">process.kill(pid, 0)<\/span>, evitando que se ejecuten varias instancias en simult\u00e1neo.<\/li>\n<li><strong>Controladores de se\u00f1ales:<\/strong> captura <span style=\"font-family: 'courier new', courier, monospace;\">SIGINT\/SIGTERM<\/span> con callbacks sin operaci\u00f3n (<span style=\"font-family: 'courier new', courier, monospace;\">() =&gt; {}<\/span>) para impedir las interrupciones.<\/li>\n<li><strong>Limpieza de directorios temporales:<\/strong> tras la manipulaci\u00f3n del tarball, se eliminan los artefactos forenses.<\/li>\n<li><strong>Todas las cadenas sensibles: <\/strong>codificado mediante el codificador o gzip+Base64.<\/li>\n<li><strong>Gesti\u00f3n silenciosa de errores:<\/strong> los fallos se detectan y suprimen.<\/li>\n<li><strong>Nombramiento inocuo:<\/strong> la ruta de C2 <span style=\"font-family: 'courier new', courier, monospace;\">v1\/telemetry<\/span> imita endpoints de an\u00e1lisis leg\u00edtimos.<\/li>\n<\/ul>\n<h2><a id=\"post-181758-_heading=h.zek1c5ltaqmi\"><\/a>Gu\u00edas provisionales<\/h2>\n<ol>\n<li><strong>Bloquee<\/strong> los dominios\u00a0C2 y las IP enumeradas anteriormente en el per\u00edmetro de la red.<\/li>\n<li><strong>Rote<\/strong> todas las credenciales que puedan haber estado expuestas: tokens de npm, PAT de GitHub, claves de AWS\/Azure\/Google Cloud, claves SSH y secretos CI\/CD.<\/li>\n<li><strong>Audite<\/strong> los paquetes de npm que mantiene en busca de cambios de versi\u00f3n no autorizados o nuevos hooks de <span style=\"font-family: 'courier new', courier, monospace;\">preinstall<\/span>.<\/li>\n<li><strong>Revise<\/strong> GitHub para detectar la creaci\u00f3n de repositorios no autorizada, archivos de flujo de trabajo inesperados y descargas de artefactos.<\/li>\n<li><strong>Busque<\/strong> el artefacto <span style=\"font-family: 'courier new', courier, monospace;\">format-results<\/span> en los registros de GitHub Actions de la organizaci\u00f3n.<\/li>\n<li><strong>Busque<\/strong> la ejecuci\u00f3n inesperada de procesos Bun y conexiones salientes a la infraestructura de indicadores de vulneraci\u00f3n (IoC).<\/li>\n<li><strong>Vincule<\/strong> las dependencias a versiones buenas conocidas mediante archivos de bloqueo y hashes de integridad.<\/li>\n<\/ol>\n<h2><a id=\"post-181758-_heading=h.wkvs7p4i49vx\"><\/a>Consultas de b\u00fasqueda de amenazas gestionada de Unit\u00a042<\/h2>\n<p>El equipo de b\u00fasqueda de amenazas gestionada de Unit\u00a042 contin\u00faa rastreando cualquier intento de explotar esta CVE entre nuestros clientes utilizando Cortex\u00a0XDR y las consultas XQL que se muestran a continuaci\u00f3n. Los clientes de Cortex\u00a0XDR tambi\u00e9n pueden usar estas consultas\u00a0XQL para buscar signos de explotaci\u00f3n.<\/p>\n<p>La siguiente consulta\u00a0XQL se ha utilizado para identificar con \u00e9xito la ejecuci\u00f3n de un archivo JavaScript a trav\u00e9s de Bun que, luego, llama a la CLI de GitHub probablemente en un intento de recopilar tokens de autenticaci\u00f3n almacenados localmente. Si bien Bun es leg\u00edtimo en muchos entornos de desarrollo, su uso como entorno de ejecuci\u00f3n para malware de instalaci\u00f3n de paquetes en esta campa\u00f1a hace que valga la pena investigar este comportamiento cuando se observa con comandos de acceso a credenciales como <span style=\"font-family: 'courier new', courier, monospace;\">gh auth token<\/span>:<\/p>\n<pre class=\"lang:default decode:true\">\/\/ Title: Mini Shai-Hulud antv package compromise malicious package installation and persistence\r\n\/\/ Description: Identifies the Mini Shai-Hulud installation activity at various stages involved in the antv npm package compromise.\r\n\/\/ MITRE ATT&amp;CK TTP ID: T1195.001\r\nconfig case_sensitive = false\r\n| dataset = xdr_data\r\n| fields agent_hostname, event_id, actor_effective_username, actor_process_image_command_line, actor_process_image_path, actor_process_image_sha256, action_file_sha256, action_file_path, action_file_name, action_process_image_command_line, action_process_image_path, action_process_image_name, event_type, event_sub_type, action_external_hostname\r\n| filter event_type in (ENUM.FILE, ENUM.NETWORK)\r\nand (action_file_path ~= \"(?:\\\/tmp\\\/kitty\\-[A-Za-z0-9]{6}\\\/.\\.py|\\.local\\\/share\\\/kitty\\\/cat\\.py)\"\r\nor (actor_process_image_path ~= \"\\.npm\\\/_npx\\\/[0-9a-f]{16}\\\/node_modules\\\/bun\\\/bin\\\/bun.exe\" and (action_file_path ~= \"\\.npm\\\/_npx\\\/[0-9a-f]{16}\\\/node_modules\\\/nx\\-next\\\/index\\.js\" or action_external_hostname ~= \"(?:t\\.m\\-kosche\\.com|api\\.github\\.com)\")))<\/pre>\n<h2><a id=\"post-181758-_heading=h.sjsj4e168v4\"><\/a>Conclusi\u00f3n<\/h2>\n<p>Unit\u00a042 ha sido testigo de un cambio desde el incidente de Shai-Hulud de septiembre de 2025, lo que demostr\u00f3 que no se trataba de un pico temporal, sino de la nueva l\u00ednea de base para el riesgo que corre la cadena de suministro de software. En un ecosistema en el que el c\u00f3digo se comparte a la velocidad del pensamiento, una sola dependencia comprometida puede desencadenar una cascada global.<\/p>\n<p>En \u00faltima instancia, los compromisos de npm comparten aspectos y las organizaciones pueden navegar por esta volatilidad teniendo en cuenta determinadas pr\u00e1cticas recomendadas. A medida que continuamos supervisando, analizando y actualizando los hallazgos sobre los paquetes de npm, le recomendamos ir m\u00e1s all\u00e1 de las defensas est\u00e1ticas y adoptar una cultura de verificaci\u00f3n continua. Quiz\u00e1s la cadena de suministro sea el nuevo objetivo principal, pero con inteligencia colectiva y visibilidad implacable, no tiene por qu\u00e9 ser la vulnerabilidad principal.<\/p>\n<h2><a id=\"post-181758-_heading=h.hafzdjqcyxh2\"><\/a>Mitigaci\u00f3n para paquetes de npm comprometidos<\/h2>\n<p><strong>Aplicar periodos de enfriamiento<\/strong>: implemente una pol\u00edtica (a trav\u00e9s de un registro privado o proxy como Artifactory) que bloquee cualquier versi\u00f3n de paquete publicada en las \u00faltimas 24 a 72\u00a0horas. La mayor\u00eda de los paquetes maliciosos se identifican y eliminan del registro p\u00fablico dentro de esta ventana de tiempo.<\/p>\n<p><strong>Desactivaci\u00f3n de los scripts del ciclo de vida<\/strong>: muchas vulneraciones se basan en hooks de preinstalaci\u00f3n o postinstalaci\u00f3n para exfiltrar secretos. Utilice lo siguiente en su <span style=\"font-family: 'courier new', courier, monospace;\">.npmrc: ignore-scripts=true<\/span>.<\/p>\n<p><strong>Fijaci\u00f3n de versiones y npm ci<\/strong>: utilice <span style=\"font-family: 'courier new', courier, monospace;\">package-lock.json<\/span> y aseg\u00farese de que sus canales de CI\/CD utilicen <span style=\"font-family: 'courier new', courier, monospace;\">npm\u00a0ci<\/span> en lugar de <span style=\"font-family: 'courier new', courier, monospace;\">npm install<\/span>. Esto evita la actualizaci\u00f3n \u201coculta\u201d de dependencias durante una compilaci\u00f3n.<\/p>\n<p><strong>Proxy de registro privado<\/strong>: nunca permita que las m\u00e1quinas de los desarrolladores o los ejecutores de CI se comuniquen directamente con <span style=\"font-family: 'courier new', courier, monospace;\">registry.npmjs[.]org<\/span>. Dirija todo el tr\u00e1fico a trav\u00e9s de un registro privado.<\/p>\n<p><strong>Ocultamiento de espacios de nombres<\/strong> (prevenci\u00f3n de la confusi\u00f3n de dependencias): los atacantes suelen publicar en el registro p\u00fablico paquetes con el mismo nombre que sus bibliotecas internas. Utilice siempre paquetes con \u00e1mbito definido (por ejemplo, <span style=\"font-family: 'courier new', courier, monospace;\">@myorg\/internal-lib<\/span>) y configure su registro privado para que solo resuelva ese \u00e1mbito internamente.<\/p>\n<p><strong>Verificaci\u00f3n de la procedencia<\/strong>: verifique el certificado de OpenID Connect. Muchos paquetes importantes proporcionan \u201cprocedencia\u201d, lo que demuestra que el c\u00f3digo se construy\u00f3 en un ejecutor espec\u00edfico de GitHub\/GitLab. Utilice herramientas como <span style=\"font-family: 'courier new', courier, monospace;\">slsa-verifier<\/span> para comprobarlo durante la compilaci\u00f3n.<\/p>\n<p><strong>Filtrado de salida en CI\/CD<\/strong>: La mayor\u00eda del malware basado en npm intenta enviar tokens <span style=\"font-family: 'courier new', courier, monospace;\">~\/.npmrc<\/span> o claves <span style=\"font-family: 'courier new', courier, monospace;\">~\/.ssh<\/span> a un servidor\u00a0C2. Aplique estrictas pol\u00edticas de red de salida a sus ejecutores de CI. Solo permita conexiones a su registro privado y a objetivos de implementaci\u00f3n conocidos.<\/p>\n<p><strong>Lista de materiales de software<\/strong> (SBOM): genere autom\u00e1ticamente una lista de materiales de software para cada versi\u00f3n de producci\u00f3n. Esto le permite a su equipo de seguridad realizar un an\u00e1lisis de impacto instant\u00e1neo cuando se anuncia un nuevo d\u00eda cero.<\/p>\n<p>Palo Alto Networks ha compartido nuestros resultados con nuestros compa\u00f1eros de Cyber Threat Alliance (CTA). Los miembros de CTA utilizan esta inteligencia para implementar r\u00e1pidamente medidas de protecci\u00f3n para sus clientes y desarticular sistem\u00e1ticamente a los ciberdelincuentes. Obtenga m\u00e1s informaci\u00f3n sobre <a href=\"https:\/\/www.cyberthreatalliance.org\/\" target=\"_blank\" rel=\"noopener\">Cyber Threat Alliance<\/a>.<\/p>\n<p>Los clientes de Palo Alto Networks est\u00e1n mejor protegidos gracias a nuestros productos, como se indica a continuaci\u00f3n. Actualizaremos este resumen de amenazas a medida que dispongamos de m\u00e1s informaci\u00f3n pertinente.<\/p>\n<h2><a id=\"post-181758-_heading=h.tofavyn3ol6z\"><\/a>Protecciones de productos de Palo Alto Networks relacionadas con paquetes de npm comprometidos<\/h2>\n<p>Los clientes de Palo Alto Networks pueden aprovechar varias protecciones y actualizaciones de productos para identificar y defenderse contra esta amenaza.<\/p>\n<p>Si cree que podr\u00eda haber resultado vulnerado o tiene un problema urgente, p\u00f3ngase en contacto con el <a href=\"https:\/\/start.paloaltonetworks.com\/contact-unit42.html\" target=\"_blank\" rel=\"noopener\">equipo de respuesta ante incidentes de Unit\u00a042<\/a> o llame al:<\/p>\n<ul>\n<li>Norteam\u00e9rica: llamada gratuita: +1\u00a0(866)\u00a0486-4842 (866.4.UNIT42)<\/li>\n<li>Reino Unido: +44.20.3743.3660<\/li>\n<li>Europa y Oriente Medio: +31.20.299.3130<\/li>\n<li>Asia: +65.6983.8730<\/li>\n<li>Jap\u00f3n: +81.50.1790.0200<\/li>\n<li>Australia: +61.2.4062.7950<\/li>\n<li>India: 000 800 050 45107<\/li>\n<li>Corea del Sur: +82.080.467.8774<\/li>\n<\/ul>\n<h3><a id=\"post-181758-_heading=h.bi3uef6jc8pv\"><\/a>Advanced WildFire<\/h3>\n<p>Los modelos de aprendizaje autom\u00e1tico y las t\u00e9cnicas de an\u00e1lisis de <a href=\"https:\/\/docs.paloaltonetworks.com\/wildfire\" target=\"_blank\" rel=\"noopener\">Advanced WildFire<\/a> se han revisado y actualizado a la luz de los indicadores asociados con las vulneraciones de npm, incluido el paquete malicioso Bitwarden.<\/p>\n<h3><a id=\"post-181758-_heading=h.u9heys547ppc\"><\/a>Servicios de seguridad entregados en la nube para el firewall de nueva generaci\u00f3n<\/h3>\n<p><a href=\"https:\/\/docs.paloaltonetworks.com\/pan-os\/10-1\/pan-os-new-features\/url-filtering-features\/advanced-url-filtering\" target=\"_blank\" rel=\"noopener\">Advanced URL Filtering<\/a> y<a href=\"https:\/\/docs.paloaltonetworks.com\/dns-security\" target=\"_blank\" rel=\"noopener\">Advanced DNS Security<\/a>\u00a0identifican los dominios y las direcciones\u00a0IP conocidas que se asocian con esta actividad como maliciosos.<\/p>\n<h3><a id=\"post-181758-_heading=h.g3mn7mjirgh1\"><\/a>Cortex Cloud<\/h3>\n<p>El M\u00f3dulo de Seguridad de Aplicaciones (<a href=\"https:\/\/www.paloaltonetworks.com\/cortex\/cloud\/application-security-posture-management\" target=\"_blank\" rel=\"noopener\">ASPM<\/a>) de <a href=\"https:\/\/www.paloaltonetworks.com\/cortex\/cloud\" target=\"_blank\" rel=\"noopener\">Cortex Cloud<\/a> admite el escaneo de paquetes de npm instalados en recursos en la nube, as\u00ed como el monitoreo de registros de auditor\u00eda de terceros proveedores de SaaS, incluido GitHub, como se discute en este art\u00edculo. Cortex Cloud prioriza las alertas, los problemas, las pol\u00edticas y los activos en funci\u00f3n de las aplicaciones ingeridas y de su uso. Esto les permite a los equipos de seguridad seguir siendo conscientes de la seguridad en las instalaciones y en el entorno de nube mediante la identificaci\u00f3n y la remediaci\u00f3n de los recursos en la nube afectados y la respuesta activa a <a href=\"https:\/\/docs-cortex.paloaltonetworks.com\/r\/Cortex-CLOUD\/Cortex-Cloud-Runtime-Security-Documentation\/Endpoint-protection\" target=\"_blank\" rel=\"noopener\">las operaciones en tiempo de ejecuci\u00f3n<\/a> asociadas de las amenazas analizadas en este art\u00edculo a trav\u00e9s del agente XDR y de las operaciones <a href=\"https:\/\/docs-cortex.paloaltonetworks.com\/r\/Cortex-XSIAM\/Cortex-XSIAM-Premium-Documentation\/Use-cases\" target=\"_blank\" rel=\"noopener\">sin servidor<\/a> de Cortex Cloud. Para conocer con m\u00e1s detalle c\u00f3mo protegerse contra esta amenaza utilizando Cortex Cloud, <a href=\"https:\/\/www.paloaltonetworks.com\/blog\/cloud-security\/bitwardencli-supply-chain-attack.\" target=\"_blank\" rel=\"noopener\">consulte el blog<\/a>.<\/p>\n<h3><a id=\"post-181758-_heading=h.l1k0a6b5rlgk\"><\/a>Seguridad de endpoints ag\u00e9ntica de Koi<\/h3>\n<p><a href=\"https:\/\/www.koi.ai\/product\/endpoint\" target=\"_blank\" rel=\"noopener\">Koi Agentic Endpoint Security<\/a> les permite a los clientes retrasar las actualizaciones autom\u00e1ticas de todos los paquetes instalados por un per\u00edodo de tiempo establecido, por lo que las versiones reci\u00e9n lanzadas ganan una reputaci\u00f3n y son sometidas a escrutinio p\u00fablico antes de que las implementen en su entorno.<\/p>\n<h2><a id=\"post-181758-_heading=h.br0cq0z5wx42\"><\/a>Indicadores de vulneraci\u00f3n<\/h2>\n<h3><a id=\"post-181758-_heading=h.jis9n6q95p4h\"><\/a>Actividad de los indicadores a partir del 29 de abril de 2026<\/h3>\n<h4><a id=\"post-181758-_heading=h.yvg2ta1wz8tp\"><\/a>Paquetes afectados<\/h4>\n<ul>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">@cap-js\/sqlite@2.2.2<\/span><\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">@cap-js\/postgres@2.2.2<\/span><\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">@cap-js\/db-service@2.10.1<\/span><\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">mbt@1.2.48<\/span><\/li>\n<\/ul>\n<h4><a id=\"post-181758-_heading=h.ih6i87mit4re\"><\/a>SHA256 Hashes<\/h4>\n<ul>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">setup.mjs: 4066781fa830224c8bbcc3aa005a396657f9c8f9016f9a64ad44a9d7f5f45e34<\/span><\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">execution.js: 6f933d00b7d05678eb43c90963a80b8947c4ae6830182f89df31da9f568fea95<\/span><\/li>\n<\/ul>\n<h4><a id=\"post-181758-_heading=h.3oi5wgbnzp2b\"><\/a>URL<\/h4>\n<ul>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">hxxps[:]\/\/github[.]com\/oven-sh\/bun\/releases\/download\/bun-v1.3.13\/ (descarga de Bun)<\/span><\/li>\n<li><span style=\"font-family: 'courier new', courier, monospace;\">hxxps[:]\/\/api.github[.]com\/search\/commits?q=OhNoWhatsGoingOnWithGitHub (dead drop)<\/span><\/li>\n<\/ul>\n<p>Actividad de los indicadores a partir del 22 de abril de 2026<\/p>\n<h3><a id=\"post-181758-_heading=h.choq71yrz8lt\"><\/a>Indicadores de red<\/h3>\n<p>En la Tabla 3, se presentan los indicadores de red de esta actividad.<\/p>\n<table style=\"width: 100.217%;\">\n<tbody>\n<tr>\n<td style=\"width: 37.2881%; text-align: center;\"><strong>Indicador<\/strong><\/td>\n<td style=\"width: 226.172%; text-align: center;\"><strong>Tipo<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<tbody>\n<tr>\n<td style=\"width: 37.2881%;\"><span style=\"font-family: 'courier new', courier, monospace;\">audit.checkmarx[.]cx<\/span><\/td>\n<td style=\"width: 226.172%;\">Dominio C2<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 37.2881%;\"><span style=\"font-family: 'courier new', courier, monospace;\">94.154.172[.]43<\/span><\/td>\n<td style=\"width: 226.172%;\">Direcci\u00f3n\u00a0IP de C2<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 37.2881%;\"><span style=\"font-family: 'courier new', courier, monospace;\">checkmarx[.]cx<\/span><\/td>\n<td style=\"width: 226.172%;\">Dominio controlado por el atacante<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 37.2881%;\"><span style=\"font-family: 'courier new', courier, monospace;\">91.195.240[.]123<\/span><\/td>\n<td style=\"width: 226.172%;\">Direcci\u00f3n IP del atacante<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-size: 10pt;\">Tabla\u00a03. Indicadores de red.<\/span><\/p>\n<h3><a id=\"post-181758-_heading=h.ualo98ly4ae4\"><\/a>Indicadores de GitHub<\/h3>\n<p>En la Tabla 4, se enumeran los indicadores de GitHub de esta actividad.<\/p>\n<table style=\"width: 99.9983%;\">\n<tbody>\n<tr>\n<td style=\"text-align: center; width: 76.2867%;\"><strong>Indicador<\/strong><\/td>\n<td style=\"text-align: center; width: 26.1556%;\"><strong>Tipo<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<tbody>\n<tr>\n<td style=\"width: 76.2867%;\"><span style=\"font-family: 'courier new', courier, monospace;\">helloworm00\/hello-world<\/span><\/td>\n<td style=\"width: 26.1556%;\">Repositorio dead drop<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 76.2867%;\"><span style=\"font-family: 'courier new', courier, monospace;\">bc544f455d7c06c8a1f3446160a6d9a4a8236b11<\/span><\/td>\n<td style=\"width: 26.1556%;\">Hash SHA1 del commit utilizado como dead drop<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 76.2867%;\"><span style=\"font-family: 'courier new', courier, monospace;\">helloworm00@proton[.]me<\/span><\/td>\n<td style=\"width: 26.1556%;\">Correo electr\u00f3nico del atacante<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 76.2867%;\">Mensajes de commit que coincidan con <span style=\"font-family: 'courier new', courier, monospace;\">LongLiveTheResistanceAgainstMachines:*<\/span><\/td>\n<td style=\"width: 26.1556%;\">Puesta en escena de la exfiltraci\u00f3n<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 76.2867%;\">Repositorios p\u00fablicos denominados <span style=\"font-family: 'courier new', courier, monospace;\">&lt;dune-word&gt;-&lt;dune-word&gt;-&lt;3digits&gt;<\/span> con la descripci\u00f3n <span style=\"font-family: 'courier new', courier, monospace;\">\u201cCheckmarx Configuration Storage\u201d<\/span>.<\/td>\n<td style=\"width: 26.1556%;\">Repositorios de exfiltraci\u00f3n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-size: 10pt;\">Tabla\u00a04. Indicadores de GitHub.<\/span><\/p>\n<h3><a id=\"post-181758-_heading=h.bjibkepe0q4l\"><\/a>Indicadores de proceso y archivos<\/h3>\n<p>En la Tabla\u00a05, se enumeran los indicadores de archivos y procesos de esta actividad.<\/p>\n<table style=\"width: 101.195%; height: 243px;\">\n<thead>\n<tr style=\"height: 24px;\">\n<th style=\"width: 27.6654%; height: 24px;\"><strong>Indicador<\/strong><\/th>\n<th style=\"width: 17.6181%; height: 24px;\"><strong>Tipo<\/strong><\/th>\n<th style=\"width: 57.7641%; height: 24px;\"><strong>SHA256 hash<\/strong><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"height: 25px;\">\n<td style=\"width: 27.6654%; height: 25px;\"><span style=\"font-family: 'courier new', courier, monospace;\">bw_setup.js<\/span><\/td>\n<td style=\"width: 17.6181%; height: 25px;\">Script Bootstrap<\/td>\n<td style=\"width: 57.7641%; height: 25px;\"><span style=\"font-family: 'courier new', courier, monospace;\">f35475829991b303c5efc2ee0f343dd38f8614e8b5e69db683923135f85cf60d<\/span><\/td>\n<\/tr>\n<tr style=\"height: 25px;\">\n<td style=\"width: 27.6654%; height: 25px;\"><span style=\"font-family: 'courier new', courier, monospace;\">bw1.js<\/span><\/td>\n<td style=\"width: 17.6181%; height: 25px;\">Carga \u00fatil ofuscada<\/td>\n<td style=\"width: 57.7641%; height: 25px;\"><span style=\"font-family: 'courier new', courier, monospace;\">18f784b3bc9a0bcdcb1a8d7f51bc5f54323fc40cbd874119354ab609bef6e4cb<\/span><\/td>\n<\/tr>\n<tr style=\"height: 25px;\">\n<td style=\"width: 27.6654%; height: 25px;\"><span style=\"font-family: 'courier new', courier, monospace;\">package.json<\/span><\/td>\n<td style=\"width: 17.6181%; height: 25px;\">Manifiesto malicioso<\/td>\n<td style=\"width: 57.7641%; height: 25px;\"><span style=\"font-family: 'courier new', courier, monospace;\">167ce57ef59a32a6a0ef4137785828077879092d7f83ddbc1755d6e69116e0ad<\/span><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 27.6654%; height: 24px;\"><span style=\"font-family: 'courier new', courier, monospace;\">setup.mjs<\/span> en paquetes infectados<\/td>\n<td style=\"width: 17.6181%; height: 24px;\">Carga \u00fatil del gusano<\/td>\n<td style=\"width: 57.7641%; height: 24px;\"><\/td>\n<\/tr>\n<tr style=\"height: 48px;\">\n<td style=\"width: 27.6654%; height: 48px;\">Ejecuci\u00f3n inesperada del proceso <span style=\"font-family: 'courier new', courier, monospace;\">bun<\/span><\/td>\n<td style=\"width: 17.6181%; height: 48px;\">Indicador de tiempo de ejecuci\u00f3n<\/td>\n<td style=\"width: 57.7641%; height: 48px;\"><\/td>\n<\/tr>\n<tr style=\"height: 48px;\">\n<td style=\"width: 27.6654%; height: 48px;\"><span style=\"font-family: 'courier new', courier, monospace;\">.github\/workflows\/format-check.yml<\/span> en ramas transitorias<\/td>\n<td style=\"width: 17.6181%; height: 48px;\">Inyecci\u00f3n de flujo de trabajo<\/td>\n<td style=\"width: 57.7641%; height: 48px;\"><\/td>\n<\/tr>\n<tr style=\"height: 24px;\">\n<td style=\"width: 27.6654%; height: 24px;\">Artefacto de flujo de trabajo <span style=\"font-family: 'courier new', courier, monospace;\">format-results<\/span><\/td>\n<td style=\"width: 17.6181%; height: 24px;\">Exfiltraci\u00f3n de secretos<\/td>\n<td style=\"width: 57.7641%; height: 24px;\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-size: 10pt;\">Tabla 5. Indicadores de proceso y archivos.<\/span><\/p>\n<h3><a id=\"post-181758-_heading=h.7oh0c6cco51\"><\/a>Indicadores de npm<\/h3>\n<p>En la Tabla\u00a06, se presentan los indicadores de npm de esta actividad.<\/p>\n<table style=\"width: 101.127%;\">\n<thead>\n<tr>\n<th style=\"width: 73.8971%;\"><strong>Indicador<\/strong><\/th>\n<th style=\"width: 125.184%;\"><strong>Tipo<\/strong><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"width: 73.8971%;\"><span style=\"font-family: 'courier new', courier, monospace;\">@bitwarden\/cli@2026.4.0<\/span><\/td>\n<td style=\"width: 125.184%;\">Paquete malicioso<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 73.8971%;\"><span style=\"font-family: 'courier new', courier, monospace;\">Nueva preinstalaci\u00f3n: \u201cnode setup.mjs\u201d en package.json<\/span><\/td>\n<td style=\"width: 125.184%;\">Hook inyectado<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-size: 10pt;\">Tabla\u00a06. Indicadores de npm.<\/span><\/p>\n<h2><a id=\"post-181758-_heading=h.hvx6wy43ik9g\"><\/a>Referencias adicionales<\/h2>\n<ul>\n<li><a href=\"https:\/\/checkmarx.com\/blog\/checkmarx-security-update-april-22\/\" target=\"_blank\" rel=\"noopener\">Checkmarx Security Update: April 22, 2026<\/a> (Actualizaci\u00f3n de seguridad de Checkmarx: 22 de abril de 2026), Checkmarx.<\/li>\n<li><a href=\"https:\/\/socket.dev\/blog\/checkmarx-supply-chain-compromise\" target=\"_blank\" rel=\"noopener\">Malicious Checkmarx Artifacts Found in Official KICS Docker Repository and Code Extensions<\/a> (Artefactos maliciosos de Checkmarx encontrados en el repositorio oficial de Docker de KICS y en extensiones de c\u00f3digo), Socket.<\/li>\n<li><a href=\"https:\/\/unit42.paloaltonetworks.com\/es-la\/teampcp-supply-chain-attacks\/\" target=\"_blank\" rel=\"noopener\">Weaponizing the Protectors: TeamPCP\u2019s Multi-Stage Supply Chain Attack on Security Infrastructure<\/a> (Armar a los protectores: ataque multifase de TeamPCP a la cadena de suministro dirigido contra la infraestructura de seguridad)<\/li>\n<li><a href=\"https:\/\/unit42.paloaltonetworks.com\/es-la\/axios-supply-chain-attack\/\" target=\"_blank\" rel=\"noopener\">Threat Brief: Widespread Impact of the Axios Supply Chain Attack<\/a> (Informe de amenazas: el impacto generalizado del ataque a la cadena de suministro de Axios)<\/li>\n<li><a href=\"https:\/\/unit42.paloaltonetworks.com\/es-la\/npm-supply-chain-attack\/\" target=\"_blank\" rel=\"noopener\">\u201cShai-Hulud\u201d Worm Compromises npm Ecosystem in Supply Chain Attack (Updated November 26) (El gusano \u201cShai-Hulud\u201d compromete el ecosistema de npm en un ataque a la cadena de suministro [actualizado el 26 de noviembre])<\/a><\/li>\n<li><a href=\"https:\/\/www.paloaltonetworks.com\/blog\/cloud-security\/bitwardencli-supply-chain-attack\/\" target=\"_blank\" rel=\"noopener\">Bitwarden CLI Impersonation Attack Steals Cloud Credentials and Spreads Across npm Supply Chains<\/a> (El ataque de Bitwarden de suplantaci\u00f3n de CLI roba credenciales en la nube y se extiende por las cadenas de suministro de npm), Cortex Cloud, Palo Alto Networks<\/li>\n<\/ul>\n<p><em>Actualizado el 27 de abril de 2026 a las 2.15\u00a0p.\u00a0m. PT para a\u00f1adir informaci\u00f3n sobre Bitwarden y enlazar con el art\u00edculo de Cortex Cloud en la secci\u00f3n <\/em>\u201c<em>Referencias adicionales<\/em>\u201d<em>. <\/em><\/p>\n<p><em>Actualizado el 1 de mayo de 2026 a las 5:55\u00a0p\u00a0m. PT para a\u00f1adir informaci\u00f3n sobre la campa\u00f1a de Mini\u00a0Shai-Hulud. <\/em><\/p>\n<p><em>Actualizado el 20 de mayo de 2026 a las 12:30\u00a0p.\u00a0m. PT para actualizar el Resumen Ejecutivo con informaci\u00f3n sobre dos nuevas oleadas y agregar una nueva secci\u00f3n sobre las oleadas de Mini-Shai Hulud de mayo de 2026.<\/em><\/p>\n<p><em>Actualizado el 21 de mayo de 2026 a las 8:45\u00a0a.\u00a0m. PT para agregar consultas de b\u00fasqueda de amenazas gestionada y protecci\u00f3n adicional del producto. <\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Unit 42 analyzes npm supply chain evolution post-Shai Hulud. Discover wormable malware, CI\/CD persistence, multi-stage attacks and more. <\/p>\n","protected":false},"author":23,"featured_media":179406,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[8775,8793],"tags":[9451,9195,10130,10129,10131,9519,10132],"product_categories":[8922,8924,8921,8932,8933,8890],"coauthors":[1025],"class_list":["post-181758","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-top-cyberthreats-es-la","category-malware-es-la","tag-credential-harvesting-es-la","tag-github-es-la","tag-npm-packages","tag-obfuscation","tag-payload","tag-supply-chain-es-la","tag-worm-propagation","product_categories-advanced-dns-security-es-la","product_categories-advanced-url-filtering-es-la","product_categories-cloud-delivered-security-services-es-la","product_categories-cortex-es-la","product_categories-cortex-cloud-es-la","product_categories-unit-42-incident-response-es-la"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.6 (Yoast SEO v27.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>El panorama de amenazas de npm: superficie de ataque y mitigaciones (Actualizado el 21 de mayo)<\/title>\n<meta name=\"description\" content=\"Unit 42 analyzes npm supply chain evolution post-Shai Hulud. Discover wormable malware, CI\/CD persistence, multi-stage attacks and more.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/\" \/>\n<meta property=\"og:locale\" content=\"es_LA\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"El panorama de amenazas de npm: superficie de ataque y mitigaciones (Actualizado el 21 de mayo)\" \/>\n<meta property=\"og:description\" content=\"Unit 42 analyzes npm supply chain evolution post-Shai Hulud. Discover wormable malware, CI\/CD persistence, multi-stage attacks and more.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/\" \/>\n<meta property=\"og:site_name\" content=\"Unit 42\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-21T15:08:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-29T17:39:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/04\/05_Malware_Category_1920x900.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"900\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Unit 42\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"El panorama de amenazas de npm: superficie de ataque y mitigaciones (Actualizado el 21 de mayo)","description":"Unit 42 analyzes npm supply chain evolution post-Shai Hulud. Discover wormable malware, CI\/CD persistence, multi-stage attacks and more.","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:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/","og_locale":"es_LA","og_type":"article","og_title":"El panorama de amenazas de npm: superficie de ataque y mitigaciones (Actualizado el 21 de mayo)","og_description":"Unit 42 analyzes npm supply chain evolution post-Shai Hulud. Discover wormable malware, CI\/CD persistence, multi-stage attacks and more.","og_url":"https:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/","og_site_name":"Unit 42","article_published_time":"2026-05-21T15:08:40+00:00","article_modified_time":"2026-05-29T17:39:01+00:00","og_image":[{"width":1920,"height":900,"url":"https:\/\/unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/04\/05_Malware_Category_1920x900.jpg","type":"image\/jpeg"}],"author":"Unit 42","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/#article","isPartOf":{"@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/"},"author":{"name":"Unit 42","@id":"https:\/\/unit42.paloaltonetworks.com\/#\/schema\/person\/a891f81d18648a1e0bab742238d31a63"},"headline":"El panorama de amenazas de npm: superficie de ataque y mitigaciones (Actualizado el 21 de mayo)","datePublished":"2026-05-21T15:08:40+00:00","dateModified":"2026-05-29T17:39:01+00:00","mainEntityOfPage":{"@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/"},"wordCount":8573,"image":{"@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/#primaryimage"},"thumbnailUrl":"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/04\/05_Malware_Category_1920x900.jpg","keywords":["Credential Harvesting","GitHub","npm packages","obfuscation","payload","supply chain","worm propagation"],"articleSection":["Amenazas sofisticadas","Malware"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/","url":"https:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/","name":"El panorama de amenazas de npm: superficie de ataque y mitigaciones (Actualizado el 21 de mayo)","isPartOf":{"@id":"https:\/\/unit42.paloaltonetworks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/#primaryimage"},"image":{"@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/#primaryimage"},"thumbnailUrl":"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/04\/05_Malware_Category_1920x900.jpg","datePublished":"2026-05-21T15:08:40+00:00","dateModified":"2026-05-29T17:39:01+00:00","author":{"@id":"https:\/\/unit42.paloaltonetworks.com\/#\/schema\/person\/a891f81d18648a1e0bab742238d31a63"},"description":"Unit 42 analyzes npm supply chain evolution post-Shai Hulud. Discover wormable malware, CI\/CD persistence, multi-stage attacks and more.","breadcrumb":{"@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/#primaryimage","url":"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/04\/05_Malware_Category_1920x900.jpg","contentUrl":"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2026\/04\/05_Malware_Category_1920x900.jpg","width":1920,"height":900,"caption":"Pictorial representation of the npm packages supply chain attack. Screen displaying code with a prominent alert symbol and the words 'VIRUS DETECTED' highlighted in red."},{"@type":"BreadcrumbList","@id":"https:\/\/unit42.paloaltonetworks.com\/es-la\/monitoring-npm-supply-chain-attacks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/unit42.paloaltonetworks.com\/"},{"@type":"ListItem","position":2,"name":"El panorama de amenazas de npm: superficie de ataque y mitigaciones (Actualizado el 21 de mayo)"}]},{"@type":"WebSite","@id":"https:\/\/unit42.paloaltonetworks.com\/#website","url":"https:\/\/unit42.paloaltonetworks.com\/","name":"Unit 42","description":"Palo Alto Networks","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/unit42.paloaltonetworks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/unit42.paloaltonetworks.com\/#\/schema\/person\/a891f81d18648a1e0bab742238d31a63","name":"Unit 42","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2025\/09\/Insights_headshot-placeholder-300x300.jpg5b5a1c33b73a577ebaf42f25081b0ebd","url":"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2025\/09\/Insights_headshot-placeholder-300x300.jpg","contentUrl":"https:\/\/origin-unit42.paloaltonetworks.com\/wp-content\/uploads\/2025\/09\/Insights_headshot-placeholder-300x300.jpg","caption":"Unit 42"},"url":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/author\/unit42\/"}]}},"_links":{"self":[{"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/posts\/181758","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/users\/23"}],"replies":[{"embeddable":true,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/comments?post=181758"}],"version-history":[{"count":1,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/posts\/181758\/revisions"}],"predecessor-version":[{"id":181827,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/posts\/181758\/revisions\/181827"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/media\/179406"}],"wp:attachment":[{"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/media?parent=181758"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/categories?post=181758"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/tags?post=181758"},{"taxonomy":"product_categories","embeddable":true,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/product_categories?post=181758"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/origin-unit42.paloaltonetworks.com\/es-la\/wp-json\/wp\/v2\/coauthors?post=181758"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}