円記号を含むファイル名がトラバーサルを引き起こす問題について
この問題は整理すると、
- Unicode では円記号(U+00A5)とバックスラッシュ(U+005C)が個別の文字として定義されている
- NTFS*1 のファイル名には円記号(U+00A5)を含むことができる
- 歴史的な理由により、U+00A5の円記号は Unicode 以外の文字コードへの変換にて 0x5C(バックスラッシュ)に変換されることが多い
ということから、ファイル名を Unicode で扱わなかった場合に円記号(U+00A5)が 0x5C のディレクトリ区切り記号に変換されてしまい、結果としてファイル名が相対パスとして扱われてしまうということになります。
この問題自体は、IPA経由で Microsoft へも連絡したのですが、
ご指摘のとおり、"..¥(U+00A5)" を含むファイルパスをアプリケーション内部で処理する方法に問題がある場合、相対パスとして解釈され意図しない動作につながる可能性はあるものと考えられます。しかしながら、この動作はアプリケーション側で正しく Unicode を想定せずに処理を実装したことにより発生する問題であり…
(中略)
…この動作は Unicode に関するアプリケーションのサニタイズまたは入力値検査を不正に回避できる可能性であり、オペレーティングシステムのアクセス制御を回避することはできません。そのため、オペレーティングシステム(Win32 API) 上の脆弱性ではないと考えます
という、Windows 自体の問題ではなく、個々のアプリケーションの問題であるという明確な回答をもらっています。
ちなみに、
http://d.hatena.ne.jp/hideakii/20051108#20051108fn2
そもそもこれって脆弱性ってことになるのか考案者に確認するの忘れてたので余計に深く追求しなかった
デモで実演された、テキストエディタがディレクトリトラバーサルしてファイルを開いてしまうというのは、アプリケーションの不具合ではあるかも知れませんが、それ自体が何かの脅威を含むわけではありませんので、脆弱性ではありません。
ディレクトリの変更に便利なコマンド
ずきん日記を見て思い出したんですが、Windows 95/98 の MS-DOSプロンプトでは "..." は "..\.." と等価な扱いを受けるため、
C:\foo\bar\>cd...
とすることで、C:\ に移動できたんですが、XP のコマンドプロンプトでは使えないんですねぇ…。それなりに便利だったのに。
なお、Explorer や Internet Explorer では、アドレスバーに shell:foobar などと入力することにより、特殊なフォルダへ簡単にアクセスすることができます。利用可能なフォルダは、HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders に定義されています(それ以外にも ProgramFiles など非公開(?)なものもあります)。代表的なものとしては
shell:Administrative Tools | 管理ツール |
shell:Cache | IE の キャッシュディレクトリ |
shell:ControlPanelFolder | コントロールパネル |
shell:Cookies | IE の Cookie ディレクトリ |
shell:Desktop | デスクトップ |
shell:Favorites | お気に入り |
shell:History | IEの履歴 |
shell:Personal | マイ ドキュメント |
shell:Recent | 最近使ったファイル |
shell:Windows | Windows ディレクトリ |
などがあります。例えば、アドレスバーに
shell:personal
と打ち込んでやると、すばやくマイドキュメントに移動することができます。便利。もちろん「ファイル名を指定して実行」で「名前」欄に打ち込んでも OK。