El malware KREMLIN reescribe los datos de confianza de Chromium para secuestrar sesiones bancarias brasileñas
KREMLIN instala extensiones maliciosas en Chrome y Edge al falsificar datos de integridad de Chromium para robar sesiones y credenciales bancarias brasileñas.
Texto generado por inteligencia artificial, publicado sin revisión humana. Transparencia IA
Imagen ilustrativa generada con IA
Una operación de malware con motivaciones económicas está instalando extensiones no autorizadas de Chrome y Edge mediante la reconstrucción de los datos de integridad que Chromium utiliza para proteger los perfiles del navegador. Las extensiones pueden capturar credenciales bancarias brasileñas, tokens de sesión y otra información confidencial.
Elastic Security Labs rastrea la operación como REF9334 y denomina KREMLIN a este ecosistema de malware, un nombre elegido por su autor, Kr3mlin4rt1st. La campaña está activa desde mayo de 2025 y abarca siete campañas observadas y señuelos que suplantan la identidad de 12 bancos brasileños.
Elastic publicó su investigación técnica sobre KREMLIN el 14 de septiembre de 2026. Posteriormente, la operación se incluyó en un resumen de malware de Security Affairs publicado el 20 de septiembre de 2026.
A pesar de su nombre, la campaña no se ha atribuido a Rusia. Los mensajes en portugués y los comentarios del código fuente, junto con unas transacciones de Ethereum concentradas durante el horario laboral de São Paulo, apuntan más bien a una operación centrada en Brasil.
Un documento falso inicia una infección de Windows en varias etapas
Las infecciones de KREMLIN comienzan cuando un usuario ejecuta manualmente un archivo JavaScript disfrazado de documento bancario, factura o archivo relacionado con una empresa. El loader utiliza una ofuscación limitada, que incluye nombres de funciones genéricos, tablas de cadenas indexadas, notación de corchetes y varias etapas sucesivas en JavaScript.
Uno de los loaders iniciales analizados tiene el siguiente hash SHA-256:
106eac79396a3ff77b8f375c391260ce422be2ae4d55d3aa75b2635cbdc0fa42
El script muestra primero un mensaje de error falso para hacer creer a la víctima que el supuesto documento simplemente no se ha podido abrir. Después crea un script temporal que invoca shell.Popup y lo elimina. El nombre del archivo sigue este patrón:
popup_{date}_{random}.js
Otro ejemplo asociado a esta etapa es:
5ece7fd3766b0b7f8aadefa562313cea6c3c94f9398658dd389910e5be44f552
Antes de continuar, el loader comprueba el entorno. Cuenta los archivos del escritorio y consulta Windows Management Instrumentation para determinar cuántos procesos están en ejecución. La ejecución se detiene si el escritorio contiene menos de cinco archivos o si el sistema tiene menos de 50 procesos, condiciones habituales en entornos de análisis recién creados.
El loader informa de estas comprobaciones fallidas mediante:
/api/log_loader?hash=
La muestra analizada se conectó a:
hxxps://connection[.]upgradeonline[.]site
Si el equipo supera la inspección, la primera etapa descarga un runtime de Node.js. También utiliza la utilidad certutil de Microsoft para decodificar y extraer otra etapa de JavaScript, mezclando la cadena de infección con herramientas legítimas de Windows y de desarrollo.
La persistencia se oculta tras una tarea de actualización de Node.js
La segunda etapa extrae una tarea programada de un archivo CAB incrustado. Registra la tarea con el nombre aparentemente legítimo:
MicrosoftNodeRuntimeUpdater
La descripción de la tarea hace referencia al runtime V8 de Node.js y al motor V8 de Google, de modo que la entrada parece corresponder a un software legítimo. Se ejecuta un minuto después del inicio de sesión del usuario y lanza:
conhost.exe --headless node.exe
El comando se ejecuta desde el directorio que contiene el script malicioso.
Esta etapa también consulta un contrato inteligente de Ethereum que actúa como resolvedor dead drop:
0xCD7360A83E5cdbBbbbcEB0e78748babA6740d07b
En lugar de incluir servidores de descarga fijos en cada loader, los operadores pueden cambiar la información de infraestructura almacenada mediante el contrato. KREMLIN solicita tres parámetros:
main-v2, que identifica el instalador principal de la extensión del navegador.sub-module, que apunta a un archivo JPEG que contiene un kit de inyección .NET RunPE.sentinel, que proporciona un archivo JPEG con un archivo CAB y un ejecutable de SentinelOne.
La ubicación observada del instalador principal era:
hxxps://granderevolucao[.]store/5c92d3b8734b4f498752f735a1ca0987/{campaignId}
Los demás componentes estaban alojados en Archive.org:
hxxps://archive[.]org/download/hotelmoskva/hotelmoskva.jpg
hxxps://ia601808[.]us[.]archive[.]org/5/items/sentinel_20260722_0435/Sentinel.jpg
Elastic no observó el uso del inyector .NET en la actividad analizada. Sin embargo, su presencia demuestra que el framework de distribución puede proporcionar capacidades que van más allá de la extensión del navegador.
Las cargas reciben capas adicionales de ocultación. El módulo principal está codificado como Base64 invertido, mientras que los archivos JPEG portadores contienen datos Base64 entre marcadores de archivo. Un archivo items.json dentro del archivo relacionado con SentinelOne define qué elementos deben aparecer en el directorio de instalación y permite sustituir archivos posteriormente.
Los valores de integridad falsificados de Chromium autorizan la extensión
El binario central de KREMLIN es un ejecutable C++ x64 de aproximadamente 2,10 MB:
c8c38634dd44d7c6162c66174a6ee23ee404265125166e8d757681bdd66a4268
Su objetivo principal es instalar extensiones maliciosas en Google Chrome y Microsoft Edge. KREMLIN no se limita a copiar los archivos de la extensión en un perfil del navegador. Modifica los datos de preferencias de Chromium y reconstruye los valores que normalmente revelarían cambios no autorizados.
El instalador manipula:
- Secure Preferences de Chromium.
- Valores de integridad HMAC necesarios.
- Hashes cifrados de App-Bound.
Esto hace que la extensión parezca aprobada por el usuario y le permite superar las comprobaciones de integridad del perfil de Chromium. Una vez cargada, puede dirigirse a credenciales bancarias, tokens de sesión del navegador y sesiones bancarias autenticadas.
El robo de un token de sesión válido puede permitir al atacante aprovechar un estado del navegador ya autenticado, en lugar de depender únicamente de una contraseña capturada. No se ha divulgado el comportamiento exacto frente a cada banco suplantado.
No se ha identificado ninguna versión afectada de Chrome, Edge o Windows. Tampoco existe un CVE, una puntuación CVSS, un parche del proveedor o una versión corregida del software asociada a la operación. Se trata de una técnica de distribución de malware, no de una vulnerabilidad del navegador divulgada con un proceso convencional de actualización.
La carga lateral de SentinelOne y las llamadas indirectas al sistema dificultan el análisis
KREMLIN ejecuta un componente legítimo de SentinelOne:
SentinelMemoryScanner.exe
Ese programa carga una biblioteca maliciosa sin firmar que se hace pasar por:
SentinelAgentCore.dll
Esta configuración de carga lateral de DLL permite que la carga se ejecute dentro del contexto de proceso de un ejecutable confiable. Los defensores no deben asumir que la presencia de un nombre de archivo legítimo de SentinelOne hace seguras las bibliotecas cargadas o el directorio que las contiene.
Durante la inicialización, el malware localiza LdrpLoaderLock y LdrpWorkInProgress dentro de ntdll.dll. Libera el bloqueo del loader y borra el estado de trabajo en curso, lo que permite que su subproceso de trabajo se inicie antes de que DllMain devuelva el control. Este comportamiento evita la sincronización normal del loader de Windows y previene un interbloqueo que se produciría si el código de inicialización esperara al subproceso recién creado.
KREMLIN también utiliza llamadas indirectas al sistema. Correlaciona las exportaciones de ntdll.dll con las entradas RUNTIME_FUNCTION ordenadas por dirección en .pdata, calcula los System Service Numbers contando las exportaciones Zw* precedentes e invoca las llamadas mediante una secuencia syscall; ret existente. Un stub incrustado proporciona una alternativa de respaldo.
Elastic relacionó esta implementación con el proyecto de código abierto PigSyscall. La manipulación del bloqueo del loader también presenta similitudes con la técnica pública LdrLockLiberator.
El binario no está muy ofuscado y la depuración sigue habilitada tanto en el instalador como en la extensión. Estos indicios de inmadurez en el desarrollo contrastan con una infraestructura de distribución y configuración relativamente sofisticada.
Las comprobaciones contra el análisis terminan las ejecuciones sospechosas
La carga nativa examina nombres de procesos, memoria, propiedades del disco y el proceso anfitrión en busca de indicios de herramientas de seguridad o virtualización. Las primeras etapas en JavaScript añaden sus propias comprobaciones del número de archivos del escritorio y de procesos.
KREMLIN busca numerosos programas de análisis, entre ellos:
procmon.exe
processhacker.exe
systeminformer.exe
wireshark.exe
windbg.exe
x32dbg.exe
x64dbg.exe
ida64.exe
ghidra.exe
fiddler.exe
frida-helper-64.exe
También busca nombres genéricos relacionados con sandboxes, como malware.exe, sandbox.exe, test.exe, joeboxcontrol.exe y fakenet.exe.
Ante muchas detecciones positivas, el malware intenta acceder deliberadamente a:
0x1337
Esa dirección no válida provoca una infracción de acceso y finaliza la ejecución de una forma que puede parecer un bloqueo. Elastic no observó comprobaciones explícitas de depuradores o hooks de API, aunque algunos resultados ambientales recopilados no necesariamente provocan la terminación.
El interruptor de apagado de Elastic interrumpió más de 1.500 infecciones
Elastic registró un dominio de network canary utilizado por la campaña y lo convirtió en un interruptor de apagado temporal. La intervención interrumpió más de 1.500 infecciones, mientras que todavía se contabilizaban otros sistemas afectados cuando se publicó la investigación.
El dominio canary no se ha divulgado y la interrupción se describe como temporal. Por ello, las organizaciones deben buscar indicios locales en lugar de considerar la intervención una remediación permanente.
Las comprobaciones prioritarias incluyen:
- Localizar la tarea programada
MicrosoftNodeRuntimeUpdater. - Investigar
conhost.exe --headless node.exe, especialmente cuando se ejecute desde directorios en los que los usuarios puedan escribir. - Buscar los tres hashes SHA-256 proporcionados en la telemetría de endpoints y de red.
- Revisar los perfiles de Chrome y Edge en busca de cambios inesperados en Secure Preferences, HMAC, hashes de App-Bound o extensiones.
- Identificar archivos
SentinelAgentCore.dllsin firmar cargados porSentinelMemoryScanner.exe. - Marcar los binarios de SentinelOne ejecutados fuera de los directorios de instalación aprobados.
- Examinar actividades sospechosas de
certutilrelacionadas con JavaScript o cargas extraídas. - Buscar conexiones con los dominios indicados y con la dirección del contrato de Ethereum.
- Inspeccionar archivos JavaScript con temática bancaria recibidos como facturas, documentos o material corporativo.
Los usuarios que sospechen haber sufrido una infección deben invalidar las sesiones bancarias activas y las credenciales a través de canales de confianza, después de aislar y examinar el equipo afectado. Eliminar únicamente la extensión visible puede dejar intactos la tarea programada, el loader y los componentes cargados lateralmente.
Fuentes
Este artículo es una reelaboración original basada en las siguientes fuentes.
- fuente primariaelastic.co
- Security Affairs
