KOF2014 version〜～誰かの失敗を他⼭山の⽯石に〜～

脆弱性事例例に学ぶセキュアコーディング「SSL/TLS証明書検証」編

JPCERT/CC 情報流流通対策グループ
⼾戸⽥田  洋三  (yozo.toda@jpcert.or.jp)
1自己紹介	JPCERT/CC
情報流流通対策グループ  解析チーム
リードアナリスト    ⼾戸⽥田  洋三
http://www.tomo.gr.jp/root/e9706.html

2

Copyright©2014 JPCERT/CC All rights reserved.

脆弱性情報分析, セキュアコー
ディング普及啓発活動……に努めてますJPCERT/CCとは	JPCERT  Coordination  Center
⽇日本における情報セキュリ
ティ対策活動の向上に取り組んでいる組織

3

Copyright©2014 JPCERT/CC All rights reserved.

JPCERT/CCの主な活動	

4

Copyright©2014 JPCERT/CC All rights reserved.

本⽇日の話題ü SSL/TLS証明書検証って?
ü 証明書検証に関連する脆弱性事例例紹介
ü 脆弱性事例例のポイントおさらいü 参考情報など

5Copyright©2014 JPCERT/CC All rights reserved.

SSL/TLS証明書検証って?
脆弱性事例例
脆弱性事例例ポイントおさらい
参考情報など6Copyright©2014 JPCERT/CC All rights reserved.

SSL/TLS通信⼿手順
SSL/TLS
Transport層の上で暗号化通信路路を実現する仕組み
SSL 3.0 - RFC6101
TLS 1.0 - RFC2246
TLS 1.1 - RFC4346
TLS 1.2 - RFC5246……….
攻撃⼿手法への対策や新たな暗号化スイー
ト追加など, 現在も進化中…
参考: http://ja.wikipedia.org/wiki/Transport_Layer_Security
7Copyright©2014 JPCERT/CC All rights reserved.

SSL/TLS通信⼿手順
SSL/TLS
Transport層の上で暗号化通信路路を実現する仕組み
SSL 3.0 - RFC6101
TLS 1.0 - RFC2246
TLS 1.1 - RFC4346
TLS 1.2 - RFC5246……….

今⽇日はここだけに攻撃⼿手法への対策や新たな暗号化スイー
注⽬目します.
ト追加など, 現在も進化中…

参考: http://ja.wikipedia.org/wiki/Transport_Layer_Security
8

Copyright©2014 JPCERT/CC All rights reserved.

サーバ証明書って?
•サーバの公開鍵とサーバのドメイン名がはいっている  (https で使う場合)•とある  CA (認証局)が, ドメイン名と公開鍵の関係を確認してくれたもの•ITU-T規格 X.509 で決められているものを流流⽤用•RFC5280, RFC6818•Web ブラウザなどでは, 信頼する  CA のオレオレ証明書をあらかじめ持っておく9

Copyright©2014 JPCERT/CC All rights reserved.

証明書の検証には2つの処理理が含まれている•受け取ったサーバ証明書が, 信頼する  CA を起点として正しく作られたものであることを確認する•⇒証明書検証•信頼できるサーバ証明書が持っているサーバ名がアクセスしようとしているサーバ名と⼀一致することを確認する•⇒ホスト名検証

10

Copyright©2014 JPCERT/CC All rights reserved.

X.509 v3 証明書の構造

https://www.ipa.go.jp/security/pki/033.html
11

Copyright©2014 JPCERT/CC All rights reserved.

X.509 v3 証明書の構造
この証明書をつくった  CAの情報

https://www.ipa.go.jp/security/pki/033.html
12

Copyright©2014 JPCERT/CC All rights reserved.

X.509 v3 証明書の構造

サーバのドメイン名が収められている場所(拡張フィールドのsubjectAltNameと  必須フィールドのsubject)https://www.ipa.go.jp/security/pki/033.html
13Copyright©2014 JPCERT/CC All rights reserved.

