IEのオートコンプリートは無効にしたほうがいいことを再認識した

毎回パスワード入力するのがめんどい。IEとかにはユーザが入力したIDとパスワードを記憶させることができる。キーパンチしないのでキーロガーの対策にはいいのではと思いがち。でも、このオートコンプリートの情報は簡単に取り出せるといわれて久しい。どのくらい簡単なんだろうと思って調べてみた。

保存されているパスワード情報を確認できるソフトは昔からけっこうある。


[HideSeek]
http://www.vector.co.jp/soft/win95/util/se312032.html
[認術修業]
http://www.vector.co.jp/soft/win95/util/se290270.html


ほんとに簡単に取り出せそうだ。

このIEオートコンプリートやOutlookのクレデンシャルの情報はWindowsによって暗号化され、レジストリの保存されている。この部分を司さどっているのがProtected Storage Service。このサービスがクレデンシャル情報の暗号・複合を行っているが、APIが用意されていて、基本的にどんなアプリケーションからも利用できるようだ。

このAPIを利用してIE7以降からオートコンプリート文字列を取得するサンプルがあった(↓)。


[IE7におけるパスワード等の操作要領]
http://www.sapporoworks.ne.jp/ie7_pass/


ソースをダウンロードしたところ、実はそのままでは動かなかったがチョチョッと修正したら見事に動いた。ソースを見たところ、ログインしているユーザのIEのオートコンプリート情報は「HKEY_CURRENT_USERS\Software\Microsoft\Internet Explorer\IntelliForms\Storage2」に保存されているらしい。



値の名前がURLのハッシュ値SHA1)。値がオートコンプリート情報で暗号化されバイナリで保存されている。URL部分はハッシュなので不可逆。じゃあ、どうやってURL文字列を取り出しているかというと、実はアクセスされたURLの履歴情報を別途取得し、その値をSHA1でハッシュしたものと比較しているのだ。

このURL履歴情報はCOMの「IUrlHistoryStg2」インターフェースを使用することで取得可能だ。URLが判明したところで、肝心の暗号化されているオートコンプリート情報だが、「CryptUnprotectData」という「Crypt32.dll」に含まれるAPI一発で複合化できてしまうらしい。

いや、やってみると、ほんとに簡単だ。以下取得したオートコンプリート情報。なんだが、平文でパスワードが表示されているとゾッとする。



今更ながらこれは怖い。そういえば Windows Fire Wall の穴もそれ用のAPIあっさり空けることができたっけ。Windows APIってけっこうオープンだ。なんか制限できないのかな。実行しているプロセスの権限トークンを使ったファイル単位でのファイルシステムのアクセス制御ではなく、もっと、なんかこう、MSの証明書がついてないプログラムからのアクセスは不可とか。そもそも公開APIを絞るとか。開発できるアプリの柔軟性とか拡張性とか考えるとなかなか難しいのかな。

ちなみに、IEのオートコンプリートを無効にするには、メニューバーから「ツール」-「インターネットオプション」-「コンテンツ」タブ-「オートコンプリート」-「設定」で行うことができる。