未知のファイルを隔離するEAの仕組みと謎

前回からの続き。

今時のインターネット接続が当たり前の環境では、日々、様々なファイルをダウンロードして開くことになる。そのような状況で何でも無防備に開けてしまうと、悪意のあるファイルにも簡単に実行する機会を与えてしまう...。それを防ぐために、いつの頃からかOSXはダウンロードしたファイルについては、本当に開いてよいのかどうか?確認するようになった。


  • 「開く」ボタンを押すことで、そのファイルは開かれ、実行されることになる。
  • 一度でも「開く」を許可されると、それ以降は確認なしで開けるようになる。

実はこの仕組みの裏でも、EAが活躍している。

ダウンロードしたファイルに追加される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
2014310日 月曜日 141011秒 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タイプにする意味があるのだろうか?

謎が残った...。