顧客のテレメトリデータを定期的に監視していたところ、インターネットに公開されているデバイスに影響を与えるCVE-2021-35394を悪用しようとする複数の試みが確認されました。その活動の大部分は、機会を捉えたスキャンに類似していましたが、その一部からは別の事実が判明しました。それは、一見正当に見えるSTUNトラフィックや公開STUNインフラを悪用して、感染したホストを登録し、オペレーターからのコマンドを受信し、ネットワーク監視の観点から悪意のある活動を目立たなくするように設計されたコマンド&コントロール(C&C)システムを持つボットネットの存在です。
Clingが注目される理由は、新たな拡散手法を導入しているからではなく、通常のSTUNの動作を実用的なコマンド&コントロールチャネルとして再利用している点にある。その結果、ボットネットのトラフィックは、正当なNAT越えのアクティビティのように見えつつも、拡散、プロキシ、トンネリング、およびサービス拒否(DoS)コマンドをサポートすることが可能となっている。
CVE-2021-35394の悪用による初期アクセス
当社は、世界中の顧客ネットワークに導入されたセンサーから送信される匿名化されたテレメトリデータを常時監視しています。この可視性により、悪用動向を追跡し、一見すると日常的な活動に見えても、実際にはより注目すべきマルウェアの挙動につながっているケースを特定することができます。今回、CVE-2021-35394の悪用試行が急増していることに気づきました。これは、通常UDPServerとしてコンパイルされるRealtek Jungle SDKの診断コンポーネントに影響を与えるリモートコード実行の脆弱性です。 この脆弱性は数年前から存在していますが、影響を受けるSDKコンポーネントが、ルーター、アクセスポイント、リピーター、その他の機器を含む多くのIoT およびネットワーク機器に組み込まれているため、実環境では広く悪用されています。これらの機器は、多くの場合、更新を受け取らず、長年にわたりパッチが適用されないまま脆弱な状態が続いています。
これらのアクセスの大半は、古くはあっても依然として悪用されているIoT の脆弱性をめぐってよく見られる、機会を捉えた探査活動と一致していました。しかし、その活動の一部は、エクスプロイトチェーンが、Miraiのようなボットネットによく見られる典型的な通信パターンに従わないマルウェアのサンプルを取得・実行していたため、特に目立っていました。