X.509 証明書検証
lASN.1 データ構造として正しく読めるか?
lCAによる署名は正しくなされているか?
l有効期限は切切れていないか?
l失効されていないか?

l証明書チェーンをたどって信頼している(CAの)証明書に辿りつけるか?
RFC5280: Internet X.509 Public Key Infrastructure Certificate andCertificate Revocation List (CRL) Profile
6. Certification Path Validation
http://tools.ietf.org/html/rfc5280#section-6
Certification path validation algorithm
http://en.wikipedia.org/wiki/Certification_path_validation_algorithm
14

Copyright©2014 JPCERT/CC All rights reserved.

証明書チェーンの検証処理理https://security.stackexchange.com/questions/56389/ssl-certificateframework-101-how-does-the-browser-actually-verify-the-validity
15

Copyright©2014 JPCERT/CC All rights reserved.

ホスト名検証lアクセスしようとしているサーバ名(ドメイン名)とサーバ証明書に⽰示されているサーバ名が⼀一致するか?
lサーバ証明書に  subjectAltName が含まれている場合はそれを使うこと
l⼀一致するかどうかの検証アルゴリズムは証明書検証で使うアルゴリズムと同じ
RFC2818: HTTP Over TLS
3.1. Server Identity
http://tools.ietf.org/html/rfc2818#section-3.1
RFC5280: Internet X.509 Public Key Infrastructure Certificate andCertificate Revocation List (CRL) Profile
7. Processing Rules for Internationalized Names
http://tools.ietf.org/html/rfc5280#section-7
16

Copyright©2014 JPCERT/CC All rights reserved.

SSL/TLS証明書検証って?
脆弱性事例例
脆弱性事例例ポイントおさらい
参考情報など17

Copyright©2014 JPCERT/CC All rights reserved.

証明書の検証不不備
jvn.jp の掲載事例例で「証明書の検証不不備」を拾拾い出してみると… (2013年年以降降)JVN#27388160: Android 版  「スマ保」における  SSL/TLS サーバ証明書の検証不不備の脆弱性
JVN#48270605: Yahoo!ボックス(Android版) における  SSL サーバ証明書の検証不不備の脆弱性
JVN#04560253: Android 版アプリ「ゆこゆこ」における  SSL サーバ証明書の検証不不備の脆弱性
JVN#17637243: Android 版アプリ  Kindle における  SSL サーバ証明書の検証不不備の脆弱性
JVN#27702217: Android 版  Ameba における  SSL サーバ証明書の検証不不備の脆弱性
JVN#72950786: Android 版  Outlook.com における  SSL サーバ証明書の検証不不備の脆弱性
JVN#10603428: Android 版アプリ「JR東⽇日本アプリ」における  SSL サーバ証明書の検証不不備の脆弱性
JVN#16263849: Android 版アプリ「出前館」における  SSL サーバ証明書の検証不不備の脆弱性
JVN#48810179: Android 版アプリ「デニーズ」における  SSL サーバ証明書の検証不不備の脆弱性
JVN#97810280: KDrive個⼈人版  PCクライアントソフトにおける  SSL サーバ証明書の検証不不備の脆弱性
JVN#75084836: Android 版  Yahoo!ショッピングにおける  SSL サーバ証明書の検証不不備の脆弱性
JVN#68156832: ヤフオク! における  SSL サーバ証明書の検証不不備の脆弱性
JVN#39218538: Android 版  ピザハット公式アプリ 　宅宅配ピザのPizzaHut における  SSL サーバ証明書の検証不不備の脆弱性
JVN#85812843: FileMaker Pro における  SSL サーバ証明書の検証不不備の脆弱性
JVNVU#389795: Windows Phone 7 に  SSL サーバ証明書の検証不不備の脆弱性
JVN#39707339: Opera における  SSL サーバ証明書の検証不不備の脆弱性
JVN#82029095: spモードメールアプリにおける  SSL サーバ証明書の検証不不備の脆弱性

Android アプリでよく報告されてます.
(もちろん他の実⾏行行環境の例例もあり)
参考
SSL/TLS ではなく  IPsec での例例もあり: CVE-2013-1028
Apple OS X v10.8.5 and Security Update 2013-004
18

