{"id":7491,"date":"2025-08-28T15:58:41","date_gmt":"2025-08-28T18:58:41","guid":{"rendered":"https:\/\/itconnect.lat\/portal\/?p=7491"},"modified":"2025-08-28T15:58:41","modified_gmt":"2025-08-28T18:58:41","slug":"vs-code-00001","status":"publish","type":"post","link":"https:\/\/itconnect.lat\/portal\/vs-code-00001\/","title":{"rendered":"VS Code 2025: \u00bf(In) seguridad de la Cadena de Suministro de Software?"},"content":{"rendered":"<h1>An\u00e1lisis de la Vulnerabilidad de Reutilizaci\u00f3n de Nombres en VS Code Marketplace y sus Implicaciones para la Seguridad de la Cadena de Suministro de Software<\/h1>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_7493\" aria-describedby=\"caption-attachment-7493\" style=\"width: 400px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/itconnect.lat\/portal\/wp-content\/uploads\/2025\/08\/tinywow_02_83691950-e1756406935480.webp\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-7493\" src=\"https:\/\/itconnect.lat\/portal\/wp-content\/uploads\/2025\/08\/tinywow_02_83691950-e1756406935480.webp\" alt=\"VS Code\" width=\"400\" height=\"400\" title=\"\"><\/a><figcaption id=\"caption-attachment-7493\" class=\"wp-caption-text\">VS Code<\/figcaption><\/figure>\n<p>Investigadores de ciberseguridad han identificado una vulnerabilidad cr\u00edtica en la gobernanza de pol\u00edticas del Visual Studio Code (VS Code) Marketplace, que permite a los actores de amenazas reutilizar los nombres de extensiones previamente eliminadas.<\/p>\n<p>Este informe proporciona un an\u00e1lisis exhaustivo de esta falla, su explotaci\u00f3n en el mundo real y su contexto dentro del panorama m\u00e1s amplio de los riesgos de la cadena de suministro de software.<\/p>\n<p>El descubrimiento, realizado por la firma de seguridad ReversingLabs, expone una brecha significativa entre las pr\u00e1cticas de seguridad declaradas por Microsoft y la realidad operativa de su marketplace, permitiendo ataques de suplantaci\u00f3n de identidad altamente efectivos.<\/p>\n<p>La vulnerabilidad se origina en una distinci\u00f3n de pol\u00edtica entre &#8220;anular la publicaci\u00f3n&#8221; y &#8220;eliminar&#8221; una extensi\u00f3n. Mientras que la primera opci\u00f3n reserva el nombre, la segunda lo libera para que cualquier otro editor lo reclame.<\/p>\n<p>Esta laguna fue explotada por la campa\u00f1a de ransomware en desarrollo &#8220;Shiba&#8221;, que utiliz\u00f3 nombres de extensiones id\u00e9nticos bajo diferentes editores para distribuir cargas \u00fatiles maliciosas. Este incidente subraya c\u00f3mo una falla de pol\u00edtica, en lugar de un error de c\u00f3digo tradicional, puede crear un vector de ataque potente y sigiloso.<\/p>\n<p>Un an\u00e1lisis comparativo revela una disparidad en la madurez de la seguridad entre los principales repositorios de paquetes. El Python Package Index (PyPI), por ejemplo, ha implementado una pol\u00edtica m\u00e1s robusta que proh\u00edbe expl\u00edcitamente la reutilizaci\u00f3n de nombres previamente asociados con paquetes maliciosos, una salvaguarda crucial que est\u00e1 ausente en el VS Code Marketplace.<\/p>\n<p>El ecosistema de npm, aunque se centra en la prevenci\u00f3n del typosquatting y la resoluci\u00f3n de disputas, tambi\u00e9n presenta complejidades en sus pol\u00edticas de ciclo de vida de paquetes. Estas diferencias ilustran una falta de estandarizaci\u00f3n en las pr\u00e1cticas de seguridad fundamentales en todo el ecosistema de c\u00f3digo abierto.<\/p>\n<p>La amenaza se ve agravada por la sofisticaci\u00f3n de las campa\u00f1as maliciosas, como se demuestra en un an\u00e1lisis de ocho paquetes maliciosos de npm que utilizaron 70 capas de ofuscaci\u00f3n para desplegar un ladr\u00f3n de informaci\u00f3n del navegador Google Chrome. Esta campa\u00f1a destaca la capacidad de los adversarios para evadir el an\u00e1lisis est\u00e1tico y automatizado, lo que requiere un enfoque de defensa en profundidad.<\/p>\n<p>La mitigaci\u00f3n de estos riesgos sist\u00e9micos exige la adopci\u00f3n de un modelo de &#8220;Responsabilidad Compartida&#8221;. Este marco asigna deberes espec\u00edficos a los propietarios de plataformas, los mantenedores de paquetes, los investigadores de seguridad y los consumidores de software (desarrolladores y organizaciones).<\/p>\n<p>Las recomendaciones clave de este informe incluyen: para los propietarios de plataformas, la reforma de las pol\u00edticas de ciclo de vida de los nombres para priorizar la seguridad; para las organizaciones, la implementaci\u00f3n de controles empresariales como listas de permitidos y el uso de repositorios privados; y para los desarrolladores, la adopci\u00f3n de pr\u00e1cticas de investigaci\u00f3n rigurosas para todas las dependencias de terceros.<\/p>\n<p>En \u00faltima instancia, la seguridad de la cadena de suministro de software depende de un esfuerzo colaborativo y de la maduraci\u00f3n de las pol\u00edticas de gobernanza en todos los niveles del ecosistema.<\/p>\n<h2>Deconstrucci\u00f3n de la Vulnerabilidad de Secuestro de Nombres en el Visual Studio Code Marketplace<\/h2>\n<p>La vulnerabilidad que permite el secuestro de nombres en el VS Code Marketplace no es un error de c\u00f3digo convencional, sino una falla fundamental en la pol\u00edtica de gobernanza y el ciclo de vida de las extensiones.<\/p>\n<p>Su mecanismo se basa en una distinci\u00f3n sutil pero cr\u00edtica en la forma en que el marketplace maneja la eliminaci\u00f3n de extensiones, creando una oportunidad para que los actores de amenazas se apropien de la confianza y la reputaci\u00f3n asociadas con nombres de extensiones previamente existentes.<\/p>\n<h3>La Falla Central: Extensiones &#8220;Eliminadas&#8221; vs. &#8220;No Publicadas&#8221;<\/h3>\n<p>La ra\u00edz de la vulnerabilidad reside en las dos opciones distintas que un editor tiene para retirar una extensi\u00f3n del marketplace, cada una con implicaciones de seguridad dr\u00e1sticamente diferentes.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/p>\n<ol start=\"1\">\n<li><b>Anular la Publicaci\u00f3n (Unpublish):<\/b> Cuando un editor anula la publicaci\u00f3n de una extensi\u00f3n, esta se oculta de la vista p\u00fablica en el marketplace. Sin embargo, la plataforma retiene el nombre de la extensi\u00f3n y sus metadatos asociados, como las estad\u00edsticas de descarga. Crucialmente, el nombre permanece vinculado al editor original y no puede ser reclamado por nadie m\u00e1s. Este comportamiento es el esperado para mantener la integridad del espacio de nombres y prevenir la suplantaci\u00f3n de identidad.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-54 hide\">\n<div class=\"carousel-container ng-tns-c669095837-54\"><\/div>\n<\/div>\n<\/li>\n<li><b>Eliminar (Remove):<\/b> Por el contrario, cuando una extensi\u00f3n es eliminada por completo, el marketplace la borra de sus registros y, fundamentalmente, libera su nombre. Este nombre vuelve al grupo p\u00fablico de nombres disponibles, lo que permite que cualquier otro editor, leg\u00edtimo o malicioso, lo reclame y publique una nueva extensi\u00f3n bajo esa misma identidad.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/li>\n<\/ol>\n<p>Esta dualidad en la pol\u00edtica de eliminaci\u00f3n es el n\u00facleo de la falla explotable. Permite a un actor de amenazas monitorear el marketplace en busca de extensiones que han sido eliminadas, especialmente aquellas que pudieron haber tenido una base de usuarios o una reputaci\u00f3n establecida, para luego secuestrar ese nombre y publicar una versi\u00f3n maliciosa.<\/p>\n<p>ReversingLabs demostr\u00f3 de manera concluyente esta falla al publicar con \u00e9xito extensiones de prueba utilizando nombres que hab\u00edan sido previamente asociados con paquetes maliciosos eliminados, como &#8220;Solidity-Ethereum&#8221;.<\/p>\n<p>El problema no es un error que impide que la pol\u00edtica funcione como se dise\u00f1\u00f3; el problema es que la pol\u00edtica fue dise\u00f1ada con una opci\u00f3n inherentemente insegura.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/p>\n<h3>Contradicci\u00f3n con la Documentaci\u00f3n Oficial y las Pol\u00edticas de Nomenclatura<\/h3>\n<p>La existencia de esta laguna contradice directamente el esp\u00edritu, si no la letra, de la propia documentaci\u00f3n de VS Code. La documentaci\u00f3n oficial para desarrolladores de extensiones estipula que el campo <code>&lt;name&gt;<\/code> en el manifiesto de la extensi\u00f3n &#8220;debe ser exclusivo del Marketplace&#8221;. Si bien la unicidad t\u00e9cnica se mantiene a trav\u00e9s del identificador completo de la extensi\u00f3n, que combina el nombre del editor y el nombre de la extensi\u00f3n (<code style=\"font-size: 16px; font-style: inherit; font-weight: inherit;\">&lt;editor&gt;.&lt;nombre&gt;<\/code><span style=\"font-size: 16px;\">), la pol\u00edtica de eliminaci\u00f3n permite que el componente <\/span><code style=\"font-size: 16px; font-style: inherit; font-weight: inherit;\">&lt;nombre&gt;<\/code><span style=\"font-size: 16px;\">, que es el que ven y buscan los usuarios, sea duplicado por diferentes editores.<\/span><\/p>\n<p>El caso de las extensiones <code>ahban.shiba<\/code> y <code>ahbanC.shiba<\/code> ejemplifica perfectamente esta contradicci\u00f3n. Ambas compart\u00edan el mismo nombre de extensi\u00f3n, &#8220;shiba&#8221;, y solo se diferenciaban por el nombre del editor.<\/p>\n<p>Para un desarrollador que busca una extensi\u00f3n, esta distinci\u00f3n puede pasar f\u00e1cilmente desapercibida, especialmente si el nombre del editor malicioso est\u00e1 dise\u00f1ado para parecer leg\u00edtimo o gen\u00e9rico.<\/p>\n<p>La pol\u00edtica de &#8220;eliminar&#8221; socava la garant\u00eda de unicidad que la documentaci\u00f3n pretende ofrecer, creando confusi\u00f3n y un vector de ataque directo.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/p>\n<h3>Evaluaci\u00f3n de las Medidas de Seguridad Declaradas por Microsoft<\/h3>\n<p>Microsoft enumera varias medidas de seguridad para proteger el VS Code Marketplace. Sin embargo, un an\u00e1lisis cr\u00edtico a la luz de esta vulnerabilidad revela que, si bien son \u00fatiles para ciertos tipos de amenazas, son insuficientes para abordar la falla de la reutilizaci\u00f3n de nombres.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/p>\n<ul>\n<li><b>An\u00e1lisis de Malware:<\/b> El marketplace realiza an\u00e1lisis de malware en cada paquete de extensi\u00f3n publicado. Sin embargo, esta es una medida reactiva y no infalible. Las extensiones maliciosas de la campa\u00f1a &#8220;Shiba&#8221; estuvieron disponibles en el marketplace durante per\u00edodos prolongados antes de ser detectadas y eliminadas, lo que indica que el an\u00e1lisis inicial no las marc\u00f3 o que el c\u00f3digo malicioso se introdujo en una actualizaci\u00f3n posterior. Adem\u00e1s, los atacantes utilizan cada vez m\u00e1s t\u00e9cnicas de ofuscaci\u00f3n para evadir estos esc\u00e1neres.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-60 hide\">\n<div class=\"carousel-container ng-tns-c669095837-60\"><\/div>\n<\/div>\n<\/li>\n<li><b>Prevenci\u00f3n de &#8220;Name Squatting&#8221;:<\/b> La pol\u00edtica de Microsoft contra el &#8220;name squatting&#8221; est\u00e1 dise\u00f1ada principalmente para evitar que los autores roben los nombres de editores oficiales (como Microsoft o RedHat) o de extensiones muy populares (como GitHub Copilot). Es ineficaz contra el escenario de esta vulnerabilidad, que no implica robar el nombre de un editor oficial, sino reutilizar el nombre de una extensi\u00f3n no oficial que ha sido eliminada.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-61 hide\">\n<div class=\"carousel-container ng-tns-c669095837-61\"><\/div>\n<\/div>\n<\/li>\n<li><b>Lista de Bloqueo (Block List):<\/b> Si se verifica que una extensi\u00f3n es maliciosa, se elimina del marketplace y se agrega a una lista de bloqueo. VS Code puede desinstalar autom\u00e1ticamente las extensiones que est\u00e1n en esta lista de las m\u00e1quinas de los usuarios. Si bien esta es una medida de respuesta a incidentes crucial, no aborda el problema de la prevenci\u00f3n. Si la extensi\u00f3n fue &#8220;eliminada&#8221; en lugar de simplemente bloqueada, su nombre queda disponible para ser reutilizado, iniciando el ciclo de ataque de nuevo.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-62 hide\">\n<div class=\"carousel-container ng-tns-c669095837-62\"><\/div>\n<\/div>\n<\/li>\n<li><b>Editores Verificados:<\/b> El programa de editores verificados (indicado por una marca de verificaci\u00f3n azul) proporciona una se\u00f1al de confianza al confirmar la identidad de un editor a trav\u00e9s de la propiedad del dominio. Sin embargo, no impide que un editor no verificado secuestre el nombre de una extensi\u00f3n eliminada que pertenec\u00eda a otro editor (verificado o no). La confianza se asocia con el nombre de la extensi\u00f3n tanto como con el editor, y la pol\u00edtica actual permite que esta confianza sea explotada.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-63 hide\">\n<div class=\"carousel-container ng-tns-c669095837-63\"><\/div>\n<\/div>\n<\/li>\n<\/ul>\n<p>El an\u00e1lisis de esta vulnerabilidad revela una desconexi\u00f3n fundamental en el modelo de amenaza del marketplace. La pol\u00edtica de &#8220;eliminar&#8221; trata los nombres de las extensiones como recursos transitorios y reutilizables, similar a c\u00f3mo un sistema operativo podr\u00eda liberar memoria.<\/p>\n<p>Sin embargo, en un ecosistema social como un marketplace, un nombre no es solo un puntero; es un activo que acumula reputaci\u00f3n y confianza. Al permitir que este activo sea transferido a un actor no relacionado y potencialmente malicioso sin ning\u00fan tipo de control o advertencia, la pol\u00edtica crea un riesgo sist\u00e9mico.<\/p>\n<p>La vulnerabilidad no es, por lo tanto, un simple descuido, sino el resultado de una decisi\u00f3n de dise\u00f1o de pol\u00edticas que prioriza la limpieza del espacio de nombres sobre la seguridad y la no repudiaci\u00f3n de la identidad.<\/p>\n<h2>Estudio de Caso: La Campa\u00f1a de Ransomware &#8220;Shiba&#8221;<\/h2>\n<p>La explotaci\u00f3n de la vulnerabilidad de reutilizaci\u00f3n de nombres en el VS Code Marketplace no fue un ejercicio te\u00f3rico. Fue puesta en pr\u00e1ctica por una campa\u00f1a de malware activa, aunque en una etapa de desarrollo temprano, denominada &#8220;Shiba&#8221;. El an\u00e1lisis de esta campa\u00f1a proporciona una visi\u00f3n concreta de c\u00f3mo los actores de amenazas pueden convertir una falla de pol\u00edtica en un arma para distribuir c\u00f3digo malicioso, sentando las bases para ataques m\u00e1s sofisticados.<\/p>\n<h3>Cronolog\u00eda del Ataque y Variantes<\/h3>\n<p>La campa\u00f1a &#8220;Shiba&#8221; demostr\u00f3 un patr\u00f3n de desarrollo iterativo y persistencia por parte del actor de amenazas. La actividad se manifest\u00f3 a trav\u00e9s de varias extensiones publicadas a lo largo de varios meses :<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/p>\n<ul>\n<li><b><code>ahban.cychelloworld<\/code>:<\/b> Esta extensi\u00f3n fue la primera en aparecer, subida al marketplace el 27 de octubre de 2024. Inicialmente, la primera versi\u00f3n no conten\u00eda la carga \u00fatil maliciosa. El c\u00f3digo de ransomware se introdujo en la versi\u00f3n 0.0.2, publicada el 24 de noviembre de 2024.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-65 hide\">\n<div class=\"carousel-container ng-tns-c669095837-65\"><\/div>\n<\/div>\n<\/li>\n<li><b><code>ahban.shiba<\/code>:<\/b> Una segunda variante fue publicada el 17 de febrero de 2025, utilizando un editor diferente pero una carga \u00fatil similar.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-66 hide\">\n<div class=\"carousel-container ng-tns-c669095837-66\"><\/div>\n<\/div>\n<\/li>\n<li><b><code>ahbanC.shiba<\/code>:<\/b> Esta fue la variante que finalmente llev\u00f3 a ReversingLabs a descubrir la vulnerabilidad subyacente. El nombre de la extensi\u00f3n era pr\u00e1cticamente id\u00e9ntico al de <code>ahban.shiba<\/code>, pero fue publicado por un editor diferente. Esta repetici\u00f3n del nombre de la extensi\u00f3n fue la anomal\u00eda que desencaden\u00f3 una investigaci\u00f3n m\u00e1s profunda.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-67 hide\">\n<div class=\"carousel-container ng-tns-c669095837-67\"><\/div>\n<\/div>\n<\/li>\n<\/ul>\n<p>La existencia de estas tres bibliotecas, todas con una funcionalidad similar y nombres casi id\u00e9nticos, sugiere que el actor de amenazas estaba probando y refinando constantemente su enfoque, probablemente explorando la eficacia de la distribuci\u00f3n a trav\u00e9s del marketplace y la evasi\u00f3n de las defensas existentes.<\/p>\n<h3>An\u00e1lisis T\u00e9cnico del Malware<\/h3>\n<p>El malware &#8220;Shiba&#8221; operaba a trav\u00e9s de un ataque de m\u00faltiples etapas, una t\u00e9cnica com\u00fan para evadir la detecci\u00f3n y aumentar la flexibilidad. La cadena de ataque se puede desglosar de la siguiente manera:<\/p>\n<ol start=\"1\">\n<li><b>Etapa 1: Carga \u00datil del Descargador (Downloader):<\/b> La extensi\u00f3n de VS Code en s\u00ed misma no conten\u00eda el ransomware completo. Su funci\u00f3n principal era actuar como un simple descargador. Una vez instalada y activada, la extensi\u00f3n ejecutaba un comando, como <code style=\"font-size: 16px; font-style: inherit; font-weight: inherit;\">shiba.aowoo<\/code><span style=\"font-size: 16px;\">, dise\u00f1ado para contactar un servidor remoto y recuperar la siguiente etapa de la carga \u00fatil. Este enfoque permite al atacante cambiar la carga \u00fatil final sin tener que volver a publicar la extensi\u00f3n en el marketplace.<\/span><span class=\"button-container hide-from-message-actions ng-star-inserted\" style=\"font-size: 16px;\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-69 hide\">\n<div class=\"carousel-container ng-tns-c669095837-69\"><\/div>\n<\/div>\n<\/li>\n<li><b>Etapa 2: Ejecuci\u00f3n de PowerShell:<\/b> La carga \u00fatil descargada del servidor remoto era un script de PowerShell. PowerShell es una herramienta de ataque preferida debido a su poder, su presencia nativa en los sistemas Windows y su capacidad para ejecutar operaciones en memoria (&#8220;fileless&#8221;), lo que puede dificultar la detecci\u00f3n por parte de soluciones antivirus tradicionales.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-70 hide\">\n<div class=\"carousel-container ng-tns-c669095837-70\"><\/div>\n<\/div>\n<\/li>\n<li><b>Etapa 3: Funcionalidad de Ransomware Naciente:<\/b> El script de PowerShell conten\u00eda la l\u00f3gica del ransomware, pero su implementaci\u00f3n indica que estaba en una fase experimental o de prueba. En lugar de cifrar todo el sistema de archivos del usuario, su objetivo era muy espec\u00edfico: buscaba y cifraba archivos \u00fanicamente dentro de una carpeta llamada <code>C:\\users\\%username%\\Desktop\\testShiba<\/code>. Este comportamiento sugiere que el atacante estaba probando su c\u00f3digo de cifrado en un entorno controlado antes de desplegarlo a una escala m\u00e1s destructiva.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-71 hide\">\n<div class=\"carousel-container ng-tns-c669095837-71\"><\/div>\n<\/div>\n<\/li>\n<li><b>Nota de Rescate y Pago:<\/b> Despu\u00e9s de completar el proceso de cifrado, el malware mostraba una notificaci\u00f3n de Windows con el siguiente mensaje: &#8220;Tus archivos han sido cifrados. Paga 1 ShibaCoin a ShibaWallet para recuperarlos&#8221;. Sin embargo, la nota de rescate era fundamentalmente defectuosa desde la perspectiva del atacante: no proporcionaba una direcci\u00f3n de billetera de criptomonedas real ni instrucciones detalladas sobre c\u00f3mo realizar el pago. Esta omisi\u00f3n refuerza la conclusi\u00f3n de que la campa\u00f1a era un trabajo en progreso, posiblemente un prototipo para futuras operaciones de ransomware.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-72 hide\">\n<div class=\"carousel-container ng-tns-c669095837-72\"><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<p>A continuaci\u00f3n se presenta una tabla que resume los Indicadores de Compromiso (IOCs) clave asociados con la campa\u00f1a &#8220;Shiba&#8221;, proporcionando a los equipos de seguridad informaci\u00f3n procesable para la detecci\u00f3n y respuesta.<\/p>\n<div class=\"horizontal-scroll-wrapper\">\n<table>\n<thead>\n<tr>\n<td>Tipo de Indicador<\/td>\n<td>Valor \/ Patr\u00f3n<\/td>\n<td>Descripci\u00f3n \/ Contexto<\/td>\n<td><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>ID de Extensi\u00f3n<\/td>\n<td><code>ahban.shiba<\/code><\/td>\n<td>Extensi\u00f3n maliciosa que contiene la carga \u00fatil del descargador.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>ID de Extensi\u00f3n<\/td>\n<td><code>ahban.cychelloworld<\/code><\/td>\n<td>Variante inicial de la extensi\u00f3n maliciosa.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>ID de Extensi\u00f3n<\/td>\n<td><code>ahbanC.shiba<\/code><\/td>\n<td>Variante que explot\u00f3 la reutilizaci\u00f3n de nombres, llevando al descubrimiento de la vulnerabilidad.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Comando Ejecutado<\/td>\n<td><code>shiba.aowoo<\/code><\/td>\n<td>Comando ejecutado por la extensi\u00f3n para descargar la carga \u00fatil de la segunda etapa.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Tipo de Carga \u00datil<\/td>\n<td>Script de PowerShell<\/td>\n<td>La segunda etapa del ataque, recuperada de un servidor remoto.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Directorio Objetivo<\/td>\n<td><code>C:\\users\\%username%\\Desktop\\testShiba<\/code><\/td>\n<td>La carpeta espec\u00edfica donde el ransomware experimental cifraba los archivos.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Texto de la Nota de Rescate<\/td>\n<td>&#8220;Your files have been encrypted. Pay 1 ShibaCoin to ShibaWallet to recover them.&#8221;<\/td>\n<td>Mensaje de notificaci\u00f3n de Windows mostrado a la v\u00edctima.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Servidor de Carga \u00datil<\/td>\n<td>Servidor externo de Amazon Web Services (AWS)<\/td>\n<td>La infraestructura remota utilizada para alojar el script de PowerShell.<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h2>El Ecosistema M\u00e1s Amplio: Un An\u00e1lisis Comparativo de las Posturas de Seguridad de los Repositorios<\/h2>\n<p>La vulnerabilidad de reutilizaci\u00f3n de nombres en el VS Code Marketplace no es un fen\u00f3meno aislado, sino un s\u00edntoma de los desaf\u00edos de gobernanza m\u00e1s amplios que enfrentan los ecosistemas de software de c\u00f3digo abierto.<\/p>\n<p>La postura de seguridad de un repositorio de paquetes es un reflejo directo de su filosof\u00eda de gobernanza, su madurez y las lecciones aprendidas de incidentes de seguridad pasados.<\/p>\n<p>Un an\u00e1lisis comparativo de las pol\u00edticas del VS Code Marketplace, el Python Package Index (PyPI) y el npm Registry revela diferencias significativas en la forma en que cada plataforma gestiona el ciclo de vida de los nombres de los paquetes, lo que resulta en niveles de riesgo muy diferentes para sus respectivos usuarios.<\/p>\n<h3>Python Package Index (PyPI): Un Modelo M\u00e1s Maduro<\/h3>\n<p>PyPI, como uno de los repositorios de paquetes m\u00e1s antiguos y grandes, ha desarrollado un conjunto de pol\u00edticas que demuestran una mayor conciencia de las t\u00e1cticas adversarias. Si bien su pol\u00edtica sobre la reutilizaci\u00f3n de nombres no es perfecta, contiene una salvaguarda cr\u00edtica que est\u00e1 ausente en VS Code.<\/p>\n<p>La pol\u00edtica de PyPI establece que cuando un proyecto es eliminado, su nombre queda disponible para que cualquier otro usuario lo registre. A primera vista, esto parece similar a la pol\u00edtica de VS Code y presenta un riesgo de secuestro de nombres, como lo demostraron los investigadores de JFrog, quienes identificaron miles de paquetes con potencial de secuestro y observaron un caso real con el paquete <span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><code style=\"font-size: 16px; font-style: inherit; font-weight: inherit;\">pingdomv3<\/code><span style=\"font-size: 16px;\">.<\/span><span class=\"button-container hide-from-message-actions ng-star-inserted\" style=\"font-size: 16px;\">\u00a0 \u00a0<\/span><\/p>\n<p>Sin embargo, PyPI ha instituido una excepci\u00f3n crucial: los administradores de PyPI se reservan el derecho de hacer que los nombres de los paquetes no est\u00e9n disponibles permanentemente si se determina que fueron utilizados por primera vez para distribuir malware. Esta pol\u00edtica es una medida de seguridad proactiva y espec\u00edfica.<\/p>\n<p>Reconoce que los nombres asociados con malware son &#8220;t\u00f3xicos&#8221; y no deben ser reciclados, ya que podr\u00edan enga\u00f1ar a los usuarios o ser reutilizados por el mismo actor de amenazas u otros.<\/p>\n<p>Adem\u00e1s, PyPI ha implementado reglas estrictas sobre la inmutabilidad de las versiones de los paquetes; una vez que un archivo con un nombre y una versi\u00f3n espec\u00edficos se ha subido, ese mismo nombre de archivo no se puede volver a subir, incluso si se elimina. Esto evita que los atacantes reemplacen una versi\u00f3n leg\u00edtima por una maliciosa sin cambiar el n\u00famero de versi\u00f3n.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/p>\n<p>La existencia de estas pol\u00edticas m\u00e1s estrictas no es accidental. Es el resultado de a\u00f1os de lidiar con una multitud de ataques a la cadena de suministro, desde typosquatting hasta la toma de control de cuentas de mantenedores.<\/p>\n<p>La postura de PyPI refleja una &#8220;cicatriz&#8221; institucional, donde las lecciones aprendidas de incidentes pasados se han codificado en pol\u00edticas de gobernanza m\u00e1s s\u00f3lidas para proteger el ecosistema.<span class=\"button-container hide-from-message-actions ng-star-inserted\"> \u00a0<\/span><\/p>\n<h3>npm Registry: Enfoque en Disputas y &#8220;Squatting&#8221;<\/h3>\n<p>El npm Registry, el repositorio de paquetes m\u00e1s grande del mundo, ha centrado gran parte de sus pol\u00edticas de nomenclatura en la prevenci\u00f3n del typosquatting y la resoluci\u00f3n de disputas de nombres a trav\u00e9s de un proceso formal. Las directrices de npm proh\u00edben expl\u00edcitamente el &#8220;squatting&#8221;, que se define como registrar un nombre de paquete con el \u00fanico prop\u00f3sito de reservarlo para uso futuro sin publicar c\u00f3digo funcional.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/p>\n<p>En cuanto a la eliminaci\u00f3n, la historia de npm est\u00e1 marcada por el infame incidente de <code>left-pad<\/code> en 2016, donde la eliminaci\u00f3n de un paquete trivial pero ampliamente utilizado rompi\u00f3 miles de compilaciones en todo el mundo. Como resultado, las pol\u00edticas sobre la anulaci\u00f3n de la publicaci\u00f3n (<code>unpublish<\/code>) se han vuelto m\u00e1s estrictas.<\/p>\n<p>La documentaci\u00f3n de npm indica que &#8220;incluso si se anula la publicaci\u00f3n de una versi\u00f3n de un paquete, esa combinaci\u00f3n espec\u00edfica de nombre y versi\u00f3n nunca se puede reutilizar&#8221;.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/p>\n<p>Sin embargo, el enfoque principal aqu\u00ed est\u00e1 en la inmutabilidad de la <i>versi\u00f3n<\/i>. Las pol\u00edticas son menos expl\u00edcitas y m\u00e1s complejas en lo que respecta al ciclo de vida completo del <i>nombre<\/i> del paquete despu\u00e9s de que todas sus versiones han sido eliminadas.<\/p>\n<p>Si bien la intenci\u00f3n es prevenir la interrupci\u00f3n y el secuestro, el enfoque principal ha sido la resoluci\u00f3n de conflictos y la prevenci\u00f3n del typosquatting, en lugar de una pol\u00edtica proactiva de retirada de nombres maliciosos como la de PyPI.<\/p>\n<h3>Implicaciones de las Diferencias de Pol\u00edticas<\/h3>\n<p>La postura de seguridad de un repositorio no puede evaluarse \u00fanicamente por sus capacidades de escaneo de malware, sino que debe incluir un an\u00e1lisis de sus pol\u00edticas de gobernanza fundamentales. La vulnerabilidad de reutilizaci\u00f3n de nombres en VS Code es un ejemplo claro de c\u00f3mo una pol\u00edtica permisiva puede crear un riesgo sist\u00e9mico.<\/p>\n<p>La ausencia de una excepci\u00f3n para nombres maliciosos, como la que tiene PyPI, indica una falta de madurez en el modelo de amenaza del marketplace.<\/p>\n<p>El estado actual de las pol\u00edticas de ciclo de vida de los repositorios puede considerarse un indicador de su madurez en seguridad. PyPI, habiendo sido un objetivo principal durante m\u00e1s tiempo, ha desarrollado pol\u00edticas m\u00e1s endurecidas en respuesta a TTPs (T\u00e1cticas, T\u00e9cnicas y Procedimientos) adversarios observados en el mundo real.<\/p>\n<p>El VS Code Marketplace, al ser un ecosistema m\u00e1s joven y curado por una \u00fanica corporaci\u00f3n, parece tener pol\u00edticas m\u00e1s centradas en la conveniencia del desarrollador y la gesti\u00f3n de la plataforma que en un modelo de amenaza adversarial robusto.<\/p>\n<p>La vulnerabilidad de reutilizaci\u00f3n de nombres no fue una sorpresa para los investigadores familiarizados con los patrones de ataque en otros ecosistemas; fue una falla predecible en una plataforma que a\u00fan no ha incorporado las duras lecciones aprendidas por sus predecesores.<\/p>\n<h2>Inmersi\u00f3n Profunda en el Vector de Ataque: Typosquatting, Brandjacking y Confusi\u00f3n de Dependencias<\/h2>\n<p>La vulnerabilidad de reutilizaci\u00f3n de nombres en el VS Code Marketplace no existe en el vac\u00edo.<\/p>\n<p>Es una manifestaci\u00f3n de una clase m\u00e1s amplia y persistente de ataques a la cadena de suministro de software conocidos colectivamente como ataques de confusi\u00f3n de nombres.<\/p>\n<p>Estos ataques explotan la psicolog\u00eda humana, los errores tipogr\u00e1ficos y las complejidades de los sistemas de gesti\u00f3n de paquetes para enga\u00f1ar a los desarrolladores y a las herramientas de compilaci\u00f3n automatizadas para que consuman c\u00f3digo malicioso. Comprender este contexto es crucial para apreciar la gravedad de la falla del marketplace.<\/p>\n<h3>Definici\u00f3n de las Clases de Ataque<\/h3>\n<p>Los ataques de confusi\u00f3n de nombres se pueden clasificar en varias categor\u00edas distintas, cada una con su propio mecanismo de enga\u00f1o:<\/p>\n<ul>\n<li><b>Typosquatting:<\/b> Esta es la forma m\u00e1s com\u00fan de ataque. Los adversarios publican paquetes maliciosos con nombres que son errores tipogr\u00e1ficos comunes de paquetes leg\u00edtimos y populares. El objetivo es atrapar a los desarrolladores que escriben mal un nombre de paquete durante la instalaci\u00f3n. Los ejemplos incluyen omisiones de letras (<code>requests<\/code> vs. <code>reqests<\/code>), repeticiones (<code>jquery<\/code> vs. <code>jquerry<\/code>) o transposiciones (<code>electron<\/code> vs. <code>electorn<\/code>). El ataque al paquete <span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0<\/span><code style=\"font-size: 16px; font-style: inherit; font-weight: inherit;\">colorama<\/code><span style=\"font-size: 16px;\"> de PyPI con un paquete malicioso llamado <\/span><code style=\"font-size: 16px; font-style: inherit; font-weight: inherit;\">colourama<\/code><span style=\"font-size: 16px;\"> es un caso cl\u00e1sico.<\/span><span class=\"button-container hide-from-message-actions ng-star-inserted\" style=\"font-size: 16px;\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-81 hide\">\n<div class=\"carousel-container ng-tns-c669095837-81\"><\/div>\n<\/div>\n<\/li>\n<li><b>Brandjacking:<\/b> En este ataque, un actor de amenazas toma el nombre de un paquete popular y de confianza de un ecosistema de lenguaje (por ejemplo, Python) y publica un paquete malicioso con el mismo nombre en un ecosistema diferente (por ejemplo, Rust). El atacante se aprovecha del reconocimiento de la marca, esperando que un desarrollador que se mueva entre ecosistemas conf\u00ede en el nombre familiar sin una investigaci\u00f3n adecuada.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-82 hide\">\n<div class=\"carousel-container ng-tns-c669095837-82\"><\/div>\n<\/div>\n<\/li>\n<li><b>Combosquatting:<\/b> Esta t\u00e9cnica implica combinar el nombre de un paquete popular con palabras clave que sugieren una funcionalidad mejorada o espec\u00edfica, como &#8220;api&#8221;, &#8220;security&#8221; o &#8220;tools&#8221; (por ejemplo, <code>axios-api<\/code>). Esto puede enga\u00f1ar a los desarrolladores para que piensen que est\u00e1n instalando un complemento oficial o una herramienta de ayuda.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-83 hide\">\n<div class=\"carousel-container ng-tns-c669095837-83\"><\/div>\n<\/div>\n<\/li>\n<li><b>Confusi\u00f3n de Dependencias (Dependency Confusion):<\/b> Este ataque, m\u00e1s dirigido, explota la forma en que los gestores de paquetes resuelven las dependencias. Un atacante identifica el nombre de un paquete privado o interno utilizado dentro de una organizaci\u00f3n. Luego, publica un paquete malicioso con el mismo nombre en un repositorio p\u00fablico (como npm o PyPI). Si el sistema de compilaci\u00f3n de la organizaci\u00f3n no est\u00e1 configurado correctamente para priorizar el repositorio privado, puede &#8220;confundirse&#8221; y descargar la versi\u00f3n p\u00fablica maliciosa, especialmente si esta tiene un n\u00famero de versi\u00f3n m\u00e1s alto.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-84 hide\">\n<div class=\"carousel-container ng-tns-c669095837-84\"><\/div>\n<\/div>\n<\/li>\n<\/ul>\n<h3>Conectando la Reutilizaci\u00f3n de Nombres con el Panorama General de Amenazas<\/h3>\n<p>La vulnerabilidad de reutilizaci\u00f3n de nombres descubierta en el VS Code Marketplace puede considerarse una variante particularmente potente y sigilosa de estos ataques de confusi\u00f3n de nombres.<\/p>\n<p>A diferencia del typosquatting, que se basa en un error del usuario, la reutilizaci\u00f3n de nombres explota la confianza establecida y la memoria institucional.<\/p>\n<p>El peligro radica en que el nombre secuestrado no es una imitaci\u00f3n; es el nombre <i>exacto<\/i> de un paquete que pudo haber sido leg\u00edtimo, popular y de confianza en el pasado.<\/p>\n<p>Considere los siguientes escenarios:<\/p>\n<ol start=\"1\">\n<li><b>Scripts de Automatizaci\u00f3n y Tutoriales:<\/b> Un desarrollador puede tener un script de instalaci\u00f3n o seguir un tutorial en l\u00ednea que hace referencia a una extensi\u00f3n por su nombre leg\u00edtimo. Si esa extensi\u00f3n es eliminada y su nombre es secuestrado, el script o el tutorial ahora apuntan directamente a la versi\u00f3n maliciosa. No hay ning\u00fan error tipogr\u00e1fico que detectar.<\/li>\n<li><b>Sistemas de CI\/CD (Integraci\u00f3n Continua\/Entrega Continua):<\/b> Las canalizaciones de CI\/CD a menudo est\u00e1n configuradas para instalar un conjunto espec\u00edfico de herramientas y extensiones en los entornos de compilaci\u00f3n. Si una de estas extensiones es eliminada y su nombre es reutilizado, la canalizaci\u00f3n de CI\/CD comenzar\u00e1 a instalar autom\u00e1ticamente la versi\u00f3n maliciosa en cada ejecuci\u00f3n, comprometiendo potencialmente el entorno de compilaci\u00f3n, las credenciales y el software que se est\u00e1 produciendo.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-85 hide\">\n<div class=\"carousel-container ng-tns-c669095837-85\"><\/div>\n<\/div>\n<\/li>\n<li><b>Confianza del Desarrollador:<\/b> Un desarrollador que us\u00f3 una extensi\u00f3n en el pasado puede buscarla por su nombre para reinstalarla en una nueva m\u00e1quina. Al encontrar una extensi\u00f3n con el nombre y el icono esperados, es mucho menos probable que investigue al editor o el c\u00f3digo fuente, asumiendo que es el mismo paquete que recuerda.<\/li>\n<\/ol>\n<p>Esta t\u00e9cnica es m\u00e1s insidiosa que el typosquatting porque el indicador principal de un ataque\u2014un nombre mal escrito\u2014est\u00e1 ausente.<\/p>\n<p>La carga de la detecci\u00f3n se traslada por completo al desarrollador, quien ahora debe verificar no solo el nombre, sino tambi\u00e9n la identidad del editor y compararla con un estado previamente conocido, una tarea que es poco pr\u00e1ctica a escala.<\/p>\n<p>El ataque al paquete <code>cross-env<\/code> de npm, que exfiltraba variables de entorno, demostr\u00f3 cu\u00e1n efectivo puede ser un nombre casi id\u00e9ntico. La reutilizaci\u00f3n de un nombre exacto elimina incluso esa peque\u00f1a diferencia, haciendo que la detecci\u00f3n manual sea casi imposible sin un escrutinio forense.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/p>\n<h2>La Ofuscaci\u00f3n de M\u00faltiples Capas de los Ladrones de Informaci\u00f3n de npm<\/h2>\n<p>Si la campa\u00f1a &#8220;Shiba&#8221; representa una amenaza en desarrollo, un conjunto de paquetes maliciosos descubiertos en el registro de npm por el equipo de investigaci\u00f3n de seguridad de JFrog ilustra el extremo superior de la sofisticaci\u00f3n en los ataques a la cadena de suministro.<\/p>\n<p>Esta campa\u00f1a no solo utiliz\u00f3 t\u00e1cticas de confusi\u00f3n de nombres para su distribuci\u00f3n inicial, sino que tambi\u00e9n emple\u00f3 una t\u00e9cnica de ofuscaci\u00f3n de 70 capas para ocultar su carga \u00fatil final: un potente ladr\u00f3n de informaci\u00f3n dirigido al navegador Google Chrome.<\/p>\n<h3>Descripci\u00f3n General de la Campa\u00f1a<\/h3>\n<p>La campa\u00f1a involucr\u00f3 al menos ocho paquetes maliciosos de npm, publicados por los usuarios <code>ruer<\/code> y <code>npjun<\/code>. Los nombres de los paquetes fueron dise\u00f1ados para imitar bibliotecas leg\u00edtimas de React y Solana, utilizando t\u00e9cnicas de typosquatting y combosquatting para atraer a los desarrolladores. Los paquetes inclu\u00edan <code>toolkdvv<\/code>, <code>react-sxt<\/code>, <code>react-sdk-solana<\/code>, <code>react-typex<\/code>, <code>react-typexs<\/code>, <code>react-native-control<\/code>, <code>revshare-sdk-api<\/code> y <code>revshare-sdk-apii<\/code>.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/p>\n<p>El objetivo final de cada uno de estos paquetes era el mismo: desplegar un ladr\u00f3n de informaci\u00f3n altamente capaz en los sistemas Windows de las v\u00edctimas, con el objetivo de exfiltrar datos sensibles directamente del navegador Google Chrome.<\/p>\n<h3>Deconstrucci\u00f3n de la Ofuscaci\u00f3n de 70 Capas<\/h3>\n<p>La caracter\u00edstica m\u00e1s notable de esta campa\u00f1a fue el uso extremo de la ofuscaci\u00f3n para evadir la detecci\u00f3n por parte de herramientas de an\u00e1lisis est\u00e1tico y de los propios investigadores de seguridad. La cadena de ataque se desarroll\u00f3 a trav\u00e9s de m\u00faltiples etapas, cada una desenvolviendo la siguiente como una mu\u00f1eca rusa.<\/p>\n<ol start=\"1\">\n<li><b>Etapa Inicial (JavaScript):<\/b> El ataque comenzaba con un archivo JavaScript (<code>src\/react.js<\/code>) dentro del paquete de npm. Este script inicial estaba ofuscado utilizando una t\u00e9cnica similar a la de <code>obfuscator.io<\/code> para ocultar su verdadera intenci\u00f3n. Una vez desofuscado, el prop\u00f3sito del script era claro: preparar el terreno para una carga \u00fatil de Python.<\/li>\n<li>Sus acciones inclu\u00edan:<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-88 hide\">\n<div class=\"carousel-container ng-tns-c669095837-88\"><\/div>\n<\/div>\n<ul>\n<li>Terminar cualquier proceso de Python en ejecuci\u00f3n.<\/li>\n<li>Verificar si Python estaba instalado en la m\u00e1quina. Si no lo estaba, descargaba e instalaba silenciosamente una versi\u00f3n espec\u00edfica desde los lanzamientos oficiales de Python.<\/li>\n<li>Instalar las bibliotecas de Python necesarias, como <code>pycryptodome<\/code> y <code>requests<\/code>, utilizando <code>pip<\/code>.<\/li>\n<li>Finalmente, escrib\u00eda un script de Python ofuscado en un archivo temporal y lo ejecutaba silenciosamente utilizando m\u00faltiples m\u00e9todos de evasi\u00f3n (WMI, ActiveXObject, PowerShell, Tareas Programadas) para asegurar la ejecuci\u00f3n.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-89 hide\">\n<div class=\"carousel-container ng-tns-c669095837-89\"><\/div>\n<\/div>\n<\/li>\n<\/ul>\n<\/li>\n<li><b>Ofuscaci\u00f3n de Python de M\u00faltiples Capas:<\/b> La verdadera complejidad resid\u00eda en la carga \u00fatil de Python.\n<ul>\n<li><b>Primera Capa (64 iteraciones):<\/b> El c\u00f3digo estaba oculto dentro de una funci\u00f3n lambda an\u00f3nima que se llamaba a s\u00ed misma recursivamente. En cada llamada, la carga \u00fatil se desenvolv\u00eda realizando tres operaciones: revertir el orden de una cadena de caracteres, decodificarla desde Base64 y descomprimirla utilizando <code>zlib<\/code>. Este proceso se repet\u00eda 64 veces, creando una barrera formidable para el an\u00e1lisis manual.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-90 hide\">\n<div class=\"carousel-container ng-tns-c669095837-90\"><\/div>\n<\/div>\n<\/li>\n<li><b>Segunda Capa:<\/b> Despu\u00e9s de las 64 iteraciones, emerg\u00eda una t\u00e9cnica de ofuscaci\u00f3n diferente. Esta capa utilizaba bytes sin procesar para ocultar cadenas y empleaba la inversi\u00f3n de segmentos (<code>slice reversing<\/code>) para ocultar la l\u00f3gica. La desofuscaci\u00f3n de esta capa revel\u00f3 un c\u00f3digo Python serializado (<code>marshalled<\/code>) que hab\u00eda sido comprimido dos veces con <code>bz2<\/code>, con los bytes en orden inverso en cada etapa de descompresi\u00f3n.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-91 hide\">\n<div class=\"carousel-container ng-tns-c669095837-91\"><\/div>\n<\/div>\n<\/li>\n<li><b>Capas Posteriores:<\/b> Las capas subsiguientes continuaron utilizando variaciones de estas t\u00e9cnicas, totalizando 70 capas de ofuscaci\u00f3n. Este nivel de complejidad no solo est\u00e1 dise\u00f1ado para derrotar a los esc\u00e1neres automatizados, sino tambi\u00e9n para agotar el tiempo y los recursos de los analistas de seguridad humanos.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>Carga \u00datil Final: Funcionalidad del Ladr\u00f3n de Informaci\u00f3n de Chrome<\/h3>\n<p>Despu\u00e9s de navegar por el laberinto de la ofuscaci\u00f3n, la carga \u00fatil final revel\u00f3 ser un ladr\u00f3n de informaci\u00f3n altamente especializado y peligroso, con capacidades extensas para robar datos del navegador Chrome.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/p>\n<ul>\n<li><b>Robo de Datos:<\/b>\n<ul>\n<li><b>Credenciales:<\/b> Extra\u00eda contrase\u00f1as guardadas.<\/li>\n<li><b>Finanzas:<\/b> Recopilaba datos de tarjetas de cr\u00e9dito almacenadas.<\/li>\n<li><b>Sesiones:<\/b> Robaba cookies de sesi\u00f3n, lo que podr\u00eda permitir a los atacantes secuestrar sesiones de usuario activas en varios sitios web.<\/li>\n<li><b>Criptomonedas:<\/b> Se dirig\u00eda espec\u00edficamente a los datos de las billeteras de criptomonedas almacenadas por extensiones populares, incluyendo MetaMask (<code>nkbihfbeogaeaoehlefnkodbefgpgknn<\/code>), Phantom (<code>bfnaelmomeimhlpmgjnjophhpkkoljpa<\/code>), Trust Wallet (<code>egjidjbpglichdcondbcbdnbeeppgdph<\/code>) y Solflare (<code>bhhhlbepdkbapadjdnnojkbgioiodbic<\/code>).<\/li>\n<\/ul>\n<\/li>\n<li><b>T\u00e9cnicas de Evasi\u00f3n:<\/b> El malware empleaba t\u00e9cnicas avanzadas para acceder a los archivos de datos de Chrome, que a menudo est\u00e1n bloqueados mientras el navegador est\u00e1 en funcionamiento. Utilizaba un bypass de &#8220;shadow copy&#8221; y la suplantaci\u00f3n de LSASS para acceder y descifrar las claves de Chrome.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-93 hide\">\n<div class=\"carousel-container ng-tns-c669095837-93\"><\/div>\n<\/div>\n<\/li>\n<li><b>Exfiltraci\u00f3n de Datos:<\/b> Los datos robados se empaquetaban y se exfiltraban a servidores remotos alojados en la plataforma <code>railway.app<\/code>. La carga \u00fatil tambi\u00e9n inclu\u00eda un webhook de Discord como mecanismo de exfiltraci\u00f3n de respaldo, aunque no se observ\u00f3 que se utilizara en la campa\u00f1a analizada.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/li>\n<\/ul>\n<p>La siguiente tabla resume los Indicadores de Compromiso (IOCs) asociados con esta sofisticada campa\u00f1a, proporcionando a los equipos de seguridad los datos necesarios para la detecci\u00f3n y la caza de amenazas.<\/p>\n<div class=\"horizontal-scroll-wrapper\">\n<table>\n<thead>\n<tr>\n<td>Tipo de Indicador<\/td>\n<td>Valor \/ Patr\u00f3n<\/td>\n<td>Descripci\u00f3n \/ Contexto<\/td>\n<td><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Paquete npm<\/td>\n<td><code>toolkdvv<\/code> (versiones 1.1.0, 1.0.0)<\/td>\n<td>Paquete malicioso que aloja la carga \u00fatil ofuscada.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Paquete npm<\/td>\n<td><code>react-sxt<\/code> (versi\u00f3n 2.4.1)<\/td>\n<td>Paquete malicioso que aloja la carga \u00fatil ofuscada.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Paquete npm<\/td>\n<td><code>react-typex<\/code> (versi\u00f3n 0.1.0)<\/td>\n<td>Paquete malicioso que aloja la carga \u00fatil ofuscada.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Paquete npm<\/td>\n<td><code>react-typexs<\/code> (versi\u00f3n 0.1.0)<\/td>\n<td>Paquete malicioso que aloja la carga \u00fatil ofuscada.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Paquete npm<\/td>\n<td><code>react-sdk-solana<\/code> (versi\u00f3n 2.4.1)<\/td>\n<td>Paquete malicioso que aloja la carga \u00fatil ofuscada.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Paquete npm<\/td>\n<td><code>react-native-control<\/code> (versi\u00f3n 2.4.1)<\/td>\n<td>Paquete malicioso que aloja la carga \u00fatil ofuscada.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Paquete npm<\/td>\n<td><code>revshare-sdk-api<\/code> (versi\u00f3n 2.4.1)<\/td>\n<td>Paquete malicioso que aloja la carga \u00fatil ofuscada.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Paquete npm<\/td>\n<td><code>revshare-sdk-apii<\/code> (versi\u00f3n 2.4.1)<\/td>\n<td>Paquete malicioso que aloja la carga \u00fatil ofuscada.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>Usuario de npm<\/td>\n<td><code>ruer<\/code>, <code>npjun<\/code><\/td>\n<td>Nombres de usuario utilizados para publicar los paquetes maliciosos.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>URL de Exfiltraci\u00f3n<\/td>\n<td><code>hxxps[:]\/\/vepo-production-013b[.]up[.]railway[.]app\/upload<\/code><\/td>\n<td>Endpoint remoto para recibir los datos robados.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>URL de Exfiltraci\u00f3n<\/td>\n<td><code>hxxps[:]\/\/chrome-data-receiver[.]up[.]railway[.]app\/upload<\/code><\/td>\n<td>Endpoint remoto para recibir los datos robados.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>URL de Exfiltraci\u00f3n<\/td>\n<td><code>hxxps[:]\/\/chrome-extract[.]up[.]railway[.]app\/upload<\/code><\/td>\n<td>Endpoint remoto para recibir los datos robados.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>ID de Extensi\u00f3n de Billetera<\/td>\n<td><code>nkbihfbeogaeaoehlefnkodbefgpgknn<\/code><\/td>\n<td>ID de la extensi\u00f3n de Chrome para MetaMask, objetivo del malware.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>ID de Extensi\u00f3n de Billetera<\/td>\n<td><code>bfnaelmomeimhlpmgjnjophhpkkoljpa<\/code><\/td>\n<td>ID de la extensi\u00f3n de Chrome para Phantom, objetivo del malware.<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h3><span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0\u00a0<\/span>Una Falla de Gobernanza: An\u00e1lisis de las Pol\u00edticas de Plataforma sobre el Ciclo de Vida de los Paquetes<\/h3>\n<p>Los incidentes analizados, desde la reutilizaci\u00f3n de nombres en VS Code hasta la ofuscaci\u00f3n extrema en npm, no son simplemente una colecci\u00f3n de ataques aislados. Son manifestaciones de una falla sist\u00e9mica m\u00e1s profunda en la gobernanza de los repositorios de software de c\u00f3digo abierto.<\/p>\n<figure id=\"attachment_7494\" aria-describedby=\"caption-attachment-7494\" style=\"width: 400px\" class=\"wp-caption alignright\"><a href=\"https:\/\/itconnect.lat\/portal\/wp-content\/uploads\/2025\/08\/tinywow_01_83691930-e1756407149852.webp\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-7494\" src=\"https:\/\/itconnect.lat\/portal\/wp-content\/uploads\/2025\/08\/tinywow_01_83691930-e1756407149852.webp\" alt=\"VS Code\" width=\"400\" height=\"400\" title=\"\"><\/a><figcaption id=\"caption-attachment-7494\" class=\"wp-caption-text\">VS Code<\/figcaption><\/figure>\n<p>La falta de pol\u00edticas estandarizadas, coherentes y centradas en la seguridad para todo el ciclo de vida de un paquete\u2014desde su publicaci\u00f3n y mantenimiento hasta su eliminaci\u00f3n y el destino de su nombre\u2014crea un entorno inherentemente riesgoso.<\/p>\n<p>Esta ambig\u00fcedad e inconsistencia entre plataformas obliga a los desarrolladores y a las organizaciones a navegar por un panorama de amenazas complejo sin un marco de confianza claro, convirtiendo a los repositorios en uno de los principales puntos de entrada para los ataques a la cadena de suministro.<\/p>\n<p>La ra\u00edz del problema es que muchas pol\u00edticas de los repositorios parecen haber sido dise\u00f1adas con un enfoque en la funcionalidad, la conveniencia del desarrollador y la gesti\u00f3n del espacio de nombres, en lugar de un modelo de amenaza adversarial robusto. La capacidad de &#8220;eliminar&#8221; completamente una extensi\u00f3n en VS Code y liberar su nombre es un ejemplo perfecto.<\/p>\n<p>Esta caracter\u00edstica puede haber sido concebida para permitir a los desarrolladores desvincularse por completo de un proyecto o para mantener el espacio de nombres limpio. Sin embargo, no tuvo en cuenta el valor de la &#8220;reputaci\u00f3n&#8221; como un activo de seguridad.<\/p>\n<p>Un nombre de paquete no es solo una cadena de caracteres; es un identificador al que los usuarios asocian confianza con el tiempo. Permitir que esa confianza sea transferida a un actor desconocido y potencialmente malicioso es un fallo de dise\u00f1o de pol\u00edticas.<\/p>\n<p>Esta falla se vuelve a\u00fan m\u00e1s evidente cuando se compara con las pol\u00edticas de otras plataformas importantes. La siguiente tabla ofrece una comparaci\u00f3n directa de las pol\u00edticas de reutilizaci\u00f3n de nombres de paquetes en el VS Code Marketplace, PyPI y npm, destacando las diferencias cr\u00edticas en sus posturas de seguridad.<\/p>\n<div class=\"horizontal-scroll-wrapper\">\n<div class=\"table-block-component\">\n<div class=\"table-block has-export-button\">\n<div class=\"table-content not-end-of-paragraph\">\n<table>\n<thead>\n<tr>\n<td>Plataforma<\/td>\n<td>Pol\u00edtica sobre Reutilizaci\u00f3n de Nombres Eliminados\/No Publicados<\/td>\n<td>Pol\u00edtica sobre Reutilizaci\u00f3n de Nombres de Paquetes <i>Maliciosos<\/i><\/td>\n<td>Mitigaci\u00f3n Principal para Conflictos de Nombres<\/td>\n<td>Evaluaci\u00f3n General de la Postura de Seguridad<\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><b>VS Code Marketplace<\/b><\/td>\n<td>Permite la reutilizaci\u00f3n de nombres para extensiones &#8220;eliminadas&#8221;. Los nombres &#8220;no publicados&#8221; se reservan.<\/td>\n<td>No existe una pol\u00edtica espec\u00edfica. Los nombres de extensiones maliciosas eliminadas pueden ser reutilizados.<\/td>\n<td>Depende de la unicidad del par <code>&lt;editor&gt;.&lt;nombre&gt;<\/code> y de listas de bloqueo reactivas.<\/td>\n<td><b>Inmadura \/ Permisiva:<\/b> Prioriza la limpieza del espacio de nombres sobre la prevenci\u00f3n de la suplantaci\u00f3n de identidad. La falta de una pol\u00edtica para nombres maliciosos es una brecha cr\u00edtica.<\/td>\n<\/tr>\n<tr>\n<td><b>Python Package Index (PyPI)<\/b><\/td>\n<td>Permite la reutilizaci\u00f3n de nombres de proyectos eliminados, aunque con restricciones sobre la reutilizaci\u00f3n de nombres de archivos exactos (nombre + versi\u00f3n).<\/td>\n<td><b>Proactiva:<\/b> Proh\u00edbe expl\u00edcitamente la reutilizaci\u00f3n de nombres de proyectos que se determin\u00f3 que eran maliciosos. El nombre queda permanentemente no disponible.<\/td>\n<td>Proceso formal de disputa de nombres (PEP 541) y la prohibici\u00f3n proactiva de nombres maliciosos.<\/td>\n<td><b>Madura \/ Consciente de la Seguridad:<\/b> La pol\u00edtica de retirada de nombres maliciosos demuestra un aprendizaje de incidentes pasados y un enfoque proactivo para romper la cadena de ataque.<\/td>\n<\/tr>\n<tr>\n<td><b>npm Registry<\/b><\/td>\n<td>Estricta en cuanto a la no reutilizaci\u00f3n de una combinaci\u00f3n espec\u00edfica de <i>nombre y versi\u00f3n<\/i> una vez publicada. Las pol\u00edticas sobre la reutilizaci\u00f3n del nombre general despu\u00e9s de la eliminaci\u00f3n completa son complejas.<\/td>\n<td>No hay una pol\u00edtica expl\u00edcita y proactiva de retirada de nombres como en PyPI. La gesti\u00f3n se realiza a trav\u00e9s de la eliminaci\u00f3n de paquetes y la seguridad de la cuenta.<\/td>\n<td>Proceso de disputa de nombres, pol\u00edticas contra el typosquatting y el &#8220;squatting&#8221;.<\/td>\n<td><b>En Evoluci\u00f3n \/ Compleja:<\/b> Las pol\u00edticas se han endurecido en respuesta a incidentes (ej. <code>left-pad<\/code>), pero el enfoque principal est\u00e1 en la inmutabilidad de la versi\u00f3n y la resoluci\u00f3n de disputas, no en la gesti\u00f3n proactiva del ciclo de vida de los nombres maliciosos.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Como muestra la tabla, existe una clara jerarqu\u00eda en la madurez de la seguridad. PyPI se destaca por su pol\u00edtica proactiva, que reconoce que ciertos identificadores est\u00e1n permanentemente comprometidos y deben ser retirados de la circulaci\u00f3n.<\/p>\n<p>Esta es una lecci\u00f3n fundamental en la gesti\u00f3n de identidades digitales que el VS Code Marketplace a\u00fan no ha implementado. La postura de VS Code, al tratar todos los nombres eliminados por igual, independientemente de su historial, crea un riesgo innecesario y significativo.<\/p>\n<p>Esta falta de gobernanza estandarizada coloca una carga desproporcionada sobre el consumidor final. Se espera que los desarrolladores no solo eval\u00faen el c\u00f3digo de un paquete, sino que tambi\u00e9n comprendan y naveguen por las sutiles y a menudo mal documentadas pol\u00edticas de ciclo de vida de cada repositorio que utilizan.<\/p>\n<p>Esta es una expectativa poco realista y una receta para el fracaso a escala. Sin pol\u00edticas de plataforma s\u00f3lidas y seguras por defecto, los ataques a la cadena de suministro seguir\u00e1n proliferando, explotando las grietas en la gobernanza de los ecosistemas de los que depende la industria del software.<\/p>\n<h2>El Imperativo de la Responsabilidad Compartida: Un Marco para Asegurar la Cadena de Suministro de Software<\/h2>\n<p>La seguridad de la cadena de suministro de software no puede ser responsabilidad de una sola entidad. La naturaleza interconectada y distribuida del desarrollo de software moderno, que depende en gran medida de componentes de c\u00f3digo abierto, exige un modelo de <b>Responsabilidad Compartida<\/b>. Este modelo, similar al utilizado en la seguridad de la computaci\u00f3n en la nube, distribuye las obligaciones de seguridad entre todos los participantes del ecosistema. Cada actor, desde los propietarios de las plataformas hasta los desarrolladores individuales, tiene un papel distinto y crucial que desempe\u00f1ar para fortalecer las defensas colectivas contra las amenazas.<span class=\"button-container hide-from-message-actions ng-star-inserted\"> \u00a0<\/span><\/p>\n<h3>Propietarios de Plataformas (por ejemplo, Microsoft, GitHub\/npm, <a href=\"https:\/\/www.python.org\/psf-landing\/\" target=\"_blank\" rel=\"noopener\">Python Software Foundation<\/a>)<\/h3>\n<p>Los propietarios de los repositorios de paquetes act\u00faan como los guardianes del ecosistema y tienen la mayor capacidad para implementar cambios a escala. Sus responsabilidades son fundamentales para establecer una base de seguridad.<\/p>\n<ul>\n<li><b>Establecer Pol\u00edticas Seguras por Defecto:<\/b> Deben dise\u00f1ar e implementar pol\u00edticas de ciclo de vida de paquetes que prioricen la seguridad sobre la conveniencia. Esto incluye la adopci\u00f3n de pol\u00edticas como la de PyPI de retirar permanentemente los nombres asociados con malware, hacer que la autenticaci\u00f3n de dos factores (2FA) sea obligatoria para los mantenedores de paquetes populares y tener procesos de disputa de nombres claros y transparentes.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-97 hide\">\n<div class=\"carousel-container ng-tns-c669095837-97\"><\/div>\n<\/div>\n<\/li>\n<li><b>Invertir en Detecci\u00f3n y Prevenci\u00f3n Robustas:<\/b> Las plataformas deben ir m\u00e1s all\u00e1 del escaneo b\u00e1sico de malware. Deben invertir en an\u00e1lisis est\u00e1ticos y din\u00e1micos avanzados capaces de detectar t\u00e9cnicas de ofuscaci\u00f3n sofisticadas y comportamientos sospechosos antes de que un paquete sea publicado. La integraci\u00f3n de la inteligencia de amenazas en estos sistemas es crucial.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-98 hide\">\n<div class=\"carousel-container ng-tns-c669095837-98\"><\/div>\n<\/div>\n<\/li>\n<li><b>Fomentar la Transparencia y la Confianza:<\/b> Deben proporcionar a los usuarios un historial claro y auditable de los paquetes y los nombres de los paquetes. Esto incluye informaci\u00f3n sobre la propiedad, las transferencias y las eliminaciones. Las insignias de &#8220;editor verificado&#8221; son un buen comienzo, pero se necesita m\u00e1s granularidad para construir una cadena de confianza s\u00f3lida.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-99 hide\">\n<div class=\"carousel-container ng-tns-c669095837-99\"><\/div>\n<\/div>\n<\/li>\n<li><b>Colaborar con la Comunidad de Seguridad:<\/b> Deben establecer canales claros y receptivos para que los investigadores de seguridad informen sobre vulnerabilidades (tanto en la plataforma como en los paquetes que aloja) y seguir las mejores pr\u00e1cticas de divulgaci\u00f3n coordinada de vulnerabilidades (CVD).<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/li>\n<\/ul>\n<h3>Mantenedores de Paquetes<\/h3>\n<p>Los desarrolladores que crean y mantienen el software de c\u00f3digo abierto del que todos dependemos son una parte vital de la cadena de suministro.<\/p>\n<ul>\n<li><b>Asegurar sus Cuentas y Entornos de Desarrollo:<\/b> La toma de control de la cuenta de un mantenedor es un vector de ataque com\u00fan. Es su responsabilidad utilizar contrase\u00f1as seguras y, lo que es m\u00e1s importante, habilitar la 2FA en sus cuentas de repositorio. Tambi\u00e9n deben seguir pr\u00e1cticas de desarrollo seguras en sus propios entornos.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-101 hide\">\n<div class=\"carousel-container ng-tns-c669095837-101\"><\/div>\n<\/div>\n<\/li>\n<li><b>Gestionar las Dependencias de Forma Responsable:<\/b> Los mantenedores deben investigar y monitorear las dependencias que utilizan en sus propios proyectos, ya que una vulnerabilidad en una dependencia transitiva puede comprometer su paquete.<\/li>\n<li><b>Responder a las Divulgaciones de Vulnerabilidades:<\/b> Deben tener un proceso claro para recibir informes de seguridad y deben responder de manera oportuna para corregir las vulnerabilidades y notificar a sus usuarios.<\/li>\n<\/ul>\n<h3>Investigadores de Seguridad<\/h3>\n<p>La comunidad de investigaci\u00f3n de seguridad act\u00faa como el sistema inmunol\u00f3gico del ecosistema de c\u00f3digo abierto, identificando debilidades antes de que puedan ser explotadas a gran escala.<\/p>\n<ul>\n<li><b>Descubrimiento Proactivo de Amenazas:<\/b> Su funci\u00f3n es buscar activamente vulnerabilidades en las plataformas, paquetes y las t\u00e1cticas utilizadas por los actores de amenazas.<\/li>\n<li><b>Divulgaci\u00f3n Responsable:<\/b> Deben seguir las normas de Divulgaci\u00f3n Coordinada de Vulnerabilidades (CVD), notificando de forma privada a los propietarios de la plataforma o a los mantenedores y d\u00e1ndoles un tiempo razonable para solucionar el problema antes de la divulgaci\u00f3n p\u00fablica. Esto equilibra la necesidad de informar al p\u00fablico con el riesgo de armar a los atacantes.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/li>\n<\/ul>\n<h3>Consumidores (Desarrolladores y Organizaciones)<\/h3>\n<p>En \u00faltima instancia, la organizaci\u00f3n que construye e implementa el software es responsable de los componentes que elige incluir. No pueden delegar completamente la seguridad a las plataformas o a los mantenedores.<\/p>\n<ul>\n<li><b>Investigar Antes de Integrar:<\/b> Los desarrolladores y las organizaciones tienen la responsabilidad de realizar la debida diligencia en cada componente de terceros. Esto significa no confiar ciegamente en un nombre de paquete, sino investigar al autor, la popularidad, el historial de mantenimiento y las vulnerabilidades conocidas.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-103 hide\">\n<div class=\"carousel-container ng-tns-c669095837-103\"><\/div>\n<\/div>\n<\/li>\n<li><b>Implementar Controles T\u00e9cnicos:<\/b> Las organizaciones deben implementar defensas t\u00e9cnicas como el uso de repositorios privados o proxy que act\u00faen como una zona de cuarentena, el uso de herramientas de An\u00e1lisis de Composici\u00f3n de Software (SCA) para escanear dependencias y la aplicaci\u00f3n de pol\u00edticas de seguridad en sus canalizaciones de CI\/CD.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-104 hide\">\n<div class=\"carousel-container ng-tns-c669095837-104\"><\/div>\n<\/div>\n<\/li>\n<li><b>Mantener un Inventario y Monitorear Continuamente:<\/b> Es crucial mantener un inventario preciso de todos los componentes de software y sus dependencias, com\u00fanmente conocido como una Lista de Materiales de Software (SBOM, por sus siglas en ingl\u00e9s). Este inventario permite una r\u00e1pida evaluaci\u00f3n del impacto cuando se descubre una nueva vulnerabilidad y debe ser monitoreado continuamente en busca de nuevas amenazas.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/li>\n<\/ul>\n<p>Solo cuando cada uno de estos grupos asuma plenamente sus responsabilidades, el ecosistema de software de c\u00f3digo abierto podr\u00e1 pasar de un estado reactivo, donde se responde a los ataques a medida que ocurren, a una postura proactiva y resistente, donde las defensas colectivas hacen que los ataques a la cadena de suministro sean significativamente m\u00e1s dif\u00edciles y costosos de ejecutar.<\/p>\n<h2>Recomendaciones Estrat\u00e9gicas para la Mitigaci\u00f3n y la Resiliencia<\/h2>\n<p>Para abordar eficazmente las amenazas a la cadena de suministro de software, como la vulnerabilidad de reutilizaci\u00f3n de nombres en el VS Code Marketplace, se requiere un enfoque de defensa en profundidad.<\/p>\n<p>Las siguientes recomendaciones estrat\u00e9gicas est\u00e1n dise\u00f1adas para proporcionar orientaci\u00f3n procesable a los diferentes actores dentro del ecosistema de software, desde el desarrollador individual hasta el CISO de la organizaci\u00f3n y los propietarios de las plataformas.<\/p>\n<h3>Para Desarrolladores y Equipos de DevSecOps<\/h3>\n<p>Los desarrolladores son la primera l\u00ednea de defensa. La incorporaci\u00f3n de pr\u00e1cticas de seguridad en el flujo de trabajo diario es la forma m\u00e1s eficaz de prevenir la introducci\u00f3n de dependencias maliciosas.<\/p>\n<ul>\n<li><b>Adoptar una Mentalidad de Confianza Cero para las Dependencias:<\/b> Cada paquete, extensi\u00f3n o biblioteca de terceros debe ser tratado como potencialmente no confiable hasta que se verifique. Nunca se debe confiar \u00fanicamente en el nombre de un paquete.<\/li>\n<li><b>Implementar un Proceso de Investigaci\u00f3n Riguroso:<\/b> Antes de agregar cualquier nueva dependencia a un proyecto, los desarrolladores deben realizar un proceso de investigaci\u00f3n utilizando una lista de verificaci\u00f3n estandarizada.<\/li>\n<li><b>Integrar Herramientas de Seguridad Automatizadas en la Canalizaci\u00f3n de CI\/CD:<\/b> La seguridad no debe ser un paso manual y espor\u00e1dico. Herramientas como el An\u00e1lisis de Composici\u00f3n de Software (SCA), el An\u00e1lisis Est\u00e1tico de Seguridad de Aplicaciones (SAST) y el An\u00e1lisis Din\u00e1mico de Seguridad de Aplicaciones (DAST) deben integrarse en la canalizaci\u00f3n de CI\/CD. Estas herramientas pueden escanear continuamente las dependencias en busca de vulnerabilidades conocidas, problemas de licencia y comportamientos sospechosos.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/li>\n<li><b>Utilizar Banderas de Instalaci\u00f3n Seguras:<\/b> Al instalar paquetes de npm, se debe utilizar la bandera <code>--ignore-scripts<\/code>. Esta bandera evita la ejecuci\u00f3n autom\u00e1tica de scripts de preinstalaci\u00f3n y postinstalaci\u00f3n, que son un vector de ataque com\u00fan utilizado por los paquetes maliciosos para ejecutar c\u00f3digo arbitrario en la m\u00e1quina del desarrollador o en el servidor de compilaci\u00f3n.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span><\/li>\n<li><b>Fijar las Versiones de las Dependencias (Pinning):<\/b> Se deben utilizar archivos de bloqueo (como <code>package-lock.json<\/code> en npm o <code>poetry.lock<\/code> en Python) para fijar las versiones exactas de todas las dependencias, incluidas las transitivas. Esto evita que el gestor de paquetes descargue autom\u00e1ticamente una versi\u00f3n m\u00e1s nueva (y potencialmente maliciosa) de una dependencia sin una acci\u00f3n expl\u00edcita.<\/li>\n<\/ul>\n<p>La siguiente tabla proporciona una lista de verificaci\u00f3n pr\u00e1ctica que los desarrolladores pueden utilizar para evaluar las dependencias de terceros.<\/p>\n<div class=\"horizontal-scroll-wrapper\">\n<table>\n<thead>\n<tr>\n<td><strong>Elemento de la Lista de Verificaci\u00f3n<\/strong><\/td>\n<td><strong>Preguntas Clave a Considerar<\/strong><\/td>\n<td><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><b>Procedencia y Reputaci\u00f3n del Autor<\/b><\/td>\n<td>\u00bfQui\u00e9n es el editor o autor? \u00bfSon conocidos y de confianza en la comunidad? \u00bfTienen un perfil de GitHub activo y leg\u00edtimo, seguidores y un historial de contribuciones?<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><b>Popularidad y Mantenimiento<\/b><\/td>\n<td>\u00bfCu\u00e1ntas descargas tiene el paquete? \u00bfEs un proyecto activo con confirmaciones y lanzamientos recientes? \u00bfHay problemas abiertos sin respuesta? Un paquete abandonado es un riesgo de seguridad.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><b>Historial de Seguridad<\/b><\/td>\n<td>\u00bfTiene el paquete vulnerabilidades conocidas (CVEs)? \u00bfSe pueden encontrar en bases de datos como la NVD o Snyk? Si tuvo vulnerabilidades en el pasado, \u00bfcon qu\u00e9 rapidez se solucionaron?<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><b>Verificaci\u00f3n de Sanidad del Nombre<\/b><\/td>\n<td>\u00bfEl nombre del paquete parece un error tipogr\u00e1fico de otro paquete popular? \u00bfEl nombre coincide con el enlace del repositorio? \u00bfHay guiones o graf\u00edas inusuales?<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><b>Permisos y Funcionalidad<\/b><\/td>\n<td>\u00bfQu\u00e9 hace realmente el paquete? \u00bfSolicita permisos excesivos, como acceso a la red o al sistema de archivos, que no parecen necesarios para su funci\u00f3n declarada?<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><b>Dependencias Transitivas<\/b><\/td>\n<td>\u00bfCu\u00e1les son las dependencias del paquete? \u00bfCu\u00e1ntas hay? Cada dependencia transitiva es un riesgo potencial y tambi\u00e9n debe ser investigada.<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><b>Resultados del Escaneo Automatizado<\/b><\/td>\n<td>\u00bfQu\u00e9 informan las herramientas de SCA y SAST sobre el paquete? \u00bfHay c\u00f3digo ofuscado, llamadas a la red sospechosas o scripts de instalaci\u00f3n peligrosos?<\/td>\n<td><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h3><span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0\u00a0<\/span>Para Organizaciones y los CISO<\/h3>\n<p>La seguridad de la cadena de suministro debe ser una prioridad estrat\u00e9gica a nivel organizacional, respaldada por pol\u00edticas y controles t\u00e9cnicos.<\/p>\n<ul>\n<li><b>Establecer una Lista de Permitidos (Allowlist) a Nivel Empresarial:<\/b> En lugar de permitir que los desarrolladores instalen cualquier paquete o extensi\u00f3n, las organizaciones deben mantener una lista centralizada de componentes de terceros aprobados y examinados. VS Code y otros entornos de desarrollo ofrecen mecanismos de pol\u00edticas para hacer cumplir estas listas de permitidos, como la pol\u00edtica <code>AllowedExtensions<\/code>.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-109 hide\">\n<div class=\"carousel-container ng-tns-c669095837-109\"><\/div>\n<\/div>\n<\/li>\n<li><b>Exigir el Uso de un Repositorio Privado\/Proxy:<\/b> Se debe exigir a todos los equipos de desarrollo que obtengan sus dependencias a trav\u00e9s de un repositorio interno (como Sonatype Nexus o JFrog Artifactory). Este repositorio act\u00faa como un cach\u00e9 y una puerta de seguridad, almacenando solo las versiones aprobadas de los paquetes p\u00fablicos. Esto evita que los desarrolladores y los sistemas de compilaci\u00f3n se conecten directamente a los repositorios p\u00fablicos y proporciona un \u00fanico punto de control para el escaneo y la auditor\u00eda.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-110 hide\">\n<div class=\"carousel-container ng-tns-c669095837-110\"><\/div>\n<\/div>\n<\/li>\n<li><b>Promover la Lista de Materiales de Software (SBOM):<\/b> Las organizaciones deben exigir la generaci\u00f3n de un SBOM para cada aplicaci\u00f3n que construyan. Un SBOM es un inventario detallado de todos los componentes de software, bibliotecas y sus dependencias. Este inventario es invaluable para la gesti\u00f3n de vulnerabilidades, el cumplimiento de licencias y, lo que es m\u00e1s importante, para una r\u00e1pida evaluaci\u00f3n del impacto cuando se revela una nueva vulnerabilidad en un componente de c\u00f3digo abierto.<span class=\"button-container hide-from-message-actions ng-star-inserted\">\u00a0 \u00a0<\/span>\n<div class=\"container ng-tns-c669095837-111 hide\">\n<div class=\"carousel-container ng-tns-c669095837-111\"><\/div>\n<\/div>\n<\/li>\n<li><b>Desarrollar un Plan de Respuesta a Incidentes para Ataques a la Cadena de Suministro:<\/b> Se deben crear manuales de procedimientos (playbooks) espec\u00edficos para responder a incidentes que involucren dependencias comprometidas. Estos planes deben incluir pasos para la identificaci\u00f3n (utilizando el SBOM), la contenci\u00f3n (aislando los sistemas afectados), la erradicaci\u00f3n (eliminando el componente malicioso y rotando las credenciales comprometidas) y la recuperaci\u00f3n.<\/li>\n<\/ul>\n<h3>Para Propietarios de Plataformas<\/h3>\n<figure id=\"attachment_7495\" aria-describedby=\"caption-attachment-7495\" style=\"width: 400px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/itconnect.lat\/portal\/wp-content\/uploads\/2025\/08\/tinywow_03_83692004-e1756407378968.webp\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-7495\" src=\"https:\/\/itconnect.lat\/portal\/wp-content\/uploads\/2025\/08\/tinywow_03_83692004-e1756407378968.webp\" alt=\"VS Code \" width=\"400\" height=\"400\" title=\"\"><\/a><figcaption id=\"caption-attachment-7495\" class=\"wp-caption-text\">VS Code<\/figcaption><\/figure>\n<p>Los propietarios de los repositorios tienen la responsabilidad de crear un entorno seguro para sus usuarios.<\/p>\n<ul>\n<li><b>Reformar las Pol\u00edticas de Ciclo de Vida de los Nombres:<\/b> La laguna de reutilizaci\u00f3n de nombres en el VS Code Marketplace debe cerrarse de inmediato. Las plataformas deben adoptar el modelo de PyPI de retirar permanentemente los nombres de los paquetes que se haya confirmado que son maliciosos. La seguridad del ecosistema debe tener prioridad sobre la limpieza del espacio de nombres.<\/li>\n<li><b>Mejorar la Detecci\u00f3n Automatizada:<\/b> Se debe invertir en capacidades de an\u00e1lisis est\u00e1tico y din\u00e1mico m\u00e1s sofisticadas. Estas herramientas deben estar dise\u00f1adas para detectar las t\u00e9cnicas de ofuscaci\u00f3n avanzadas y los comportamientos sospechosos (como los observados en los ladrones de informaci\u00f3n de npm) antes de que un paquete se publique.<\/li>\n<li><b>Aumentar la Transparencia:<\/b> Los usuarios deben tener acceso a un historial claro y auditable para cada nombre de paquete. Esto deber\u00eda incluir cu\u00e1ndo se cre\u00f3, por qui\u00e9n, si alguna vez fue eliminado o transferido, y su historial de seguridad. Esta transparencia ayuda a los desarrolladores a tomar decisiones informadas.<\/li>\n<li><b>Reforzar la Verificaci\u00f3n de la Identidad del Editor:<\/b> Los procesos para verificar la identidad de un editor deben ser m\u00e1s estrictos. Esto ayuda a construir una cadena de confianza m\u00e1s fuerte y dificulta que los actores de amenazas publiquen paquetes bajo una apariencia de legitimidad.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h5>Por Marcelo Lozano &#8211; General Publisher IT CONNECT LATAM<\/h5>\n<h6>Lea m\u00e1s sobre Ciberseguridad en:<\/h6>\n<ul>\n<li><a href=\"https:\/\/itconnect.lat\/portal\/empresas-argentinas-001\/\">Empresas Argentinas 2025 Protegen su Seguridad<\/a><\/li>\n<li><a href=\"https:\/\/itconnect.lat\/portal\/campo-de-batalla-algoritmico-001\/\">Campo de Batalla Algor\u00edtmico: La guerra superior 2025<\/a><\/li>\n<li><a href=\"https:\/\/itconnect.lat\/portal\/red-team-001\/\">Red Team 2025: cuando pensar como el enemigo, es seguridad<\/a><\/li>\n<li><a href=\"https:\/\/itconnect.lat\/portal\/zero-trust-0001\/\">Zero Trust: Evaluando las Brechas de Seguridad 2025<\/a><\/li>\n<li><a href=\"https:\/\/itconnect.lat\/portal\/pfa-0000000001\/\">PFA, GNA, PNA y otras polic\u00edas en riesgo impactante en 2025<\/a><\/li>\n<\/ul>\n<p><span style=\"font-size: 8pt; color: #ffffff;\">vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code,\u00a0<\/span><\/p>\n<p><span style=\"font-size: 8pt; color: #ffffff;\">vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code, vs code,\u00a0<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>An\u00e1lisis de la Vulnerabilidad de Reutilizaci\u00f3n de Nombres en VS Code Marketplace y sus Implicaciones para la Seguridad de la Cadena de Suministro de Software &nbsp; Investigadores de ciberseguridad han identificado una vulnerabilidad cr\u00edtica en la gobernanza de pol\u00edticas del Visual Studio Code (VS Code) Marketplace, que permite a los actores de amenazas reutilizar los [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":7497,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[58],"tags":[4351],"class_list":["post-7491","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ciberseguridad","tag-vs-code"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/itconnect.lat\/portal\/wp-json\/wp\/v2\/posts\/7491","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itconnect.lat\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itconnect.lat\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itconnect.lat\/portal\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/itconnect.lat\/portal\/wp-json\/wp\/v2\/comments?post=7491"}],"version-history":[{"count":2,"href":"https:\/\/itconnect.lat\/portal\/wp-json\/wp\/v2\/posts\/7491\/revisions"}],"predecessor-version":[{"id":7498,"href":"https:\/\/itconnect.lat\/portal\/wp-json\/wp\/v2\/posts\/7491\/revisions\/7498"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itconnect.lat\/portal\/wp-json\/wp\/v2\/media\/7497"}],"wp:attachment":[{"href":"https:\/\/itconnect.lat\/portal\/wp-json\/wp\/v2\/media?parent=7491"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itconnect.lat\/portal\/wp-json\/wp\/v2\/categories?post=7491"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itconnect.lat\/portal\/wp-json\/wp\/v2\/tags?post=7491"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}