11/15/2020

Appleは本当にあなたが実行するアプリをログに記録しているのか?

Jacopo Jannoneのブログより

Appleが発表したmacOS Big Surがリリースした直後にサーバの問題が発生し、ユーザが自分のコンピュータでサードパーティ製のアプリを実行できなくなってしまいました。Twitter上の人たちはすぐに回避策を見つけましたが、他の人たちはその問題に関連してプライバシーの懸念を表明しています。

Jeff Johnson @lapcatsoftware

Appleユーザの皆さん、

もし、あなたがMacでアプリの起動がハングアップしているなら、私はLittle Snitchを使って問題を特定しました。

それは、http://ocsp.apple.comに接続しているtrustdです。

OCSPはソフト障害なので、接続を拒否すると修正されます。

(インターネットの切断も修正)

OCSPとは?

OCSPは、Online Certificate Status Protocol1の略です。その名の通り、証明書の有効性を確認するために使用され、大量の証明書失効リストをダウンロードしてスキャンする必要はありません。macOSはアプリを起動する前に開発者証明書が失効していないことを確認するためにOCSPを使用します。

ジェフ・ジョンソンが上記のツイートで説明しているように、macOSがAppleのOCSPレスポンダに到達できない場合は、チェックをスキップしてアプリを起動します。これが基本的にフェールオープンの動作です。問題は、Appleのレスポンダがダウンしなかったことです。到達可能でしたが、非常に遅くなり、ソフト障害がトリガーとなってチェックを諦めてしまうのを防いだことです。

この仕組みは、アプリを起動する前にmacOSがAppleにコンタクトする必要があることは明らかです。Appleの問題によって引き起こされたこの事実が突然一般の人に知れ渡ったことで、プライバシーの懸念が浮上し、セキュリティ研究者のジェフリー・ポール2の投稿がTwitterで大変な話題となりました。彼は次のように主張しています。

macOSの現在のバージョンでは、OSはプログラムを実行すると、そのプログラムのハッシュ(一意の識別子)をAppleに送信します。

それは確かに不気味でしょう。

さらに悪いことに、OCSPはHTTPを使用するのが一般的です。ポート80で古き良きプレーンテキストHTTPの話をしていて、HTTPSをけなしているのではありません。これには通常正当な理由があります。OCSPサービスがウェブブラウザで使用されている場合に特に明らかになります。つまり、ループの防止です。OCSPで証明書をチェックするためにHTTPSを使用した場合、OCSPを使用してHTTPS接続の証明書もチェックする必要があります。これは、別のHTTPS接続などを開くことを意味します。

もちろん、OCSPは暗号化を義務付けていませんが、応答がサーバによって署名されていることは必須です。これでも、ネットワーク上にトラフィック・アナライザを持っている人が、開いたアプリを開いたときに、全てのアプリを傍受する可能性があるという最初の懸念は解決されません。

深く潜る

OCSPの基本をいくつか知っていると、さらに多くの疑問が湧いてきます。OCSPは、証明書のチェックするためのものですが、なぜ実行したアプリのハッシュを送信することと関係があるのでしょうか? macOSは実際に起動時に各実行可能ファイルのハッシュを計算しているのでしょうか? 非常に大きなものはどうでしょうか? それにはかなりの時間がかかります。誰も気づかなかったのでしょうか? もしかしたら、ハッシュは一度だけ計算され(例えば、アプリを初めて実行したとき)、どこかに保存されているのかも知れません。しかし、私は確信が持てず、これらの主張にはさらに調査が必要だと思います。

OCSPリクエストのキャプチャするのは、HTTPプロキシを設定するか、Wiresharkを起動するのと同じくらい簡単です。HTTPSがないということは、暗号化も証明書のピン留めもなく、何の問題もないことを意味します。Firefoxを開いているときに次のリクエストをキャプチャしました。