Copyright©2014 JPCERT/CC All rights reserved.

某宅宅配ピザアプリにおけるSSL証明書検証不不備の脆弱性

通信の盗聴や改ざんにアプリユーザがきづけない宅宅配ピザのデリバリーを予約したり注⽂文したりできるアプリ。

https://jvn.jp/jp/JVN39218538/index.html
https://play.google.com/store/apps/details?id=jp.pizzahut.aorder
19

Copyright©2014 JPCERT/CC All rights reserved.

通信にはユーザの⽒氏名、住所、メールアドレスなどの情報が含まれる

攻撃のシナリオ
1. ウェブサーバにSSL/TLS接続を要求

攻撃者

宅宅配ピザアプリ

なりすまし
不不正なサーバ証明書

被害者

20

3. 警告を出さずに接続してしまう

Copyright©2014 JPCERT/CC All rights reserved.

2. 不不正なサーバ
証明書を返す脆弱性の原因
jp/pizzahut/aorder/data/DataUtil.java	  public	  static	  HttpClient	  getNewHttpClient()	  {	  	  	  	  	  DefaultHttpClient	  v6;	  	  	  	  	  try	  {	  	  	  	  	  	  	  	  KeyStore	  v5	  =	  KeyStore.getInstance(KeyStore.getDefaultType());	  	  	  	  	  	  	  	  v5.load(null,	  null);	  	  	  	  	  	  	  	  MySSLSocketFactory	  mySSLScoket	  =	  new	  MySSLSocketFactory(v5);	  	  	  	  	  	  	  	  if(PizzaHutDefineRelease.sAllowAllSSL)	  {	  	  	  	  	  	  	  	  	  	  	  ((SSLSocketFactory)mySSLScoket).setHostnameVerifier	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  (SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);	  	  	  	  	  	  	  	  }	  	  	  	  	  	  	  	  	  BasicHttpParams	  v2	  =	  new	  BasicHttpParams();	  	  	  	  	  	  	  	  HttpConnectionParams.setConnectionTimeout(((HttpParams)v2),	  30000);	  	  	  	  	  	  	  	  ...	  	  	  	  	  }	  	  	  	  	  catch(Exception	  v1)	  {	  	  	  	  	  	  	  	  v6	  =	  new	  DefaultHttpClient();	  	  	  	  	  }	  	  	  	  	  return	  ((HttpClient)v6);	  }	  21Copyright©2014 JPCERT/CC All rights reserved.

脆弱性の原因
jp/pizzahut/aorder/data/DataUtil.java	  public	  static	  HttpClient	  getNewHttpClient()	  {	  	  	  	  	  DefaultHttpClient	  v6;	  	  	  	  	  try	  {	  	  	  	  	  	  	  	  KeyStore	  v5	  =	  KeyStore.getInstance(KeyStore.getDefaultType());	  	  	  	  	  	  	  	  v5.load(null,	  null);	  	  	  	  	  	  	  	  MySSLSocketFactory	  mySSLScoket	  =	  new	  MySSLSocketFactory(v5);	  	  	  	  	  	  	  	  if(PizzaHutDefineRelease.sAllowAllSSL)	  {	  	  	  	  	  	  	  	  	  	  	  ((SSLSocketFactory)mySSLScoket).setHostnameVerifier	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  (SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);	  	  	  	  	  	  	  	  }	  	  	  	  	  	  	  	  	  BasicHttpParams	  v2	  =	  new	  BasicHttpParams();	  	  	  	  	  	  	  	  HttpConnectionParams.setConnectionTimeout(((HttpParams)v2),	  30000);	  	  	  	  	  	  	  	  ...	  	  	  	  	  }	  	  	  	  	  catch(Exception	  v1)	  {	  	  	  	  	  	  	  	  v6	  =	  new	  DefaultHttpClient();	  	  	  	  	  }	  	  	  	  	  return	  ((HttpClient)v6);	  }	  ホスト名検証を無効にしている!

