FreeRDPのクリップボードに重大な欠陥、悪意あるRDPサーバーによるコード実行の恐れ

FreeRDPのWindowsクライアントに重大なヒープバッファオーバーフローの脆弱性が見つかりました。悪意のあるリモートデスクトッププロトコル(RDP)サーバーがこの脆弱性を悪用すれば、接続元クライアントのメモリを破損させ、任意のコードを実行できる可能性があります。

パッチ管理ソリューション

この欠陥は、wfreerdpのクリップボードリダイレクション(CLIPRDR)仮想チャネルに特有のもので、攻撃者が制御するレスポンスがクライアント側の要求サイズを上回ってしまう問題です。

FreeRDPのクリップボードに重大な欠陥

この問題はGHSA-cj9v-h4hq-29jrとして追跡されており、FreeRDPバージョン3.28.0に影響します。バージョン3.29.0には必要な修正が含まれています。

FreeRDPのアドバイザリでは、wfreerdpはすでにメンテナンスが行われておらず使用すべきではないと強調されており、各組織はサポートされているFreeRDPクライアントおよび最新ビルドへの移行が必要だとしています。

この脆弱性は、wfreerdpがサーバーから送信されたCLIPRDR_FILECONTENTS_RESPONSEメッセージを処理する際に発生します。クリップボード経由のファイル転送では、クライアントがサーバーに対して特定の量のファイルデータを要求します。

しかし、悪意あるサーバーはこれよりも大幅に大きいペイロードを返し、宛先バッファのサイズをチェックしないままCopyMemory操作で使用されるサーバー制御の長さ値を提供することができます。

この脆弱なデータパスには、cliprdr_read_file_contents_response、wf_cliprdr_server_file_contents_response、CliprdrStreamReadという各関数が関わっています。プロトコルパーサーは受信したメッセージの長さからcbRequestedを抽出しますが、この長さがクライアントの元の要求と一致するか、それより小さいかどうかを確認していません。

[Malicious RDP Server]
    │
    ▼ Sends CLIPRDR_FILE_CONTENTS_RESPONSE (dataLen = 65540)
    │
channels/cliprdr/cliprdr_common.c:384
    ▼ cliprdr_read_file_contents_response()
    │  response->cbRequested = response->common.dataLen - 4  → cbRequested = 65536
    │  // ❌ No validation: cbRequested not checked against requested cb
    │
client/Windows/wf_cliprdr.c:2449
    ▼ wf_cliprdr_server_file_contents_response()
    │  clipboard->req_fsize = fileContentsResponse->cbRequested  → req_fsize = 65536
    │  // ❌ Directly accepts server value without comparing to original cb
    │  SetEvent(clipboard->req_fevent)  → Wakes waiting thread
    │
client/Windows/wf_cliprdr.c:249
    ▼ CliprdrStream_Read()
    │  CopyMemory(pv, clipboard->req_fdata, clipboard->req_fsize)
    │  // 💥 pv size = cb = 16384, req_fsize = 65536
    │  // 💥 49152 bytes out-of-bounds heap write!
    ▼
[Heap Memory Corruption → SIGSEGV / Process Crash]

コールバックはこの過大な値をclipboard->reqfsizeに保存し、その後CliprdrStreamReadが、より小さい要求サイズ用に確保されたバッファへサーバー提供のデータをコピーしてしまいます。

例えば、クライアントがクリップボードのファイルコンテンツを16KB要求した場合、悪意あるRDPサーバーは64KBで応答することができます。この操作により、意図したヒープ割り当てを約48KB超えて書き込みが行われ、隣接するヒープオブジェクトやヒープ管理用のメタデータを上書きしてしまう可能性があります。

このような破損はFreeRDPプロセスをクラッシュさせる恐れがありますが、特定のヒープレイアウト条件下では、制御フローの乗っ取りやリモートコード実行に悪用される可能性もあります。

プログラミング

この脆弱性を悪用するには、被害者がクリップボードリダイレクションを有効にした状態で、攻撃者が制御するRDPサーバーに接続する必要があります。クリップボード機能は通常デフォルトで有効になっており、この脆弱なパスは、RDPセッション中にユーザーがWindowsエクスプローラーでCtrl+Vなどの貼り付け操作を行った際にアクセスされる可能性があります。

このため、フィッシング攻撃や不正なリモートサポート要求、公開状態のテストサーバー、侵害されたRDPインフラなどが、この脆弱性を悪用する現実的なシナリオとして考えられます。

各組織は、影響を受けるFreeRDP環境を直ちにバージョン3.29.0以降にアップデートし、旧式のwfreerdpクライアントを依然として使用している環境がないか特定する必要があります。

パッチ適用または移行が完了するまでの間、管理者は信頼できないRDP接続に対してクリップボードリダイレクションを無効化し、アウトバウンドのRDPアクセスを制限し、ユーザーが接続前にリモートホストの身元と正当性を確認するよう徹底すべきです。

セキュリティチームは、予期しないFreeRDPのクラッシュ、不審なRDP接続先、クリップボード仮想チャネルにおける異常な挙動についても、エンドポイントのテレメトリを監視する必要があります。

警告: 20以上の政府系サイトが企業や市民にマルウェアを配布していました。 攻撃に関する詳細な調査結果はこちら からご確認いただき、自組織の露出状況をチェックしてください

翻訳元: https://gbhackers.com/critical-freerdp-clipboard-flaw/

ソース: gbhackers.com