KATARUは、Telnetの認証情報を総当たり攻撃してハニーポットを侵害した事例で確認された、IoT マルウェアのサンプルです。このマルウェアは、おなじみのMiraiスタイルのボットネット機能を備えている一方で、複数のLinux向けn-dayローカル特権昇格エクスプロイト、Linuxおよび組み込み環境にわたる広範な永続化機能、暗号化されたC2通信、分析回避チェック、おとりトラフィックなど、異例に幅広い機能セットを備えている点が際立っています。 アーキテクチャに不整合なエクスプロイトコード、RFCに由来するテスト値、幅広いクロスプラットフォームの永続化ロジックなど、いくつかの実装上の特徴から、KATARUは成熟したマルウェアファミリーとして開発・検証されたものではなく、AIの支援を受けて組み立てられたものであることが強く示唆されています。本記事では、感染チェーン、主要な技術的挙動、および同様のIoT 脅威を特定し、そのリスクを低減するための防御策について解説します。
KATARUの技術的詳細
初回アクセス
8月、ベトナムにあるIPアドレスから当社のハニーポットの1つに対してTelnetの認証情報を総当たり攻撃した結果、感染が確認されました。アクセスを獲得した後、攻撃者はBusyBoxコマンドを使用して、次のように保存されていたARMペイロードを取得・実行しました。 vlxx.arm (13382c16e2401b07451577b46e634b8031ec254d98b876e59692b5fa22abc1d4).
ステージング中に確認されたコマンドシーケンスやマーカー(condi72 や condixx など)から、ペイロードは loader によって配信された可能性が高いことが示唆される cc76bc218627279ecb4d0ce74ad2651e9db9e3e843e35d6569576e056e3a9218 あるいは、それと密接に関連する亜種。この初歩的なドロッパーの旧バージョンのソースコードは、以前にもネット上に公開されていた。
.png)
当社のマルウェア分類システムは、このサンプルを、これまでに確認されたIoT マルウェアと比較して異例であると判定したため、詳細な分析が行われました。最も顕著な違いは、複数のLinux向けローカル権限昇格エクスプロイトが含まれていたことであり、これはIoT マルウェアのサンプルでは通常見られない機能です。
このサンプルは一見すると純粋なC言語のように見えますが、ELF .コメント このセクションには、以下の項目への言及が含まれています。 clang バージョン 20.1.2、LLD 20.1.2そして zig-bootstrap. 最も可能性の高い説明は、Zigに同梱されているclang/LLDツールチェーンを使用してコンパイルされたということだ。この構成により、静的muslによるクロスコンパイルが容易になり、個別のGCCクロスツールチェーンを維持することなく、1つのホストから複数のアーキテクチャ向けのペイロードをビルドできるようになる。
このファミリーについては、マルウェアの設定ファイルを復号するために使用されたChaCha20のノンスに基づき、「KATARU」として追跡しています。
権限昇格
実行されると、このサンプルはいくつかの権限昇格の経路を試みます。単純な設定ミスを悪用するものもあれば、ターゲットアーキテクチャに合わせて修正することなく、公開されているエクスプロイトコードをそのまま再利用しているように見えるものもあります。具体的には:
- このツールは、以下のような深刻な設定ミスのあるシステムを検出し、
/etc/passwd現在のユーザーが書き込み権限を持っている場合、その場合はroot:x:~とroot::, ルートパスワードのプレースホルダーを削除し、以下を通じて権限昇格を可能にするsuパスワードなしでroot権限を取得する。 - 設定ミスが存在しない場合、このサンプルにはCVE-2026-46300(Fragnesia)の脆弱性に対するエクスプロイトコードが含まれており、これにより権限のないユーザーが影響を受けるLinuxシステム上でroot権限を取得することが可能となります。逆コンパイルの結果から、公開されているエクスプロイトを修正を加えることなくそのままコピーしたものと推測されます。
- 前のエクスプロイトが失敗した場合、このサンプルには、CVE-2026-43284(DirtyFrag)の脆弱性に対する追加のエクスプロイトが埋め込まれており、これもまた公開されているコードからコピーされたものである。
- 次に試みられたエクスプロイトは、CVE-2026-31431(Copy Fail)です。これまでのエクスプロイト経路と同様、このコードもほとんど、あるいはまったく変更を加えずにコピーされたものと見られます。
- 次の関数は、現在の実行ファイルを再起動するシェルスクリプトを作成し、設定を行うことで、cgroup v1 の release_agent エスケープを準備します。
/sys/fs/cgroup/memory/release_agentそのスクリプトを実行するには。 - ハードコードされたリストに含まれるファイルのいずれかがSUIDであるかどうかを確認するヘルパー関数がもう1つありますが、その出力は破棄されており、現時点では特権昇格機能の残りの部分には組み込まれていません。
.png)
.png)
こうしたローカル権限昇格の試みにおいて最も注目すべき点は、アーキテクチャの不一致である。分析対象のサンプルはARM向けに構築されているにもかかわらず、エクスプロイトコードで使用されているシェルコードはx86を対象としている。これは、エクスプロイトコードが公開されているソースからコピーされ、適切なテストやアーキテクチャ間の移植を行わずに、そのまま組み込まれたことを示唆している。
永続化メカニズム
KATARUはまず、/proc/self/exeに対してreadlinkを実行して自身のパスを特定し、その後、いくつかの候補となる場所に自身をコピーします。一部の書き込み操作は実行時の権限に依存します。CAP_LINUX_IMMUTABLEが利用可能な場合、このマルウェアは一時的にターゲットを書き込み可能にし、自身の内容で上書きした後、その結果として生成されたコピーを不変かつ追記専用としてマークします。
.png)
その後、サンプルは、一般的なLinuxおよび組み込みシステムの起動パス全体を対象に、広範囲にわたる永続化のスキャンを試みます。対象となるメカニズムには、以下のものが含まれます。 systemd サービス、タイマー、パスユニット、およびジェネレータ; cron そして @reboot; rc.local, SysV init、および inittab; シェルおよびプロファイルの起動ファイル; NVRAM および U-Boot のフック; udev、APT、OPKG、NetworkManager、DHCPフック;OpenWrt procd また、ホットプラグスクリプト、runit、s6、dinit、OpenRC などの代替 init システム、XDG デスクトップの自動起動、および実行ファイルが終了した場合にそれを再起動するウォッチドッグループも含まれます。
.png)
このサンプルには、Android 独自の永続化機能も含まれています。Android およびルートフレームワークで使用されるいくつかのブートスクリプトの保存場所を確認し、Android の登録を試みます。 init によってトリガーされるサービス sys.boot_completed または dev.bootcomplete.
総じて言えば、これは選択的な永続化戦略というよりは、「利用可能なものはすべて試す」という、雑多な枠組みである。その広範さにより、異種混在のLinux、組み込み、ルーター、デスクトップ、Android環境にわたる再起動を乗り切る可能性は高まるが、一方で、この機能が広範に寄せ集められたものであり、すべてのターゲットで検証されていないという印象を強めてしまう。
C2コミュニケーションズ
KATARUは、Miraiのような平文通信ではなく、暗号化された独自のC2チャネルを使用しています。各ボットは一時的なX25519鍵ペアを生成し、サーバーと公開鍵を交換した後、ディフィー・ヘルマン方式を用いて共有秘密鍵を導出します。その後、サーバーは、バイナリに埋め込まれた固定公開鍵に対応する秘密鍵を保有していることを証明します。 ハンドシェイク後、トラフィックは長さがプレフィックスで指定されたフレームとして送信され、メッセージカウンターを用いたChaCha20-Poly1305によって暗号化および認証される。
この設計は、フォワードシークレシーを確保し、改ざんを検知するとともに、第三者がC2サーバーになりすますにはオペレーターの秘密鍵が必要となるため、シンクホール攻撃を困難にすることを目的としています。 特異で、ありそうもない詳細として、ピン留めされた鍵がRFC 7748のX25519テストベクトルに含まれるアリスの公開鍵と一致している点が挙げられます。これは、実装が参考資料からコピーされたか、LLMの支援を受けて作成され、検証なしに組み込まれた可能性があることを示唆しています。
.png)
.png)
C2からは、以下のコマンドがサポートされています:
- 攻撃:Mirai系ボットネットでよく見られる、TCP、UDP、ICMP、HTTP、QUIC、DNSフラッドなど、複数のDDoS攻撃モードに対応しています。また、Minecraft、FiveM、OpenVPN、WireGuardなど、特定のサービスに特化した攻撃タイプも含まれています。さらに、このマルウェアは、組み込まれた認証情報リストを使用してSSHのブルートフォース攻撃を実行します。
- 速度テスト:指定された期間、ターゲットIPアドレスにUDPデータグラムを送信し、送信されたバイト数に基づいてスループットを算出し、その結果をC2サーバーに報告します。
.png)
- バイナリのダウンロードと実行:wget を使用して C2 で指定された URL からバイナリをダウンロードし、それを実行することで、第 2 段階のローダーとして機能します。このコマンドは、ハードコードされたアーキテクチャ一覧を使用して、複数のアーキテクチャ向けの ELF バイナリのダウンロードを試みます。
.png)
- シェルコマンドの実行:execl を通じて C2 サーバーから受信したコマンドを実行します。コマンドの出力は C2 サーバーには返されません。
- 攻撃を停止:現在攻撃タスクを実行中のプロセスを終了させます。
- アンインストール:実行中の攻撃を停止し、永続化に関連するアーティファクトやマルウェアのコピーを削除し、関連するNVRAM変数をクリアし、変更内容を永続ストレージに保存します。

