EFAIL

既に概要記事は幾つも出ていますが、以下は詳細の記載された特設サイト[EFAIL](https://efail.de/)の日本語訳です。

# EFAIL

エンドツーエンドの電子メール暗号化技術OpenPGP、およびS/MIMEには、暗号化した電子メールから平文を復号できる脆弱性が存在します。
電子メールは、その経路は部分的に[TLS](https://en.wikipedia.org/wiki/Transport_Layer_Security)によって保護されていますが、基本的には平文の通信媒体です。
敵対環境下に置かれている人々(ジャーナリスト、政治活動家、内部通報者など)にとっては、デジタル通信の機密性は欠かせません。
国家機関など強大な力を持つ組織は、多くの人々の電子メールを盗聴することが知られています。
彼らに対抗するため、[エンドツーエンドの機密通信](https://en.wikipedia.org/wiki/End-to-end_encryption)として[OpenPGP](https://en.wikipedia.org/wiki/Pretty_Good_Privacy)が提供されています。
[S/MIME](https://en.wikipedia.org/wiki/S/MIME)も、主に企業間で使われる電子メールのエンドツーエンド暗号化の標準規格です。

![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/26088/40d78e08-346a-1b36-57bb-fdcb9002a17b.jpeg)

EFAIL攻撃は、OpenPGPおよびS/MIMEの標準実装に存在する脆弱性を悪用し、暗号化した電子メールを平文にしてしまいます。
一言で言うと、外部サイトから読み込む画像やスタイルなどHTMLメールの動的コンテンツを悪用して平文を流出させます。
これらの攻撃を成功させるために、攻撃者はまずネットワークを盗聴したり、メールアカウントやメールサーバやクライアントのPCなどをハックして、復号したい電子メールを回収する必要があります。
メールは何年も前に盗まれている可能性もあります。

![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/26088/2a76d4ed-e856-126b-9e09-343e5d009e91.jpeg)

攻撃者は暗号化された電子メールを特定の方法で改竄し、そのメールを被害者に送信します。
被害者のメールクライアントは、メールを復号して外部コンテンツをロードすることで、平文を攻撃者に送信します。

### Direct Exfiltration

EFAILは2とおりの方法があり、ここではまず"direct exfiltration"について解説します。
こちらはApple Mail、iOS Mail、Mozilla Thunderbirdの脆弱性を悪用して暗号化された電子メールの平文を直接抽出します。
これはメールクライアントをバージョンアップすることで対応が可能です。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/26088/77e12537-00df-f72c-b2cd-1359f1cb5629.png)

攻撃者は、上記のように3個のボディを持つマルチパートメールを作成します。
最初のボディはimgタグを含むHTMLメール本文です。
imgタグのsrc属性が閉じられていないことに注意してください。
2番目のボディにはPGPもしくはS/MIME暗号文が含まれています。
最後のボディはimg閉じタグです。

攻撃者は被害者にこのメールを送信します。
被害者のメールクライアントは暗号化された2番目のボディを復号することで、ボディ全体は以下のように変形されます。
1行目のsrc属性は4行目で閉じられるので、URLは4行全体にまたがることになります。

![04.png](https://qiita-image-store.s3.amazonaws.com/0/26088/762ceb94-1a7e-740c-99b5-88f065bdc06e.png)

メールクライアントは、印刷できない全ての文字をURLエンコードし、そしてそのURLに対して画像をリクエストします。

![05.png](https://qiita-image-store.s3.amazonaws.com/0/26088/e05e4ec8-59a5-04e4-2c6f-c397301d554f.png)

URLには暗号化されていたメール本文の平文が含まれているため、被害者のメールクライアントは攻撃者に平文を送信します。

EFAILの"direct exfiltration"は、暗号化されたPGPおよびS/MIMEに対して機能します。

### The CBC/CFB Gadget Attack

次に、OpenPGPとS/MIMEの仕様上の脆弱性を用いて平文を流出させる、"CBC/CFB gadget attack"について説明します。

以下の図は、S/MIMEにおけるCBC gadgetsの処理を表しています。
[CBC暗号利用モード](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation)では、攻撃者は平文を知っていれば平文ブロックを正確に改竄できます。
S/MIMEで暗号化された電子メールは、通常"Content-type: multipart/signed"で始まるため、攻撃者は少なくともひとつの平文ブロック"a"を知っています。
次に、bのように内容が全て0である正規化平文ブロックも作ることができます。

ブロックのペア、XとC0をCBC gadgetと呼びます。
ステップ"c"では、攻撃者は暗号化された平文にimgタグを突っ込むCBC gadgetを繰り返し追加します。
これによって、被害者がメールを開いたときに平文を密かに取り出す、暗号化されたメールボディを作ることができます。

OpenPGPは[CFB暗号利用モード](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_Feedback_.28CFB.29)を使用するのですが、これはCBCと同じ暗号特性を持っているため、全く同じCFB gadget攻撃を受けてしまいます。

<img width="1222" alt="06.png" src="https://qiita-image-store.s3.amazonaws.com/0/26088/b36e86e0-7c27-b5aa-1fc4-a875d042045c.png">

"direct exfiltration"との違いは、標準に準拠しているクライアントは全て脆弱であることと、各ベンダーは攻撃を防ぐ緩和策を作ることができることです。
長期的には、脆弱性の根本原因に対策する方法を見付け、仕様を変更して標準化する必要があります。

PGPとS/MIMEに対するCBC/CFB gadget攻撃は技術的にはとてもよく似ていますが、攻撃が成功する条件は大きく異なります。
S/MIMEに対する攻撃は簡単です。
攻撃者は、S/MIME暗号化されたメールをひとつ作成して被害者に送り付けることで、大量の(テストでは最大500通)S/MIME暗号を突破することができました。

調査した結果では、PGPに対するCFB gadget攻撃は、試行回数の約1/3しか成功しませんでした。
その理由としては、PGPは暗号化する前に平文の圧縮を行うため、既知の平文を推測することが困難になるためです。
しかし、これはEFAILの仕様的な制限というわけではなく、調査が進めばもっと解読が進むと思われます。

## Mitigations

EFAILを防ぐ策は以下のとおりです。

### Short term: No decryption in email client

短期的にEFAILを防ぐ最善の方法は、メールクライアントを使わずに別の方法でS/MIMEやPGPを復号することです。
まずメールクライアントからS/MIMEとPGP暗号鍵を削除します。
解読できる別のソフトウェアに、メールクライアントから暗号化されたテキストをコピペして復号します。
この方法では、メールクライアントからの漏洩はおこりません。
この方法は、プロセスが複雑になるという欠点はありますが、現時点では最も安全な対策です。

### Short term: Disable HTML rendering

EFAIL攻撃は、主にimgやstyleなどの動的HTMLコンテンツを悪用した攻撃です。
メールクライアントで、受信HTMLメールの表示を無効にすると、EFAIL攻撃の最もよくある手段を止めることができます。
EFAIL攻撃には、HTML以外の攻撃方法もあるにはあるのですが、それらは悪用することがより困難です。

### Medium term: Patching

ベンダーは近いうちに、EFAIL脆弱性を修正するか、悪用を困難にするパッチを提供することでしょう。

### Long term: Update OpenPGP and S/MIME standards

EFAIL攻撃は、[MIME](https://en.wikipedia.org/wiki/MIME)やS/MIME、OpenPGPの仕様上の欠陥や未定義の動作を悪用しています。
従って、最終的には仕様を更新する必要がありますが、これには時間がかかるでしょう。

## Full technical paper

[Efail: Breaking S/MIME and OpenPGP Email Encryption using Exfiltration Channels](https://efail.de/efail-attack-paper.pdf)：PDF

Damian Poddebniak, Christian Dresen, Jens Müller, Fabian Ising, Sebastian Schinzel, Simon Friedberger, Juraj Somorovsky, and Jörg Schwenk.
27th USENIX Security Symposium, Baltimore, August 2018.

チームにコンタクトしたい人はmail@efail.deにメールしてください。

## Questions and Answers

### What is PGP and S/MIME encryption?

PGP・S/MIME暗号化って何？

PGPとS/MIMEは両方とも、電子メールに暗号化のセキュリティを追加します。
攻撃者にメールアカウントへのフルアクセス権を奪われてしまったとしても、これらを使用していれば、電子メール本文の機密性と信頼性を保証することができます。
EFAIL攻撃は、この暗号化セキュリティを突破します。

### What are the EFAIL attacks?

EFAIL攻撃って何？

EFAIL攻撃とは、復号した後の電子メールの平文を攻撃者に送信することによって、PGPとS/MIMEの暗号化を突破します。

### Are there CVEs for EFAIL?

EFAIL攻撃のCVE番号は？

CBC/CFB gadget攻撃には以下のCVEが割り当てられました。

CVE-2017-17688: OpenPGP CFB gadget attacks 
CVE-2017-17689: S/MIME CBC gadget attacks 

多くのベンダーが、EFAILに関連する個別のセキュリティ問題に対してさらに別のCVEを割り当てました。

### Who is affected?

誰が影響を受けますか？

ジャーナリスト、政治活動家、内部告発者など、誰かに自分のメールアカウントにアクセスされるのを恐れる人たちが、主にPGPの暗号化レイヤを使用しています。
EFAIL攻撃は、この暗号化レイヤを破壊します。
これによって、メールアカウントにさえアクセスできる者であれば、PGP暗号化を無視して被害者の電子メールを読むことができます。
主にエンタープライズ分野で使われるS/MIMEについても同じ攻撃が通用します。

### Can you read my emails?

私のメールは読まれますか？

EFAIL攻撃では、S/MIMEもしくはPGPで暗号化された電子メールそのものにはアクセスできる必要があります。
従って、攻撃者が電子メールにアクセスしている場合にのみこの影響を受けます。
しかし、そもそもS/MIMEとPGPの目的そのものが、メール自体にアクセスされてしまった場合に対する保護です。
従って、S/MIMEとPGPに頼っているユーザにとっては、EFAIL攻撃は大きな問題になるでしょう。

### But my emails are TLS encrypted!

私のメールはTLSで暗号化されてるはずです！

TLSはメールクライアントとメールサーバ間、2台のメールサーバ間のネットワーク通信を暗号化するトランスポート層の暗号化技術です。
つまり、サーバやメールクライアント上ではTLSは解除され、メールは平文で処理されることになります。
攻撃者はメールアカウントやメールサーバに侵入して電子メールにアクセスを試みるため、電子メールを読み取り、改竄することができます。
PGPとS/MIMEは、攻撃者が既に電子メールにアクセスできてしまっているときに、電子メールの機密性完全性を保つために使われます。

### Is my email client affected?

私のメールクライアントは影響を受けますか？

我々の調査によると、S/MIMEに対応している35のメールクライアントのうち25個、OpenPGP対応メールクライアント28のうち10個が、EFAILに対して脆弱な状態でした。
これらを確実に修正するためにはOpenPGPとS/MIMEの仕様を修正する必要があります。
Apple Mail、iOS Mail、Mozilla Thunderbirdについてはさらに実装上の欠陥があったため、もっと簡単な方法で平文を抽出することができました。

### Can I find out whether I have already been attacked?

私が攻撃を受けているか確認できますか？

既にEFAIL攻撃を受けているかを確実に調べる方法はありません。
もちろん、受信トレイにあるメールを全て調べることはできます。
閉じていないimgタグの先に暗号化されたコンテンツが続く不正な形式のメール、平文を外部URLに送信するメール等です。
攻撃者は、被害者のいずれかを標的にして、重要なコンテンツを流出させることができます。
攻撃者がメールサーバそのものを制御下に置いているというさらに悪質なシナリオでは、被害者が情報を流出させた後に攻撃者がメールを削除している可能性もあります。

### I don't send HTML emails. Am I safe?

HTMLメールを送信していません。私は安全ですか？

攻撃者は、暗号化されたテキストメールをHTMLメールに改竄することができます。
EFAIL攻撃を防ぐには、HTMLメールの表示を無効にする必要があります。

### I have disabled HTML in my email client. Am I safe?

HTMLメールを無効化しています。私は安全ですか？

場合によります。
S/MIMEとPGPは、全ての受信者と送信者の公開鍵で暗号化されます。
参加者のうち一人でもEFAILに脆弱なユーザがいるのであれば、EFAIL攻撃が可能です。
EFAILを防ぐには、全ての参加者が安全なメールクライアントを使用する必要があります。

### Will signatures prevent these attacks?

署名で攻撃を防げますか？

いいえ。
PGP・S/MIME暗号化メールは、署名がされているか、既存の署名が有効かどうかに関係なくメールを表示します。
署名に問題があったとしても、攻撃者は暗号文を、署名が有効な別の電子メールにコピーして送付することができます。

### Can you decrypt my own encrypted emails when I lost my private key?

秘密鍵を紛失したときに、自分の暗号化された電子メールを復号できますか？

いいえ。
EFAIL攻撃は、秘密鍵を所有し、メールを復号できるメールクライアントを持っている被害者を対象としています。
秘密鍵を紛失した場合は、EFAIL攻撃は暗号化した電子メールを復号することができません。

### Do I need to revoke my certificate or public key?

証明書や公開鍵を取り消す必要がありますか？

いいえ。
EFAIL攻撃は、復号された平文にアクセスします。
秘密鍵に直接アクセスすることはできません。

### I have encrypted data using OpenPGP or S/MIME and I won't decrypt it in the email context. Am I safe?

OpenPGPやS/MIMEを使ってテキストを暗号化していますが、メールには使っていません。私は安全ですか？

現状ではイエス。
我々は調査していませんが、何らかのエッジケースはあるかもしれません。
たとえば、重要なファイルの存在するディレクトリを暗号化した際に、攻撃者が暗号化されたファイルをマルウェアなどの不正なファイルに入れ替えるなどです。
被害者がディレクトリを復号してファイルを開くと、マルウェアやHTMLファイルが平文を流出させたり、システムを乗っ取ったりすることができる可能性があるかもしれません。

### What happens if there are quotes in the encrypted email?

暗号化した電子メールに引用符が含まれるとどうなりますか？

平文に引用符が存在する場合、その部分でURLが打ち切られるため、後ろのテキストが抽出されなかったり、このexploitが全く動作しなくなる可能性があります。
CBC/CFB暗号利用モードの特性上、攻撃者はひとつのS/MIME・PGP暗号文を複数のパートに分割し、それぞれを個別のHTMLタグで抽出することが可能です。
そのパートのうちひとつに引用符が含まれていると、そのパートだけ抽出する情報が欠落します。
しかし、そのような状態でも、攻撃者は平文を全て抽出するように他の技術を使用することができます。

## Responsible Disclosure

我々は[責任ある開示](https://en.wikipedia.org/wiki/Responsible_disclosure)に則り、対策を適用した(もしくは対策中である)ベンダーの調査結果を開示しました。
これらの対策は特定の攻撃に対する修正プログラムであり、追加の攻撃や新たな脆弱性が発見される可能性は除外できません。
さらに、全ての対策が完了したとしても、攻撃者が電子メールの本文を改竄したり、電子メール以外のコンテキストで実行される悪意のあるコードを添付する攻撃に対しては、両仕様とも依然として脆弱です。

我々は2017年11月24日に、GnuPG開発者に対して脆弱性を通知しました。
参考のために、case numbersやCVEが割り振られていればそれも表記します。

S/MIMEクライアントに対する攻撃結果：

![07.png](https://qiita-image-store.s3.amazonaws.com/0/26088/6d5f21bd-9b29-0f8c-4122-a6d659205808.png)

PGPクライアントに対する攻撃結果：

![08.png](https://qiita-image-store.s3.amazonaws.com/0/26088/065bc397-9d21-a7c5-b728-75c44f01804d.png)

Direct exfiltration攻撃

![09.png](https://qiita-image-store.s3.amazonaws.com/0/26088/49e5d56e-38b4-3af3-848c-f1256fb1614f.png)

## Coverage

・電子フロンティア財団：2018年5月13日
[Attention PGP Users: New Vulnerabilities Require You To Take Action Now](https://www.eff.org/deeplinks/2018/05/attention-pgp-users-new-vulnerabilities-require-you-take-action-now)

・Ars Technica：2018年5月14日
[Critical PGP and S/MIME bugs can reveal encrypted e-mails. Uninstall now](https://arstechnica.com/information-technology/2018/05/critical-pgp-and-smime-bugs-can-reveal-encrypted-e-mails-uninstall-now/)

・Golem：2018年5月14日
[PGP und S/MIME abschalten](https://www.golem.de/news/e-mail-verschluesselung-pgp-und-s-mime-abschalten-1805-134359.html)


# 感想

普段からメールを暗号化していない俺大勝利。

PGPなどの暗号化は、道中は暗号化されるので盗聴しても解読できませんが、最終的にメールクライアントで表示するときには当然平文になります。

ということで、"Direct Exfiltration"は、imgタグのsrc要素内に暗号化文字列を書いておけばメールクライアントが勝手に平文に訳した上でHTTPリクエストしてくれる、という非常に単純な仕組みです。
正直誰でもすぐに思いつきそうなレベルなのですが、今まで誰も気付いてなかったのが驚きですね。
もちろん私は全く思いつきませんでした。

"The CBC/CFB Gadget Attack"はもう少しややこしいのですが、CBCやCFBの暗号化は一定のブロック単位で行われているので、ブロックを丸ごと入れ替えることで中身の改竄が可能になる、ということのようです。
わりと重要な"CBC/CFB gadget"の仕組みをいまいち理解してないのでそのへんの訳がふわふわという致命的欠陥があるので誰かがプルリクしてくれるでしょう。

さしあたってはHTMLメールを無効化するだけでほぼ防げるみたいです。
なお、そもそもPGPやS/MIMEを使ってない人には全く関係ない話で、普及率も大して高くないので、ちょっと騒ぎすぎという気がしないでもない。
だってみんな『パスワードは別途送信します』でしょう？

※『パスワードは別途送信します』の場合、メールアカウントを覗かれた時点で全漏洩なのでセキュリティはPGP・S/MIME未満