特別編 Safariの脆弱性に学ぶBAHとusroリソースの働き:Undocumented Mac OS X(3/3 ページ)
今回は、いつもの連載から少し離れ、2006年2月に発表された、Safariの外部から送り込まれたシェルスクリプトを自動的に実行してしまう脆弱性について考えてみたい。
Safariがスクリプトを実行してしまうまで
さて、役者はそろったので脆弱性の流れを説明しよう。まず、実行させたいシェルスクリプトを用意する。そのファイル名に「.jpg」なり「.mov」なりの何か別のデータファイルに見えるような拡張子を付加する。なお、実行パーミッションを割り当てる必要はない。このままだと、ダブルクリックすると画像およびPDFビュワーの「プレビュー」やQuickTime Playerなど拡張子に対応するアプリケーションが実行され、ファイルが破損しているか間違っているといったエラーを表示するだけだろう。
そこで、このファイルにusroリソースを割り当て、起動に使うアプリケーションに「ターミナル」を指定するのだ。すると、このファイルは一見jpgファイルやmovファイルに見えるが、ダブルクリックするとターミナルが起動し、スクリプトが実行されてしまう。
最後に、このファイルをBAHを使って圧縮した上で、Webサイトに配置する。
Safariを使っているユーザーがこのファイルをダウンロードすると、ZIPファイルは「“安全な”ファイル」と想定されているため自動的に展開され、アーカイブから展開されたjpgファイルやmovファイルもまた「“安全な”ファイル」と想定されているため、これを表示しようとする。そう、そこでターミナルで読み込まれてしまい、スクリプトが実行されてしまうのだ。
暫定的な対処法
対処法は、この3つの要因のどれかを切ることだ。
ブラウザに関する対処
一番簡単なのはSafariの「“安全な”ファイルを開く」のチェックを外すことだ。これによって、ダウンロードしたファイルを自動的に展開したり表示したりといった行為が抑制される。同様に「“安全な”ファイルを開く」のような機能を持たない別のブラウザに切り替えてしまうのも有効だ。
ZIPアーカイブに関する対処
__MACOSXを理解しないソフトウェアでZIPアーカイブを展開するという手もある。わたしが試したところ、AladdinのStuffIt Expander 10はBAHと同じく__MACOSXが存在した場合その中の情報の結合を行ってしまう。フリーソフトのOpenUp.appは__MACOSXを解さないコマンドライン版のunzipを用いているため問題がない。そこで、ZIPファイルの展開に対応するアプリケーションをOpenUp.appに変更すれば最悪の事態は防げる。
しかし、これらはあくまで暫定的な対処にすぎないという点に気をつけてほしい。自動的に開くことを防げても、ダウンロードしたZIPアーカイブをユーザー自身が無邪気に開いて、中のファイルをダブルクリックしてしまえば結局実行されてしまうからだ。「Safariじゃないから大丈夫」「メールで送られてきたファイルだから」「iChatで送られたものだから」と慢心していたら、そういった初歩的なミスを犯しかねない。
また最初に述べたように、リソースフォークを保存する手段はZIPに限らない。tarやrsyncという手もあれば、HFS Plusファイルシステムを内包するディスクイメージのdmgや昔ながらのsitもある。ZIPだけを封じても万全ではないのだ。
usroリソースに関する対処
usroリソースはパスに依存するため、ターミナルを削除したり場所を移すという手もある。Mac OS Xには、アプリケーションの初回起動時に本当に実行して良いか確認する機能がある。不正なアプリケーションをこっそり仕組まれ関連づけを悪用して起動するという問題への対処なのだが、つまりそのユーザーがターミナルを一度も起動したことがなければ、確認パネルが表示されるため実行を阻める。
しかし、UNIX系ユーザーにとってターミナルが存在しないMac OS Xは、その価値を半減しかねないし、場所を移してしまったソフトウェアにはソフトウェアアップデートが適切に適用されなくなるリスクがある。そして、X11やAutomatorなど、スクリプトを実行しうる可能性のあるアプリケーションはターミナルだけとは限らない。そのすべてを消したり、場所を移したり、1度も使わないと操を立てるのは現実的とはいえないだろう。
根源的な問題としては、usroリソースを使ったアプリケーションの指定ができること、そしてそれが外部から設定できてしまうことにある。残念ながら現状、これに対する有効な対処法はない*。怪しいファイルを開く前は必ず「情報を見る」を使い、どのアプリケーションが起動されるのか確認するしかない(図4)。
セキュリティアップデート 2006-001
2006年3月1日、Appleよりセキュリティアップデートが公開された。Leap-AウイルスやPHPの脆弱性などの問題を解決するとともに、この「“安全な”ファイルを開く」の問題についても対処が行われている。
具体的には、LaunchServicesの処理が追加され*、「“安全な”ファイル」かどうかというチェックがより細かく行われるようになった。ZIPなどのアーカイブ内のファイルもそれぞれチェックされ、そしてusroリソースの付いたファイルはもはや安全とは見なされず、警告が表示される。
ただし、BAHなどがusroリソースフォークを保存してしまう点には変わりなく、外部からアーカイブをダウンロードし展開する際に注意が必要なことにも変わりはない。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このページで出てきた専門用語
これに対する有効な対処法はない
メモリ上のバイナリを改ざんするApplication Enhancerというソフトウェアを用いてLaunchServicesにパッチを当て、usroリソースがある場合を危険なファイルと判定、usroリソースの削除を試みるようにする方法が提案されている。確かにこの方法ならば根本的に問題が解決するが、実行中のソフトウェアにパッチを当てるApplication Enhancerという危険なソフトウェアに依存しているため万人には勧めがたい。
LaunchServicesの処理が追加され
そのためか、AladdinのStuffIt Expander 10で、ZIPファイルをアーカイブの中に含むZIPファイルを展開しようとするとエラーを表示するようになってしまった。おそらく、LaunchServicesのエラーチェックルーチンにアーカイブ中のZIPファイルのパスを渡し、安全性を問うたときに返ってくる戻り値が従来のものと異なる、新しい値が返ってきてしまうためと推測される。
本記事は、オープンソースマガジン2006年5月号「Undocumented Mac OS X」を再構成したものです。
関連記事
- 連載第1回 initを置き換えるlaunchd【前編】
UNIX使いに真のMACPOWERを! 本連載では、UNIX使いに向け、UNIX系OSとしてのMac OS Xを解説していく。記念すべき第1回では、initに代わるものとしてMac OS X Tigerで採用された、launchdを紹介しよう。 - 連載第2回 initを置き換えるlaunchd【後編】
- 連載第3回:plist(プロパティリスト)とFoundation【前編】
- 連載第4回:plist(プロパティリスト)とFoundation【後編】
- 連載第5回:OpenDirectory
- 連載第6回:迷走の痕跡を抱えるMac OS XのOpenDirectory
- 連載第7回:HFS、HFS Plusの基本的概念【前編】
- 連載第8回:HFS、HFS Plusの基本的概念【中編】
- 連載第9回:HFS、HFS Plusの基本的概念【後編】
- 連載第10回:HFS Plus独自の機能【前編】
- 連載第11回:HFS Plus独自の機能【後編】
Copyright © ITmedia, Inc. All Rights Reserved.