GET /ocsp-devid01/ME4wTKADAgEAMEUwQzBBMAkGBSsOAwIaBQAEFDOB0e%2FbaLCFIU0u76%2
BMSmlkPCpsBBRXF%2B2iz9x8mKEQ4Py%2Bhy0s8uMXVAIIBseUIWx6qTA%3D HTTP/1.1
Host: ocsp.apple.com
Accept: */*
User-Agent: com.apple.trustd/2.0
Accept-Language: it-it
Accept-Encoding: gzip, deflate
Connection: keep-alive

また、Firefoxを閉じて再度開いてみても何のリクエストもされなかったことも付け加えておかなければなりません。これは合理的であり、証明書のチェックは起動のたびに実行されるのではなく、一定期間実行されなかった後にのみ実行されていることを示しています。

リクエストは、ペイロードをbase64エンコードされた文字列として含む非常に単純なGETです。実際のバイナリデータは、ファイルに簡単にダンプできます。

echo 'ME4wTKADAgEAMEUwQzBBMAkGBSsOAwIaBQAEFDOB0e/baLCFIU0u76+MSmlkPCpsBBR
XF+2iz9x8mKEQ4Py+hy0s8uMXVAIIBseUIWx6qTA=' | base64 --decode > output.bin

ハッシュには見えない80バイト長のペイロードが得られます。案の定、ハッシュではありません。バイナリファイルから読み取り可能な情報を抽出するために、OpenSSLを使うことができます。

openssl ocsp -text -reqin output.bin
OCSP Request Data:
    Version: 1 (0x0)
    Requestor List:
        Certificate ID:
          Hash Algorithm: sha1
          Issuer Name Hash: 3381D1EFDB68B085214D2EEFAF8C4A69643C2A6C
          Issuer Key Hash: 5717EDA2CFDC7C98A110E0FCBE872D2CF2E31754
          Serial Number: 06C794216C7AA930

macOSのtrustdサービスは、起動したアプリのハッシュを送信しないことは明らかです。その代わりに、そもそも、OCSPとは何かを理解した上で期待しているように、証明書に関する情報を送信するだけです。

これでは問題を解決しませんよね? 各アプリが一意の証明書を持っている場合、各シリアル番号を対応するアプリに関連付けるテーブルを作成することはまだ可能で、これはプライバシーの問題です。これが本当かどうかを確認してみましょう。

開発者証明書...

まず、この情報がどの証明書からのものかを確認したいと思います。Appleのcodesignユーティリティを使用してFirefoxアプリから証明書を抽出、一致するデータを探してみました。

codesign -d --extract-certificates /Applications/Firefox.app

このコマンドを実行すると、codesign0codesign1などの名前でいくつかのファイルが作成されます。最初のファイルはリーフ証明書で、他のファイルはルートまでの証明書チェーンに属しています。codesign0は私たちが探しているもので、もう一度OpenSSLを使って、情報を抽出することができます。

openssl x509 -inform der -in codesign0 -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 488521955867797808 (0x6c794216c7aa930)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=Developer ID Certification Authority, OU=Apple Certification 
Authority, O=Apple Inc., C=US
        Validity
            Not Before: May  8 19:08:58 2017 GMT
            Not After : May  9 19:08:58 2022 GMT
        Subject: UID=43AQ936H96, CN=Developer ID Application: Mozilla Corporation 
(43AQ936H96), OU=43AQ936H96, O=Mozilla Corporation, C=US
        ...

取得したシリアル番号(0x6c794216c7aa930)を確認し、OCSPリクエストのペイロードと比較します。一致しました! これは、OCSPリクエストが実際にアプリ開発者証明書に関する情報を送信していることを証明しています。

...そしてその一般性

「だから何?」とあなたは尋ねるかもしれません。開発者証明書はアプリごとに固有のものではありません。繰り返しになりますが、私の言葉を鵜呑みにしないで下さい。私たちは、Thunderbirdなど、Mozillaとは別のアプリの証明書を確認することで、これをすばやく確認することができます。

codesign -d --extract-certificates /Applications/Thunderbird.app
openssl x509 -inform der -in codesign0 -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 488521955867797808 (0x6c794216c7aa930)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=Developer ID Certification Authority, OU=Apple Certification
Authority, O=Apple Inc., C=US
        Validity
            Not Before: May  8 19:08:58 2017 GMT
            Not After : May  9 19:08:58 2022 GMT
        Subject: UID=43AQ936H96, CN=Developer ID Application: Mozilla Corporation 
(43AQ936H96), OU=43AQ936H96, O=Mozilla Corporation, C=US
        ...

これは、Firefoxで使われているのと全く同じ証明書です(もちろんそうです!)。だから、ジェフリー・ポールの分析は、少なくともこれらの部分に関係するものについては、正確ではありません(私の強調)。

OSは、あなたがプログラムを実行する際、実行するプログラムのハッシュ(一意の識別子)をAppleに送信します。
[IPアドレス]は、日付、時刻、コンピューター、ISP、都市、州、アプリケーション・ハッシュの見出しを持つテーブルを作成することができます。
つまり、Appleはあなたがそこでどのようなアプリをどのくらいの頻度で開いているかを知っているということです。彼らは、友人の家でWi-FiでPremiereを開いた時も、他の都市に旅行でホテルでTor Browserを開いた時も、Appleには分かります。

macOSは実際には、アプリの開発者証明書に関する曖昧な情報を送信していますが、これはプライバシーの観点から見るとかなり重要な違いです。

公証について一言

この誤解の根底にあると思われることを明らかにしたいと思います。実際には、macOSがAppleに実行ファイルのハッシュを送信できる状況があり、それはGatekeeperは最初の起動時にAppleのサーバーに公証チケットが存在するかどうかを確認する際に、公証票がアプリにステープルで留められていない場合です3

これはOCSPとは何の関係もありません。このチェックは特定の状況下で行われ、api.apple-cloudkit.comにあるセキュアな(HTTPS)エンドポイントを経由して行われます。このプロセスの間、プログレスバー付きのポップアップがユーザに表示されます。

OCSPのブロックについて

AppleのOCSPレスポンダが停止した時に学んだと思いますが、OCSPリクエストをブロックするにはいくつかの方法があります。最も一般的なのは、Little Snitch4/etc/hostsファイルの編集です。個人的には、重要なセキュリティ機能が動作しなくなるのでお勧めはしません。

さて、実際の事実を知ったところで、この機能によってあなたのプライバシーが危険にさらされているのは、システムで未検出のマルウェアが実行されていることよりも、もっと危険だと思うなら、先に進んでください。そうでなければ、気にしないで下さい。

あなたが、macOS Big Surを使用している場合、OCSPをブロックすることはそれほど簡単ではないかも知れません。しかし、陰謀論を叫ぶ前に、一般的なユーザは一般的に、このような複雑でデリケートなセキュリティ機能を無効にした場合のコンピュータへの影響を完全に理解して評価することができないことに心に留めておいて下さい。

TL;DR

  • いいえ、macOSはアプリを実行するたびにアプリのハッシュをAppleに送信することはありません

  • macOSは、実行しているアプリの開発者証明書に関する曖昧な情報を送信することがあるので注意して下さい。この情報は、ネットワーク上でクリアテキストで送信されます。

  • Little Snitchまたはhostsファイルでocsp.apple.comをブロックしてはいけません
  1. https://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol
  2. https://sneak.berlin/20201112/your-computer-isnt-yours/
  3. https://eclecticlight.co/2020/08/28/how-notarization-works/
  4. https://obdev.at/products/littlesnitch/index.html

Hacker NewsSecurity Embedded