iOS15メールプライバシー保護機能という闇への防衛術


# iOSのメールプライバシー保護機能が闇動作なので紹介したい

iOS15(2021/9/21リリース)では、メールプライバシー保護機能(MPP - Mail Privacy Protection)なる機能が導入されました（iPadOSやMacOSも同様に導入）。標準メールアプリが対象で、iOS15で標準メールアプリを起動するとこんな画面が出てきます（画像はiPadOS15ですが）。見たことある方、多いのではないでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314396/2f95b563-6e8a-0e85-7c9f-e5b59773de2f.png)

この機能に関するAppleさんの説明は [iPhoneでメールプライバシー保護を使用する](https://support.apple.com/ja-jp/guide/iphone/iphf084865c7/ios) にあり、

1. 送信者に対しIPアドレスが隠されること
1. メールが開かれたかどうか送信者は確認できなくなること

が謳われています。

この実現方法を調べたら驚きの挙動でして、 **いままでITPの謎動作とかを対岸の火事だと思って眺めていたらメールの方にもやってきたわ** 、という気分になったので紹介してみようと思います。

# （予備知識）送信者のメール計測とは

現在、多くのサイトで計測のタグ（Google Analytics、Adobe Campaign など）があって、ページのアクセス数やどんなブラウザが多いかなどを取得します。おなじように、HTMLメールでも開封の計測タグがあって、HTML中の先頭や末尾に

```html
<img src="https://送信するシステムの開封計測用ホスト名/path/メールの種類を表すID＋ユーザーID.gif" width="1" height="1">
```

みたいなタグがあります（メールの種類を表すID＋ユーザーIDは難読化や暗号化されている場合が多い）。
※HTMLメールではJavaScriptもCookieも不可なのでこんなタグになる。

受信者がメールを開くとき、画像の読み込みをONにしていれば、メールの中にあるバナーの画像と一緒に、上記のタグから開封計測用ホストへアクセスが行われます。開封計測用ホストでは、そのアクセスより

1. 受信者がメールを開いたかどうか（パスの中にユーザーIDがあるので分かる）
1. 受信者がメールを開いた時間（アクセス時間）
1. 受信者がメールを開いたときのUserAgent＝環境（WindowsかiPhoneかAndroidか……）。WEBメールならそのブラウザのUA、メールアプリならアプリが使用するレンダリングを提供するブラウザのUA
1. 受信者がメールを開いたときのIPアドレス。IPアドレスからおおむねの場所（あまり日本ではあてにならない）。

がわかります。これを送信者は取得します。

「そのようなものを取得するからAppleはメールプライバシー保護機能でそこを塞いできたのだ」と思うかもしれませんが、これら取得したデータは全部ファーストパーティーです。**「サイトを作って、PCとスマホの比率をUA見て調べようとしていたら、なぜかApple製品だけUA見てもPCかスマホかわからないので、サイトの改善に困る」みたいなこと起きたら、世界中のWebサイト屋さんが泣くと思うんですけど、iOS(iPhone)を始めるとするApple製品のメールでは、そういうことがすでに起きたというのもなかなか闇**です。

---------------------------------------

では、メールプライバシー保護機能の動作についてです。

# なんだその多段プロキシ

メールプライバシー保護機能の導入前までは、iOS標準メールアプリでHTMLメールの画像を開くと、iOS標準メールアプリが直接、画像のあるホストへHTTP(S)で画像を取得していました。これだと、送信者側はメールを開いたときの受信者のIPアドレスが分かります。サイトの利用者がサイトにアクセスしたらサイト提供者にIPアドレスが判明する、のと同じです。

これが、メールプライバシー保護機能が有効なiOSでは

1. iPhoneから1つめのCDNへ画像を取得
1. 1つめのCDNから2つめのCDNへ画像を取得
1. 2つめのCDNから画像のあるホストへHTTP(S)で画像を取得

と多段プロキシで構成されています。Appleさんの [メールプライバシー保護とプライバシー](https://www.apple.com/jp/legal/privacy/data/ja/mail-privacy-protection/) でもそのように書かれていますし、通信先をiPhoneや画像アクセスされる側から見てもこの通りでした。CDNは cloudflare、Fastly あたりを併用して使っているようです。 

**多段プロキシ……って、IPアドレスがバレたらまずい、と考える中二病のアイテムかと思っていたら、令和の世になって手元のiPhoneでそんな動作をしてるとはなかなか闇です。**

これにより、送信者が受信者のIPアドレスを取得できなくなりました（アクセス元IPは2つめのCDNなため）。ただ、日本だと受信者のIPアドレスほぼ使いません。使用されるのはアメリカのような時差のある国で、この受信者はどのタイムゾーンなの？何時に送ったらいいの？を判別するためが多いです。

# なんだそのUserAgent

この多段プロキシ経由の画像取得時、**UserAgent は「Mozilla/5.0」という謎UA**でやってきます。メールプライバシー保護機能が有効なiOS・iPadOS・MacOS ぜんぶこれです。
たしかに iOS などのバージョンは分からなくなりましたが、「Mozilla/5.0」というUAでアクセスしてくるのは、このメールプライバシー保護機能が有効なiOS・iPadOS・Mac OSくらいなもので、逆に送信側に対して「この受信者はメールプライバシー保護機能が有効で、たぶんiOSだな（※iOS・iPadOS・MacOS だと圧倒的にiOSが多いから）」と開示する結果になっています。微妙な結果です。

# なんだその頻度とタイミング

このメールプライバシー保護機能、「メールが開かれたかどうか送信者は確認できなくなること」が謳われています。どのように実現しているかというと、**開封の計測タグを含めたHTMLメールにあるすべての画像を、受信者の行動によらず自動で（というか勝手に）iPhoneが取得する ⇒ 結果、送信者は開封計測用の画像へのアクセスが「受信者の行動によるもの」「iPhoneの自動的なアクセスによるもの」どっちか分からなくなるので、送信者は受信者が開封しかたどうか分からなくなる。**というロジックで行われています。

その自動で（というか勝手に）iPhoneがHTMLメール中の画像を取得する頻度やタイミング、最初は「受信者に届いた際に必ず」だと思っていたのですが、リリース後に試したところ

* 頻度：必ずではなく半分よりずっと少なくランダムに（なのである受信者の開封画像へのアクセスを累積したら、開封される方がどうか傾向は分かる）
* タイミング：（どうやら）標準メールアプリを受信者が操作していてメールを見ていたり書いてたりしているとき、バックグラウンドで別メールの画像をランダムに取得しに行く

という傾向でした。「神はサイコロを振らない」とアインシュタインが量子力学を批判したのは有名ですが、iPhoneはサイコロを振って画像へのアクセスを行ったり行わなかったりします。プライバシーのためにこのような動作をしていると思うのですが、**「メールを読んでたら、なぜかそのときに関係ない別のメールの画像を取得している」というバッググラウンドでふつうのユーザーに意味不明な動作を作りこむところ、Apple製品っぽくて闇**です。

※[新しいiPhoneにデータ移行するとプライベートアドレスも移植される厄介な仕様があった「一般人がこの原因にたどり着けるわけがない」](https://togetter.com/li/1808842) 、はプライバシーという目的のために意味不明な動作をする、という点でよく似ている。

---------------------------------------

というわけで、iOSのメールプライバシー保護機能が闇動作を紹介してみました。今後も、Appleさんがプライバシーのためにわけわかんない動作を、iOSに持ち込んでくると思うと、少し憂鬱😅です。