Win32 APIの既知の弱点により、このような大きな影響があります。
プログラムは、CreateProcess()
システムコールを介してWin32で生成されます。いくつかの方法で使用できます。Unix、Linux、またはOS / 2のバックグラウンドから来ている人々は、通常、プログラム(イメージファイル)が生成する2つの別個の引数と、新しいプロセスに渡すコマンドテールをとると考えます。これらのオペレーティングシステムのAPIには2つの別個のものがあります。しかし、実際には、システムコールは、プログラム名と引数を1つの大きな文字列にまとめた代替形式で呼び出すことができます。 CreateProcess()
プログラムファイル名とコマンドテールを分離しようとします。
問題は、左側の部分がファイルまたはディレクトリに一致するまで、連続するスペース文字ごとに文字列を徐々に分割してこれを行うことです。多くのWin32プログラムはC:\Program Files\Contoso\TakeOver.exe StackExchange.com
、システムコールのように文字列を渡そうとします。これは、明らかに危険な人がやって来て、あなたと同じようにファイルを作成するまで、適切なプログラムを(C:\Program Files\Contoso\TakeOver.exe
適切なコマンドテールで)実行します。StackExchange.com
C:\Program
その時点で、システムコールC:\Program
はコマンドtailでプログラムイメージファイルを実行しようとしますFiles\Contoso\TakeOver.exe StackExchange.com
。天国C:\Program
は、実際に実行可能なプログラムイメージである場合に役立ちます。
これは一般的な弱点であり、One Big Stringを使用して他のプログラムを生成するプログラムと組み合わせてスペースを含むすべてのプログラムファイル名に適用されます。しかし、これに見舞われる最も一般的なケースは、存在するすべてのC:\Program Files\
プログラムと、One Big Stringアプローチを使用する多数のWin32プログラムです。
Win32 APIを変更するには遅すぎます。10年前には遅すぎました。そして、Microsoftは、2つではなく1つの大きな文字列を渡す他の人によって書かれたプログラムのすべてを変更することはできませんCreateProcess()
。そのため、Microsoftは、ユーザーのログオン時に、C:\Program
表示される警告の存在を確認し、表示するWindowsを作成します。
そして、ご覧のとおり、MicrosoftのWin32 docoには、開発者にOne Big Stringアプローチを使用してプログラムを記述しないようにという大きな「セキュリティ」警告があります。
参考文献