Windows 8 / 8.1 / 10 アプリケーションがファイル名構造を通じて攻撃を受けないようにしようと頭を悩ませている場合、Google のセキュリティ エンジニアが API を詳しく調査して役立つ情報を提供しています。
この長い説明の理由は、Google の観点から見ると単純です。「病的なリバース エンジニア」の James Forshaw 氏は、Windows 32 パスのドキュメントが不完全なため、セキュリティ上の脆弱性につながる間違いが生じる余地がたくさんあると書いています。
「Windows NT上でWin32 APIがファイルパスを処理する仕組みは、後方互換性のためのハック、奇妙な動作、そして美学に満ちた物語です。Win32パスの不適切な処理は、セキュリティ上の脆弱性につながる可能性があります」とForshaw氏はここで述べています。
存在する必要がある下位互換性ハックの数は、NTDLL パス名エクスポート呼び出しの出力 (「DOS パス」を参照) - RtlDosPathNameToRelativeNtPathName_Uによって示唆されます。
フォーショー氏は、様々な場所で問題が発生する可能性があると指摘する。例えば、Microsoftのドライブ命名規則に精通している開発者は、ドライブ名はAからZまでの文字であるという古くからの前提に基づいて作業している可能性が高い。
もうそうではありません。「 RtlGetFullPathName_U API ではこの要件が強制されないことが判明しましたが、エクスプローラー シェルとコマンド プロンプトではほぼ確実に強制されます」と彼は指摘しています (「ほぼ」という修飾語は、このようなもののリバース エンジニアリングがいかに難しいかを示しています)。
デフォルトのドライブ命名でも、必ずしも期待どおりになるとは限りません。
Windows開発の初心者はおそらくそれを期待していないでしょう =::=::/
画像: ジェームズ・フォーショウ、Google Project Zero
なぜこれが重要なのでしょうか?それは、ドライブやファイルの処理ミスを悪用した攻撃を回避しようとする人は、非常に複雑な入力セットを検証する必要があるからです。
「奇妙な動作や奇妙な動作が多すぎるため、起こり得るすべての結果を検証するコードを書くのは非常に困難です」とフォーショー氏は書いている。
すべてをNTパスに変換すると、誤動作の可能性が低くなるため多少は改善されますが、それでもシンボリックリンクの乱用やドライブレターの変更によって混乱が生じる可能性があります。Win32パスを検証しようとするアプリケーションに遭遇した場合は、十分に注意する必要があります。
また、プログラマーが彼の例や自分の例をテストして結果を確認できるようにするために彼が書いた C# のサンプル プログラムもあります。®