2026年9月22日、当社のOpen WebUIハニーポットに4件のリクエストが届きました。いずれも、ペイロードをダウンロードして実行するよう設計されたPythonコードを含んでいました。4件すべてに対する応答は同じで、401 Not authenticatedでした。
当社のオープンソースのデセプションフレームワークBeelzebubは、リクエストボディを保存していました。その中にあったのが、ダウンロードURL hxxp://hand.genddos[.]st:48180/bugです。前日には、同じIPアドレスがRedisハニーポットにも同じURLを送っていました。2つの異なるサービスに対し、コードを実行する手段は2通りですが、取得先は1か所でした。
Redisの応答はエミュレートしたものです。ペイロードの分析は静的解析にとどまり、感染や稼働中のコントローラーセッション、動作するインストールは確認していません。9月23日に保存したVirusTotalの検索結果では、調査対象のローダーとMIPSのハッシュに対応するファイル記録は見つかりませんでした。感染ホスト数を裏付ける独立した情報もなく、被害の規模は不明です。
復元したコードからは、MIPSサンプルをIoT向けDDoSおよびシェルボットと説明できます。ただし、これらの機能が実際に使われる様子は確認していません。
コード実行への2つのルート
Open WebUIへのリクエストは94.154.43[.]7から、約23分の間隔を空けて2回に分けて届きました。各回はサインアップのリクエストから始まり、ハニーポットはHTTP 200とユーザーオブジェクトを返しました。その後、送信元はPipeクラスを/api/v1/functions/createへ、Toolsクラスを/api/v1/tools/createへ送信しました。
これらのAPIを使うと、権限を持つユーザーはサーバー上で動作するPythonコードをインストールできます。Functionの作成は管理者に限られ、Toolの作成には権限が必要です。
送信されたクラスでは、通常のプラグインメソッドよりも先にダウンロードコマンドが置かれていました。ダウンロードして実行するコマンドは__init__内にあり、インスタンスを作成するだけで起動します。pipe()とrun()は空文字列を返すだけです。インポートを省略し、コマンドを伏せた状態で、送信されたコードの1つは次のようになっていました。
class Pipe: # The Tools submission used the same constructor pattern.
def __init__(self):
subprocess.Popen("<download-and-run command referencing /bug>", shell=True)
def pipe(self, *args, **kwargs):
return ""
Redisへの攻撃は別のルートをたどりました。同じアドレスからの2つのセッションには、cronジョブの形式で/bugを参照する3つの値が含まれていました。送信元はRedisのdirとdbfilenameの設定を変更したうえでSAVEを呼び出し、cronが埋め込みコマンドを実行できる場所にスナップショットを書き込もうとしました。さらに、キーの削除と元の設定の復元も試みています。
これらのリクエストは、既知の実行経路を悪用しようとした試みを示しています。認証バイパスやcronによる実行が成功した事実は確認されていません。当社は/bugをたどり、関連するアーティファクトを調べました。
URLをたどる
Caronteを使うことで、ハニーポットが記録したリクエストの先まで、URLをたどることができました。当社は/bug(シェルローダー)と、その関連ペイロードである/spider.mipsを取得し、静的に解析しました。ペイロードは、シンボル情報を削除した静的リンクのビッグエンディアンMIPS ELFです。SHA-256を検証したうえで、Caronteのデコンパイル結果を使ってその機能を調べました。
これらのファイルは、ハニーポットでのやり取りとは別に収集したものです。リクエストの際にどのバージョンが配信されていたのかは特定できません。
当社は、ローダーや復元した文字列に含まれるSPIDER_*変数にちなみ、このマルウェアを仮にSpiderと呼んでいます。マルウェアファミリーは特定できていません。
復元したローダースクリプトは、16種類のバイナリ名を順に試し、実行に成功するまで続ける作りです。サフィックスはMIPS、ARM、x86、PowerPC、SuperH、SPARC、M68k、ARCに対応しています。
hxxp://hand.genddos[.]st:48180/spider.<architecture>
このローダーは、ダウンロードツールが存在しない環境にも備えています。実行権限を復元し、curl、wget、BusyBoxのwgetの順にフォールバックします。各候補は書き込み可能なディレクトリ内で.spidとして、出力を抑制した状態で実行されます。ローダーは試行後にファイルを削除し、いずれかの候補が成功を返した時点で停止します。timeoutが使える環境では、1回の試行を15秒に制限します。
Spiderの命令を読み解く
ボットの挙動の多くは、単純な文字列スキャンでは見えません。各関数は番号で文字列を要求し、デコーダーが24バイトの鍵を繰り返し使うXORで、197エントリのテーブルから文字列を取り出します。当社はこのテーブル全体を静的に復元しました。コマンドやSPIDER_*の名前、http2、fivem、voipといった攻撃手法が読めるようになり、Caronteのデコンパイル結果からハンドラーを見分けられるようになりました。
MIPSサンプルに設定されたコントローラーは、ChaCha20で保護されたホスト名とポートを復号して復元しました。結果は、配信用と同じホスト名のTCPポート48101です。到達可能性や、ハンドシェイクが完了したことまでは確認できません。
Distribution (from loader): hand.genddos[.]st:48180
Recovered MIPS controller: hand.genddos[.]st:48101/TCP
復元したコマンド
復元したコマンドテーブルとハンドラーからは、フラッド攻撃、シェル実行、帯域テストの機能がうかがえます。
| コマンド | 復元したハンドラーまたは形式 |
|---|---|
!ATK |
攻撃手法は、UDP/TCP、HTTP/HTTPS/HTTP2、SIP、FiveM、Sourceエンジンのトラフィックに対応します。 |
!EXEC |
シェルコマンドを実行し、出力、エラー、完了マーカーをEXECR行として返します。 |
!STOP |
攻撃タスクを停止し、STOPR %dを返信します。 |
!KILL |
ソケットとプロセスのチェックを実行した後、ボットを終了します。 |
!SPD |
帯域の測定を要求し、SPD %lluを返信します。 |
帯域テストは、オペレーターがフラッド攻撃に対するデバイスの寄与度を見積もるのに役立つ可能性があります。Spiderは、公開テストファイルに対してダウンロードを、指定されたホストに対してアップロードを測定します。どちらのルーチンもSPD %lluの応答に反映できます。HELLOによる登録にもspeed=が含まれますが、この値の取得元はたどれませんでした。
足場の維持
復元したMIPSコードには、親プロセスからの切り離しや、/proc/self/exeを通じた/usr/local/bin/や/var/lib/などの場所へのコピーが含まれています。コピー先の名前にはkworkerなどが使われます。これにより、.spidが削除された後もコピーが残る可能性がありますが、インストールの成立は確認していません。
復元したインストーラーのテンプレートには、再起動のための方法がいくつも用意されています。systemd、init、cron、シェル、Androidのフックです。cronテンプレートは5分ごとに実行され、ランチャーは別のコピーを起動する前に/proc/[0-9]*/exeを確認します。
復元したプロセス管理ルーチンは、/procからmirai、gafgyt、mozi、xmrigなどの名前を検索し、該当するプロセスにシグナルを送ります。clamdやrkhunterといったセキュリティツールも標的で、該当するサービスにはsystemctl stopとdisableのコマンドが用意されています。これらはコード上の標的であり、実際に終了させた事例や系譜の証拠ではありません。
復元したコードには、これとは別に二重起動を確認する処理があり、/proc/net/tcpをスキャンしてポート39123のリスナーを探します。このリスナーを開くコードは特定できていません。
静的解析では、デバッガー対策のチェックも確認できました。MIPSコードは/proc/self/statusからTracerPidを読み取り、ptrace(PTRACE_TRACEME)を呼び出し、200万回のループにかかる時間を約2,500msのしきい値と比較します。コードには、[kworker/u2:1]のようなカーネルスレッドのプロセス名も含まれています。
3つのビルドにまたがる復元ルーチン
CaronteによるMIPSel、x86_64、PowerPCのデコンパイル結果を比較したところ、共通する!KILLのシーケンスを復元できました。これは、共通の実装か、コピーされたモジュールの存在を示唆するものです。ファミリーを特定できる検証済みのシグネチャではありません。
復元したコードは、終了パスの前にTCPソケットテーブルの行を解析し、最大256個のソケットinodeを保持します。そして、プロセスのファイルディスクリプター内にあるsocket:[inode]リンクと突き合わせ、最大8階層のプロセスの親子関係をたどります。
x86_64とPowerPCのデコンパイル結果にも、同じ行解析用のフォーマット文字列が現れます。この文字列はビッグエンディアンMIPSの基準サンプルでも確認しましたが、そのビルドでシーケンス全体を確認したわけではありません。
このシーケンスと上限値は比較の手がかりにとどまり、元のソースや作成者を特定するものではありません。共通コードがあるからといって、これらのサンプルを誰が運用していたかを確定することもできません。
ソケットのチェックにより、ボットの終了前に補助ルーチンを実行するかどうかが決まります。このルーチンの目的は不明です。競合プロセスのスキャンは、これとは別の処理です。
防御側が探せるもの
以下の手がかりは、送信されたコマンドと復元したコードから得たものです。実際のテレメトリーと照合し、検証する必要があります。
YARAルールの候補は、復元したファイルのマーカーを組み合わせたものです。YARA 4.5.4でコンパイルでき、ビッグエンディアンMIPSの基準サンプルと、MIPSel、x86_64、PowerPCの兄弟サンプルにマッチします。この4サンプル以外への適用範囲と誤検知については、検証していません。
- 配信:複数のアーキテクチャを試すダウンローダー、ダウンロードツールの実行権限の復元、
.spidという名前のファイルの実行。ローダーが削除するため、ディスク検索よりも過去のファイルテレメトリーのほうが有用な可能性があります。 - 永続化:
SPIDER_*環境変数、カーネルスレッドを装ったプロセス、関連する起動エントリー。5分ごとのcronスケジュールやランチャーによる/proc/*/exeの確認とあわせて、実行ファイルとその通信を調べてください。 - プロトコル:復元した
HELLOテンプレートは、speed=、disk=、boot=の順で終わります。この文法は、観測したトラフィックでは未確認です。HELLOやPINGだけでは範囲が広すぎます。
復元したコントローラー、ハッシュ、起動パスは以下に示します。TCP 39123はコード検索で見つけた手がかりであり、リッスンポートとして存在するかどうかは未確認です。
ハニーポットが可視化したもの
1つの送信元、1つのローダーURL、2つの入口。AIアプリケーションのプラグインAPIと、Redisのcron書き込みです。
Open WebUIは401を返し、Redisはエミュレートした+OKを返しました。通常は、ログに応答が残って終わりです。しかし今回は、ハニーポットがローダーURLを含むリクエストボディを保存していました。CaronteがそれをたどってローダーとペイロードにたどりつきMIPSサンプルが何のために作られたかは、静的解析で明らかになりました。
Open WebUIを運用している場合は、プラグインの作成を特権的なアクセスとして扱い、受理された送信だけでなく、拒否された送信も確認してください。RedisがインターネットからアクセスできるRedisでは、想定外のCONFIG SET dirやdbfilenameの変更が目印になります。コントローラー、ハッシュ、起動パスは以下のとおりです。
Beelzebubはオープンソースです。ここまでの内容はすべて、拒否して記録したリクエストから始まりました。/bugやspider.<architecture>がご自身のセンサーに現れた場合は、ぜひ情報を交換させてください。
参考情報
ネットワークIoC
2026年10月1日にVirusTotalのパッシブDNSレコードを照会したところ、9月11日の08:12:42 UTCに176.65.139[.]155、2026年9月28日の09:06:01 UTCに176.65.139[.]170が返されました。これらの過去の名前解決結果は調査すべきアドレスを示しますが、9月21〜22日の攻撃の際にどのIPが/bugを配信していたのかまでは特定できません。
| 役割 | 指標 | 備考 |
|---|---|---|
| リクエスト送信元 | 94.154.43[.]7 |
9月21日のRedisへの送信と、2026年9月22日のOpen WebUIへの送信。 |
| ローダー配信 | hxxp://hand.genddos[.]st:48180/bug |
送信されたURLと、別途取得したローダーの記録。このURLは2種類の異なるローダーハッシュと関連付けられています。 |
| ペイロード配信 | hxxp://hand.genddos[.]st:48180/spider.<architecture> |
ローダーに含まれる、16候補のURLパターン。 |
| 設定されたコントローラー | hand.genddos[.]st:48101/TCP |
暗号化されたMIPS設定から復元したホスト名とポート。 |
| 過去のアドレス | 176.65.139[.]155 |
2026年9月11日付のVirusTotalの名前解決結果。 |
| その後の名前解決 | 176.65.139[.]170 |
2026年9月28日付のVirusTotalの名前解決結果。 |
アーティファクトのハッシュと入手経路
| アーティファクト | サイズ | SHA-256 |
|---|---|---|
/bug、SPIDER_NAME='Mentalist' |
1,529バイト | 732394c84732f6cc68ba6f6e65f3ef8f005ef3db5988c6befd050048f5ecfd6b |
/bug、SPIDER_NAME='webrtc' |
1,526バイト | a632b7a71cdb1d8d7f5fab841eb0d335d6a1f806ed32f56a1eeba879a8eda5e5 |
spider.mips、ビッグエンディアンMIPS ELF |
582,460バイト | db75a8ddcdbf6eaf388c1753af4baaddc2e9c32fe28523a8c57f331c93206b2f |
spider.mipsel |
582,492バイト | 84301bca0070ab51048f3f910162e722bc43aeca0b4c118ad7e470069d69b6cb |
spider.x86_64 |
352,328バイト | 5aa66c3051cb3eacde36e7a743c901aaafe8f01b6a8dd12b3b3213654414d964 |
spider.powerpc |
397,164バイト | b258c6af3acf43b1bd56f1b8c559b9a7df0c39629904a2da87f731bd8cb6420a |
これらのハッシュとサイズは、当社のCaronteによる解析で扱ったファイルを特定するものです。静的な設定の復元に使ったMIPSの基準サンプルについては、当社で独自にハッシュを再計算しました。
当社が解析した/bugローダーは2種類です。9月22日のローダーレポートは1,529バイトのMentalist版(732394c8…fd6b)、9月23日のURLレポートは1,526バイトのwebrtc版(a632b7a7…a5e5)を特定しています。どちらのレポートも、そのローダーを同じMIPSペイロードに関連付けています。これらはレポートの日付であり、別途取得したファイルが、9月21〜22日のハニーポットへのリクエストで提供されたビルドと同じとは限りません。2つのSPIDER_NAMEの値が何を意味するのかは不明です。
復元したインストールの詳細
以下のパスとテンプレートは静的解析で得たものであり、動作するインストールは確認していません。
ローダーは、一時配置先として$TMPDIR、/data/local/tmp、/tmp、/var/tmp、$HOME、カレントディレクトリを探します。インストーラーの候補ディレクトリには/usr/local/bin/、/var/lib/、/usr/bin/、/tmp/、/var/tmp/があり、名前にはkworkerやkworker-bootなどが使われます。
- Systemd:
/run/systemd/system、/etc/systemd/system、multi-user.target.wants。ユニットテンプレートは、Type=oneshot、RemainAfterExit=yes、ExecStartエントリー、WantedBy=multi-user.targetを使用します。 - Initとcron:
/etc/init.d、/etc/rc.d、/etc/rc2.dから/etc/rc5.dまで、/etc/cron.d、/etc/crontabs/root、/var/spool/cron/crontabs/root。システム用とユーザー別のcronテンプレートは、それぞれ5分間隔のスケジュールを含みます。 - シェルとAndroidの起動:
/etc/rc.local、/etc/profile.d、.profile、.mkshrc、/data/adb/service.d、/data/adb/post-fs-data.dが、デコードした設定に現れます。
インストーラーは、生成するランチャーでSPIDER_NAMEをエクスポートします。メインルーチンは、SPIDER_INSTALLを読み取ってインストール管理のパスを選択し、SPIDER_PSを読み取ってプロセス名を設定します。
コマンドハンドラーのシェルのフォールバックには、/system/bin/sh、/vendor/bin/sh、/usr/bin/sh、/data/local/tmp/shが含まれます。
その他の検知結果
CaronteのMIPS解析では、ClamAVのUnix.Trojan.Mirai-8041698-0という検知が記録されました。このラベルはMiraiの系譜を裏付けるものではなく、ファミリーは未特定のままです。最新のシグネチャでClamAVを再実行してはいません。
ATT&CKマッピング
PythonとRedisの項目は送信されたコマンドを、ペイロードの項目は静的解析で復元したコードとテンプレートを説明しています。いずれも、被害環境での実行成功を裏付けるものではありません。
| テクニック | 名称 | 根拠 |
|---|---|---|
| T1059.006 | Python | Open WebUIへの送信に含まれる、シェルを起動するコンストラクター。 |
| T1059.004 | Unix Shell | シェルローダーと!EXECハンドラー。 |
| T1105 | Ingress Tool Transfer | ローダーによる、アーキテクチャ別ペイロードの取得。 |
| T1053.003 | Cron | Redisのcron書き込みの試みと、インストーラーのテンプレート。 |
| T1543.002 | Systemd Service | インストーラーのサービスユニットテンプレートと起動パス。 |
| T1037.004 | RC Scripts | インストーラーのinit/rcスクリプトとrc.localフック。 |
| T1546.004 | Unix Shell Configuration Modification | /etc/profile.dを含む、インストーラーのシェル起動フック。 |
| T1057 | Process Discovery | /procの列挙と、プロセスのファイルディスクリプターの調査。 |
| T1070.004 | File Deletion | 各起動試行後の、ローダーによる.spidの削除。 |
| T1027 | Obfuscated Files or Information | XORによる文字列テーブルと、暗号化されたコントローラー設定。 |
| T1140 | Deobfuscate/Decode Files or Information | 実行時の文字列テーブルデコーダーと、コントローラーフィールドのデコーダー。 |
| T1498 | Network Denial of Service | ペイロードに含まれる、UDP/TCPとアプリケーションプロトコルのトラフィック手法。 |
翻訳元: https://beelzebub.ai/blog/along-came-a-spider-iot-bot/