「Tengu」は、「Mirai」を起源とするIoT ファミリーであり、今日のボットネットが単なる分散型サービス拒否(DDoS)攻撃ツールという枠を超えて進化している実態を示しています。当社がTenguを詳細分析の対象として選んだ理由は、追跡している数多くのMirai派生サンプルの中でも特に際立っていたこと、そして、これまで未知のマルウェアファミリーを特定するための当社の機械学習システムによって検出されたためです。 このマルウェアは、独自に暗号化されたコマンド&コントロール(C&C)プロトコル、プロキシ機能、ペイロードの更新、システムおよびネットワークの検出機能、そして複数のプロトコルやサービスを標的とする幅広いサービス拒否(DoS)機能を組み合わせています。また、感染したLinuxベースのデバイス上でマルウェアを継続的に実行させ、復旧を困難にするよう設計された、複数の永続化および自己防衛メカニズムも備えています。
防御側にとって重要なポイントは、外部にさらされており、適切なメンテナンスIoT 依然として攻撃者にとって魅力的な足掛かりとなっているという点です。一度侵害されると、これらのデバイスは、大規模なDDoS攻撃への参加だけでなく、トラフィックのプロキシ化、ホストやネットワーク情報の収集、追加のペイロードのダウンロード、さらには削除を回避するためにも悪用される可能性があります。そのため、リスクを低減するためには、タイムリーなパッチ適用、デフォルトの認証情報の削除、ネットワークのセグメンテーション、およびデバイスの異常な動作の継続的な監視が不可欠となります。
Tenguに関する技術的な詳細解説
我々が分析したTenguのサンプルは、平文の登録パケット、攻撃ベクトルの登録、暗号化された文字列の初期化、およびDoS攻撃コードの一部など、Miraiといくつかの共通点を有しています。しかし、Tenguにはさらに、C2コマンド向けのAEAD暗号化、複数の解析回避策、プロキシ機能、更新機能、および追加の攻撃手法(その一部はゲームプロトコルを標的としている)など、より高度な機能も追加されています。

当社のハニーポットで確認されたドロッパーは、Telnetによるブルートフォース攻撃を通じて侵入してきました。これは、C2サーバーとして使用されていたのと同じホストからHTTP経由でアーキテクチャ固有のサンプルをダウンロードして実行する、単純なシェルスクリプトでした。
C2通信

マルウェアが実行されると、実行時に0x22とのXOR演算を用いてC2アドレスの難読化を解除します。このサンプルでは、設定されたC2アドレスは64[.]89.163.8であり、ハードコードされたポート番号は9931です。 また、このサンプルには、現在の時刻とランダムに選択されたTLDに基づいてDGA方式のドメインを生成するロジックも含まれていますが、実際にこの機能が使用されている様子は確認されませんでした。

このプロトコルでは、初期登録メッセージ、ハートビートメッセージ、およびコマンドの出力が平文で送信されます。 ただし、サーバーからボットへのコマンドおよび更新メッセージは、ChaCha20/Poly1305に類似した暗号化方式を用いて認証および暗号化されます。暗号化キーはサンプルに埋め込まれており、2つの32バイトの値にXOR演算を適用することで復元できます。097522a52986982b9eefc29f95efdd9d3b6032e7というサンプルでは、 復元された鍵は c2a1b84d9f73512e8a6c15f0b4d9e73b114a66895dc328927e34a5b148ce6103 である。

