{"id":69359,"date":"2026-09-20T18:32:59","date_gmt":"2026-09-20T18:32:59","guid":{"rendered":"https:\/\/overcentral.com\/es\/?p=69359"},"modified":"2026-09-20T18:32:59","modified_gmt":"2026-09-20T18:32:59","slug":"indexed-btree-malware-npm-69359","status":"publish","type":"post","link":"https:\/\/overcentral.com\/es\/indexed-btree-malware-npm-69359\/","title":{"rendered":"Indexed-btree malicioso evade defensas de npm en ejecuci\u00f3n"},"content":{"rendered":"<p>La cadena de suministro de software open source vuelve a ser el blanco de un ataque meticulosamente orquestado. Una campa\u00f1a de malware en el ecosistema npm, centrada en el paquete malicioso &#8216;indexed-btree&#8217;, ha logrado acumular m\u00e1s de dos millones de descargas semanales burlando las defensas m\u00e1s recientes implementadas por GitHub y npm. El hallazgo, documentado por investigadores de Checkmarx, revela una evoluci\u00f3n en las t\u00e1cticas de los atacantes: en lugar de recurrir a scripts de instalaci\u00f3n \u2014ya bloqueados por las medidas de seguridad de npm v12\u2014, el c\u00f3digo malicioso se oculta en el comportamiento normal de ejecuci\u00f3n de la librer\u00eda, activ\u00e1ndose \u00fanicamente cuando una aplicaci\u00f3n invoca una funci\u00f3n leg\u00edtima con un valor espec\u00edfico.<\/p>\n<p>Este movimiento no solo representa un paso adelante en la sofisticaci\u00f3n de los ataques a la cadena de suministro, sino que expone una vulnerabilidad cr\u00edtica en los modelos de detecci\u00f3n actuales, que siguen centrados en analizar el momento de la instalaci\u00f3n. La campa\u00f1a, que ya habr\u00eda generado beneficios significativos para los operadores \u2014quienes controlan una billetera con 109 ETH, seg\u00fan el informe\u2014, demuestra que la seguridad en el ecosistema npm requiere un enfoque que trascienda el escaneo est\u00e1tico y abrace el an\u00e1lisis din\u00e1mico en tiempo de ejecuci\u00f3n.<\/p>\n<h2>La suplantaci\u00f3n de una librer\u00eda leg\u00edtima: &#8216;sorted-btree&#8217; como se\u00f1uelo<\/h2>\n<p>El paquete &#8216;indexed-btree&#8217; fue dise\u00f1ado para hacerse pasar por la conocida y leg\u00edtima librer\u00eda &#8216;sorted-btree&#8217;, una estructura de datos de \u00e1rbol B utilizada ampliamente en aplicaciones Node.js para indexaci\u00f3n y ordenaci\u00f3n. Esta estrategia de typosquatting \u2014o suplantaci\u00f3n por similitud de nombre\u2014 no es nueva, pero en este caso los atacantes fueron m\u00e1s all\u00e1: construyeron un repositorio en GitHub de apariencia completamente leg\u00edtima, poblado con un historial de commits veros\u00edmil, y curaron una cuenta de desarrollador que reforzaba la ilusi\u00f3n de autenticidad.<\/p>\n<p>El resultado fue un paquete que, a simple vista, parec\u00eda una alternativa confiable y bien mantenida. Los dos millones de descargas semanales que acumul\u00f3 no fueron fruto del azar, sino de una campa\u00f1a de distribuci\u00f3n que logr\u00f3 infiltrarse en proyectos que, sin saberlo, incorporaron una puerta trasera silenciosa en su base de c\u00f3digo.<\/p>\n<h2>\u00bfC\u00f3mo evade el malware las medidas de seguridad de npm v12?<\/h2>\n<p>En junio de 2026, GitHub anunci\u00f3 un conjunto de medidas de seguridad para npm dise\u00f1adas espec\u00edficamente para frenar los ataques a la cadena de suministro que ven\u00edan sacudiendo el ecosistema desde finales <a href=\"https:\/\/overcentral.com\/es\/123456-un-ano-mas-lidera-las-contrasenas-mas-predecibles-de-2025\/\" title=\"123456 un a\u00f1o m\u00e1s lidera las contrase\u00f1as m\u00e1s predecibles de 2025\" data-iacss-internal=\"1\">de 2025<\/a>. La m\u00e1s relevante de estas medidas es el bloqueo de los scripts de ciclo de vida de las dependencias \u2014&#8217;preinstall&#8217;, &#8216;install&#8217; y &#8216;postinstall&#8217;\u2014 a menos que el desarrollador los apruebe expl\u00edcitamente. Adem\u00e1s, npm dej\u00f3 de recuperar autom\u00e1ticamente dependencias desde repositorios Git remotos o URLs externas sin permiso.<\/p>\n<p>Estas protecciones cierran la puerta a los m\u00e9todos cl\u00e1sicos de infecci\u00f3n, donde el c\u00f3digo malicioso se ejecutaba durante la instalaci\u00f3n del paquete. Sin embargo, el paquete &#8216;indexed-btree&#8217; las sortea por completo al no emplear ning\u00fan script de instalaci\u00f3n. La instalaci\u00f3n del paquete parece limpia; no activa ninguno de los mecanismos de aprobaci\u00f3n de npm v12. El verdadero peligro yace en el c\u00f3digo de la propia librer\u00eda, espec\u00edficamente en el m\u00e9todo <strong>BTree.prototype.set()<\/strong>, la funci\u00f3n principal que cualquier usuario de la librer\u00eda llamar\u00eda constantemente para insertar o actualizar valores en el \u00e1rbol.<\/p>\n<p>El m\u00e9todo <strong>set()<\/strong> contiene un loader oculto que se activa solo cuando la aplicaci\u00f3n lo invoca con una clave (key) espec\u00edfica. Al alcanzar ese valor disparador, el loader ejecuta el archivo <strong>sharedLoad.min.js<\/strong>, que contiene la primera etapa del malware, ofuscada y dise\u00f1ada para evadir tanto las herramientas de an\u00e1lisis de manchas (taint analysis) como la mayor\u00eda de los esc\u00e1neres est\u00e1ticos. La elecci\u00f3n del m\u00e9todo set() es particularmente astuta: es una operaci\u00f3n que cualquier desarrollador que utilice un \u00e1rbol B realizar\u00e1 de forma rutinaria, lo que garantiza que el malware se ejecute temprano en el ciclo de vida de la aplicaci\u00f3n.<\/p>\n<h3>\u00bfQu\u00e9 ocurre una vez que el malware se activa?<\/h3>\n<p>Una vez que el m\u00e9todo set() con la clave espec\u00edfica desencadena la ejecuci\u00f3n de <strong>sharedLoad.min.js<\/strong>, el malware procede a recopilar informaci\u00f3n detallada del sistema infectado: arquitectura del procesador, nombre del host, CPU, memoria RAM y tiempo de actividad del sistema (uptime). Estos datos son exfiltrados a trav\u00e9s de canales de Slack y Telegram cuyas credenciales est\u00e1n hardcodeadas en el c\u00f3digo.<\/p>\n<p>Pero la capacidad de comunicaci\u00f3n del malware no termina ah\u00ed. El c\u00f3digo tambi\u00e9n consulta un contrato inteligente de Ethereum en la red de prueba Sepolia (testnet) para obtener instrucciones del servidor de comando y control (C2). Para proteger esta comunicaci\u00f3n, los atacantes implementan un intercambio de claves X25519, del cual derivan una clave AES que utilizan para descifrar una carga \u00fatil de segunda etapa almacenada en el propio contrato inteligente. Esto permite a los operadores actualizar el comportamiento del malware de forma remota y sigilosa.<\/p>\n<p>Un detalle que subraya la profesionalizaci\u00f3n de la operaci\u00f3n es la capacidad del malware para autodestruirse. Cuando los atacantes deciden finalizar el ataque, el c\u00f3digo puede eliminar sus propios archivos y, m\u00e1s impresionante a\u00fan, borrar el trigger malicioso del m\u00e9todo <strong>set()<\/strong> del paquete, dejando la librer\u00eda limpia y sin rastro de la infecci\u00f3n. Esta capacidad de borrado dificulta enormemente la atribuci\u00f3n y el an\u00e1lisis forense posterior.<\/p>\n<h2>El alcance de la campa\u00f1a: nueve paquetes adicionales vinculados<\/h2>\n<p>Los investigadores de Checkmarx no se detuvieron en &#8216;indexed-btree&#8217;. Durante su an\u00e1lisis, identificaron otros nueve paquetes en npm que forman parte de la misma operaci\u00f3n, todos ya eliminados del registro. Las cifras de descargas acumuladas por estos paquetes revelan la magnitud del impacto:<\/p>\n<ul>\n<li><strong>ordered-kv-index<\/strong>: 448.184 descargas<\/li>\n<li><strong>btree-leaderboard<\/strong>: 493.685 descargas<\/li>\n<li><strong>priority-slot-queue<\/strong>: 402.860 descargas<\/li>\n<li><strong>btree-range-store<\/strong>: 468.092 descargas<\/li>\n<li><strong>btree-core<\/strong>: 1.951.274 descargas<\/li>\n<li><strong>btree-time-index<\/strong>: 425.312 descargas<\/li>\n<li><strong>btree-lru-cache<\/strong>: 372.185 descargas<\/li>\n<li><strong>neighbor-key-map<\/strong>: 366.019 descargas<\/li>\n<li><strong>sliding-score-window<\/strong>: 448.024 descargas<\/li>\n<\/ul>\n<p>Estos paquetes, que suman millones de descargas colectivas, siguen la misma estrategia: nombres que evocan funcionalidades leg\u00edtimas de estructuras de datos y caching, repositorios falsamente activos y, presumiblemente, el mismo mecanismo de activaci\u00f3n en tiempo de ejecuci\u00f3n. La diversidad de nombres sugiere que los atacantes buscaban maximizar su superficie de ataque, infiltr\u00e1ndose en distintos tipos de proyectos.<\/p>\n<h2>Implicaciones para la seguridad de la cadena de suministro<\/h2>\n<p>Esta campa\u00f1a representa un punto de inflexi\u00f3n en la comprensi\u00f3n de las amenazas a la cadena de suministro de software. Hasta ahora, la mayor\u00eda de las defensas se centraban en el momento de la instalaci\u00f3n: escaneo de scripts, an\u00e1lisis de dependencias, verificaci\u00f3n de integridad de los paquetes. Las medidas de npm v12 fueron un paso importante en esa direcci\u00f3n, pero el ataque con &#8216;indexed-btree&#8217; demuestra que los actores de amenazas ya han encontrado una v\u00eda de evasi\u00f3n que explota un punto ciego fundamental: el comportamiento en tiempo de ejecuci\u00f3n.<\/p>\n<p>El hecho de que el malware se oculte dentro de una funci\u00f3n que los desarrolladores invocan de forma leg\u00edtima y constante plantea un desaf\u00edo enorme para las herramientas de seguridad tradicionales. Los esc\u00e1neres est\u00e1ticos, que examinan el c\u00f3digo sin ejecutarlo, tienen dificultades para detectar cargas \u00fatiles ofuscadas que solo se activan bajo condiciones espec\u00edficas de entrada. Las herramientas de an\u00e1lisis de dependencias, que se ejecutan durante la instalaci\u00f3n, no encuentran nada sospechoso porque no hay scripts que analizar. Es un ataque dise\u00f1ado espec\u00edficamente para pasar desapercibido bajo el radar de las defensas actuales.<\/p>\n<h3>\u00bfQu\u00e9 deben hacer los desarrolladores que instalaron estos paquetes?<\/h3>\n<p>La recomendaci\u00f3n de los investigadores es clara y urgente: cualquier desarrollador que haya instalado &#8216;indexed-btree&#8217; o cualquiera de los otros nueve paquetes listados debe rotar inmediatamente todos los secretos y credenciales que pudieran estar presentes en el entorno de desarrollo o en las m\u00e1quinas infectadas. Adem\u00e1s, es necesario restaurar el entorno de desarrollo a partir de una copia de seguridad limpia y anterior a la infecci\u00f3n.<\/p>\n<p>Pero m\u00e1s all\u00e1 de la respuesta inmediata, este incidente subraya la necesidad de adoptar un enfoque de seguridad que incluya an\u00e1lisis de comportamiento en tiempo de ejecuci\u00f3n. Herramientas que monitoreen las llamadas a funciones cr\u00edticas, la comunicaci\u00f3n con redes externas no autorizadas o la modificaci\u00f3n inesperada de estructuras de datos podr\u00edan haber detectado la actividad an\u00f3mala del m\u00e9todo <strong>set()<\/strong> incluso sin conocer previamente la firma del malware. La comunidad de seguridad open source debe comenzar a integrar capacidades de detecci\u00f3n din\u00e1mica en sus flujos de CI\/CD, no solo como una capa adicional, sino como un componente esencial de la defensa contra este nuevo tipo de amenazas.<\/p>\n<h2>El factor econ\u00f3mico: 109 ETH y la monetizaci\u00f3n del ataque<\/h2>\n<p>Uno de los aspectos m\u00e1s reveladores de la investigaci\u00f3n es la posible motivaci\u00f3n econ\u00f3mica detr\u00e1s de la campa\u00f1a. Checkmarx identific\u00f3 una billetera controlada por los atacantes que contiene 109 ETH, aunque el informe no especifica si esos fondos provienen directamente del robo de criptomonedas o de otras actividades il\u00edcitas. Lo que s\u00ed est\u00e1 claro es que una operaci\u00f3n de esta envergadura \u2014con nueve paquetes adicionales, repositorios falsos meticulosamente construidos y un mecanismo de C2 basado en contratos inteligentes\u2014 requiere una inversi\u00f3n de tiempo y recursos considerable. Los 109 ETH, valuados en varios cientos de miles de d\u00f3lares dependiendo de la cotizaci\u00f3n, sugieren que los atacantes esperaban \u2014y posiblemente ya han obtenido\u2014 un retorno significativo.<\/p>\n<p>La utilizaci\u00f3n de Ethereum y la red Sepolia para el C2 no es casual: los contratos inteligentes ofrecen un canal de comunicaci\u00f3n persistente, inmutable y descentralizado, dif\u00edcil de censurar o desactivar por las autoridades o los equipos de respuesta a incidentes. Es una t\u00e1ctica que ya se ha visto en ataques avanzados y que probablemente se replicar\u00e1 en el futuro.<\/p>\n<h2>Lecciones para el ecosistema npm y m\u00e1s all\u00e1<\/h2>\n<p>El caso de &#8216;indexed-btree&#8217; debe servir como una llamada de atenci\u00f3n para todo el ecosistema de desarrollo JavaScript. Mientras que las medidas de seguridad en la instalaci\u00f3n son necesarias, no son suficientes. La confianza en un paquete open source no puede basarse \u00fanicamente en su apariencia externa \u2014commits frecuentes, README bien redactado, estrellas en GitHub\u2014, especialmente cuando los atacantes han demostrado que pueden falsificar todos esos indicadores.<\/p>\n<p>Los mantenedores de paquetes y los equipos de seguridad de npm deber\u00edan considerar mecanismos adicionales como la verificaci\u00f3n de firmas digitales en el c\u00f3digo publicado, la auditor\u00eda obligatoria de cambios en funciones cr\u00edticas (como el m\u00e9todo <strong>set()<\/strong> de una librer\u00eda de \u00e1rbol B) y la implementaci\u00f3n de sistemas de reputaci\u00f3n basados en el comportamiento hist\u00f3rico real del paquete, no solo en m\u00e9tricas superficiales. Por su parte, los desarrolladores deben adoptar una postura de confianza cero incluso hacia las dependencias m\u00e1s aparentemente leg\u00edtimas, monitoreando su comportamiento en tiempo de ejecuci\u00f3n y cuestionando cualquier desviaci\u00f3n inesperada.<\/p>\n<p>La cadena de suministro de software es un ecosistema fr\u00e1gil donde la confianza es el pegamento que lo mantiene unido. Ataques como este erosionan esa confianza y demuestran que la seguridad no es un estado est\u00e1tico que se alcanza con una pol\u00edtica o una herramienta, sino un proceso continuo de adaptaci\u00f3n a unas amenazas que evolucionan al menos tan r\u00e1pido como las defensas. Los dos millones de descargas de &#8216;indexed-btree&#8217; son un recordatorio de que, en seguridad, el eslab\u00f3n m\u00e1s d\u00e9bil no es la tecnolog\u00eda, sino nuestra propia capacidad de anticipar el pr\u00f3ximo movimiento del adversario.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La cadena de suministro de software open source vuelve a ser el blanco de un ataque meticulosamente orquestado. Una campa\u00f1a de malware en el ecosistema npm, centrada en el paquete malicioso &#8216;indexed-btree&#8217;, ha logrado acumular m\u00e1s de dos millones de descargas semanales burlando las defensas m\u00e1s recientes implementadas por GitHub y npm. El hallazgo, documentado [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":69364,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/es\/69359.png","fifu_image_alt":"Indexed-btree malicioso evade defensas de npm en ejecuci\u00f3n","footnotes":""},"categories":[5],"tags":[],"class_list":["post-69359","post","type-post","status-publish","format-standard","has-post-thumbnail","category-tecnologia"],"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/es\/69359.png","fifu_image_alt":"Indexed-btree malicioso evade defensas de npm en ejecuci\u00f3n","_links":{"self":[{"href":"https:\/\/overcentral.com\/es\/wp-json\/wp\/v2\/posts\/69359","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/overcentral.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/overcentral.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/overcentral.com\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/overcentral.com\/es\/wp-json\/wp\/v2\/comments?post=69359"}],"version-history":[{"count":1,"href":"https:\/\/overcentral.com\/es\/wp-json\/wp\/v2\/posts\/69359\/revisions"}],"predecessor-version":[{"id":69360,"href":"https:\/\/overcentral.com\/es\/wp-json\/wp\/v2\/posts\/69359\/revisions\/69360"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/overcentral.com\/es\/wp-json\/wp\/v2\/media\/69364"}],"wp:attachment":[{"href":"https:\/\/overcentral.com\/es\/wp-json\/wp\/v2\/media?parent=69359"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/overcentral.com\/es\/wp-json\/wp\/v2\/categories?post=69359"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/overcentral.com\/es\/wp-json\/wp\/v2\/tags?post=69359"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}