Skip to content

Instantly share code, notes, and snippets.

@mala
Last active December 29, 2016 18:02
  • Star 16 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save mala/fad5e0bc8a82a9c0fc9d to your computer and use it in GitHub Desktop.
AFNetworking 2.5.2 以下の脆弱性について

未修正のアプリが数多く残っている状態なので、パブリックな場所での言及には注意して下さい

未修正のアプリが数多く残っている状況ですが、すでに広く情報が公開されており、2.5.2で修正されたという情報が広まると混乱が生じるため広く周知する次第です。

問題と経緯

AFNetworking 2.5.1 にMITM攻撃を許す脆弱性があり、2.5.2で修正された、 と報道されていますが、これは誤りです。

2.5.2では問題が修正されていません。また、2.5.1だけではなく、他の 2.x 系列のバージョンにも脆弱性があります。次のリリースで問題が修正される見込みです

別のサーバー用に発行された証明書でも、エラーを起こさずに正常に通信が成立するという状態です。 過去にも問題が指摘されていましたが、修正されないままリリースされており、2.5.2でも修正されませんでした。

検証方法

httpsキャプチャ機能を備えたデバッグ用のproxyサーバーで、差し替える証明書の情報をいじってください。(そのようなオプションがあります)

  • 端末のルート証明書ストアを追加した状態で、mitmproxyの --no-upstream-cert オプションを使う
  • 信用できる認証局から発行された証明書であるが、接続対象のサーバー向けに発行されたものではない(ホスト名が違う) 状態になる
  • ブラウザ上での通信ではエラー、AFNetworking 2.5.2 や 2.x での通信は正常に成功する、という状態になります
  • https://mitmproxy.org/doc/features/upstreamcerts.html

対策

2015-03-30

  • 早急にリリースする場合は、2.5.2 ではなく、githubのmasterから最新のものを使って下さい。
  • もしくは self.validatesDomainName の箇所を自前で変更して下さい

2015-04-20

情報開示について

2015-03-30

未修正のアプリが多くあり、またAppleの審査によって修正バージョンのリリースが遅れることが予想されるため、 この問題についてしばらくパブリックには言及しません。(影響を受けそうなアプリ製作者に個別に連絡しています)

Minded Security に記事の訂正を要求していますが、いつごろになるかはわかりません。

2015-04-22

https://github.com/AFNetworking/AFNetworking/releases/tag/2.5.3

補足

Alamofire 1.2.0 以下にも証明書検証不備があります

<s>mitmproxy cnコピーするかどうかの処理が変わっていたので最新版だと検証できていなかった。</s>
mitmproxyでの検証手順、transparent proxyとして設定してやらないと host == example.com 等になって正しいCNを返してしまうようなので、
CN検証不備を行うには有効な別サーバ向けの証明書を --cert で指定するか下記のように書き換える
diff --git a/libmproxy/proxy/server.py b/libmproxy/proxy/server.py
index a72f9ab..d390cea 100644
--- a/libmproxy/proxy/server.py
+++ b/libmproxy/proxy/server.py
@@ -257,9 +257,10 @@ class ConnectionHandler:
if self.config.certforward and self.server_conn.ssl_established:
return self.server_conn.cert, self.config.certstore.gen_pkey(self.server_conn.cert), None
else:
- host = self.server_conn.address.host
+ host = "mitmproxy"
sans = []
if self.server_conn.ssl_established and (not self.config.no_upstream_cert):
+ host = self.server_conn.address.host
upstream_cert = self.server_conn.cert
sans.extend(upstream_cert.altnames)
if upstream_cert.cn:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment