
MDT製のSCN-IP100.03およびSCN-IP000.03のファームウェアv3.0.3におけるCVE-2021-37740のDoS脆弱性のPoC。このバグはファームウェアv3.0.4で修正されました。
CVE-2021-37740 は、MDT社製のKNXnet/IP SecureルータSCN-IP100.03およびインターフェースSCN-IP000.03のファームウェアv3.0.3に影響を与えるサービス拒否(DoS)脆弱性です。 特別に細工されたKNXnet/IP Secureフレームにより、デバイスが以降のリクエストに応答しなくなり、通常の動作を復旧するには再起動が必要になります。 このリポジトリには、バグをトリガーする方法を示す概念実証が含まれており、もともとは協調的な脆弱性開示のために開発されました。
攻撃者は、標的のデバイスとのTCP接続を確立し、その後、変更された total length フィールド(0x0259以上の値)を含む SESSION_REQUEST フレームを送信することで、この脆弱性を悪用できます。
影響を受けるデバイスは、どの接続においてもKNXnet/IP Secureフレームに応答しなくなります。SESSION_REQUEST は、ISO 22510:2019で規定されているKNXnet/IP Secureユニキャストプロトコルのハンドシェイク中に最初に送信されるフレームです。
本来は固定長46バイトであるべきです。規格では、長さが異なるフレームは破棄されることが求められています。
このリポジトリで提供されるスクリプトにはPython 3が必要です。healthcheck.pyは、デバイスがまだ応答可能かどうかをテストするためのものです。
標的デバイスとのTCP接続を確立し、KNXnet/IP Secureユニキャストハンドシェイクの開始を試みます。
デバイスが応答した場合、その応答は16進数としてstdoutに出力されます。
poc.pyは、無効なSESSION_REQUESTフレームを送信することでDoS脆弱性をトリガーしようとします。脆弱なデバイスの場合、標的デバイスが再起動されない限り、その後のhealthcheck.pyの実行では応答が得られません。
スクリプトは以下のコマンドで実行できます。<insert IP address>は実際のIPアドレス(例:192.168.2.137)に置き換えてください。
python3 healthcheck.py -t <insert IP address>
python3 poc.py -t <insert IP address>
Windowsでは、Pythonのエイリアスをpython3からpythonに変更する必要がある場合があります。標的デバイスが制御エンドポイントを3671以外のポートで実装している場合は、スクリプト内のポートを適宜調整する必要があります。
この脆弱性は、MDTファームウェアの変更履歴に記載されているように、ファームウェアv3.0.4で修正されました。最新のファームウェアをインストールすることで問題が解決します。ファームウェア更新の手順と.hexファイルは、MDTのウェブサイトで提供されています。
この概念実証は MITライセンス の下で配布されています。
ダウンロード:
変更点: