昨年12月に、脆弱性があるとのメールが、JPCERT/CCから送られてきました。
どうやら一般のユーザーさんからIPAへ報告があり、それを仲介する形で、前述の機関が、作者である僕へ連絡を取ってきたという流れです。
報告内容は非常に具体的で、実際に脆弱性を突いて攻撃可能にするサンプルも添付されていました。おかげですぐに現象を再現させることができました。
いわゆる典型的な「バイナリ・プランティングカレントディレクトリ」という脆弱性で、わかりやすかったということもあるでしょう。
自分で言うのもなんですが、僕はそれほど上級なプログラマではありません。実装はほぼVCLに頼っていて、どうしても実現できないところは、仕方なくWin32 APIを使うという感じでした。なので正直、よくニュースになるような脆弱性とは、無縁だろうと思っていました(どのようなレベルでプログラミングしていても脆弱性は起こりえるのですが)。
しかし、その数少ないWin32 APIの箇所に脆弱性があったというわけです。
現象は、アタッシェケースの動作設定を変えることで起こります(デフォルトでは発生しません)。
具体的には、フォルダを復号したあとに、自動でフォルダを開くという動作設定を行います。
そのときの動作には、以下のWin32 APIを使っていました。
[cpp]
ShellExecute(NULL, "open", "explorer.exe", OutputFileName.c_str(), NULL, SW_NORMAL);
[/cpp]
ポイントは、5番目の引数が、”NULL”になっていたこと。
[cpp]
ShellExecute(NULL, "open", "explorer.exe", OutputFileName.c_str(), NULL, SW_NORMAL);
[/cpp]
ここで既定のディレクトリの指定をNULLとしていたことで、Explorer.exeがディレクトリを開くところを、カレントに「Explorer.exe」あれば、それが優先し意図せず実行してしまうという挙動になっていました。
そのExplorer.exeが、もしも悪意あるプログラムで偽装されていたら‥‥
という脆弱性でした。
対処は実に簡単で、きちんと既定のディレクトリを指定してあげることでした。
[cpp]
ShellExecute(NULL, "open", "explorer.exe", OutputFileName.c_str(), DirectoryName.c_str(), SW_NORMAL);
[/cpp]
あるいは、実行するべき操作として、explorerを指定しても良かったでしょう(ふつうはこちらでしょうか?)。
[cpp]
ShellExecute(NULL, "explorer", OutputFileName.c_str(), NULL, NULL, SW_NORMAL);
[/cpp]
実は、これに関して気づいてはいたのですが(次のバージョンアップで対応予定でした)、前バージョンがわりに安定していたことと、指定がなくとも動いていたことで、しばらく放置していました。
ようは脆弱性につながるという認識不足と、油断していた、ということでしょうか。本当に申し訳ありません‥‥
修正後は、JPCERT/CC担当者の方と、対処したバージョンの公開と、脆弱性の情報公開の日程を詰め、先行して僕のサイトで公開しました。その数日後の2010/12/17に、JPCERT/CCにも情報が公開されました。
ちなみに、詳細はコチラ。
僕の想像を超え、反響も大きく、窓の杜でも記事になったせいでしょうか、ホームページがアクセス過多で、@niftyからほぼ丸一日の閉鎖措置を食らいました。さらには問い合わせのメールが大量に舞い込むなど、その対応に追われました。
そうして、ホームページを一時的に閉鎖されたことが、今回ブログをはじめようと思い立ったキッカケでもあります。
開発当初は、自分で使うツールとして作りはじめ、「他の方にも使ってくれるかなあ」などと軽い気持ちではじめた『アタッシェケース』ですが、今回僕の予想以上に、多くの方々に使用していただいていることを知りました。また、フリーソフトとはいえ、生半可な気持ちでは公開できないと、改めて痛感しました。
いろいろご迷惑をおかけしましたが、今後もよろしくお願いします。
このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。
日々の開発作業で気づいたこと共有を。同じところで躓いている人が、 検索で辿り着けたら良いな、というスタンスで記事を書くので不定期更新になります。
コメントする