サーバーから感染したシステムに対して、以下のコマンドを送信することができます:
- プロキシの開始: 指定されたオプションに基づいてプロキシを起動します。PID は
/tmp/.proxy.pid.デフォルトのプロトコルはSOCKS5です。ポート番号や認証情報はパラメータとして指定できます。 - プロキシの停止: 保存されているPIDに基づいてプロキシを終了し 、その後PIDファイルを削除します。
- ネットワーク情報: ネットワークインターフェース、ローカルのIPアドレスおよびMACアドレス、デフォルトゲートウェイ、設定済みのDNSサーバーなど、ネットワーク構成に関する情報を取得します 。
- 攻撃の停止: DoS攻撃を行っているすべての実行中のプロセスを終了させます 。
- システム情報: システム情報をサーバーに送信します 。これには、カーネルバージョン、CPU、RAM、空きメモリ、稼働時間、プロセス、平均負荷などが含まれます。
- コマンドの実行: サーバーから送信されたコマンドを実行し 、その出力をサーバーに送信します。
- cronの永続化:永続化のためにcron関連ファイルの変更を試みていますが、実装は未完成か、あるいは不具合があるようです。追加されたエントリは /proc/self/exe を参照していますが、これはcronコマンドを実行しているプロセスによって解決されるものであり、インストールされたマルウェアのバイナリを確実に指し示すものではありません。
- systemd の永続化:永続化を実現するために、偽の systemd サービスを追加します。

- initd の永続化: 永続性を確保するために init.d サービスを追加します 。
- DoS攻撃の開始:Mirai型およびアプリケーション層の手法を幅広く用いて、DDoSワーカーを起動します。登録されている攻撃手法は計25種類です。対応するトラフィックには、送信元アドレスを偽装したUDPフラッド、 TCP SYN、ACK、PSH、およびペイロードフラッド;ICMPエコーフラッド;混合TCPワーカーモード;さらに、HTTP、DNS、NTP、SNMP、SIP、SSH、SMTP、FTP、Source Engine/Quakeスタイルのサービス、Minecraft、およびカスタムUDPペイロードに対するプロトコル固有のプローブ。これにより、このボットネットは、汎用的なボリューム型攻撃と、ゲームサーバーインフラを含む特定のサービスに対する標的型妨害攻撃の両方に対応可能です。

- IPFSペイロードのダウンロード:64[.]89.163.8:8080 のハードコードされた IPFS ゲートウェイから C2 から提供された CID を取得し、応答を一時的な隠しファイルに保存します。その結果が ELF ファイルか APK ファイルかを検証し、ELF ファイルの場合は直接実行し、APK ファイルの場合はインストールと起動を試みた後、一時ファイルを削除します。 APKのサポートは、セキュリティ対策が不十分なAndroid TVボックスや、同様のAndroidベースのデバイスを標的としている可能性が高い。
もう1つの機能として、更新メカニズムがあります。これは、コマンドと同じメッセージ形式を使用しません。ボットが、コマンドに使用されるのと同じ鍵で暗号化されたメッセージを受信すると、0xDEAFBEEFで始まるペイロードによって更新ルーチンが起動します。ボットは、残りのペイロードバイトを/tmp/.upに書き込んだ後、ダウンロードされたペイロードに対してexecveを呼び出します。

AEAD暗号化ルーチンを分析し、標準のChaCha20およびPoly1305の動作との相違点を特定した上でC2キーを抽出することで、ボットをローカルでホストされた偽のC2サーバーにリダイレクトし、制御された環境下でマルウェアとやり取りできるようにしました。

自己防衛
Miraiの亜種の大半は、こうした自己防衛機能を実装していないか、あるいはごくわずかしか実装していないため、tenguのこの部分がすぐに私たちの注目を集めた。
このマルウェアは、メインプロセスを60秒ごとにguardian 独立したguardian 生成しguardian 監視対象のインスタンスが終了するたびにインストール済みのバイナリを再起動guardian 、プロセスレベルの自己修復型持続性を実現しています。さらに、感染したシステム上での足場を維持するために、いくつかの手法を採用しています。
監視機関

ウォッチドッグルーチンはまず、SysRq を無効にし、アクティブなハードウェアウォッチドッグをすべて無効にして、デバイスを正常に終了させます。その後、[kworker/0:0], システム上にウォッチドッグデバイスが存在する場合、それを再起動し、タイムアウト時間を約30秒に設定して有効化します。 ワーカーは、メインのマルウェアプロセスが存続している間のみキープアライブ信号を送信します。マルウェアが強制終了されると、ワーカーはinitプロセスに親プロセスを変更し、ウォッチドッグへのサービス提供を停止して、システムの再起動を許容します。これにより、ウォッチドッグは「修復対策回避メカニズム」として機能し、強制再起動を利用して、マルウェアの永続化メカニズムがマルウェアを再起動する機会を与えます。
バイナリ・ブリッキング

