プロフェッショナル SSL/TLS 輪
読会
6. 装の実 問題
2017/09/05
Overview
• - プロフェッショナル SSL/TLS
• 6. 実装の問題
– 6.1 証明書の検証における欠陥
– 6.2 乱数生成における欠陥
– 6.3 Heartbleed
– 6.4 FREAK
– 6.5 Logjam
– 6.6 プロトコルダウングレード攻撃
– 6.7 強制切断攻撃
– 6.8 デプロイにおける弱点
• - 実践ハンズオン
Overview
• - プロフェッショナル SSL/TLS
• 6. 実装の問題
– 6.1 証明書の検証における欠陥
– 6.2 乱数生成における欠陥
– 6.3 Heartbleed
– 6.4 FREAK
– 6.5 Logjam
– 6.6 プロトコルダウングレード攻撃
– 6.7 強制切断攻撃
– 6.8 デプロイにおける弱点
• - 実践ハンズオン
6. 実装の問題
• 証明書チェーンのそれぞれに対して確認が必要な項目
• 1. エンドエンティティ ( サーバ ) 証明書が意図したホスト名に対して有効であること
• 2. 証明書チェーンの証明書全て ( エンドエンティティのものを含む ) が下記を満たすこ
と
– いずれも期限切れになっていない
– 署名がいずれも有効である 3. 中間 CA 証明書は場合によってさらに下記の要求を満たす必要が
ある
– 意図したものである場合に、他の証明書に対する署名に使えること
– 他の CA 証明書に対する署名に使えること
– 末端の証明書におけるホスト名の署名に使えること
6.1.1 ライブラリとプラットフォームにおける検証の不備
• Microsoft 社の CryptoAPI(,OpenSSL) における Basic Constaints( 基本制約 ) の
確認に欠陥があった事例 (2002 年 )
• GunTLS における証明書チェーン検証の欠陥
• OpenSSL における DSA および ECDSA の署名検証の欠陥
• iOS 関連の TLS 実装 バグ
• GnuTLS における証明書チェーン検証の欠陥 (2014 年 )
• OpenSSL の ChangeCipherSpec インジェクション攻撃 (2014 年 )
• OpenSSL における証明書チェーン検証の欠陥 (2015 年 )
Microsoft 社の CryptoAPI(,OpenSSL) における Basic Constaints( 基本制
約 ) の確認に欠陥があった事例 (2002 年 )
• 有効なサーバ証明書であればどんなものでもドメイン名などを詐称した証明書に
対する署名に利用でき、その詐称した証明書を信頼されたものにできてしまう可
能性
• 対象
– Microsoft 社の全プラットフォーム
– その他の OS 上で動いている製品
– Konqueror(KDE のデスクトップ環境でデフォルトのブラウザ )
– OpenSSL
• Bound by Moxie Marlingspike in 2002.8
• エクスプロイト sslsniff
GunTLS における証明書チェーン検証の欠陥
• 信頼されていない証明書チェーンの末尾に、どんなものでもいいから信頼された
ルート証明書を追記するだけで、不正な証明書が有効なものとして認識されてし
まうという欠陥。
• 手順
• 1. /etc/hosts に localhost のエイリアスとしてサーバを追加
• 2. アタッチされたファイルを使って以下のコマンドを実行
– $ gnutls-serv --http -p 4433 -a --x509keyfile server.key --x509certfile chain.pem
• 3. GNU TLS クライアントを使ってサーバに接続
– $ gnutls-cli gnutls-cli --x509cafile thawte.pem -p 4433 server
実装
• _gnutls_x509_verify_certificate in x509/verify.c
• http://repo.or.cz/w/gnutls.git?a=commitdiff;h=c154545b8a3df4f7d06c6aa335c18740cbec
f57a
OpenSSL における DSA および ECDSA の署名検証の欠陥
• DSA 署名と ECDSA 署名の欠陥が検出されない。
• 詐称された証明書が有効とみなされる。
• Fix されたコード
– https://bugzilla.redhat.com/attachment.cgi?id=327115&action=diff
– チェックが甘い
iOS 関連の TLS 実装 バグ
• iOS における Basic Constraints( 基本制約 ) の確認に欠陥があった事例 (2011 年 )
– 証明書を下位 CA 証明書として利用してよいかを確認しておらず、どんな末端の証明書
でもあらゆる証明書に対する署名が可能になっていた 4.2.10,4.3.5 より前
• iOS および OS X における接続認証の欠陥 (2014 年 )
– 接続認証のコードにミスがあって、能動的なバグであり、 MITM 攻撃で DHE および ECD
HE の接続が乗っ取られてしまうバグ 6.x,7.xOS X(10.9)TLS ハンドシェイク中のほんの短い
一瞬で起こり、ログにも残らない
GnuTLS における証明書チェーン検証の欠陥 (2014 年 )
• 1. X.509 バージョン 1 形式の証明書が、公開鍵所有者を特定できない任意の中間 CA 証明
書として GnuTLS に扱われてしまうバグ
– https://www.gitorious.org/gnutls/gnutls/commit/b1abfe3d18?p=gnutls:gnutls.git;a=blobdiff;f=lib/x509/
verify.c;h=b916ee51de36eb7854e5a93958e5d92caa767fd8;hp=2b64ab690bf2be20837594beafdb6fe23
8db3cf6;hb=b1abfe3d18;hpb=a49d49d0520fa738c03cb714eb0d8040177108c6
• 2. 不正な証明書が検証プロセスを迂回して有効なものとなってしまうバグ
– https://bugzilla.redhat.com/attachment.cgi?id=867911&action=diff
OpenSSL の ChangeCipherSpec インジェクション攻撃 (2014 年 )
• 通信の両端で OpenSSL が使われている時有効
• ChangeCipherSpec メッセージは、 TLS ハンドシェイク中に双方からネゴシエーション終了
と暗号化への切り替えの合図として使われるのに、ハンドシェイクプロトコルの一部で
はないために認証されない。
• 予測可能なマスターしっくれっとをネゴシエーションするように強制できる。
• https://bugzilla.redhat.com/attachment.cgi?id=901373&action=diff
OpenSSL における証明書チェーン検証の欠陥 (2015 年 )
• 証明書チェーンの検証コードのバグ
• ネットワーク上の攻撃者が末端の証明書を有効な中間 CA 証明書として使える
– https://bugzilla.redhat.com/attachment.cgi?id=1045431&action=diff
– https://bugzilla.redhat.com/attachment.cgi?id=1045432&action=diff
– https://bugzilla.redhat.com/attachment.cgi?id=1045433&action=diff
6.1.2 アプリケーションの検証における欠陥
• セキュリティクリティカルなアプリケーションおよびライブラリの多くで SSL 証明書の
検証が完全に壊れている。
• Amazon EC2 の Java ライブラリおよびそれをベースにしたクラウド用のクライアントすべ
ても!
• ライブラリのデフォルトの安全ではなく、開発者が自分で安全なコードを書かないとい
けないという API の設計がまずい。
• 今はこの論文が言ってることに関しては問題ではなさそうだが (SOAP リクエストに関わ
る SSL 証明書の検証でホスト名検証を省略するという話なので )
• 論文 PDF
– https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUK
Ewjf_4yT6_TVAhVNOrwKHS-ZCrQQFggvMAE&url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.cs.utexas.edu%2F~shmat%2Fs
hmat_ccs12.pdf&usg=AFQjCNGPKl-0ZNPcFUIaE16t6E5OJyki2w
論文引用
• Codehaus XFire is another open-source Java implementation of SOAP
• Both versions of HttpClient rely on SSLSocketFactory for SSL connection establishment but mistak
enly omit hostname verification (Section 4.2).
• SSL vulnerabilities caused by bugs in Web-services middleware are pervasive in Amazon libraries.
Affected software includes Amazon EC2 API Tools Java library, which uses XFire to set up SSL conn
ections to EC2 servers
6.1.2 アプリケーションの検証における欠陥
• 該当箇所の関数の実装
6.1.3 ホスト名の検証における問題
• たいていのクライアントが Null バイトをホスト名の終端とみなすことを利用
• Microsoft 社の CryptoAPI,GnuTL,SNSS ライブラリ ,Firefox,IE etc…
Overview
• - プロフェッショナル SSL/TLS
• 6. 実装の問題
– 6.1 証明書の検証における欠陥
– 6.2 乱数生成における欠陥
– 6.3 Heartbleed
– 6.4 FREAK
– 6.5 Logjam
– 6.6 プロトコルダウングレード攻撃
– 6.7 強制切断攻撃
– 6.8 デプロイにおける弱点
• - 実践ハンズオン
6.2 乱数生成器 (RNG)
• Netscape Navigator における RNG の欠陥 (1994 年 )
• Debian における RNG の欠陥 (2006 年 )
• 組み込みデバイスにおける不十分なエントロピー
Netscape Navigator における RNG の欠陥 (1994 年 )
• ブートからの経過時間をマイクロ秒で表した時間と、 OS におけるプロセス ID および親プロセ
ス ID から単純なアルゴリズムで乱数を生成。条件によっては、数十 bit までのセキュリティレ
ベルに落とし込んで総当りできる。
– Seed を決定する処理
– 鍵生成アルゴリズム
Debian における RNG の欠陥 (2006 年 )
• 間違って暗号処理部分のコメントアウトをしたことで、プロセス ID から得られる補助的
なエントロピーしか残らず 16bit になる。
– https://anonscm.debian.org/viewvc/pkg-openssl/openssl/trunk/rand/md_rand.c?p2=%2Fopenssl%2Ftrunk%2Frand%
=141
組み込みデバイスにおける不十分なエントロピー
• 2002 年 2 月にインターネット上にある RSA および DSA 鍵の品質を調査した結果が発表さ
れたところ、組み込みデバイスで問題が多く見つかった。
– デフォルトの鍵
– エントロピーが低いので鍵が使いまわされた
– 素因数分解可能な鍵
Overview
• - プロフェッショナル SSL/TLS
• 6. 実装の問題
– 6.1 証明書の検証における欠陥
– 6.2 乱数生成における欠陥
– 6.3 Heartbleed
– 6.4 FREAK
– 6.5 Logjam
– 6.6 プロトコルダウングレード攻撃
– 6.7 強制切断攻撃
– 6.8 デプロイにおける弱点
• - 実践ハンズオン
6.3 Heartbleed
• OpenSSL の Heartbeat プロトコルの実装の脆弱性。返信するデータの長さの確認を怠って
いる箇所がコード中にあることが原因で、遠隔からの攻撃者が送信した以上のデータを
引き出せる。
• 1 回の Heartbeet リクエストで、サーバプロセスが含まれるメモリから 64K バイトまでの
データを取り出せるので複数回繰り返すことで、メモリ上にのっかった秘密鍵や SSL/TLS
のセッション鍵、パスワードなどのデータを取り出す。
実装
• https://bugzilla.redhat.com/attachment.cgi?id=883475&action=diff
• a/ssl/d1_both.c
• a/ssl/t1_lib.c
対策
• 対策として、パッチを当てるか、 Heartbeat プロトコルはそもそもそんなに使われていな
いので無効化する。
• OpenSSL の資金難とコードの品質の悪さ
– 「 OpenBSD has started a massive strip-down and cleanup of OpenSSL 」
http://undeadly.org/cgi?action=article&sid=20140415093252
• Heatbleed をきっかけに対策に乗り出した。
Overview
• - プロフェッショナル SSL/TLS
• 6. 実装の問題
– 6.1 証明書の検証における欠陥
– 6.2 乱数生成における欠陥
– 6.3 Heartbleed
– 6.4 FREAK
– 6.5 Logjam
– 6.6 プロトコルダウングレード攻撃
– 6.7 強制切断攻撃
– 6.8 デプロイにおける弱点
• - 実践ハンズオン
6.4 FREAK
• 背景
– 1998 年 9 月までアメリカは強力な暗号技術の輸出を規制していた。
– 秘匿のための暗号処理については 40 ビット。鍵交換については 512 ビットまで。
– 鍵交換の際に、輸出用の暗号スイートをネゴシエーションする際には一時的に弱い RSA 鍵を生
成して ServerKeyExchange メッセージをいれてクライアントに送信
• TLS 実装の欠陥が明白
• ( 引用 : http://d.hatena.ne.jp/jovi0608/20150304/1425461359)
実装
• https://github.com/openssl/openssl/commit/ce325c60c74b0fa784f5872404b722e120e5cab0
悪用の障壁と克服
• 1. メッセージに対する署名は攻撃対象であるサーバの強力な RSA 鍵で暗号化されている
こと
• -> クライアントからの接続をかまえて、クライアントの本物の乱数を攻撃対象のサーバ
への接続にコピー
• 2.TLS のハンドシェイクに干渉して変更を正当化するには適切な Finished メッセージを捏
造しなければならない
• ->Finished メッセージを送る頃には、鍵交換の強度を 512bit まで下げられている。さらに
現実の運用では、接続ごとに新しい鍵を使いまわしている場合があるので時間をかけて
攻撃できる。
Overview
• - プロフェッショナル SSL/TLS
• 6. 実装の問題
– 6.1 証明書の検証における欠陥
– 6.2 乱数生成における欠陥
– 6.3 Heartbleed
– 6.4 FREAK
– 6.5 Logjam
– 6.6 プロトコルダウングレード攻撃
– 6.7 強制切断攻撃
– 6.8 デプロイにおける弱点
• - 実践ハンズオン
6.5 Logjam
• Log は DH 鍵交換の原理として利用されている「一方向の離散対数問
題 (Discrete Logarithm Problem) 」からきている
• 概念的には FREAK 攻撃を模倣したもの
FREAK 攻撃の手法を模倣したもの ( 相違点 )
• サーバが安全でない DH パラメータを使ってしまう場合
– 最も典型的なのはサーバが DHE を含む輸出用暗号スイートを使う場合で鍵長が 512bit に制限
– ただし、多くのサーバではより高速な ECDHE や RSA による鍵交換を採用していて DHE がネゴシ
エーションされる確率は低い。
• DHE 鍵がサーバでキャッシュされている
– Mallory は DHE 鍵を 1 分以内 ( モダンブラウザがハンドシェイクをあきらめるまでのおおよその
時間 , 1)※ にやぶらないと行けないが、キャッシュしていれば話は別
– IIS は一時的な鍵を 2 時間に渡ってキャッシュ。 OpenSSL にはキャッシュする機能があるが、 Apa
che や Nginx 、は利用していない
• クライアント ( ブラウザ ) が弱い DH パラメータを受け入れてしまう
– 鍵交換にふさわしい強度が指定されない ( 強度を決定するのはサーバ )
– DH パラメータのサーバ署名が再送できてしまうプロトコルの弱点 ( 実装による欠陥ではない )
– TLS ではリプレイ攻撃に対する保護が署名の設計に含まれているが、そのための仕組みはクライアントとサー
バの乱数に依存している。問題は、この値を能動的な攻撃者が同期できてしまう。クライアントが申し出た
乱数の値を観察し、別のハンドシェイクで再利用することが可能。この欠陥により、本来であれば選択され
ない暗号スイートのネゴシエーションを攻撃者が強制できる。
安全ではない DHE 鍵交換に対する事前計算攻撃
• DH 鍵交換ではドメインパラメータの同意が必要。 ( 素数 p, 原始根 g)
• Mallory にもこれは分かるが、 DH 鍵交換を破るには、鍵交換の最中に生成される
2 つの秘密鍵の内の一方を見つけ出す必要がある。
• NFS(Number Field Sieve, 数体ふるい法 ) を 2 段階に分割することが可能で、難しい
のは最初の方。しかし、素数 p のみに依存;最初の結果さえ手に入れてしまえ
ば、同じ素数 p を使うあらゆる鍵交換を迅速に発見できる。
• 多くのアプリケーションでは、標準グループ (standard group) と呼ばれる DH パラ
メータを使いまわしている。この標準グループが弱いことが問題。
緩和策
• 輸出用暗号スイートを無効 ( 過去の遺物 )
• 1024 ビットより短い DH パラメータを使わない。
• DH パラメータを単純に 2048 ビットに対応できない場合がある (Java 6 のクライア
ントが 1024 ビットを超える強度に対応していない )
– 1024 ビットの DH パラメータを使い続けながら標準グループを使わないようにする
– DHE を無効にする (RSA 鍵交換は PFS がないのでつかうべきではない。 ECDHE はセキュ
リティ、パフォーマンスで優れている )
Overview
• - プロフェッショナル SSL/TLS
• 6. 実装の問題
– 6.1 証明書の検証における欠陥
– 6.2 乱数生成における欠陥
– 6.3 Heartbleed
– 6.4 FREAK
– 6.5 Logjam
– 6.6 プロトコルダウングレード攻撃
– 6.7 強制切断攻撃
– 6.8 デプロイにおける弱点
• - 実践ハンズオン
6.6 プロトコルダウングレード攻撃
• ハンドシェイク時のパラメータを操作してセキュリティの劣るプロトコルや弱い
暗号スイートを強制する。 SSL2.0 ではハンドシェイクの完全性が保証されないの
で、攻撃が簡単
6.6.1 SSL 3.0 のプロトコルロールバック対策
• SSL2.0 にフォールバックするときに RSA 鍵交換における PKCS#1 のブロックを特別
な形式でフォーマットする。このブロックの末尾に少なくとも 8 ビットを 0x03
で埋める。
• 攻撃を受けた場合このフォーマットを検知して攻撃を察知。
• ただし、マスター鍵で 40 ビットのものを使われると総当りで攻撃するのは簡
単。 (IE6 に期待できるセキュリティ強度 )
6.6.2 相互運用性の問題
• バージョンに対する不寛容
– SSL3.0 では、互換性を崩したが、 SSL2.0 は考慮してなく仕様が曖昧だったので、多くのサーバでは提示された
プロトコルのバージョンが好ましくない場合にハンドシェイクを拒否した。
– Renegotiation Indication という拡張 (RFC 5246 で既に規定されているもの )
– TLS サーバは、クライアントから提示された不明な拡張についてはすべて無視しなければならない
– 自分の最大のバージョン番号より大きなバージョン番号については、受け入れた上で互いに共通する最大のバージョンをネゴ
シエーションしなければならない
• 拡張についての不寛容
– プロトコルの初期のバージョン (SSL3.0 および TLS1.0) のサーバの大部分は、 ClientHello,ServerHello メッセージの
末尾に負荷的なデータを指定してきたクライアントのハンドシェイクを拒否する ( データを含められるが、実
装で、理解出来ない場合は拒否するものになっていた ) 。その後 TLS 拡張に置き換えられた
• 相互運用性に関する他の問題
– 長いハンドシェイクに対する不寛容 : F5 射精の BIG IP ロードバランサで 255 バイト以上 512 バイト未満のハン
ドシェイクメッセージを処理できない
– 任意の拡張に対する不寛容 : 明確な理由なしに未知の拡張を含む接続のネゴシエーションに失敗 (SNI 拡張、 Sta
tus Requesrt 拡張 (OCSP ステープリング ))
– フラグメンテーションの適切な処理の失敗 : SSL の分割したフラグメンテーション以外は拒否。長さが 0 のレ
コードの処理に失敗
6.6.3 プロトコルの自発的なダウングレード
• SSL2.0 はマスター鍵の総当たり攻撃に対して脆弱 (IE6 に期待できるセキュリティは最大で 40 ビット )
• SSL 3.0 は POODLE 攻撃によって安全でないことが判明 (2014 年 10 月 )
– 攻撃者は、 SSL 3.0 を使う暗号化通信において、リクエスト送信を繰り返し試み、暗号化通信の一部を解読する
恐れが発生。また攻撃者は、 TLS / SSL のバージョンをダウングレードさせる可能性がある。
– 32 文字の Cookie の値を取得することを考えると、おおよそ 8,000 回程度のリクエストをクライアントから繰り
返し送らせる必要がある
– http://developers.mobage.jp/blog/poodle
• 他のバージョンも TLS1.2 に比べて以下の点で劣る
– - GCM,SHA256,SHA384 を含む暗号スイートに対応していない
– - 楕円曲線暗号に対応していない ->PFS がない状態 ( 最悪 )
– - SSL3.0 は BEAST 攻撃に脆弱だが、対策はされている。とはいえど、 TLS1.0 より以前のプロトコルで RC4 を使え
てしまうサイトが多い
– - Microsoft 者の SSL3.0 スタックは AES に対応していないので、 IE は RC4 と 3DES の暗号スイートしか提示できな
い
• いずれも対策はされていて過去のこと
6.6.4 TLS1.0 以降のロールバック対策
• - ロールバック保護のために、クライアントから送信される PremMasterSecret のバージョン番号
には、サーバの秘密鍵で保護されるバージョン番号 (ClientHello.client_version の値 ) が追加された
ので、これを利用する。
• - ロールバック保護を新しいクライアントとの間のみで強制するように勧告 (ClientHello.client_ver
sion が TLS 1.1 以上 )
• それでもプロトコルの自発的なダウングレードの挙動で攻撃可能。
6.6.5 プロトコルの自発的なダウングレードを悪用した攻撃
• MITM 攻撃でパラメータを変更しなくても SSL3.0 より大きなバージョンをブロックすれば良い。
• - SCSV(Signaling Cipher Suite Value) 低いバージョンがネゴシエーションされる場合であっても、ク
ライアントが自信の対応している最良のプロトコルを伝達できるような特別なシグナリング ( ク
ライアントは大勢いるので普及に時間がかかる、最終的にはこれが Google の Chrome,Web や Ope
nSSL(1.0.1j),Firefox35 で対応 (POODLE 攻撃対策になる )
• - 暗号スイートのシグナリングを用いてクライアント側で攻撃を検知出来る仕組み (RFC5746 の再
ネゴシーエションを指示するための拡張の仕様 ) 安全なネゴシエーションを実装しながらも新し
いバージョン番号には不寛容であるようなサーバがわずかながらに存在して関心をあまり集めな
い
6.6.6 代的なロ ルバック攻 への防御現 ー 撃
Overview
• - プロフェッショナル SSL/TLS
• 6. 実装の問題
– 6.1 証明書の検証における欠陥
– 6.2 乱数生成における欠陥
– 6.3 Heartbleed
– 6.4 FREAK
– 6.5 Logjam
– 6.6 プロトコルダウングレード攻撃
– 6.7 強制切断攻撃
– 6.8 デプロイにおける弱点
• - 実践ハンズオン
6.7 強制切断攻撃
• 安全なメッセージがきちんと終了する前に、攻撃者によってメッセージの配送がぼうがいされて
しまう攻撃。
• SSL3.0 では close_notify が追加されたが、多くのクライアントやサーバではシャットダウンの手続
きを省略 ( 例 IE)
• SSL3.0 の標準で記載されている。
• TLS1.1 でセッションリザンプションに関する規則緩和でさらに悪化。防御方法は事実上ない。
• 2007 年ぐらいに話題に上がる。
クッキーカッター攻撃
• クッキーカッター攻撃をよりいっそう効果的に
• HTTP のレスポンスヘッダに対する強制切断攻撃
• 任意の長さの HTTP リクエストとレスポンスを挿入することでリクエストヘッダ、レスポンス
ヘッダを分割して、攻撃するきっかけをつくる
– 1. 攻撃対象の Web サイトとの間でまだセッションを確立していない利用者を攻撃する
– 2. HTTP レスポンスに任意のデータを挿入できるエントリーポイントを探す
– 3. レスポンスヘッダを 2 つの TLS レコードに分断するパディングを送信うする
– 4. 1 つめの TLS レコードの後で HTTPS 通信を閉じる
– 5. Secure 属性のないクッキーを抜き出す
• HSTS に対しても有効
• -> - max-age パラメータのさいしょの数字の直後で切り詰められば最大で 9 秒無効。
• - includeSubDomains パラメータを無効
Overview
• - プロフェッショナル SSL/TLS
• 6. 実装の問題
– 6.1 証明書の検証における欠陥
– 6.2 乱数生成における欠陥
– 6.3 Heartbleed
– 6.4 FREAK
– 6.5 Logjam
– 6.6 プロトコルダウングレード攻撃
– 6.7 強制切断攻撃
– 6.8 デプロイにおける弱点
• - 実践ハンズオン
6.8 デプロイにおける弱点
• 6.8.1 仮想ホスト混同
– 証明書を共有しているすべてのサイトでは秘密鍵を共有することになる。弱いサイトを手中に収
めると、クライアントの安全な TLS 接続を乗っ取られる恐れがある。長年放置されてた問題を De
lignant らが 2014 年に論文として、現実のシナリオで悪用する方法や有名な Web サイトになりす
ます方法を紹介。
– https://www.semanticscholar.org/paper/Virtual-Host-Confusion-Weaknesses-and-Exploits-Delignat-Lavaud-Bhargavan/a0e410d945f5
• 6.8.2 TLS セッションキャッシュの共有
– クライアントはいったん RLS セッションを確立したら、本来のサーバとだけでなく、同じセッ
ションキャッシュを共有している他の任意のサーバとの間でもセッションを再開できる。
– セッションチケットでも同様のことがいえるが回避策があり、ホストごとに専用のチケット鍵を
使うのがベストプラクティス
Overview
• - プロフェッショナル SSL/TLS
• 6. 実装の問題
– 6.1 証明書の検証における欠陥
– 6.2 乱数生成における欠陥
– 6.3 Heartbleed
– 6.4 FREAK
– 6.5 Logjam
– 6.6 プロトコルダウングレード攻撃
– 6.7 強制切断攻撃
– 6.8 デプロイにおける弱点
• - 実践ハンズオン
実践ハンズオン
• 2 つの証明書の類似性を利用して、 TLS 通信を解読できる
• http://ksnctf.sweetduet.info/q/33/q33.pcap
Thank you

More Related Content

PDF
Step-Oriented Programming による任意コード実行の可能性
PDF
自動でできるかな?
PDF
大義のために:趣味と実益のためのVMware RPCインターフェースの活用 by アブドゥル・アジズ・ハリリ, ジャシエル・スペルマン, ブライアン・ゴーレンク
PPTX
インサイドShell:.NETハッキング技術を応用したPowerShell可視性の向上 by 丹田 賢
PDF
JNSA電子署名WG勉強会 2013.09.30 jsrsasignとjsjwsについて
PDF
いろいろなSSL/TLS設定ガイドライン (JNSA電子署名WG 実世界の暗号・認証技術勉強会資料)
PPTX
産業制御システムに対するStuxnet以来最大の脅威 by Anton Cherepanov, Róbert Lipovský
PDF
SSL/TLSの基礎と最新動向
Step-Oriented Programming による任意コード実行の可能性
自動でできるかな?
大義のために:趣味と実益のためのVMware RPCインターフェースの活用 by アブドゥル・アジズ・ハリリ, ジャシエル・スペルマン, ブライアン・ゴーレンク
インサイドShell:.NETハッキング技術を応用したPowerShell可視性の向上 by 丹田 賢
JNSA電子署名WG勉強会 2013.09.30 jsrsasignとjsjwsについて
いろいろなSSL/TLS設定ガイドライン (JNSA電子署名WG 実世界の暗号・認証技術勉強会資料)
産業制御システムに対するStuxnet以来最大の脅威 by Anton Cherepanov, Róbert Lipovský
SSL/TLSの基礎と最新動向

What's hot (13)

PDF
【19-C-L】Web開発者ならおさえておきたい「常時SSL/TLS化の実装ポイント」
PDF
HTTP/2, QUIC入門
PPTX
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
PDF
#mailerstudy 02 メールと暗号 - SSL/TLS -
PDF
[CB17] Trueseeing: Effective Dataflow Analysis over Dalvik Opcodes
PPTX
HTTP/2 クライアントのパッシブ・フィンガープリンティング by オリー・シガール
PPTX
VPP事始め
PPTX
コンテナネットワーキング(CNI)最前線
PPTX
ConfD で Linux にNetconfを喋らせてみた
PDF
Javascript で暗号化
PDF
Node-v0.12のTLSを256倍使いこなす方法
PDF
How to apt-get from the internal network: remote sshd with kneesocks
PDF
いまさら聞けないNGINXコンフィグ_F5-NGINX-Community-20200805
【19-C-L】Web開発者ならおさえておきたい「常時SSL/TLS化の実装ポイント」
HTTP/2, QUIC入門
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
#mailerstudy 02 メールと暗号 - SSL/TLS -
[CB17] Trueseeing: Effective Dataflow Analysis over Dalvik Opcodes
HTTP/2 クライアントのパッシブ・フィンガープリンティング by オリー・シガール
VPP事始め
コンテナネットワーキング(CNI)最前線
ConfD で Linux にNetconfを喋らせてみた
Javascript で暗号化
Node-v0.12のTLSを256倍使いこなす方法
How to apt-get from the internal network: remote sshd with kneesocks
いまさら聞けないNGINXコンフィグ_F5-NGINX-Community-20200805
Ad

Similar to Professional SSL/TLS Reading Chapter 6 (20)

PDF
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
PDF
TLS, HTTP/2演習
PDF
qpstudy 2015.11.14 一歩先を行くインフラエンジニアに知ってほしいSSL/TLS
PDF
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
PPTX
エンジニアが知っておくべきSSL/TLSの知識(仮)
PDF
九州ソフトウェアテスト勉強会Vol6
PDF
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
PDF
Ssl証明書を設定したらapacheが起動しない?
PPTX
RFC 7457 Summarizing Known Attacks on Transport Layer Security (TLS) and Dat...
PDF
GPUを用いたSSLリバースプロキシの実装についての論文を読んだ
PDF
プロフェッショナルSSL/TLS 1.2章
PPTX
あんしんなWebサーバーのためのSSL設定
PDF
katagaitai CTF勉強会 #5 Crypto
PDF
脆弱性スキャナVuls(応用編)
PPTX
Heartbleedチェッカの改善(不正アクセスしないような改造)
PDF
『プロフェッショナルSSL/TLS』読書会4章
PDF
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
PPTX
Let's Encryptについて話す【勉強会資料】
PDF
『プロフェッショナルSSL/TLS』読書会5章
PDF
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Lessons (to be) Learned from Handling OpenSSL Vulnerabilities
TLS, HTTP/2演習
qpstudy 2015.11.14 一歩先を行くインフラエンジニアに知ってほしいSSL/TLS
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (KOF2014)
エンジニアが知っておくべきSSL/TLSの知識(仮)
九州ソフトウェアテスト勉強会Vol6
脆弱性事例に学ぶセキュアコーディング「SSL/TLS証明書検証」編 (JavaDayTokyo2015)
Ssl証明書を設定したらapacheが起動しない?
RFC 7457 Summarizing Known Attacks on Transport Layer Security (TLS) and Dat...
GPUを用いたSSLリバースプロキシの実装についての論文を読んだ
プロフェッショナルSSL/TLS 1.2章
あんしんなWebサーバーのためのSSL設定
katagaitai CTF勉強会 #5 Crypto
脆弱性スキャナVuls(応用編)
Heartbleedチェッカの改善(不正アクセスしないような改造)
『プロフェッショナルSSL/TLS』読書会4章
デブサミ2015 事例から学ぶAndroidアプリのセキュアコーディング「SSL/TLS証明書検証の現状と対策」
Let's Encryptについて話す【勉強会資料】
『プロフェッショナルSSL/TLS』読書会5章
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Ad

Recently uploaded (8)

PPTX
Vibe Codingを触って感じた現実について.pptx .
PDF
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
PDF
20250823_IoTLT_vol126_kitazaki_v1___.pdf
PPTX
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
PDF
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ
PDF
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
PDF
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
PDF
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
Vibe Codingを触って感じた現実について.pptx .
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
20250823_IoTLT_vol126_kitazaki_v1___.pdf
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
ココロ分解帳|感情をやさしく分解し自分と他者を理解するためのモバイルノートアプリ
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION

Professional SSL/TLS Reading Chapter 6

  • 2. Overview • - プロフェッショナル SSL/TLS • 6. 実装の問題 – 6.1 証明書の検証における欠陥 – 6.2 乱数生成における欠陥 – 6.3 Heartbleed – 6.4 FREAK – 6.5 Logjam – 6.6 プロトコルダウングレード攻撃 – 6.7 強制切断攻撃 – 6.8 デプロイにおける弱点 • - 実践ハンズオン
  • 3. Overview • - プロフェッショナル SSL/TLS • 6. 実装の問題 – 6.1 証明書の検証における欠陥 – 6.2 乱数生成における欠陥 – 6.3 Heartbleed – 6.4 FREAK – 6.5 Logjam – 6.6 プロトコルダウングレード攻撃 – 6.7 強制切断攻撃 – 6.8 デプロイにおける弱点 • - 実践ハンズオン
  • 4. 6. 実装の問題 • 証明書チェーンのそれぞれに対して確認が必要な項目 • 1. エンドエンティティ ( サーバ ) 証明書が意図したホスト名に対して有効であること • 2. 証明書チェーンの証明書全て ( エンドエンティティのものを含む ) が下記を満たすこ と – いずれも期限切れになっていない – 署名がいずれも有効である 3. 中間 CA 証明書は場合によってさらに下記の要求を満たす必要が ある – 意図したものである場合に、他の証明書に対する署名に使えること – 他の CA 証明書に対する署名に使えること – 末端の証明書におけるホスト名の署名に使えること
  • 5. 6.1.1 ライブラリとプラットフォームにおける検証の不備 • Microsoft 社の CryptoAPI(,OpenSSL) における Basic Constaints( 基本制約 ) の 確認に欠陥があった事例 (2002 年 ) • GunTLS における証明書チェーン検証の欠陥 • OpenSSL における DSA および ECDSA の署名検証の欠陥 • iOS 関連の TLS 実装 バグ • GnuTLS における証明書チェーン検証の欠陥 (2014 年 ) • OpenSSL の ChangeCipherSpec インジェクション攻撃 (2014 年 ) • OpenSSL における証明書チェーン検証の欠陥 (2015 年 )
  • 6. Microsoft 社の CryptoAPI(,OpenSSL) における Basic Constaints( 基本制 約 ) の確認に欠陥があった事例 (2002 年 ) • 有効なサーバ証明書であればどんなものでもドメイン名などを詐称した証明書に 対する署名に利用でき、その詐称した証明書を信頼されたものにできてしまう可 能性 • 対象 – Microsoft 社の全プラットフォーム – その他の OS 上で動いている製品 – Konqueror(KDE のデスクトップ環境でデフォルトのブラウザ ) – OpenSSL • Bound by Moxie Marlingspike in 2002.8 • エクスプロイト sslsniff
  • 7. GunTLS における証明書チェーン検証の欠陥 • 信頼されていない証明書チェーンの末尾に、どんなものでもいいから信頼された ルート証明書を追記するだけで、不正な証明書が有効なものとして認識されてし まうという欠陥。 • 手順 • 1. /etc/hosts に localhost のエイリアスとしてサーバを追加 • 2. アタッチされたファイルを使って以下のコマンドを実行 – $ gnutls-serv --http -p 4433 -a --x509keyfile server.key --x509certfile chain.pem • 3. GNU TLS クライアントを使ってサーバに接続 – $ gnutls-cli gnutls-cli --x509cafile thawte.pem -p 4433 server
  • 8. 実装 • _gnutls_x509_verify_certificate in x509/verify.c • http://repo.or.cz/w/gnutls.git?a=commitdiff;h=c154545b8a3df4f7d06c6aa335c18740cbec f57a
  • 9. OpenSSL における DSA および ECDSA の署名検証の欠陥 • DSA 署名と ECDSA 署名の欠陥が検出されない。 • 詐称された証明書が有効とみなされる。 • Fix されたコード – https://bugzilla.redhat.com/attachment.cgi?id=327115&action=diff – チェックが甘い
  • 10. iOS 関連の TLS 実装 バグ • iOS における Basic Constraints( 基本制約 ) の確認に欠陥があった事例 (2011 年 ) – 証明書を下位 CA 証明書として利用してよいかを確認しておらず、どんな末端の証明書 でもあらゆる証明書に対する署名が可能になっていた 4.2.10,4.3.5 より前 • iOS および OS X における接続認証の欠陥 (2014 年 ) – 接続認証のコードにミスがあって、能動的なバグであり、 MITM 攻撃で DHE および ECD HE の接続が乗っ取られてしまうバグ 6.x,7.xOS X(10.9)TLS ハンドシェイク中のほんの短い 一瞬で起こり、ログにも残らない
  • 11. GnuTLS における証明書チェーン検証の欠陥 (2014 年 ) • 1. X.509 バージョン 1 形式の証明書が、公開鍵所有者を特定できない任意の中間 CA 証明 書として GnuTLS に扱われてしまうバグ – https://www.gitorious.org/gnutls/gnutls/commit/b1abfe3d18?p=gnutls:gnutls.git;a=blobdiff;f=lib/x509/ verify.c;h=b916ee51de36eb7854e5a93958e5d92caa767fd8;hp=2b64ab690bf2be20837594beafdb6fe23 8db3cf6;hb=b1abfe3d18;hpb=a49d49d0520fa738c03cb714eb0d8040177108c6 • 2. 不正な証明書が検証プロセスを迂回して有効なものとなってしまうバグ – https://bugzilla.redhat.com/attachment.cgi?id=867911&action=diff
  • 12. OpenSSL の ChangeCipherSpec インジェクション攻撃 (2014 年 ) • 通信の両端で OpenSSL が使われている時有効 • ChangeCipherSpec メッセージは、 TLS ハンドシェイク中に双方からネゴシエーション終了 と暗号化への切り替えの合図として使われるのに、ハンドシェイクプロトコルの一部で はないために認証されない。 • 予測可能なマスターしっくれっとをネゴシエーションするように強制できる。 • https://bugzilla.redhat.com/attachment.cgi?id=901373&action=diff
  • 13. OpenSSL における証明書チェーン検証の欠陥 (2015 年 ) • 証明書チェーンの検証コードのバグ • ネットワーク上の攻撃者が末端の証明書を有効な中間 CA 証明書として使える – https://bugzilla.redhat.com/attachment.cgi?id=1045431&action=diff – https://bugzilla.redhat.com/attachment.cgi?id=1045432&action=diff – https://bugzilla.redhat.com/attachment.cgi?id=1045433&action=diff
  • 14. 6.1.2 アプリケーションの検証における欠陥 • セキュリティクリティカルなアプリケーションおよびライブラリの多くで SSL 証明書の 検証が完全に壊れている。 • Amazon EC2 の Java ライブラリおよびそれをベースにしたクラウド用のクライアントすべ ても! • ライブラリのデフォルトの安全ではなく、開発者が自分で安全なコードを書かないとい けないという API の設計がまずい。 • 今はこの論文が言ってることに関しては問題ではなさそうだが (SOAP リクエストに関わ る SSL 証明書の検証でホスト名検証を省略するという話なので ) • 論文 PDF – https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUK Ewjf_4yT6_TVAhVNOrwKHS-ZCrQQFggvMAE&url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.cs.utexas.edu%2F~shmat%2Fs hmat_ccs12.pdf&usg=AFQjCNGPKl-0ZNPcFUIaE16t6E5OJyki2w
  • 15. 論文引用 • Codehaus XFire is another open-source Java implementation of SOAP • Both versions of HttpClient rely on SSLSocketFactory for SSL connection establishment but mistak enly omit hostname verification (Section 4.2). • SSL vulnerabilities caused by bugs in Web-services middleware are pervasive in Amazon libraries. Affected software includes Amazon EC2 API Tools Java library, which uses XFire to set up SSL conn ections to EC2 servers
  • 17. 6.1.3 ホスト名の検証における問題 • たいていのクライアントが Null バイトをホスト名の終端とみなすことを利用 • Microsoft 社の CryptoAPI,GnuTL,SNSS ライブラリ ,Firefox,IE etc…
  • 18. Overview • - プロフェッショナル SSL/TLS • 6. 実装の問題 – 6.1 証明書の検証における欠陥 – 6.2 乱数生成における欠陥 – 6.3 Heartbleed – 6.4 FREAK – 6.5 Logjam – 6.6 プロトコルダウングレード攻撃 – 6.7 強制切断攻撃 – 6.8 デプロイにおける弱点 • - 実践ハンズオン
  • 19. 6.2 乱数生成器 (RNG) • Netscape Navigator における RNG の欠陥 (1994 年 ) • Debian における RNG の欠陥 (2006 年 ) • 組み込みデバイスにおける不十分なエントロピー
  • 20. Netscape Navigator における RNG の欠陥 (1994 年 ) • ブートからの経過時間をマイクロ秒で表した時間と、 OS におけるプロセス ID および親プロセ ス ID から単純なアルゴリズムで乱数を生成。条件によっては、数十 bit までのセキュリティレ ベルに落とし込んで総当りできる。 – Seed を決定する処理 – 鍵生成アルゴリズム
  • 21. Debian における RNG の欠陥 (2006 年 ) • 間違って暗号処理部分のコメントアウトをしたことで、プロセス ID から得られる補助的 なエントロピーしか残らず 16bit になる。 – https://anonscm.debian.org/viewvc/pkg-openssl/openssl/trunk/rand/md_rand.c?p2=%2Fopenssl%2Ftrunk%2Frand% =141
  • 22. 組み込みデバイスにおける不十分なエントロピー • 2002 年 2 月にインターネット上にある RSA および DSA 鍵の品質を調査した結果が発表さ れたところ、組み込みデバイスで問題が多く見つかった。 – デフォルトの鍵 – エントロピーが低いので鍵が使いまわされた – 素因数分解可能な鍵
  • 23. Overview • - プロフェッショナル SSL/TLS • 6. 実装の問題 – 6.1 証明書の検証における欠陥 – 6.2 乱数生成における欠陥 – 6.3 Heartbleed – 6.4 FREAK – 6.5 Logjam – 6.6 プロトコルダウングレード攻撃 – 6.7 強制切断攻撃 – 6.8 デプロイにおける弱点 • - 実践ハンズオン
  • 24. 6.3 Heartbleed • OpenSSL の Heartbeat プロトコルの実装の脆弱性。返信するデータの長さの確認を怠って いる箇所がコード中にあることが原因で、遠隔からの攻撃者が送信した以上のデータを 引き出せる。 • 1 回の Heartbeet リクエストで、サーバプロセスが含まれるメモリから 64K バイトまでの データを取り出せるので複数回繰り返すことで、メモリ上にのっかった秘密鍵や SSL/TLS のセッション鍵、パスワードなどのデータを取り出す。
  • 26. 対策 • 対策として、パッチを当てるか、 Heartbeat プロトコルはそもそもそんなに使われていな いので無効化する。 • OpenSSL の資金難とコードの品質の悪さ – 「 OpenBSD has started a massive strip-down and cleanup of OpenSSL 」 http://undeadly.org/cgi?action=article&sid=20140415093252 • Heatbleed をきっかけに対策に乗り出した。
  • 27. Overview • - プロフェッショナル SSL/TLS • 6. 実装の問題 – 6.1 証明書の検証における欠陥 – 6.2 乱数生成における欠陥 – 6.3 Heartbleed – 6.4 FREAK – 6.5 Logjam – 6.6 プロトコルダウングレード攻撃 – 6.7 強制切断攻撃 – 6.8 デプロイにおける弱点 • - 実践ハンズオン
  • 28. 6.4 FREAK • 背景 – 1998 年 9 月までアメリカは強力な暗号技術の輸出を規制していた。 – 秘匿のための暗号処理については 40 ビット。鍵交換については 512 ビットまで。 – 鍵交換の際に、輸出用の暗号スイートをネゴシエーションする際には一時的に弱い RSA 鍵を生 成して ServerKeyExchange メッセージをいれてクライアントに送信 • TLS 実装の欠陥が明白 • ( 引用 : http://d.hatena.ne.jp/jovi0608/20150304/1425461359)
  • 30. 悪用の障壁と克服 • 1. メッセージに対する署名は攻撃対象であるサーバの強力な RSA 鍵で暗号化されている こと • -> クライアントからの接続をかまえて、クライアントの本物の乱数を攻撃対象のサーバ への接続にコピー • 2.TLS のハンドシェイクに干渉して変更を正当化するには適切な Finished メッセージを捏 造しなければならない • ->Finished メッセージを送る頃には、鍵交換の強度を 512bit まで下げられている。さらに 現実の運用では、接続ごとに新しい鍵を使いまわしている場合があるので時間をかけて 攻撃できる。
  • 31. Overview • - プロフェッショナル SSL/TLS • 6. 実装の問題 – 6.1 証明書の検証における欠陥 – 6.2 乱数生成における欠陥 – 6.3 Heartbleed – 6.4 FREAK – 6.5 Logjam – 6.6 プロトコルダウングレード攻撃 – 6.7 強制切断攻撃 – 6.8 デプロイにおける弱点 • - 実践ハンズオン
  • 32. 6.5 Logjam • Log は DH 鍵交換の原理として利用されている「一方向の離散対数問 題 (Discrete Logarithm Problem) 」からきている • 概念的には FREAK 攻撃を模倣したもの
  • 33. FREAK 攻撃の手法を模倣したもの ( 相違点 ) • サーバが安全でない DH パラメータを使ってしまう場合 – 最も典型的なのはサーバが DHE を含む輸出用暗号スイートを使う場合で鍵長が 512bit に制限 – ただし、多くのサーバではより高速な ECDHE や RSA による鍵交換を採用していて DHE がネゴシ エーションされる確率は低い。 • DHE 鍵がサーバでキャッシュされている – Mallory は DHE 鍵を 1 分以内 ( モダンブラウザがハンドシェイクをあきらめるまでのおおよその 時間 , 1)※ にやぶらないと行けないが、キャッシュしていれば話は別 – IIS は一時的な鍵を 2 時間に渡ってキャッシュ。 OpenSSL にはキャッシュする機能があるが、 Apa che や Nginx 、は利用していない • クライアント ( ブラウザ ) が弱い DH パラメータを受け入れてしまう – 鍵交換にふさわしい強度が指定されない ( 強度を決定するのはサーバ ) – DH パラメータのサーバ署名が再送できてしまうプロトコルの弱点 ( 実装による欠陥ではない ) – TLS ではリプレイ攻撃に対する保護が署名の設計に含まれているが、そのための仕組みはクライアントとサー バの乱数に依存している。問題は、この値を能動的な攻撃者が同期できてしまう。クライアントが申し出た 乱数の値を観察し、別のハンドシェイクで再利用することが可能。この欠陥により、本来であれば選択され ない暗号スイートのネゴシエーションを攻撃者が強制できる。
  • 34. 安全ではない DHE 鍵交換に対する事前計算攻撃 • DH 鍵交換ではドメインパラメータの同意が必要。 ( 素数 p, 原始根 g) • Mallory にもこれは分かるが、 DH 鍵交換を破るには、鍵交換の最中に生成される 2 つの秘密鍵の内の一方を見つけ出す必要がある。 • NFS(Number Field Sieve, 数体ふるい法 ) を 2 段階に分割することが可能で、難しい のは最初の方。しかし、素数 p のみに依存;最初の結果さえ手に入れてしまえ ば、同じ素数 p を使うあらゆる鍵交換を迅速に発見できる。 • 多くのアプリケーションでは、標準グループ (standard group) と呼ばれる DH パラ メータを使いまわしている。この標準グループが弱いことが問題。
  • 35. 緩和策 • 輸出用暗号スイートを無効 ( 過去の遺物 ) • 1024 ビットより短い DH パラメータを使わない。 • DH パラメータを単純に 2048 ビットに対応できない場合がある (Java 6 のクライア ントが 1024 ビットを超える強度に対応していない ) – 1024 ビットの DH パラメータを使い続けながら標準グループを使わないようにする – DHE を無効にする (RSA 鍵交換は PFS がないのでつかうべきではない。 ECDHE はセキュ リティ、パフォーマンスで優れている )
  • 36. Overview • - プロフェッショナル SSL/TLS • 6. 実装の問題 – 6.1 証明書の検証における欠陥 – 6.2 乱数生成における欠陥 – 6.3 Heartbleed – 6.4 FREAK – 6.5 Logjam – 6.6 プロトコルダウングレード攻撃 – 6.7 強制切断攻撃 – 6.8 デプロイにおける弱点 • - 実践ハンズオン
  • 38. 6.6.1 SSL 3.0 のプロトコルロールバック対策 • SSL2.0 にフォールバックするときに RSA 鍵交換における PKCS#1 のブロックを特別 な形式でフォーマットする。このブロックの末尾に少なくとも 8 ビットを 0x03 で埋める。 • 攻撃を受けた場合このフォーマットを検知して攻撃を察知。 • ただし、マスター鍵で 40 ビットのものを使われると総当りで攻撃するのは簡 単。 (IE6 に期待できるセキュリティ強度 )
  • 39. 6.6.2 相互運用性の問題 • バージョンに対する不寛容 – SSL3.0 では、互換性を崩したが、 SSL2.0 は考慮してなく仕様が曖昧だったので、多くのサーバでは提示された プロトコルのバージョンが好ましくない場合にハンドシェイクを拒否した。 – Renegotiation Indication という拡張 (RFC 5246 で既に規定されているもの ) – TLS サーバは、クライアントから提示された不明な拡張についてはすべて無視しなければならない – 自分の最大のバージョン番号より大きなバージョン番号については、受け入れた上で互いに共通する最大のバージョンをネゴ シエーションしなければならない • 拡張についての不寛容 – プロトコルの初期のバージョン (SSL3.0 および TLS1.0) のサーバの大部分は、 ClientHello,ServerHello メッセージの 末尾に負荷的なデータを指定してきたクライアントのハンドシェイクを拒否する ( データを含められるが、実 装で、理解出来ない場合は拒否するものになっていた ) 。その後 TLS 拡張に置き換えられた • 相互運用性に関する他の問題 – 長いハンドシェイクに対する不寛容 : F5 射精の BIG IP ロードバランサで 255 バイト以上 512 バイト未満のハン ドシェイクメッセージを処理できない – 任意の拡張に対する不寛容 : 明確な理由なしに未知の拡張を含む接続のネゴシエーションに失敗 (SNI 拡張、 Sta tus Requesrt 拡張 (OCSP ステープリング )) – フラグメンテーションの適切な処理の失敗 : SSL の分割したフラグメンテーション以外は拒否。長さが 0 のレ コードの処理に失敗
  • 40. 6.6.3 プロトコルの自発的なダウングレード • SSL2.0 はマスター鍵の総当たり攻撃に対して脆弱 (IE6 に期待できるセキュリティは最大で 40 ビット ) • SSL 3.0 は POODLE 攻撃によって安全でないことが判明 (2014 年 10 月 ) – 攻撃者は、 SSL 3.0 を使う暗号化通信において、リクエスト送信を繰り返し試み、暗号化通信の一部を解読する 恐れが発生。また攻撃者は、 TLS / SSL のバージョンをダウングレードさせる可能性がある。 – 32 文字の Cookie の値を取得することを考えると、おおよそ 8,000 回程度のリクエストをクライアントから繰り 返し送らせる必要がある – http://developers.mobage.jp/blog/poodle • 他のバージョンも TLS1.2 に比べて以下の点で劣る – - GCM,SHA256,SHA384 を含む暗号スイートに対応していない – - 楕円曲線暗号に対応していない ->PFS がない状態 ( 最悪 ) – - SSL3.0 は BEAST 攻撃に脆弱だが、対策はされている。とはいえど、 TLS1.0 より以前のプロトコルで RC4 を使え てしまうサイトが多い – - Microsoft 者の SSL3.0 スタックは AES に対応していないので、 IE は RC4 と 3DES の暗号スイートしか提示できな い • いずれも対策はされていて過去のこと
  • 41. 6.6.4 TLS1.0 以降のロールバック対策 • - ロールバック保護のために、クライアントから送信される PremMasterSecret のバージョン番号 には、サーバの秘密鍵で保護されるバージョン番号 (ClientHello.client_version の値 ) が追加された ので、これを利用する。 • - ロールバック保護を新しいクライアントとの間のみで強制するように勧告 (ClientHello.client_ver sion が TLS 1.1 以上 ) • それでもプロトコルの自発的なダウングレードの挙動で攻撃可能。
  • 42. 6.6.5 プロトコルの自発的なダウングレードを悪用した攻撃 • MITM 攻撃でパラメータを変更しなくても SSL3.0 より大きなバージョンをブロックすれば良い。 • - SCSV(Signaling Cipher Suite Value) 低いバージョンがネゴシエーションされる場合であっても、ク ライアントが自信の対応している最良のプロトコルを伝達できるような特別なシグナリング ( ク ライアントは大勢いるので普及に時間がかかる、最終的にはこれが Google の Chrome,Web や Ope nSSL(1.0.1j),Firefox35 で対応 (POODLE 攻撃対策になる ) • - 暗号スイートのシグナリングを用いてクライアント側で攻撃を検知出来る仕組み (RFC5746 の再 ネゴシーエションを指示するための拡張の仕様 ) 安全なネゴシエーションを実装しながらも新し いバージョン番号には不寛容であるようなサーバがわずかながらに存在して関心をあまり集めな い 6.6.6 代的なロ ルバック攻 への防御現 ー 撃
  • 43. Overview • - プロフェッショナル SSL/TLS • 6. 実装の問題 – 6.1 証明書の検証における欠陥 – 6.2 乱数生成における欠陥 – 6.3 Heartbleed – 6.4 FREAK – 6.5 Logjam – 6.6 プロトコルダウングレード攻撃 – 6.7 強制切断攻撃 – 6.8 デプロイにおける弱点 • - 実践ハンズオン
  • 44. 6.7 強制切断攻撃 • 安全なメッセージがきちんと終了する前に、攻撃者によってメッセージの配送がぼうがいされて しまう攻撃。 • SSL3.0 では close_notify が追加されたが、多くのクライアントやサーバではシャットダウンの手続 きを省略 ( 例 IE) • SSL3.0 の標準で記載されている。 • TLS1.1 でセッションリザンプションに関する規則緩和でさらに悪化。防御方法は事実上ない。 • 2007 年ぐらいに話題に上がる。
  • 45. クッキーカッター攻撃 • クッキーカッター攻撃をよりいっそう効果的に • HTTP のレスポンスヘッダに対する強制切断攻撃 • 任意の長さの HTTP リクエストとレスポンスを挿入することでリクエストヘッダ、レスポンス ヘッダを分割して、攻撃するきっかけをつくる – 1. 攻撃対象の Web サイトとの間でまだセッションを確立していない利用者を攻撃する – 2. HTTP レスポンスに任意のデータを挿入できるエントリーポイントを探す – 3. レスポンスヘッダを 2 つの TLS レコードに分断するパディングを送信うする – 4. 1 つめの TLS レコードの後で HTTPS 通信を閉じる – 5. Secure 属性のないクッキーを抜き出す • HSTS に対しても有効 • -> - max-age パラメータのさいしょの数字の直後で切り詰められば最大で 9 秒無効。 • - includeSubDomains パラメータを無効
  • 46. Overview • - プロフェッショナル SSL/TLS • 6. 実装の問題 – 6.1 証明書の検証における欠陥 – 6.2 乱数生成における欠陥 – 6.3 Heartbleed – 6.4 FREAK – 6.5 Logjam – 6.6 プロトコルダウングレード攻撃 – 6.7 強制切断攻撃 – 6.8 デプロイにおける弱点 • - 実践ハンズオン
  • 47. 6.8 デプロイにおける弱点 • 6.8.1 仮想ホスト混同 – 証明書を共有しているすべてのサイトでは秘密鍵を共有することになる。弱いサイトを手中に収 めると、クライアントの安全な TLS 接続を乗っ取られる恐れがある。長年放置されてた問題を De lignant らが 2014 年に論文として、現実のシナリオで悪用する方法や有名な Web サイトになりす ます方法を紹介。 – https://www.semanticscholar.org/paper/Virtual-Host-Confusion-Weaknesses-and-Exploits-Delignat-Lavaud-Bhargavan/a0e410d945f5 • 6.8.2 TLS セッションキャッシュの共有 – クライアントはいったん RLS セッションを確立したら、本来のサーバとだけでなく、同じセッ ションキャッシュを共有している他の任意のサーバとの間でもセッションを再開できる。 – セッションチケットでも同様のことがいえるが回避策があり、ホストごとに専用のチケット鍵を 使うのがベストプラクティス
  • 48. Overview • - プロフェッショナル SSL/TLS • 6. 実装の問題 – 6.1 証明書の検証における欠陥 – 6.2 乱数生成における欠陥 – 6.3 Heartbleed – 6.4 FREAK – 6.5 Logjam – 6.6 プロトコルダウングレード攻撃 – 6.7 強制切断攻撃 – 6.8 デプロイにおける弱点 • - 実践ハンズオン
  • 49. 実践ハンズオン • 2 つの証明書の類似性を利用して、 TLS 通信を解読できる • http://ksnctf.sweetduet.info/q/33/q33.pcap

Editor's Notes

  • #7: https://technet.microsoft.com/library/security/ms02-050 Sniff https://moxie.org/software/sslsniff/https://github.com/moxie0/sslsniffhttps://moxie.org/ie-ssl-chain.txt <number>
  • #8: http://thread.gmane.org/gmane.comp.encryption.gpg.gnutls.devel/3217 http://www.cvedetails.com/cve/CVE-2008-4989/ <number>
  • #9: http://thread.gmane.org/gmane.comp.encryption.gpg.gnutls.devel/3217 http://www.cvedetails.com/cve/CVE-2008-4989/ <number>
  • #10: https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2008-5077 <number>
  • #11: <number>
  • #12: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-1959 <number>
  • #13: <number>
  • #14: https://www.openssl.org/news/secadv/20150709.txt <number>
  • #15: <number>
  • #16: http://docs.aws.amazon.com/AWSEC2/latest/APIReference/using-soap-api.html <number>
  • #17: <number>
  • #18: http://www.blackhat.com/presentations/bh-usa-09/MARLINSPIKE/BHUSA09-Marlinspike-DefeatSSL-SLIDES.pdf 参考 GnuTLS Security https://www.gnutls.org/security.html <number>
  • #20: <number>
  • #21: https://people.eecs.berkeley.edu/~daw/papers/ddj-netscape.html <number>
  • #22: <number>
  • #23: <number>
  • #25: http://heartbleed.com/ <number>
  • #26: <number>
  • #27: <number>
  • #29: <number>
  • #30: <number>
  • #31: <number>
  • #33: <number>
  • #34: <number>
  • #35: <number>
  • #36: <number>
  • #38: <number>
  • #39: <number>
  • #40: <number>
  • #41: POODLE攻撃 <number>
  • #42: <number>
  • #43: <number>
  • #45: <number>
  • #46: <number>
  • #48: <number>
  • #50: https://pad.amazon.com/?pad=HttpsIsSecure&user=hayshogo <number>