分析回避技術
このサンプルは、最近他のIoT マルウェアで確認されたものと同様の、いくつかの分析対策技術を採用しています。これらのチェックにより、一部の自動サンドボックスが機能しなくなる可能性がありますが、バイナリ全体に散在しているわけではなく、すべて特定の箇所から呼び出されているため、回避するのは容易です。

- ptrace: サンプルは以下のように呼び出します
ptrace~とPTRACE_TRACEMEトレースを検出するためです。また、以下の点も確認します。/proc/self/status~のためにTracerPid値が 0 でない場合、別のプロセスがトレースを行っていることを示すため、プログラムは終了します。 - LD_PRELOAD: さらに、アナリストによって制御・監視されている実行環境を示唆する可能性のある以下の環境変数のいずれかが検出された場合、プログラムは早期に終了します:
LD_PRELOAD/LD_AUDIT/LD_PROFILE/LD_DEBUG. - Valgrind と radare2: 別の関数では、次のような環境変数を調べることで、radare2 や Valgrind に関連する指標の有無を確認します。
R2_DEBUG、R2PIPE_IN、R2PIPE_OUT、VALGRIND_STARTUP_PWD、そしてVALGRINDでの実行. 一方でVALGRINDでの実行Valgrindのマクロとして存在しますが、この名前の対応する環境変数は確認できていないため、これは誤ったチェックであると思われます。 - プロセス名:次のチェックでは、デバッガーや一般的なリバースエンジニアリングツールに関連付けられたプロセス名が検出されるかどうかを確認します。該当するものが検出された場合、サンプルは終了します。

- タイミングチェック:このサンプルは、短いループの実行にかかる時間の差を計算し、その差が予想値(約100ミリ秒)を上回る場合は処理を終了します。これは、シングルステップ実行や、過度な計測処理が行われていることを示しています。
- コードの完全性: 最終チェックでは、プロセスイメージの
.textセクションを解析し、その結果をELFに格納されている32バイトのダイジェストと比較する.bothashセクション。このビルドでは、以下の理由により、このチェックは実質的に無効になっています。.bothashダイジェストが0バイトに設定されると、比較処理がスキップされます。これは、ブレークポイントやコードの改ざんを検出することを目的としています。
おとり層
KATARUのやや特異な機能の一つに、定期的にC2に似た偽のトラフィックを送信する独立したスレッドがあります。これは、サンドボックス分析や自動化されたIOC抽出を混乱させることを意図している可能性がありますが、複数のプロトコルハンドラを動作確認するために使用される開発やテストの副産物である可能性もあります。
おとりトラフィックには、次のようなHTTP形式のリクエストが含まれます。 POST /api/v1/beacon そして GET /api/v1/query、以下の偽のヘッダーを含む X-Bot-Id そして X-キャンペーン:op-cascade-2024、およびハードコードされた偽のJWTを含むJSONボディ。これらのリクエストは偽のホスト名をローテーションして送信され、そのうちのいくつかは、更新サービス、テレメトリ中継、管理パネル、あるいはC2インフラストラクチャに見せかけるように仕組まれています。

また、KATARUは偽のIRCボットのチャットを生成し、おとりIPのポート443へのTCP接続を試み、DNSに関連するポートへ不要なUDPバーストを送信します。おとりIPのリストには、RFC文書に記載された範囲と、GitHubやCloudflareなどの実際のサードパーティ製インフラが意図的に混在しており、自動レポートによって、無害なインフラが侵害の兆候として誤って特定されるリスクが高まっています。

また、このバイナリは未使用の文字列を .rodata、これにはMirai/Katanaスタイルのバナー、CNCラベル、スキャナー制御、攻撃名、および従来のMiraiローダーコマンドなどが含まれます。これらの文字列はコードから参照されていないため、生の 文字列 出力により、サンプルが自律的なTelnetスキャンを行う標準的なMiraiまたはKatanaの亜種として誤分類される可能性があります。このビルドでは拡散機能は実装されておらず、SSH認証情報を用いた攻撃は自己拡散型ではなく、C2経由で実行されます。
開発成果物と再利用のシグナル
いくつかの実装上の特徴から、KATARUは成熟したマルウェアファミリーとして開発・検証されたものではなく、AIの支援を受けて組み立てられたものであることが強く示唆されています。このマルウェアには、Linux、組み込みLinux、ルーター、デスクトップ、Android環境にまたがる異常に多くの永続化メカニズムが含まれており、サポート対象となるすべてのターゲットに対して手動で開発し、確実にテストを行うことは困難でしょう。また、そのLPEチェーンには明らかな移植性の問題が見られ、分析したARMサンプルにx86シェルコードが埋め込まれていることなどから、公開されているソースからの無批判なコピー&ペーストが行われたことが示唆されています。 その他の指標も、生成された、あるいは継ぎ接ぎされた実装パターンを示唆している。これには、RFCドキュメントのIP範囲を使用したおとりインフラストラクチャの値や、既知のテストベクトルと一致する固定されたX25519公開鍵などが含まれる。これらの痕跡を総合すると、あるオペレーターが公開されている例やエクスプロイトのPoC、LLM(大規模言語モデル)による生成支援を活用し、結果を十分に検証・確認することなく、機能を迅速に組み合わせたことが示唆される。
是正措置および提言