22Copyright©2014 JPCERT/CC All rights reserved.

他の脆弱なパターン
空っぽの  HostnameVeriﬁer
HostnameVerifier	  hv	  =	  new	  HostnameVerifier()	  {	  	  	  	  @Override	  	  	  	  public	  boolean	  verify(String	  hostname,	  SSLSession	  session)	  {	  	  	  	  	  	  	  //  常に  true  を返す  →  どんなホスト名でも受付ける
return	  true;	  	  	  	  	  }	  };	  	  空っぽの  TrustManager
TrustManager	  tm	  =	  new	  X509TrustManager()	  {	  	  	  	  @Override	  	  	  	  public	  void	  checkClientTrusted(X509Certificate[]	  chain,	  	  	  	  	  	  	  	  	  	  	  	  	  String	  authType)	  throws	  CertificateException	  {	  	  	  	  	  	  	  //	  何もしない  →  どんな証明書でも受付ける  	  	  	  }	  	  	  	  	  @Override	  	  	  	  public	  void	  checkServerTrusted(X509Certificate[]	  chain,	  	  	  	  	  	  	  	  	  	  	  	  	  String	  authType)	  throws	  CertificateException	  {	  	  	  	  	  	  	  //	  何もしない  →  どんな証明書でも受付ける  	  	  	  }	  	  	  	  	  @Override	  	  	  	  public	  X509Certificate[]	  getAcceptedIssuers()	  {	  	  	  	  	  	  	  return	  null;	  	  	  	  }	  };	  23Copyright©2014 JPCERT/CC All rights reserved.

Androidアプリの25%は脆弱なHTTPSを実装

アプリの4つに1つは脆弱なHTTPS実装を抱えている

Androidアプリ脆弱性調査レポート  2013年年10⽉月版
http://www.sonydna.com/sdna/solution/android_̲vulnerability_̲report_̲201310.pdf
24

Copyright©2014 JPCERT/CC All rights reserved.

脆弱なHTTPS実装の原因

Androidアプリ脆弱性調査レポート  2013年年10⽉月版
http://www.sonydna.com/sdna/solution/android_̲vulnerability_̲report_̲201310.pdf
25

Copyright©2014 JPCERT/CC All rights reserved.

ホスト名検証不不備: CVE-2013-4073 Ruby
OpenSSL クライアントにおけるホスト名検証バイパス脆
弱性  (CVE-2013-4073)
https://www.ruby-lang.org/ja/news/2013/06/27/hostname-check-bypassing-vulnerability-in-openssl-clientcve-2013-4073/“Rubyの  SSL クライアントはホストネームが⼀一意であることをチェックする機構を持っていますが、  その機構は  null バイト⽂文字が含まれている証明書のホストネームを適切切に処理理することができません。”

26

Copyright©2014 JPCERT/CC All rights reserved.

ホスト名検証不不備: CVE-2014-3577 Apache HttpComponents
CVE-2014-3577 Apche HttpComponents client:
Hostname verification susceptible to MITM attack
http://seclists.org/fulldisclosure/2014/Aug/48
類似事例例: CVE-2012-6153, CVE-2012-5783“Apache HttpComponents … may be susceptible
to a 'Man in the Middle Attack' due to a flaw in the default
hostname verification during SSL/TLS when a speciallycrafted server side certificate is used.”“a (crafted) DN with a O field such as
O="foo,CN=www.apache.orgâand ...... ordered such that the O appears prior to the CN field would
incorrectly match on the <www.apache.org> ..."
27

Copyright©2014 JPCERT/CC All rights reserved.

証明書チェーン検証不不備: Fake ID
Android Fake ID Vulnerability Lets Malware
Impersonate Trusted Applications, Puts All
Android Users Since January 2010 At Risk
https://bluebox.com/technical/android-fake-id-vulnerability/

Presented at BlackHat 2014 USA
ANDROID FAKEID VULNERABILITY WALKTHROUGH
https://www.blackhat.com/us-14/archives.html#android-fakeid-vulnerability-walkthroughAndroid OS のアプリ署名に関する脆弱性

28

Copyright©2014 JPCERT/CC All rights reserved.

証明書チェーン検証不不備: Fake ID
lAndroid  アプリには電⼦子署名がつけられているlAndroid OS はアプリインストール時に電⼦子署名を確認lSSL/TLSにおけるサーバ証明書検証と同等の処理理
l電⼦子署名を確認するコードは Apache Harmony 由来のもの
l証明書チェーンの確認に問題あり
Subject/Issuer の⽂文字列列としての⼀一致のみを確認し, 署名の確認を⾏行行っていなかった!!
“there is a conspicuous absence of cryptographic
verification of any issuer cert claims, instead defaulting
to simple subjectDN to issuerDN string matching.”
29

Copyright©2014 JPCERT/CC All rights reserved.

BlackHat2014での発表資料料から
30

Copyright©2014 JPCERT/CC All rights reserved.

証明書チェーン検証不不備: Apple iOS
TWSL2011-007: iOS SSL Implementation Does Not Validate
Certificate Chain
http://blog.spiderlabs.com/2011/07/twsl2011-007-ios-ssl-implementationdoes-not-validate-certificate-chain.html
https://www3.trustwave.com/spiderlabs/advisories/TWSL2011-007.txt“iOS's SSL certificate parsing contains a flaw where it fails
to check the basicConstraints parameter of certificatesin the chain.”

証明書チェーンのなかに「CA ではない」という属性の証明書があっても, エラーにしていなかった31

Copyright©2014 JPCERT/CC All rights reserved.

ACM CCS 2012
Why Eve and Mallory Love Android: An Analysis ofAndroid SSL (In)Security
http://www2.dcsec.uni-hannover.de/files/android/p50-fahl.pdf

The Most Dangerous Code in the World: Validating SSL
Certificates in Non-Browser Software
https://crypto.stanford.edu/~dabo/pubs/abstracts/ssl-client-bugs.html

多くのアプリが  SSL/TLS ライブラリを誤⽤用している!!
- 証明書検証を無効にしてしまう- ホスト名検証を無効にしてしまう-……
32

Copyright©2014 JPCERT/CC All rights reserved.

ACM CCS 2013
Rethinking SSL Development in an Appified World
http://android-ssl.org/files/p49.pdf

SSL/TLS関連の脆弱性の発⽣生原因を探る-

33

開発者の理理解不不⾜足開発中の⼀一時的な設定のままリリース
ユーザからの要望

Copyright©2014 JPCERT/CC All rights reserved.

SSL/TLS証明書検証って?
脆弱性事例例
脆弱性事例例ポイントおさらい
参考情報など34

Copyright©2014 JPCERT/CC All rights reserved.

ポイント1: 証明書を検証する
SSL/TLS  通信を⾏行行うならちゃんと証明書を検証しましょう
動作テストで検証を無効にしたのをそのまま公開、なんてダメよ
Java/Androidの場合
̶—SSLException  は無視しない̶—TrustManager  を独⾃自実装しない
̶—HostnameVeriﬁer  を独⾃自実装しない

35

Copyright©2014 JPCERT/CC All rights reserved.

ポイント2: 証明書チェーンとホスト名検証に注意
ライブラリなどで提供されている場合には下⼿手にカスタマイズせずにそのまま使おう
⾃自前で実装しなければならない場合は…

̶—仕様をしっかり読み込む
̶—動作テストもしっかりとね̶—既存の脆弱性事例例を参考にして細⼯工された証明書でも正しく動作するように注意する

36

Copyright©2014 JPCERT/CC All rights reserved.

参考: Proxy で動作検証•Proxy 経由で通信させることで, 証明書の検証処理理を確認できる•有名どころとしては Burp proxy, dsniff, Fiddler など•これらのプロキシでは https 通信に対して⾃自⼰己署名証明書を提⽰示したり, あらかじめ設定しておいた証明書を提⽰示したりといった動作が可能•信頼できない証明書(オレオレ証明書など)•ホスト名検証•有効期限切切れ•失効済み証明書

37

Copyright©2014 JPCERT/CC All rights reserved.

SSL/TLS証明書検証って?
脆弱性事例例
脆弱性事例例ポイントおさらい
参考情報など38

Copyright©2014 JPCERT/CC All rights reserved.

参考書籍
lマスタリングTCP/IP SSL/TLS編

lhttp://shop.ohmsha.co.jp/shop/shopdetail.html?
brandcode=000000001666&search=4-274-06542-1

lBulletproof SSL and TLSlhttps://www.feistyduck.com/books/bulletproof-ssland-tls/

39

Copyright©2014 JPCERT/CC All rights reserved.

参考情報lIPA: PKI 関連技術情報lhttps://www.ipa.go.jp/security/pki/index.htmllIntroduction to Public-Key Cryptographylhttps://developer.mozilla.org/en-US/docs/Introduction_to_Public-Key_CryptographylExciting Updates to Certificate Verification in Geckolhttps://blog.mozilla.org/security/2014/04/24/exciting-updates-to-certificate-verification-in-gecko/lJNSA PKI DaylPKI Day 2014 (http://www.jnsa.org/seminar/pki-day/2014/)l⼀一般社団法⼈人⽇日本スマートフォンセキュリティ協会『Androidアプリのセキュア設計・セキュアコーディングガイド』
lhttps://www.jssec.org/report/securecoding.html
lSSL/TLSライブラリの正しい使い⽅方(もしくは、コモンネームの検証について)lhttp://blog.kazuhooku.com/2014/01/ssltls.htmllAndroid Pinning by Moxie Marlinspikelhttps://github.com/moxie0/AndroidPinning40

Copyright©2014 JPCERT/CC All rights reserved.

References
SSL Vulnerabilities: Who listens when Android applications
talk?
—http://www.fireeye.com/blog/technical/2014/08/sslvulnerabilities-who-listens-when-android-applicationstalk.html

Defeating SSL Certificate Validation for AndroidApplications—https://secure.mcafee.com/us/resources/white-papers/wpdefeating-ssl-cert-validation.pdf

OnionKit by Android Library Project for Multi-Layer Network
Connections (Better TLS/SSL and Tor)
—https://github.com/guardianproject/OnionKit

CERT/CC Vulnerability Note VU#582497: Multiple Android
applications fail to properly validate SSL certificates—https://www.kb.cert.org/vuls/id/582497
41

Copyright©2014 JPCERT/CC All rights reserved.

付録

セキュアコーディングスタンダード

42

Copyright©2014 JPCERT/CC All rights reserved.

セキュアコーディングスタンダード
⽶米国  CMU/SEI の  the CERT Secure Coding Initiativeによるコーディングスタンダードシリーズ
https://www.securecoding.cert.org/

いまのところ,4種類公開されています.

43

Copyright©2014 JPCERT/CC All rights reserved.

C セキュアコーディングスタンダード

JPCERT/CC で⽇日本語公開中!!
https://www.jpcert.or.jp/sc-rules/

CERT C セキュアコーディングスタンダード紹介
https://www.jpcert.or.jp/research/materials.html#secure

44

Copyright©2014 JPCERT/CC All rights reserved.

Java セキュアコーディングスタンダード

JPCERT/CC で⽇日本語公開中!!
https://www.jpcert.or.jp/java-rules/

OSC2011@Nagoya でも紹介してます
http://www.ospn.jp/osc2011-nagoya/pdf/
osc2011nagoya-JPCERT_CC.pdf

45

Copyright©2014 JPCERT/CC All rights reserved.

セキュアコーディングスタンダード(C++, Perl)“under development”
(開発中)
46

Copyright©2014 JPCERT/CC All rights reserved.

⼀一般社団法⼈人JPCERTコーディネーションセンター        (https://www.jpcert.or.jp/)
セキュアコーディング        (https://www.jpcert.or.jp/securecoding/)
お問い合わせはこちらにどうぞ…
        (secure-‐‑‒coding@jpcert.or.jp)

47

Copyright©2014 JPCERT/CC All rights reserved.