未知のファイルを隔離するEAの仕組みと謎
前回からの続き。
今時のインターネット接続が当たり前の環境では、日々、様々なファイルをダウンロードして開くことになる。そのような状況で何でも無防備に開けてしまうと、悪意のあるファイルにも簡単に実行する機会を与えてしまう...。それを防ぐために、いつの頃からかOSXはダウンロードしたファイルについては、本当に開いてよいのかどうか?確認するようになった。
- 「開く」ボタンを押すことで、そのファイルは開かれ、実行されることになる。
- 一度でも「開く」を許可されると、それ以降は確認なしで開けるようになる。
実はこの仕組みの裏でも、EAが活躍している。
ダウンロードしたファイルに追加されるEA
- ダウンロードすると、ファイルには3つのEAが追記される。
$ xattr -l ~/Downloads/ibettercharge_1.0.2.zip com.apple.metadata:kMDItemDownloadedDate: 00000000 62 70 6C 69 73 74 30 30 A1 01 33 41 B8 CD 80 B3 |bplist00..3A....| 00000010 5E AB 7A 08 0A 00 00 00 00 00 00 01 01 00 00 00 |^.z.............| 00000020 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 |................| 00000030 00 00 00 00 13 |.....| 00000035 com.apple.metadata:kMDItemWhereFroms: 00000000 62 70 6C 69 73 74 30 30 A2 01 02 5F 10 47 68 74 |bplist00..._.Ght| 00000010 74 70 3A 2F 2F 73 6F 66 74 6F 72 69 6E 6F 2E 73 |tp://softorino.s| 00000020 33 2E 61 6D 61 7A 6F 6E 61 77 73 2E 63 6F 6D 2F |3.amazonaws.com/| 00000030 69 62 65 74 74 65 72 63 68 61 72 67 65 2F 69 62 |ibettercharge/ib| 00000040 65 74 74 65 72 63 68 61 72 67 65 5F 31 2E 30 2E |ettercharge_1.0.| 00000050 32 2E 7A 69 70 5F 10 23 68 74 74 70 3A 2F 2F 73 |2.zip_.#http://s| 00000060 6F 66 74 6F 72 69 6E 6F 2E 63 6F 6D 2F 69 62 65 |oftorino.com/ibe| 00000070 74 74 65 72 63 68 61 72 67 65 2F 08 0B 55 00 00 |ttercharge/..U..| 00000080 00 00 00 00 01 01 00 00 00 00 00 00 00 03 00 00 |................| 00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 7B |.............{| 0000009e com.apple.quarantine: 0002;531d4933;Safari.app;03F3D6DC-1547-4E33-AC9F-95DDCA719B1B
- plistの内容は、以下のようになっている。
- ダウンロードした日時。
$ xattr -p com.apple.metadata:kMDItemDownloadedDate /Users/bebe/Downloads/ibettercharge_1.0.2.zip | xxd -r -ps | plutil -convert xml1 - -o - <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <array> <date>2014-03-10T05:10:11Z</date> </array> </plist>
-
- ダウンロード元のURL。
$ xattr -p com.apple.metadata:kMDItemWhereFroms /Users/bebe/Downloads/ibettercharge_1.0.2.zip | xxd -r -ps | plutil -convert xml1 - -o - <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <array> <string>http://softorino.s3.amazonaws.com/ibettercharge/ibettercharge_1.0.2.zip</string> <string>http://softorino.com/ibettercharge/</string> </array> </plist>
- このzipファイルを解凍すると、iBetterCharge.appが出現する。
- iBetterCharge.appには、たった一つのEAが、引き継がれる。
com.apple.quarantineである!
- quarantineには、検疫とか隔離の意味がある。
- つまり、ファイルに何らかのマーキングをしていることが想像できる。
com.apple.quarantineの変化
- com.apple.quarantineは、ファイルの状態によって以下のように変化した。
- ダウンロード直後、解凍直後で、まだ一度も開こうとしていない状態。
$ xattr -l ~/Downloads/iBetterCharge.app com.apple.quarantine: 0002;531d4933;Safari.app;03F3D6DC-1547-4E33-AC9F-95DDCA719B1B
- ファイルを開こうとして、確認ダイアログが表示された状態。
- あるいは、確認ダイアログでキャンセルして、開くを許可されていない状態。
$ xattr -l ~/Downloads/iBetterCharge.app com.apple.quarantine: 0022;531d4933;Safari.app;03F3D6DC-1547-4E33-AC9F-95DDCA719B1B
- 一度でも開くを許可された状態。
$ xattr -l ~/Downloads/iBetterCharge.app com.apple.quarantine: 0062;531d4933;Safari.app;03F3D6DC-1547-4E33-AC9F-95DDCA719B1B
- 変化しているのは、最初の4桁の数字のみである。
0002 | ダウンロード直後 |
---|---|
0022 | 開くを保留 |
0062 | 開くを許可 |
- 0062の状態になると、確認なしで自由に実行できるようになる。
- では、0062を0002や0022に書き換えてみると、どうなるか?
$ xattr -w com.apple.quarantine '0002;531d4933;Safari.app;03F3D6DC-1547-4E33-AC9F-95DDCA719B1B' ~/Downloads/iBetterCharge.app $ xattr -l ~/Downloads/iBetterCharge.app com.apple.quarantine: 0002;531d4933;Safari.app;03F3D6DC-1547-4E33-AC9F-95DDCA719B1B
- ダブルクリックで実行してみると...
意味するもの
- 最初の4桁の数字は、ファイルを開く許可の状態を記録していると思われる。
- では、それに続く文字は何を意味しているのだろう?
- セミコロン;は区切り記号と想像できるので、全部で4つの意味がありそう。
- 参考ページ:(素晴らしい情報に感謝です!)
com.apple.quarantine: 0002;531d4933;Safari.app;03F3D6DC-1547-4E33-AC9F-95DDCA719B1B
kLSQuarantineType | LSQuarantineTimeStamp | kLSQuarantineAgentName | LSQuarantineEventIdentifier |
---|---|---|---|
0002 | 531d4933 | Safari.app | 03F3D6DC-1547-4E33-AC9F-95DDCA719B1B |
kLSQuarantineType
- 隔離のタイプ
- kLSQuarantineTypeWebDownload
- kLSQuarantineTypeOtherDownload
- kLSQuarantineTypeEmailAttachment
- kLSQuarantineTypeInstantMessageAttachment
- kLSQuarantineTypeCalendarEventAttachment
- kLSQuarantineTypeOtherAttachment
LSQuarantineTimeStamp
- 隔離した日時
$ date -r 0x531d4933 2014年 3月10日 月曜日 14時10分11秒 JST
kLSQuarantineAgentName
- 隔離したアプリ(たぶん)
LSQuarantineEventIdentifier
- この隔離情報を管理するUUID(たぶん)
$ sqlite3 ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 sqlite> .dump ...中略... INSERT INTO "LSQuarantineEvent" VALUES('03F3D6DC-1547-4E33-AC9F-95DDCA719B1B',416121011.345413,'com.apple.Safari','Safari','http://softorino.s3.amazonaws.com/ibettercharge/ibettercharge_1.0.2.zip',NULL,NULL,0,NULL,'http://softorino.com/',NULL); ...中略... sqlite> .exit
com.apple.quarantineをリストアップ
- どのような隔離のタイプがあるのか、ダウンロードフォルダを覗いてみた。
$ xattr -l ~/Downloads/* | grep com.apple.quarantine | cut -d: -f3 | cut -d';' -f1 | sort -u 0000 0001 0002 0003 0006 0041 0042 0043 0046 0062
- それぞれのタイプにどのような傾向があるかを調べれば、その意味が分かるかもしれない。
$ xattr -l ~/Downloads/* | grep com.apple.quarantine | grep 0006
- 正確には分からなかったが、だいたい以下のような傾向があると感じた。
0000 | ? |
---|---|
0001 | Webブラウザから、ドラッグ&ドロップで取り込んだ画像 |
0002 | Webブラウザで、リンクをクリックしてダウンロードしたファイル |
0003 | ? |
0006 | USBやSDカードスロットから取り込んだ画像 |
004x | 実行できないデータを開く許可あり |
006x | 実行可能なファイルを開く許可あり |
プレビュー.appがグループ化できない時
- プレビュー.appで「ファイルのグループを同じウィンドウで開く」設定のとき、
- Finderでファイルをまとめて選択して開くと、一つのウィンドウで表示される。
ハズなのだけど...
- 最近どうも、まとめて選択したはずなのに、別々のウィンドウに表示されてしまうことが多い。
- まとめて開く1回目の時は別々のウィンドウになり、
- 一旦閉じて、もう一度まとめて開くと一つのウィンドウになる。
- この謎めいた挙動を調べてみると、どうやらcom.apple.quarantineが影響しているようだ。
- 調べていて気付いたことは、プレビュー.appで「書き出す...」や「別名で保存...」を実行すると、
- 保存されたファイルにはcom.apple.quarantineが追記され、そのタイプは0002となっている。
- なんとダウンロードされたファイルの扱い。なぜ?
- 実は、0002タイプと、それ以外のタイプは、グループ化する時に区別されてしまうのだ!
- その後、0002タイプも開かれると、0042タイプとなる。
- すると、2回目以降にまとめて開く時には、1つのウィンドウにグループ化される。
- 謎めいた挙動の原因は、com.apple.quarantineのタイプの変化が引き起こしていたのである。
- なぜ、別ファイルとして保存すると、0002タイプになってしまうのだろう?
- セキュリティ上必要な措置なのだろうか?
- なぜ、0002タイプとそれ以外を、グループ化する時に区別する必要があるのだろう?
- そもそも、プレビュー.appが新規保存したファイルを必ず0002タイプにする意味があるのだろうか?
謎が残った...。