More Related Content
Similar to Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性 (20)
More from JPCERT Coordination Center (8)
Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性
- 2. Copyright©2016 JPCERT/CC All rights reserved.
目次
1
前半 – 脆弱性の調査
—脆弱性調査の経緯
—HTTP ヘッダインジェクションの概要
—脆弱な URLConnection クラス
—Proof of Concept code
—脆弱性の影響を受ける Android バージョン
- 3. Copyright©2016 JPCERT/CC All rights reserved.
目次
2
後半 – ソースコードの詳細調査
—Android Platform が提供している Java 実行環境
—正しい URLConnection クラスの実装 (OpenJDK)
—脆弱な URLConnection クラスの実装 (Android 6.0)
—修正された URLConnection クラスの実装 (master ブランチ)
まとめ
参考情報
謝辞
- 5. Copyright©2016 JPCERT/CC All rights reserved.
目次
4
前半 – 脆弱性の調査
—脆弱性調査の経緯
—HTTP ヘッダインジェクションの概要
—脆弱なURLConnection クラス
—Proof of Concept code
—脆弱性の影響を受ける Android バージョン
- 6. Copyright©2016 JPCERT/CC All rights reserved.
脆弱性調査の経緯
5
Apache Cordova プラグイン cordova-plugin-file-transfer
における HTTP ヘッダインジェクションの脆弱性
—https://jvn.jp/jp/JVN21612597/
上記の Apache Cordova プラグインの脆弱性報告者であ
る西村 宗晃 氏より、脆弱性の根本原因は Apache
Cordova プラグインではなく、Android Platform の Java
標準API の URLConnection クラスにあるとの追加報告
を受けた
- 7. Copyright©2016 JPCERT/CC All rights reserved.
JPCERT/CC の調査と調整
6
西村氏からの脆弱性報告をもとに Android Platform の
URLConnection クラスの 脆弱性を調査した
Android Security Team とアドバイザリ公開に向けた調整
を実施した (JVNVU#99757346)
—https://jvn.jp/vu/JVNVU99757346/index.html
Android Security Team から将来の Android バージョンで
の修正が明言された
—既存 Android バージョンへの対応は言及なし
—Android Security Team からの返信内容
Hi,
I discussed this with our engineering team and the fix in AOSP is here:
https://android-review.googlesource.com/#/c/171350/1
This will be part of a future release (most likely Android 7) and not part
of Android 6 or below.
- 8. Copyright©2016 JPCERT/CC All rights reserved.
目次
7
前半 – 脆弱性の調査
—脆弱性調査の経緯
—HTTP ヘッダインジェクションの概要
—脆弱な URLConnection クラス
—Proof of Concept code
—脆弱性の影響を受ける Android のバージョン
- 9. Copyright©2016 JPCERT/CC All rights reserved.
HTTP ヘッダインジェクションの概要
8
安全なウェブサイトの作り方
—http://www.ipa.go.jp/files/000017316.pdf
ウェブアプリケーションの中には、リクエストに対して出力する
HTTP レスポンスヘッダのフィールド値を、外部から渡されるパラ
メータの値等を利用して動的に生成するものがあります。
たとえば、HTTP リダイレクションの実装として、パラメータから
取得したジャンプ先の URL 情報を、Location ヘッダのフィールド
値に使用する場合や、掲示板等において入力された名前等を Set-
Cookie ヘッダのフィールド値に使用する場合等が挙げられます。
このようなウェブアプリケーションで、HTTP レスポンスヘッダの
出力処理に問題がある場合、攻撃者は、レスポンス内容に任意の
ヘッダフィールドを追加したり、任意のボディを作成したり、複数
のレスポンスを作り出すような攻撃を仕掛ける場合があります。
このような問題を「HTTP ヘッダ・インジェクションの脆弱性」と
呼び、この問題を悪用した攻撃手法は「HTTP ヘッダ・インジェク
ション攻撃」と呼びます。
- 11. Copyright©2016 JPCERT/CC All rights reserved.
目次
10
前半 – 脆弱性の調査
—脆弱性調査の経緯
—HTTP ヘッダインジェクションの概要
—脆弱な URLConnection クラス
—Proof of Concept code
—脆弱性の影響を受ける Android バージョン
- 12. Copyright©2016 JPCERT/CC All rights reserved.
脆弱な URLConnection クラス
11
脆弱な URLConnection クラス
—http://developer.android.com/intl/ja/reference/java/net/URL
Connection.html
—A connection to a URL for reading or writing. For HTTP
connections, see HttpURLConnection for documentation of
HTTP-specific features.
- 13. Copyright©2016 JPCERT/CC All rights reserved.
脆弱な URLConnection クラス
12
脆弱性なメソッド
—public void addRequestProperty (String field, String newValue)
Adds the given property to the request header. Existing properties
with the same name will not be overwritten by this method.
—public void setRequestProperty (String field, String newValue)
Sets the value of the specified request header field. The value will
only be used by the current URLConnection instance. This method
can only be called before the connection is established.
HTTP ヘッダを設定するクラスのメソッド
で引数の入力値検査を行っていないため、
改行コードを注入可能な脆弱性を持つ
※ 以下、addRequestProperty() は冗長なので記載を省く
- 14. Copyright©2016 JPCERT/CC All rights reserved.
目次
13
前半 – 脆弱性の調査
—脆弱性調査の経緯
—HTTP ヘッダインジェクションの概要
—脆弱な URLConnection クラス
—Proof of Concept code
—脆弱性の影響を受ける Android バージョン
- 15. Copyright©2016 JPCERT/CC All rights reserved.
Proof of Concept code
14
・改行コード による意図しない改行の挿入
この例では開発者が意図しない改行コードと
Cookie の値を設定するコードを挿入
・入力値検査を行っていない脆弱なクラスメソッド
入力値検査を行っていないため、意図しない Cookie
を設定されてしまう
- 16. Copyright©2016 JPCERT/CC All rights reserved.
目次
15
前半 – 脆弱性の調査
—脆弱性調査の経緯
—HTTP ヘッダインジェクションの概要
—脆弱な URLConnection クラス
—Proof of Concept code
—脆弱性の影響を受ける Android バージョン
- 17. Copyright©2016 JPCERT/CC All rights reserved.
脆弱性の影響を受ける Android バージョン
16
影響範囲の調査
—Android 2.3.3 ~ 6.0 (エミュレータ) で検証コードの動作確認を
実施した (実行結果のスクリーンショットは次々ページ)
—Obsolete 扱いの Android バージョンは対象外
バージョン ニックネーム API Level
2.3.3 Gingerbread 10
4.0.3 IceCreamSandwich 15
4.3.1 Jelly Bean 18
4.4.2 KitKat 19
5.1.1 Lollipop 22
6.0 Marshmallow 23
- 18. Copyright©2016 JPCERT/CC All rights reserved.
影響範囲調査の結果
17
6.0 まで全ての Android バージョンが影響を受ける
—脆弱性報告のとおり Android Platform の URLConnection クラス
に HTTP ヘッダインジェクションの脆弱性がある
OpenJDK や OracleJDK では改行コードを挿入しようと
すると例外がスローされ、脆弱性は存在しなかった
—OracleJDK バージョン : “1.8.0_72” で確認
- 19. Copyright©2016 JPCERT/CC All rights reserved.
検証コード実行結果のスクリーンショット
18
Android 2.3.3 Gingerbread (API Level 10)
Android 4.0.3 IceCreamSandwich (API Level 15)
- 20. Copyright©2016 JPCERT/CC All rights reserved.
検証コード実行結果のスクリーンショット
19
Android 4.3.1 Jelly Bean (API Level 18)
Android 4.4.2 KitKat (API Level 19)
- 21. Copyright©2016 JPCERT/CC All rights reserved.
検証コード実行結果のスクリーンショット
20
Android 5.1.1 Lollipop (API Level 22)
Android 6.0 Marshmallow (API Level 23)
- 24. Copyright©2016 JPCERT/CC All rights reserved.
目次
23
後半 – ソースコードの詳細調査
—Android Platform が提供している Java 実行環境
—正しい URLConnection クラスの実装 (OpenJDK)
—脆弱な URLConnection クラスの実装 (Android 6.0)
—修正された URLConnection クラスの実装 (master ブランチ)
まとめ
参考情報
謝辞
- 25. Copyright©2016 JPCERT/CC All rights reserved.
Android Platform が提供している Java 実行環境
24
中身は他のオープンソースから移植や独自実装が混在
URLConnection クラスは Android バージョンにより実装
が異なる (詳細は次ページ)
Oracle
Java
Google Android
Java
OpenJDK (リファレンス)
Java
Apache Harmony etc
JAVA
ほぼ同一実装 オープンソースから移植
or 独自実装
Apache Harmony etc
Java
- 26. Copyright©2016 JPCERT/CC All rights reserved.
Android Platform の URLConnection クラス
25
Android バージョンによる実装の違い
Android 2.2 ~
Apache Harmony
Android 4.4.2~
OkHttp
Android 4.0.3 ~
独自実装?
標準 API 準拠の抽象クラス
- 27. Copyright©2016 JPCERT/CC All rights reserved.
Android Platform の URLConnection クラス
26
Android バージョンによる実装の違い
Android 2.2 ~
Apache Harmony
Android 4.4.2~
OkHttp
Android 4.0.3 ~
独自実装?
標準 API 準拠の抽象クラス
デザインパターン? Strategy?
いえいえ、ベタっと実装してますちょっと読みづらい
全ての Android バージョンの
URLConnection クラスの実装で脆弱性が
存在している Apache Harmony も OkHttp も同じ脆弱性を持っていたんですね
これらを踏まえて URLConnection クラス
の実装を確認してみましょう
- 28. Copyright©2016 JPCERT/CC All rights reserved.
目次
27
後半 – ソースコードの詳細調査
—Android Platform が提供している Java 実行環境
—正しい URLConnection クラスの実装 (OpenJDK)
—脆弱な URLConnection クラスの実装 (Android 6.0)
—修正された URLConnection クラスの実装 (master ブランチ)
まとめ
参考情報
謝辞
- 29. Copyright©2016 JPCERT/CC All rights reserved.
正しい URLConnection の実装 (OpenJDK)
28
脆弱性を持つ Android Platform の URLConnection クラ
スを確認する前に、脆弱性のない Java のリファレンス
実装である OpenJDK の正しい実装を確認する
—URLConnection クラスと関連クラス図
—HTTP ヘッダを設定する処理のシーケンス図
—HTTP ヘッダ設定時に実施される入力値検査
—RFC との整合性
- 32. Copyright©2016 JPCERT/CC All rights reserved.
URLConnection クラスと関連クラス図 (実装クラス)
31
Java 標準 API の URLConnection クラスを
継承し setRequestProperty() を実装している
HttpURLConnection クラス
HTTP ヘッダのキーと
値を保持するクラス
Sun のパッケージって残ってたんですね
- 34. Copyright©2016 JPCERT/CC All rights reserved.
HTTP ヘッダ設定時に実施される入力値検査
33
改行コード LF (‘n’) の後が
スペースまたは水平タブなら OK
条件を満たさなければ
IllegalArgumentException を
スローする実装になっている
- 36. Copyright©2016 JPCERT/CC All rights reserved.
RFC 2616 (2.2 Basic Rule)
35
RFC 2616 Hypertext Transfer Protocol -- HTTP/1.1 June
1999
—https://www.ietf.org/rfc/rfc2616.txt
—1999 年に RFC で公開された HTTP 1.1 の仕様
—改行コードの扱いは 2.2 Basic Rule で定義
改行コード後のスペースと水平タブを許可
いわゆる「継続行」を許可している
- 37. Copyright©2016 JPCERT/CC All rights reserved.
RFC 2616 から RFC 723x へ
36
RCF 2616 Obsoleted by RFC 7230, RFC 7231, RFC
7232, RFC 7233, RFC 7234 and RFC7235
2014年に HTTP に関する RFC が更新
—RFC7230 HTTP/1.1 Message Syntax and Routing
—RFC7231 HTTP/1.1 Semantics and Content
—RFC7232 HTTP/1.1 Conditional Requests
—RFC7233 HTTP/1.1 Range Requests
—RFC7234 HTTP/1.1 Caching
—RFC7235 HTTP/1.1 Authentication
改行コードや LWS の扱いはどう変わったか?
- 38. Copyright©2016 JPCERT/CC All rights reserved.
RFC 7230 (3.2 Header Fields)
37
RFC 7230 HTTP/1.1 Message Syntax and Routing June
2014
—https://www.ietf.org/rfc/rfc7230.txt
—3.2 Header Fields
改行後のスペースと水平タブも禁止に
つまり継続行は廃止された
- 39. Copyright©2016 JPCERT/CC All rights reserved.
RFC 7230 (3.2.4 Field Parsing)
38
RFC 7230 HTTP/1.1 Message Syntax and Routing June
2014
—https://www.ietf.org/rfc/rfc7230.txt
—3.2.4 Field Parsing
全面的に継続行の廃止ではなく、例外として
message / http media type では有効となっている
- 40. Copyright©2016 JPCERT/CC All rights reserved.
OpenJDK の URLConnection クラスの実装まとめ
39
RFC 2616 に準拠した実装になっている
改行コード後にスペースか水平タブ以外の値を設定する
と例外 (IllegalArgumentException) をスローする
Android Platform の URLConnection クラスではどうなっ
ているのか?
- 41. Copyright©2016 JPCERT/CC All rights reserved.
目次
40
後半 – ソースコードの詳細調査
—Android Platform が提供している Java 実行環境
—正しい URLConnection クラスの実装 (OpenJDK)
—脆弱な URLConnection クラスの実装 (Android 6.0)
—修正された URLConnection クラスの実装 (master ブランチ)
まとめ
参考情報
謝辞
- 42. Copyright©2016 JPCERT/CC All rights reserved.
脆弱な URLConnection クラスの実装
41
Android Platform の 脆弱な URLConnection クラスの実
装を確認する
本稿では Android 6.0 を対象に実装の確認を行う
—Android バージョンによる実装の違い
—URLConnection クラスと関連クラス図
—HTTP ヘッダを設定する処理のシーケンス図
—HTTP ヘッダ設定時に実施される入力値検査
—RFC との整合性
- 43. Copyright©2016 JPCERT/CC All rights reserved.
Android バージョンによる実装の違い
42
Android 6.0 では OkHttp のソースコードを使用している
Android 2.2 ~
Apache Harmony
Android 4.4.2~
OkHttp
Android 4.0.3 ~
独自実装?
標準 API 準拠の抽象クラス
Android 6.0 では OkHttp のソースコードが使用されている
しかし取り込んだバージョンの OkHttpに HTTP ヘッダイン
ジェクションの脆弱性が存在した
- 44. Copyright©2016 JPCERT/CC All rights reserved.
OkHttp とは
43
OkHttp
—http://square.github.io/okhttp/
—Apache License, Version 2.0 の HTTP & HTTP/2 クライア
ントライブラリ
—Android Platform の URLConnection の実装に OkHttp
(version 2.5 より前) のソースコードが取り込まれている
Andorid 6.0 の URLConnection クラスの実装 (OkHttp か
ら取り込んだ実装)を示す
- 47. Copyright©2016 JPCERT/CC All rights reserved.
URLConnection クラスと関連クラス図 (実装クラス)
46
HTTP ヘッダのキーと
値を保持するクラス
Java 標準 API の URLConnection クラスを
継承し setRequestProperty() を実装している
HttpURLConnectionImp クラス
- 48. Copyright©2016 JPCERT/CC All rights reserved.
HTTP ヘッダを設定する処理のシーケンス図
47
Android Platform では HTTP ヘッダの設定に関わる全て
のクラスとメソッドで入力値検査をしていないのか?
これらのクラスとメソッドで入力値検査をしているか確認した
- 53. Copyright©2016 JPCERT/CC All rights reserved.
RFC との整合性
52
Android Platform の URLConnection クラス
—RFC 2616 に準拠した入力値検査を実施していない
—また、RFC 7230 にも準拠していない
—OkHttp は version 2.5 で RFC 7230 に準拠した修正を
行いリリース済
Android Platform も OkHttp の修正を master ブランチに取り
込んだ
https://android.googlesource.com/platform/external/okhttp/+/7
1b9f47b26fb57ac3e436a19519c6e3ec70e86eb
Android Platform の master ブランチでは、どのように修
正されたのか?
- 54. Copyright©2016 JPCERT/CC All rights reserved.
目次
53
後半 – ソースコードの詳細調査
—Android Platform が提供している Java 実行環境
—正しい URLConnection クラスの実装 (OpenJDK)
—脆弱な URLConnection クラスの実装 (Android 6.0)
—修正された URLConnection クラスの実装 (master ブランチ)
まとめ
参考情報
謝辞
- 55. Copyright©2016 JPCERT/CC All rights reserved.
修正された URLConnection クラスの実装
54
master ブランチに取り込まれた URLConnection クラス
の実装を確認する
—URLConnection クラスと関連クラス図
—HTTP ヘッダを設定する処理のシーケンス図
—HTTP ヘッダ設定時に実施される入力値検査
—RFC との整合性
- 58. Copyright©2016 JPCERT/CC All rights reserved.
HTTP ヘッダ設定時に実施される入力値検査
57
HTTP ヘッダフィルード名、値ともにアスキーコードの
0x1f 以下、及び 0x7f 以上が含まれていたら
IllegalArgumentException をスローする
- 59. Copyright©2016 JPCERT/CC All rights reserved.
RFC との整合性
58
改行コードを含む制御文字が全て禁止され RFC 7230 に準拠した修
正が行われた
— IT 用語辞典 e-Words より ASCII 文字コード表を引用
— http://e-words.jp/p/r-ascii.html
修正で禁止された制御文字
- 60. Copyright©2016 JPCERT/CC All rights reserved.
目次
59
後半 – ソースコードの詳細調査
—Android Platform が提供している Java 実行環境
—正しい URLConnection クラスの実装 (OpenJDK)
—脆弱な URLConnection クラスの実装 (Android 6.0)
—修正された URLConnection クラスの実装 (master ブランチ)
まとめ
参考情報
謝辞
- 61. Copyright©2016 JPCERT/CC All rights reserved.
まとめ
60
誰が本脆弱性の影響を受けるか
—HTTP ヘッダフィールドを外部入力として受け取る
Android アプリ
対策
1. master ブランチの checkNameAndValue() を Android
アプリに移植して、HTTP ヘッダの入力値検査を行うよ
うに修正する (推奨)
2. 脆弱性が修正されている OkHttp version 2.5 以降を使い
アプリケーションを実装し直す (大変)
全ての開発者が注意すべきこと
—セキュアコーディングの原則として、信頼境界の外から受
け取るパラメータを信用せず入力値検査を行う
- 62. Copyright©2016 JPCERT/CC All rights reserved.
目次
61
後半 – ソースコードの詳細調査
—Android Platform が提供している Java 実行環境
—正しい URLConnection クラスの実装 (OpenJDK)
—脆弱な URLConnection クラスの実装 (Android 6.0)
—修正された URLConnection クラスの実装 (master ブランチ)
まとめ
参考情報
謝辞
- 63. Copyright©2016 JPCERT/CC All rights reserved.
参考情報
62
本稿では Android Platform の HTTP ヘッダインジェクションについて取り
上げたが、他言語・フレームワークでも同じ脆弱性が存在する可能性があ
る
PHP の HTTP ヘッダインジェクションについて、2015年に話題になった
ことがあるので参考までに紹介する
— 2015年 7月 寺田 健 氏 (三井物産セキュアディレクション株式会社)
LWSとHTTPヘッダインジェクション
https://www.mbsd.jp/blog/20150730.html
「新RFCにより一転してPHP側の旗色が悪くなった訳ですが、PHPは比較的早くこの状
況に対処しました。具体的には、2015年2月のリリース(PHP 5.4.38, 5.5.22, 5.6.6)で、
LWSを含むヘッダをエラーとして出力できないようにする対処を行いました」
— 2015年 12月 徳丸 浩 氏 (HASHコンサルティング株式会社)
PHPにおけるHTTPヘッダインジェクションはまだしぶとく生き残る
http://blog.tokumaru.org/2015/12/phphttp.html
「HTTPヘッダインジェクション脆弱性対策については、一応はPHP側の責任と考えた
うえで、アプリケーション側でもヘッダ文字列のバリデーション等で対策をしておくこ
とを推奨します」
- 64. Copyright©2016 JPCERT/CC All rights reserved.
目次
63
後半 – ソースコードの詳細調査
—Android Platform が提供している Java 実行環境
—正しい URLConnection クラスの実装 (OpenJDK)
—脆弱な URLConnection クラスの実装 (Android 6.0)
—修正された URLConnection クラスの実装 (master ブランチ)
まとめ
参考情報
謝辞
- 65. Copyright©2016 JPCERT/CC All rights reserved.
謝辞
64
JVN#21612597 で公開された Apache Cordova に関する脆弱性の
報告者である、ソニーデジタルネットワークアプリケーションズ株
式会社の西村宗晃氏の追加調査により本脆弱性が存在する事が判明
しました。本脆弱性情報を JPCERT/CC に報告いただいた西村氏に
御礼申し上げます。