
InputLeapのドラッグアンドドロップハンドラにおけるCWE-22パストラバーサルのPoCおよびアドバイザリ。再現手順、エクスプロイトスクリプト、および修復ガイダンスを含む。
製品: InputLeap v3.0.3
ベンダー: input-leap
脆弱性: パストラバーサル
CWE: CWE-22 パス名の制限されたディレクトリへの不適切な制限(「パストラバーサル」)
InputLeapのドラッグ&ドロップハンドラーは、最後のパス区切り文字を探してその後の部分だけを保持することで、ファイル名をサニタイズしようとします。区切り文字が見つからない場合、C++の文字列検索は失敗を示すnposと呼ばれる特別な番兵値を返します。しかし、コードはこの番兵値をチェックせずに、その結果を算術計算で使用します。nposは符号なし整数の最大値として定義されているため、これを減算すると暗黙的にラップアラウンドし、完全に間違っているにもかかわらず有効に見える答えが生成されます。つまり、ファイル名だけを返す代わりに、サニタイズされていない元の文字列全体を返してしまいます。攻撃者はこれを悪用できます。あるエントリには区切り文字がなく、別のエントリには一致しない区切り文字が含まれるメッセージを作成すると、コードのグローバルな区切り文字検出ヒューリスティックが反転し、検索がサイレントに失敗し、..\..\AppData\...\Startup\evil.exeがそのまま通過します。その後、この文字列がドロップディレクトリに連結されてOSに渡され、OSは..シーケンスを解釈して、意図したフォルダの外にファイルを書き込みます。この脆弱性は、「見つからない」ケースに対する防御的チェックが欠けているために存在します。
--enable-drag-dropを有効にします(オプトイン、デフォルトはOFF)。/src/lib/inputleap/DragInformation.cpp
/src/lib/inputleap/DropHelper.cpp
サーバーへのTLS接続と非暗号化接続をサポートするPOCが提供されています。
攻撃者はこの脆弱性を悪用して、デフォルトまたは割り当てられたフォルダの外の任意のパスにファイルをアップロードできます。これによりコード実行につながる可能性があります