この脆弱性の悪用方法は単純明快です。攻撃者は、先頭に orf;、続いて、脆弱性のあるシステムによって実行されるシェルコマンドが続きます。以下に示すキャプチャされた攻撃の試みでは、脅威アクターはBusyBoxを使用しています wget HTTPサーバーからバイナリをダウンロードし、それを実行可能としてマークし、最初の引数として渡されたレプリケーション方法を使用して実行します(realtek.selfrep (この場合は)。

スキャンと悪用による拡散
本分析では、主にMIPSサンプル3b0ac6aaabb3bf8058ca14f9c8ccc613cfa3ea71に焦点を当て、同じアクティビティクラスター内の関連サンプルからの観測結果を補足として用いた。特に断りがない限り、以下で述べるパーシステンス、STUN C2、およびコマンドの挙動は、このサンプルに関するものである。
分析対象のサンプルからは、さらにいくつかのコマンドインジェクション脆弱性に対するエクスプロイトロジックが埋め込まれていることが判明しました。具体的には以下の通りです:
- Realtek SDK RCE (CVE-2014-8361)
- LB-LINK ルーターの RCE (CVE-2023-26801)
- TBK DVR RCE (CVE-2024-3721)
- Linksys RCE (CVE-2025-34037)
- Eir D1000 ルーターの RCE (CVE-2016-10372)
- FiberHome SR1041F ルーター / 中国移動 HG6543C4 RCE (CVE-2023-41011)
- MVPower CCTV DVR RCE (CVE-2016-20016)

initスクリプトによる永続化とwgetの代替
1つのコピーのみを実行するためのシングルインスタンスチェックでは、SO_REUSEADDR オプションを指定してソケットをポート 33957 にバインドし、失敗した場合は正常に終了します。 このサンプルは、自身を /root/.cling および /usr/local/bin/.cling にコピーします。両方の実行ファイルは /etc/inittab、/etc/init.d/rcS、/etc/rc.d/rc.boot に追加されるため、SysV および BusyBox の init システム上で永続化が実現されます。

もう1つの永続化メカニズムとして、 wget バイナリを、次の場所へ移動して wget.r, 新しい所在地を wget.p そして、元のwgetバイナリをマルウェア自体に置き換えます。BusyBoxの場合と同様に、シンボリックリンクも処理されます。今後、 wget 侵害されたシステム上では、cronジョブやメンテナンス作業、あるいは他の攻撃者によって呼び出される可能性があるものの、代わりにマルウェアが再実行されます。このサンプルは、呼び出し元が指定した名前を確認し、それが wget , そこで正当な wget 読み取り専用バイナリ wget.p そして、自身のargvを渡します。こうすることで、マルウェアはいつでも自身を再起動・再インストールすることが可能になります。 wget が呼び出されます。
STUNを装ったC2通信
RFC-8489で定義されているSTUNは、エンドポイントが自身のパブリックIPアドレスとNATマッピングされたポートを特定できるようにすることで、NATトラバーサルをサポートするために使用されるプロトコルです。これは、ICE、TURN、SIPなどのプロトコルやフレームワーク、およびリアルタイム通信アプリケーションの一部として一般的に使用されています。 その結果、STUNおよび関連するICE/TURNトラフィックは、特にMicrosoft Teams、Zoom、Cisco Webex、WebRTCベースのブラウザアプリケーションなどのアプリケーションから、企業ネットワーク内で頻繁に発生しています。
分析の過程で、このサンプルから、パブリックSTUNサーバーに関連付けられたIPアドレスのリストが埋め込まれていることが判明しました。感染したホストのパブリックIPを特定するためにこの手法を用いるマルウェアはこれまでも確認されてきましたが、Clingは登録およびコマンド送信のフローの一環として、STUNに類似した通信を行っています。

大まかに言えば、このボットは4段階の通信フローに従います。まず、ハードコードされたSTUNサーバーのリストに対してSTUNバインディングリクエストメッセージを送信し、それらのサーバーから返された外部から確認可能なポートを記録します。次に、マッピングされたポートと感染方法タグを含むカスタム登録データグラムをサーバーに送信し、その後、STUNトランザクションIDフィールドにオペレーターのコマンドがエンコードされたUDPパケットを待ち受けます。 このフローにより、オペレーターはボットにどこからアクセスすればよいかを把握できる一方で、周辺のトラフィックの大部分は通常のSTUNアクティビティのように見せかけることができます。
より詳しく説明すると:
1. サンプルは定期的にSTUNを送信する 製本依頼 13台のSTUNサーバーのリストに対して(約5秒ごとに):
- 74.125.250.129:19302
- 145.249.115.184:3478
- 216.93.246.18:3478
- 85.17.88.164:3478
- 77.72.169.213:3478
- 77.72.169.211:3478
- 5.39.72.109:3478
- 81.187.30.115:3478
- 212.227.67.34:3478
- 212.227.67.33:3478
- 207.38.82.134:3478
- 83.211.9.232:3478
- 212.53.40.43:3478
トランザクションIDは、ランダムな値ではなくすべてゼロに設定されており、これはRFCに準拠していません。本稿執筆時点では、これらのサーバーはすべてVirusTotalにおいて良好な評価を得ており、その大半はSTUNサーバーの公開リストに掲載されています。


2. 各サーバーは、 バインディング成功時の応答 エンドポイントのパブリックIPアドレスと、そのエンドポイントから見た送信元ポート番号を含むメッセージ。

3. このサンプルは、登録メッセージとして機能するカスタムUDPデータグラムを各STUNサーバーに送信します。この登録メッセージには、 argv[1] ボットプロセスの、または 不明 それが存在しない場合、およびSTUNバインディングによって返された各ポートについて。 argv[1] これは、ドロッパーが各ボットに、使用された感染手法に基づいてタグを付けるために使用されます(例: realtek.selfrep, selfrep.router). このカスタムUDPペイロードは、STUNに関連付けられたポートに送信されるものの、STUNプロトコルの定義の範囲外です。予想通り、仕様に準拠したサーバーはこれを無視し、私たちのテストでは、どのサーバーも応答しませんでした。

4. その後、サンプルは、以前にマッピングされたポートのいずれかに対してUDP経由でオペレーターから送信された、実行すべきコマンドを含むメッセージがないかポーリングを行います。
ネットワーク監視の観点から見ると、この活動はSTUNサーバーとの無害なやり取りとして映ります。リスト内のすべてのSTUNサーバーにカスタム登録メッセージが送信されていることを踏まえると、オペレーターは、スウォームに参加する新しいボットを追跡し、コマンドを送信すべき先を把握するために、少なくとも1つのサーバーを監視できる必要があることは明らかです。
リストにあるサーバーの中には、例えば stun.l.google.com …は、長年にわたり広く利用されている一方で、あまり知られていないものもあり、さらなる精査が必要である。リスト中のどのサーバーがボットネットのC2活動に関与しているかを確実に特定するため、初期段階のフィンガープリント分析として、13のSTUNサーバーそれぞれが制御されたバインディングリクエストにどのように応答するかを比較した。
STUNで バインディング成功時の応答, 準拠したSTUNサーバーは、元のトランザクションIDをエコーバックします。 製本依頼。しかし、13台のサーバーのうち1台は、リクエストのトランザクションIDを返答する代わりに、すべてゼロのトランザクションIDを返してきた。この異常な挙動から、このSTUNサーバーは、同じくすべてゼロのトランザクションIDを使用するボット独自のSTUNトラフィックに合わせて調整されていることが示唆された。

この発見に基づき、我々は追加の検証手順を実施した。具体的には、リストにある各STUNサーバーに登録メッセージを送信することで、ボットネットへの参加を試みる感染システムを装ったクライアントを作成した。ただし、各サーバーに対して同じマッピング済みポートのリストを報告するのではなく、互いに重複しないポートの集合を報告した。その仮説は、もし 145.249.115[.]184 、このサーバーが容疑者である場合、そのサーバーがボットネットの運営者に支配されているか、あるいは共謀している場合、C2から、その不審なサーバーに対してのみ公開していたポートのいずれかへ接続が送られてくることになります。
まさに次のようなことが起こりました。登録メッセージの送信を開始してから数時間後、私たちがアドバタイズしていたポートのうちの1つが 145.249.115[.]184 C2から複数のコマンドを受信した。


Cling向けのC2コマンドは、通常はランダムな値となるはずのSTUNトランザクションIDフィールドに隠されています。この場合、この12バイトには、ボットが実行すべきコマンドとそのパラメータがエンコードされています。以下のスクリーンショットは、標的に対してUDPフラッドを実行するコマンドがエンコードされたトランザクションIDを示しています。

我々は数日にわたり、C2から発信されるコマンドを監視し、脆弱性のあるシステムをスキャンして攻撃することで、インターネット上で自己増殖するよう指示する複数のタスクを受信した。さらに、以下のターゲットに対してフラッディング攻撃を実行するよう要求も受信した:
- 112.151.157[.]222:8080(韓国のISP)
- 192.170.240[.]137:53(シカゴ大学クラスター)
- 23.81.40[.]193:25565 (Minecraft)
- 147.185.221[.]129:25565 (Minecraft)
C2トラフィックで最も興味深い点は、コマンドの発信元と思われる場所です。オペレーターのコマンドを伝送するパケットは、 74.125.250[.]129, あるIPアドレスで stun.l.google.com と結論づけられる。つまり、運営者は単にSTUNに見せかけたパケットの中にコマンドを隠しているだけでなく、それらのコマンドを、インターネット上で最も認知度の高いSTUNサービスの一つからの正当な応答であるかのように見せかけているのである。 STUNサーバーに特定のトランザクションIDを中継させる正当な方法は、我々の知る限り存在しません。また、トラフィックがUDPかつ単方向であることを踏まえると、最も可能性の高い説明は、ボットネットの運営者が、送信元アドレス検証(RFC-2728)を適切に実行していないASNを使用しており、それによって送信元IPアドレスのなりすましが可能になっているということです。 STUNバインディング要求に対する正当な応答と、トランザクションIDにエンコードされたC2コマンドを含む応答との間で、IP TTL値に一貫した差異が見られることも、この説明を裏付けています。
これが重要なのは、多くの防御システム、ファイアウォール、およびネットワークトリアージのワークフローにおいて、信頼性の高いインフラからのトラフィックと、未知のVPSや使い捨てのC2ホストからのトラフィックとでは、扱いが大きく異なるためです。見慣れないアドレスから送信され、不審なバイトを含むUDPパケットは疑わしいと見なされますが、感染したホストがすでにSTUNアクティビティを開始した後にGoogle STUNから送信されたように見える同じパケットであれば、バックグラウンドのNATトラバーサルノイズとして見過ごされやすくなります。

対応コマンド
このサンプルは、STUNのトランザクションIDにエンコードされた複数のコマンドに対応しています バインディング成功時の応答、具体的には:
- 実行: 指定された場所からペイロードをダウンロードします
IPアドレス:ポート番号そして、それをsystem(3)に渡します。 - スキャンして悪用する: IPv4アドレス空間をスキャンし、複数のエクスプロイトを利用してボットネットの構築および拡大を試みます。提供された
IPアドレス:ポート番号これは、攻撃に成功したホストにマルウェアをダウンロードするために使用されます。 - スキャナーを停止:スキャン処理を停止します。
- TCPトンネルの開始:指定されたTCPポートでリスニングを開始し、外部からの接続を受け付けます。
- TCPトンネルの停止:TCPトンネルを終了します。
- プロキシ中継: 付属の
IPアドレス:ポート番号中継サーバーとして機能し、中継サーバーと侵害されたデバイス間のトラフィックを転送する。 - プロキシの停止:プロキシの子プロセスを終了させます。
- Flood:指定されたターゲットに対して、指定された時間、DoS攻撃を実行します。

是正措置および提言


- IoT およびネットワーク機器の脆弱性を確認する:インターネットに接続されているルーター、アクセスポイント、DVR、および組み込み機器のうち、脆弱性のあるRealtek Jungle SDKコンポーネントや、サンプルによって悪用される可能性のあるその他の既知のコマンドインジェクションの脆弱性を含む可能性があるものを特定する。
- パッチの適用と露出の低減を優先してください:CVE-2021-35394および「感染拡大」のセクションに記載されているその他の脆弱性の影響を受けるデバイスにパッチを適用してください。パッチの適用が不可能な場合は、インバウンドアクセスを制限し、不要なインターネットへの露出を排除し、デバイスをセグメント化されたネットワークゾーンに配置してください。
- 不審な接続パターンの検出:トランザクション ID がすべて 0 に設定されている、短い間隔で繰り返し送信される STUN バインディング要求、または STUN エンドポイントに送信される STUN 以外の UDP データグラムを探します。 さらに、確立されたベースラインから逸脱した予期せぬ接続がないか、アセットを監視してください。ホストのテレメトリが制限されている、あるいは利用できないことが多い組み込みデバイスにおいては、ネットワークレベルの監視が特に重要です。Nozomi のNetworks プラットフォームがこれらの機能を実際にどのように活用しているかを確認するには、今すぐデモをご依頼ください。
- 侵害されたデバイスの痕跡を確認する:.cling という名前のマルウェアのコピー、init スクリプトに追加された永続化エントリ、および wget バイナリが wget.r および wget.p ファイルに置き換えられていないかを確認する。
- IoCおよびATT&CKマッピングを実運用に活用する:以下のインジケーターと手法を用いて、検知ルールを構築し、テレメトリのカバー範囲を検証し、Clingに類似したアクティビティを対象としたターゲット型ハンティングを支援します。
結論
Clingは、一般的なIoT ボットネットが、おなじみのMirai型のパターンからさらに進化している様子を示しています。Clingも依然として、セキュリティ対策が施されていないデバイスやコマンド注入の脆弱性を通じて拡散しますが、STUNに基づくコマンド&コントロール(C&C)の設計により、感染したホストが正当なNAT越えトラフィックに似た通信を行うように仕向けている点が、他のボットネットとは一線を画しています。
このSTUNの悪用が有効なのは、周囲のトラフィックが、コラボレーションツール、ブラウザ、リアルタイム通信アプリケーションがすでに正当なSTUNアクティビティを生成している環境に溶け込むことができるためです。 同時に、Clingで見られた実装上の選択は、検知のための有用な手がかりとなります。具体的には、トランザクションIDがすべてゼロのBinding Requestの繰り返し、同じSTUNホストに送信されるカスタムUDP登録データグラム、非準拠のSTUNサーバー実装、そして.clingのコピーや置き換えられたwgetバイナリといったホスト上の痕跡などが挙げられます。
防御側にとって重要なポイントは、マルウェアが正当なインフラや広く使用されているプロトコルを意図的に模倣してトラフィックを偽装する場合、レピュテーション情報だけでは不十分であるということです。同様に重要なのは、パッチが適用されていないインターネットに接続されたデバイスを、孤立したエッジシステムとしてではなく、より広範なネットワークへの潜在的な侵入経路として扱うべきであるということです。監視においては、プロトコル認識型の検査、行動ベースラインの確立、露出の低減、およびエンドポイントの指標を組み合わせることで、一見すると通常のトラフィックパターンに見えても、その中に潜む不審な逸脱を見逃さないようにする必要があります。 以下のIoCおよびATT&CKマッピングは、この活動に対する即時のハンティングおよび検知エンジニアリングを支援するものです。
MITRE ATT&CK マッピング
初期アクセス
- T1190 – インターネットに公開されているアプリケーションの悪用:Clingは、Realtek Jungle SDKコンポーネントに影響を与えるCVE-2021-35394やその他のコマンドインジェクションの脆弱性を含む、インターネットに公開されているデバイスに対する悪用試行を通じて拡散される。
実行
- T1059 – コマンドおよびスクリプトインタープリタ:このエクスプロイトペイロードは、脆弱性のあるデバイス上でシェルコマンドを実行し、マルウェアをダウンロードしたり、ファイルのアクセス権を変更したり、バイナリを起動したりします。
永続性
- T1037 – 起動またはログオン初期化スクリプト:このサンプルは、SysV および BusyBox スタイルのシステムで再起動後も存続するために、/etc/inittab、/etc/init.d/rcS、および /etc/rc.d/rc.boot などの初期化関連ファイルに、コピーされたマルウェアバイナリへの参照を追加します。
- T1574 – 実行フローの乗っ取り:このマルウェアは、wget を、自身をラップしたようなコピーに置き換え、元のバイナリを wget.r として保持し、そのパスを wget.p に保存します。これにより、wget が呼び出された際にマルウェアが実行されるようになります。
指揮統制
- T1095 – 非アプリケーション層プロトコル:Clingは、STUNに類似した通信を通じて学習したNATマッピングされたポート宛てに送信されるUDPパケットを介して、オペレータからのコマンドを受信する。これらのコマンドは、バインディング成功応答に類似したパケットのSTUNトランザクションIDフィールドにエンコードされている。
- T1572 – プロトコル・トンネリング:このコマンドセットには、独立したTCPトンネリング機能が含まれており、感染したデバイスが指定されたTCPポートでリスニングを行い、外部からの接続を受け入れることを可能にする。
- T1090 – プロキシ:このサンプルは、指定されたリレーサーバーに接続し、侵害されたデバイスを介してデータをやり取りすることができます。
ディスカバリー
- T1046 – ネットワークサービス検出:「scan-and-exploit」コマンドは、感染したデバイスに対し、IPv4アドレス空間をスキャンして、感染拡大のためにさらなる脆弱なシステムを特定するよう指示する。
インパクト
- T1498 / T1498.001 – ネットワークサービス拒否攻撃 / 直接ネットワークフラッド:このマルウェアは、設定された期間にわたって指定された標的に対してサービス拒否攻撃を実行するフラッドコマンドをサポートしています。
IoC
- 3b0ac6aaabb3bf8058ca14f9c8ccc613cfa3ea71(mips)
- 08636d09d9ffd1713bd6bcb965ad40b6ce3de1aa (mips)
- hxxp://118.45.196[.]225:800/mipsel (loader host)
- hxxp://120.193.219[.]210:800/mipsel (loader host)
- hxxp://58.211.144[.]243:800/mipsel (loader host)
- 145.249.115[.]184 (STUNサーバー)
- /usr/local/bin/.cling
- /root/.cling
- /usr/bin/wget.r
- /usr/bin/wget.p
- /bin/wget.r
- /bin/wget.p
- /usr/local/bin/wget.r
- /usr/local/bin/wget.p
- /sbin/wget.r
- /sbin/wget.p
- /usr/sbin/wget.r
- /usr/sbin/wget.p
YARA
ルールIOT_WORM_Cling_sample
{
メタ
name = "Cling - WORM"
author = "Nozomi Networks Labs"
description = "複数のCling亜型を検出します"
tlp = "クリア"
date = "2026-09-17"
hash1 = "90d738a8d650e3fefda9d7efa4baa11bd89ab05fcf0eb173e04aa01a52b465e2"
hash2 = "3a6927a3399f2a10bb2e2229482e5096e5f1c3401a87f7f1730db11243531e28"
文字列:
$s1 = ".selfrep"
$s2 = "User-Agent: clingwashere"
$s3 = "/.cling\x00"
$s4 = "mount --bind /tmp /proc/%d"
$s5 = "POST /picsdesc.xml"
$scan_ports = { 50 00 90 1F 55 00 61 EA 51 00 58 00 }
$cmd_dispatch = { FF FF 42 24 FF 00 42 30 08 00 43 2C ?? ?? 60 10 80 10 02 00 }
$stun_magic = { 12 21 04 3C ?? ?? 99 8F 42 A4 84 34 }
コンディション
uint32(0) == 0x464C457F かつ
filesize < 1MB and
そのうちの3つ
}
参考文献
- https://datatracker.ietf.org/doc/rfc8489/
- https://datatracker.ietf.org/doc/rfc2827/
- https://www.caida.org/projects/spoofer/