このマルウェアには、再起動やシャットダウンに関連するバイナリのパス一覧も含まれています。各ファイルのヘッダーを「ELFOOD」で上書きすることで、これらのELFバイナリを破損させ、通常の再起動やシャットダウンの試行を妨害することが可能です。これにより、感染したデバイスを再起動したり安全に電源を切ったりするために、これらのユーティリティに依存しているシステムでは、復旧作業が困難になる可能性があります。
競合他社を排除する

セキュリティ対策が不十分なIoT アクセスを巡って、多くの独立したアクターが競合しているため、Tenguは制御権を獲得・維持するために競合するマルウェアを排除しようとします。この機能は、競合マルウェアを排除し続けるループを実現しています。マルウェアの実行ファイルのパスと起動時刻を記録し、その後、/procを繰り返しスキャンして実行中のプロセスを検出します。 プロセスが同じマルウェアインスタンスセットに属する場合、または一般的なLinuxプロセスを含む内部の許可リストに一致する場合は、そのプロセスは無視されます。それ以外のすべてのプロセスは、実行ファイルのパス、プロセス名、およびコマンドラインに基づいて、既知の競合マルウェアのパターンと照合されます。一致したプロセスは、SIGKILLシグナルによって終了させられ、これにはプロセスツリーの探索を通じて発見された関連プロセスも含まれます。
定期的なスキャンだけの場合よりも迅速に対応するため、このマルウェアはLinuxのプロセスコネクタや/procに対するinotify監視を通じて、プロセスの生成も監視しています。このループは約500ミリ秒ごとに実行され、停止時には監視用ディスクリプタを閉じます。

分析の妨害と回避
文字列の暗号化

Miraiと同様に、このマルウェアも一部の文字列を暗号化された形式で保存し、実行時に復号します。ここでは、文字列はカスタム製のXORベースのストリーム暗号で保護されており、この暗号は、別々の64ビットおよび32ビットの線形合同生成器からキーストリームを生成し、それにエントリごとに増加する値を組み合わせたものです。 復号された文字列は、ホストおよびネットワークの検出、ウォッチドッグの処理、解析防止チェック、競合プロセスの終了、ダウンロードツール、永続化に関連するパスや偽装名など、本分析で説明されているいくつかの動作をサポートしている。
ファイルレス実行

従来のディスク実行中、サンプルは解決されます /proc/self/exe それが匿名メモリマッピングから実行されているのか、それともディスクから実行されているのかを判別します。その結果に基づき、memfd_create を使用して、 systemd-journal。 もし memfd_create 利用できない場合、次のようなものが作成されます /dev/shm/.journal そして、ファイルディスクリプタを開いたままにしながら、ファイルのリンクを解除します。その後、その実行イメージを /proc/self/exe 新しく作成されたファイルに対して、execve を使用してそれを再実行し、argv[0] を /usr/lib/systemd/systemd-journald. これにより表示されるコマンドラインが変更されるため、argv[0]を主に参照するツール(一部のpsの出力や基本的なプロセス監視スクリプトなど)では、このマルウェアが正当なsystemdのjournalデーモンとして認識される可能性があります。
デーモンのセキュリティ強化
このプロセスにより、以下がインストールされます SIG_IGN 一般的な終了信号、切断信号、パイプ信号、および端末制御信号に対するハンドラを実装しており、これにより通常のシェルベースの中断や一時停止の影響を受けにくくなっています。その後、このマルウェアは prctl(PR_SET_DUMPABLE, 0) コアダンプを無効にし、一部のプロセス監視および書き込みを制限するには、-1000 を指定します。 /proc/self/oom_score_adj そのため、カーネルはOOMキラーによる終了対象としてこれを選定することを極力避けています。
デバッガーのチェック

このマルウェアは、 TracerPid 値は /proc/self/status 別のプロセスがそれをトレースしているかどうかを判断するためです。値がゼロ以外の場合、デバッガーやトレーサーがアタッチされていることを示し、プロセスは終了します。また、/proc/self/environ LD_PRELOAD および LD_LIBRARY_PATH については、フックや解析環境を示している可能性があります。2つの連続した rdtsc この命令は実行遅延を測定します。遅延の差が50万サイクルを超えた場合、その遅延はシングルステップ実行やエミュレーションを示している可能性があるため、プロセスは終了します。また、このマルウェアは /proc/self/maps その最初のものを特定するために r-xp マッピングを行い、そのコード領域の一部に対してSHA-256のベースラインハッシュを算出し、変更を検出するために定期的にハッシュを再計算します。最後の定期チェックでは、 /proc/self/maps。
緩和策と提言
- インターネットへの露出を削減する:Telnet やその他の管理サービスを公開しているIoT 組み込み Linux システム、特にインターネットに直接接続されているものについては、優先的に対応する。
- 認証情報とアクセス権限の強化:デフォルトの認証情報を削除し、一意のパスワードの使用を義務付け、可能な限り不要なリモートアクセスを無効にしてください。
- パッチ適用とセグメント化:デバイスのファームウェアを常に最新の状態に保ち、IoT 企業の重要資産から分離することで、横方向の拡散と業務への影響を最小限に抑えます。
- 不審な動作を監視する:予期しない外部への接続、プロキシのような動作、不審なプロセス名、および正当なシステムコンポーネントを装ったサービスなどに注意を払う。
- 応答処理中の永続性を検証する:システムへの不正アクセスが疑われる場合は、デバイスを運用に復帰させる前に、systemd サービス、init スクリプト、シェルの起動ファイル、および cron 関連のパスを確認してください。
組織が自社の環境内に脆弱性のあるデバイスが存在するかどうかを迅速に特定し、運用上の混乱やセキュリティ侵害、さらなる攻撃の拡大につながる前に、悪用試みを検知して警告を発するため、資産所有者はIoT 高度な機能を活用できます。このプラットフォームは、ネットワークトラフィックやデバイスの動作に関する詳細な可視性を提供し、IoT 効果的な脆弱性および脅威の検知を可能にします。


このプロアクティブな監視により、セキュリティチームは脆弱性や攻撃に迅速かつ効果的に対応できるようになり、重要なネットワークを標的とした攻撃による影響を最小限に抑えることができます。「Nozomi Networks IoT 」の詳細や実際の動作をご覧になりたい方は、今すぐデモをご依頼ください。
結論
「tengu」のようなマルウェアファミリーは、IoT 挙動に、より強力なC2保護、幅広い攻撃機能、解析回避ロジック、そして複数の永続化および自己防衛メカニズムを組み合わせることで、「Mirai」を起源とするマルウェアがいかに進化し続けているかを示しています。一部の機能は未完成であるか、実際に使用されている様子は確認されませんでしたが、このサンプルは、外部に露出している組み込みLinuxデバイスが、DDoSノード、プロキシ、そして堅牢な足掛かりとして、依然として攻撃者にとって価値のある標的であることを示しています。IoT エッジデバイIoT 運用する組織は、これらのシステムを攻撃対象領域の一部として扱い、従来のサーバーやエンドポイントに適用されているのと同じ厳格な基準で監視すべきである。
MITRE ATT&CK マッピング
- 実行
- T1059.004 – Unixシェル:シェルコマンドの実行および永続化スクリプトにpopenを使用する。
- T1106 – ネイティブ API:memfd_create、生ソケット、および ioctl を使用します。
- 永続性
- T1543.002 – systemd Service: Creates /etc/systemd/system/<name>.service.
- T1037.004 – RC スクリプト:init.d、procd、rc.local、および rc*.d を変更します。
- T1053.003 – Cron:cron に関連する永続化ロジックが含まれています。
- T1546.004 – シェル設定の改変:.bashrc、.profile、または /etc/profile に感染する。
- 権限昇格/防御回避
- T1222.002 – Linux ファイル権限の変更:chattr +i コマンドを実行して、インストールされたバイナリを不変にする。
- 防御回避
- T1036.004 / T1036.005 – 偽装:[kworker] や systemd-journald といった名前、および kworker-helper のようなデーモン風のインストール名を使用する。
- T1497 – 仮想化/サンドボックス回避:LD_PRELOAD、LD_LIBRARY_PATH、および rdtsc によるタイミングをチェックします。
- T1622 – デバッガ回避:TracerPid をチェックする。
- T1027 – 難読化されたファイルまたは情報:C2の設定およびパステーブルを、XORおよび実行時に導出された鍵を用いて難読化する。
- T1562.001 – 防御機能の妨害:通常のSysRq/ウォッチドッグ処理を妨害する。
- ディスカバリー
- T1082 / T1016 – システムおよびネットワーク構成の調査:ホストおよびネットワーク情報を収集し、外部へ持ち出す。
- T1057 – プロセス検出:/proc を列挙し、netlink プロセスコネクタを使用します。
- 指揮統制
- T1573 – 暗号化チャネル:AEAD ベースの独自 C2 プロトコルを使用する。
- T1568.002 – 動的解像度:ドメイン生成アルゴリズム:DGA形式の生成ロジックを備えているが、実際にはこの機能が使用されている様子は確認されなかった。
- T1090 – プロキシ:SOCKS5 プロキシ機能を実装します。
- インパクト
- T1498 / T1498.001 – ネットワーク型サービス拒否攻撃:幅広い種類のボリューム型およびプロトコル固有のDDoS攻撃手法に対応しています。
にゅうしゅつりょくせいぎょそうち
- 64[.]89.163.8 (C2)
- caef4358921486cea54333bdcde3b61c845deb9c(ドロッパー)
- 097522a52986982b9eefc29f95efdd9d3b6032e7 (i386)
- b6d406992411dad0ef80f2b7b61427448bd05540(amd64)
- 144521ad3baf1fc28ceb4ad26d6fe490ab1b31f4 (mips)
- 0243692ce6ca522bc1359a3d89d70a229cf76587 (arm)
- 01c3326ce5beb78a6c106960a3a0868682b97bfa (arm)
- 197652174622cda52435249bc96a2d82b3613194 (arm)
- da040700e8c0852eaa848fb01138e5b820c6c765 (arm)
- b249800066433c0a8bf23edae719133465247abc (ppc)
- 0750489645d263efde56189be97c045cfc8ca890 (m68k)
YARA:
ルールIOT
{
メタ
description = "Miraiを派生させたLinux系DDoSボットネット:DGA+AEAD C2、プロキシ、Android/IPFSドロッパー、ウォッチドッグ/再起動によるブリッキング"
sha256 = "897226af37990fa60f25fea00b0509faa0e78d8bee10875c23b9b6ab0b8faed9"
author = "Nozomi Networks Labs"
date = "2026-07-07"
文字列:
$masq1 = "[kworker/%d:%d]" ascii
$masq2 = "/usr/lib/systemd/systemd-journald" ascii
$masq3 = "/dev/shm/.journal" ascii
$brick = "ELFOOD" ascii
$svc1 = "chud-daemon" ascii
$svc2 = "chud-watchdog" ascii
$svc3 = "chud-scheduler" ascii
$tengu = "/etc/init.d/tengu" ascii
$upd = "/tmp/.up" ascii
$prox = "/tmp/.proxy.pid" ascii
$ipfs = "GET /ipfs/%s HTTP/1.0" ascii
$apk1 = "aapt dump badging '%s' 2>/dev/null" ascii
$apk2 = "am start -n '%s/.MainActivity' 2>/dev/null" ascii
$cron = "* * * * * root [ -x /proc/self/exe ] && /proc/self/exe" ascii
$wd = "/dev/watchdog0" ascii
$tsrc = "TSource Engine Query" ascii
コンディション
uint32(0) == 0x464c457f、そしてそれが4つ
}





.webp)