- 管理用アクセスの露出を削減する:可能な限りTelnetを無効にし、デフォルトの認証情報や脆弱な認証情報を変更し、デバイスの管理を信頼できるネットワークまたはVPN経由でアクセス可能な管理プレーンに限定する。
- IoT およびOT のアセット周辺におけるネットワークの異常を検出します。ネットワークの可視化と異常検知を活用し、各デバイスの通常のベースラインから逸脱した動作を特定します。これには、異常なアウトバウンド接続、予期しないプロトコルの使用、ビーコンのようなトラフィック、スキャン行為、トラフィック量の急激な増加、DDoSのようなパターンなどが含まれます。これは、ホストレベルのテレメトリが限られている、あるいは利用できない組み込みデバイスにおいて特に重要です。Nozomi のNetworks Platformがこれらの機能を実際にどのように活用しているかをご覧になりたい場合は、今すぐデモをご依頼ください。
- 外部に露出しているIoT およびOT デバイスに対してセグメンテーションを適用します。組み込みデバイスを専用のネットワークゾーンに配置し、東西方向の通信を制限するとともに、セグメント間の通信は必要な管理および運用トラフィックに限定します。セグメンテーションにより、横方向の移動が制限され、侵害されたデバイスによる影響範囲が縮小されるほか、ゾーン間の異常な通信を検知・調査しやすくなります。
- ファームウェアと脆弱性のあるカーネルの修正:ベンダーのサポートが許す範囲で、デバイスのファームウェアとLinuxカーネルを最新の状態に保ってください。組み込みシステムにおける権限昇格の試みは、古いカーネルやメンテナンスされていない組み込みディストリビューションが、依然として高リスクな標的である理由を浮き彫りにしています。
- 永続化アーティファクトを監視する:systemdユニット、cronエントリ、rcスクリプト、OpenWrtのホットプラグパス、Androidのブートスクリプト、パッケージマネージャーのフック、および「不変」または「追記専用」とマークされたファイルなど、起動時の設定場所に予期せぬ変更がないか注意深く確認してください。
- 異常な送信トラフィックを調査する:見慣れないTCP接続、暗号化されたカスタムプロトコル、既知のインフラへのトラフィック、および組み込み資産からのフラッド状の送信トラフィックの急激な増加に関連するアラートを優先的に調査する。
結論
KATARUは、汎用的なIoT マルウェアが、必ずしも成熟したり精巧に設計されたりすることなく、新しい機能を吸収し得ることを示しています。このサンプルは、おなじみのMiraiスタイルのボットネット挙動を維持しつつ、複数のLinux特権昇格の試み、Linuxおよび組み込み環境全体にわたる広範な永続化、暗号化されたカスタムC2、解析回避チェック、そして自動解析を誤導しうるおとり層によって、その機能を拡張しています。 同時に、アーキテクチャに不適合なエクスプロイトコード、RFCに由来するテスト値、未使用の「Mirai」をテーマとした文字列、そして異常に広範なクロスプラットフォームロジックは、AI支援による急速な統合と、検証が不十分であったことを強く示唆しています。防御側にとって重要な教訓は、お馴染みのIoT マルウェアの基盤が、公開されているエクスプロイトコードや新しい運用機能を迅速に組み込むことができるという点です。同様の脅威を特定し封じ込めるためには、露出している管理サービスの削減、永続化アーティファクトの監視、および組み込み資産からの異常なアウトバウンド動作の調査が依然として不可欠です。
MITRE ATT&CK マッピング
- 初期アクセス
- T1110.001– ブルートフォース(パスワード推測):Telnet の認証情報のブルートフォース攻撃による初期アクセスが確認されており、このサンプルにはリモートサービスに対するブルートフォース機能も含まれています。
- 実行
- T1059.004– Unixシェル:シェルによる準備(wget)およびダウンロードしたバイナリの実行。
- T1106– ネイティブ API:生のシステムコールラッパー、生のソケット、およびファイル属性変更用の ioctl。
- 永続性
- T1543.002– systemd サービス:network-dispatch サービス、タイマー、パスユニット、およびジェネレータをインストールします。
- T1037.004– RCスクリプト:init.d、rc.local、inittab、procd、OpenRC、s6、その他を順に試行します。
- T1053.003– Cron:/etc/cron.d および crontab のエントリを追加します。
- 権限昇格
- T1068– 権限昇格のための悪用:多段階のLPEチェーン。
- 防御回避
- T1027 – 難読化されたファイルまたは情報:XOR-0x22による設定レイヤーに加え、ChaCha20による文字列ボールト(ノンス「KATARU」)。
- T1562.001 – 防御機能の無効化:ハードウェアウォッチドッグ、sysrq、および再起動を無効にします。
- ディスカバリー
- T1082 – システム情報の取得:uname、/proc/cpuinfo、ディスク、およびページ数とページサイズに関する情報を読み取ります。
- T1016 – システムネットワーク構成の検出:/proc/net/*、resolv.conf、およびローカル IP を読み取ります。
- 指揮統制
- T1573.002– 暗号化チャネル:ChaCha20-Poly1305 AEADフレームを用いたX25519鍵交換。
- T1095– アプリケーション層以外プロトコル:TCP(ポート 6767)上で動作する、長さプレフィックス付きのカスタムバイナリプロトコル。
- T1105– Ingress ツールの移行:bins.sh を通じてアーキテクチャごとのペイロードを取得します。
- インパクト
- T1498.001– 直接ネットワークフラッド:UDP、TCP SYN/ACK、GRE、およびICMPフラッド。
- T1499.002– サービス枯渇型フラッド:HTTP、HTTP/2、QUIC、およびゲームサーバーへのフラッド攻撃。
IoC
- cc76bc218627279ecb4d0ce74ad2651e9db9e3e843e35d6569576e056e3a9218 (ローダー)
- 13382c16e2401b07451577b46e634b8031ec254d98b876e59692b5fa22abc1d4 (arm32)
- 6fbae3505ae0d638b820165c572d548ce92dda71e82dc47e8efe13f30617f35f (arm32)
- 9d87e6615c810907443ebd5e915f3b35099c3b5c6b6c684637138a7f8ec9cebc (arm32)
- 9d7cd4948a1fcbaeadc425752fce9a933bd6fc41eeede030dffd7b99b3bc51d5 (amd64)
- 160[.]191.242.92(Telnetの認証情報のブルートフォース攻撃およびC2)
YARA
ルールIOT_DDOS_KATARU_sample
{
メタ
name = "KATARU - DDOS"
description = "KATARUのモダン・ミライ・バリアント"
author = "Nozomi Networks Labs"
hash1 = "9d87e6615c810907443ebd5e915f3b35099c3b5c6b6c684637138a7f8ec9cebc"
hash2 = "6fbae3505ae0d638b820165c572d548ce92dda71e82dc47e8efe13f30617f35f"
hash3 = "13382c16e2401b07451577b46e634b8031ec254d98b876e59692b5fa22abc1d4"
文字列:
$kataru = "KATARU\x00"
$bothash = ".bothash"
$network_dispatch = "network-dispatch"
$kwork_0 = "[jbd2/dm0-8]"
$kwork_1 = "[kworker/u:2]"
$kwork_2 = "[kworker/u:1]"
$kwork_3 = "[kworker/2:1]"
$kwork_4 = "[kworker/1:1]"
$kwork_5 = "[kworker/0:1]"
$kwork_6 = "[kblockd/1]"
$kwork_7 = "[kworker/u:0]"
$kwork_8 = "[kworker/3:0]"
$kwork_9 = "[kworker/2:0]"
$kwork_10 = "[kworker/1:0]"
$kwork_11 = "[kworker/0:0]"
$kwork_12 = "[kthrotld/0]"
$kwork_13 = "[kblockd/0]"
$str_0 = "TracerPid:"
$str_1 = "/proc/self/status"
$str_2 = "/tmp/.cg_escape.sh"
$str_3 = "/sys/fs/cgroup/memory/release_agent"
$str_4 = "[getent passwd root] %s"
$str_5 = "id; whoami; cat /etc/shadow | head -2; exit"
$cnc_0 = "POST /api/v1/beacon"
$cnc_1 = "X-Bot-Id"
$cnc_2 = "X-Campaign"
$cnc_3 = "X-Arch"
$cnc_4 = "NICK bot-%s"
$cnc_5 = "USER %s 8 * :%s"
$cnc_6 = "JOIN #%s"
$cnc_7 = "PRIVMSG #%s :HTTPFLOOD 準備完了"
$cnc_8 = "eyJhbGciOiJIUzI1NiJ9.decoy.token"
$cnc_9 = "{\"id\":\"%s\",\"cmp\":\"%s\",\"stage\":\"beacon\",\"uptime\":%u,\"token\":"
コンディション
uint32(0) == 0x464c457f かつ
filesize < 1MB and
(
(
($bothash, $network_dispatch, $kataru) のいずれか、および
(
$str_* のうち 2 つと
($cnc_*) のうち 2 つ
)
) または
(
#network_dispatch > 20 かつ
(
($kwork_*) のうち 6 つ、または
($str_*) のうち 2 つ または
($cnc_*) のうち 2 つ
)
)
)
}
参考文献
- https://github.com/v12-security/pocs/tree/main/fragnesia
- https://github.com/v4bel/dirtyfrag
- https://xint.io/blog/copy-fail-linux-distributions
- https://www.rfc-editor.org/info/rfc7748/
- https://www.rfc-editor.org/info/rfc5737/



