eSIM / Explotación de Java Card VM

Reading time: 7 minutes

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Visión general

Las SIMs embebidas (eSIMs) se implementan como Embedded UICC (eUICC) tarjetas inteligentes que ejecutan una Java Card Virtual Machine (JC VM) sobre un elemento seguro. Debido a que los perfiles y applets pueden ser provisionados over-the-air (OTA) a través de Remote SIM Provisioning (RSP), cualquier falla de seguridad de memoria dentro de la JC VM se convierte instantáneamente en un primitivo de ejecución remota de código dentro del componente más privilegiado del dispositivo.

Esta página describe un compromiso total en el mundo real del eUICC de Kigen (Infineon SLC37 ESA1M2, ARM SC300) causado por la falta de verificaciones de seguridad de tipo en los bytecodes getfield y putfield. La misma técnica puede ser reutilizada contra otros proveedores que omiten la verificación de bytecode en la tarjeta.

Superficie de ataque

  1. Gestión de Aplicaciones Remotas (RAM) Los perfiles de eSIM pueden incrustar applets de Java Card arbitrarios. El aprovisionamiento se realiza con APDUs estándar que pueden ser tunelizadas a través de SMS-PP (Short Message Service Point-to-Point) o HTTPS. Si un atacante posee (o roba) las claves RAM para un perfil, puede INSTALL/LOAD un applet malicioso de forma remota.
  2. Ejecución de bytecode de Java Card Después de la instalación, el applet se ejecuta dentro de la VM. Las verificaciones de tiempo de ejecución faltantes permiten la corrupción de memoria.

El primitivo de confusión de tipo

getfield / putfield se supone que solo operan en referencias de objeto. En el eUICC de Kigen, las instrucciones nunca validan si el operando en la pila es una referencia de objeto o una referencia de array. Debido a que una palabra array.length vive en el mismo desplazamiento que el primer campo de instancia de un objeto normal, un atacante puede:

  1. Crear un array de bytes byte[] buf = new byte[0x100];
  2. Convertirlo a Object o = (Object)buf;
  3. Usar putfield para sobrescribir cualquier valor de 16 bits dentro de un objeto adyacente (incluyendo entradas de traducción de VTABLE / ptr).
  4. Usar getfield para leer memoria arbitraria una vez que los punteros internos han sido secuestrados.
java
// Pseudo-bytecode sequence executed by the malicious applet
// buf = newarray byte 0x100
// o   = (Object) buf            // illegal but not verified
// putfield <victimObject+offset>, 0xCAFE // arbitrary write
// ... set up read-what-where gadgets ...

El primitivo proporciona lectura / escritura arbitraria en el espacio de direcciones eUICC, suficiente para volcar la clave privada ECC única del dispositivo que autentica la tarjeta en el ecosistema GSMA.

Flujo de Trabajo de Explotación de Extremo a Extremo

  1. Enumerar firmware – Usar el ítem GET DATA no documentado DF1F:
80 CA DF 1F 00   // → "ECu10.13" (vulnerable)
  1. Instalar applet malicioso OTA – Abusar de las claves públicamente conocidas del Perfil de Prueba Genérico TS.48 y enviar fragmentos SMS-PP que transportan el archivo CAP (LOAD) seguido de un INSTALL:
// cadena APDU simplificada
80 E6 02 00 <data>   // LOAD (bloque n)
80 E6 0C 00 <data>   // INSTALL para carga
  1. Desencadenar confusión de tipo – Cuando se selecciona el applet, realiza la escritura-qué-dónde para secuestrar una tabla de punteros y filtrar memoria a través de respuestas APDU normales.
  2. Extraer clave del certificado GSMA – La clave EC privada se copia a la RAM del applet y se devuelve en fragmentos.
  3. Suplantar el eUICC – El par de claves robadas + certificados permiten al atacante autenticarse en cualquier servidor RSP como una tarjeta legítima (el enlace EID aún puede ser requerido para algunos operadores).
  4. Descargar y modificar perfiles – Los perfiles en texto plano contienen campos altamente sensibles como OPc, AMF, claves OTA e incluso applets adicionales. El atacante puede:
  • Clonar un perfil a un segundo eUICC (secuestro de voz/SMS);
  • Parchear aplicaciones de Java Card (por ejemplo, insertar spyware STK) antes de volver a cargar;
  • Extraer secretos del operador para abuso a gran escala.

Demostración de Clonación / Secuestro

Instalar el mismo perfil en TELÉFONO A y TELÉFONO B resulta en que el Centro de Conmutación Móvil enrute el tráfico entrante al dispositivo que se registró más recientemente. Una sesión de interceptación de SMS de 2FA de Gmail es suficiente para eludir la MFA para la víctima.

Kit de Herramientas de Prueba y Explotación Automatizado

Los investigadores lanzaron una herramienta interna con un comando bsc (Basic Security Check) que muestra inmediatamente si una VM de Java Card es vulnerable:

scard> bsc
- castcheck        [arbitrary int/obj casts]
- ptrgranularity   [pointer granularity/tr table presence]
- locvaraccess     [local variable access]
- stkframeaccess   [stack frame access]
- instfieldaccess  [instance field access]
- objarrconfusion  [object/array size field confusion]

Módulos enviados con el marco:

  • introspector – explorador completo de VM y memoria (~1.7 MB Java)
  • security-test – applet de verificación genérica de bypass (~150 KB)
  • exploit – compromiso Kigen eUICC 100 % fiable (~72 KB)

Mitigaciones

  1. Verificación de byte-code en la tarjeta – hacer cumplir el seguimiento completo del flujo de control y del flujo de datos en lugar de solo el de la parte superior de la pila.
  2. Ocultar encabezado de array – colocar length fuera de los campos de objeto superpuestos.
  3. Endurecer la política de claves RAM – nunca enviar perfiles con claves públicas; deshabilitar INSTALL en perfiles de prueba (abordado en GSMA TS.48 v7).
  4. Heurísticas del lado del servidor RSP – limitar la tasa de descargas de perfiles por EID, monitorear anomalías geográficas, validar la frescura del certificado.

Lista de Verificación Rápida para Pentesters

  • Consultar GET DATA DF1F – la cadena de firmware vulnerable ECu10.13 indica Kigen.
  • Verificar si las claves RAM son conocidas ‑> intentar OTA INSTALL/LOAD.
  • Después de la instalación del applet, forzar el acceso a un tipo primitivo simple (objarrconfusion).
  • Intentar leer las claves privadas del Dominio de Seguridad – éxito = compromiso total.

Referencias

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks