Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

65
Android Platform の URLConnection のののの HTTP ののののののののののの のののの JPCERT コココココココココココココ ココココココココココ ココ ココ

Transcript of Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Page 1: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Android Platform の URLConnection クラスに HTTP ヘッダインジェクションの脆弱性

JPCERT コーディネーションセンター情報流通対策グループ佐藤 裕二

Page 2: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

目次

2

前半 – 脆弱性の調査—脆弱性調査の経緯—HTTP ヘッダインジェクションの概要—脆弱な URLConnection クラス—Proof of Concept code—脆弱性の影響を受ける Android バージョン

Page 3: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

目次

3

後半 – ソースコードの詳細調査—Android Platform が提供している Java 実行環境—正しい URLConnection クラスの実装 (OpenJDK)—脆弱な URLConnection クラスの実装 (Android 6.0)—修正された URLConnection クラスの実装 (master ブラン

チ )まとめ参考情報謝辞

Page 4: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

前半 - 脆弱性の調査

4

Page 5: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

目次

5

前半 – 脆弱性の調査—脆弱性調査の経緯—HTTP ヘッダインジェクションの概要—脆弱な URLConnection クラス—Proof of Concept code—脆弱性の影響を受ける Android バージョン

Page 6: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

脆弱性調査の経緯

6

Apache Cordova プラグイン cordova-plugin-file-transfer における HTTP ヘッダインジェクションの脆弱性—https://jvn.jp/jp/JVN21612597/

上記の Apache Cordova プラグインの脆弱性報告者である西村 宗晃 氏より、脆弱性の根本原因は Apache Cordova プラグインではなく、 Android Platform の Java 標準 API の URLConnection クラスにあるとの追加報告を受けた

Page 7: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

JPCERT/CC の調査と調整

7

西村氏からの脆弱性報告をもとに 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/1This will be part of a future release (most likely Android 7) and not partof Android 6 or below.

Page 8: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

目次

8

前半 – 脆弱性の調査—脆弱性調査の経緯—HTTP ヘッダインジェクションの概要—脆弱な URLConnection クラス—Proof of Concept code—脆弱性の影響を受ける Android のバージョン

Page 9: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

HTTP ヘッダインジェクションの概要

9

安全なウェブサイトの作り方—http://www.ipa.go.jp/files/000017316.pdf

ウェブアプリケーションの中には、リクエストに対して出力する HTTP レスポンスヘッダのフィールド値を、外部から渡されるパラメータの値等を利用して動的に生成するものがあります。

たとえば、 HTTP リダイレクションの実装として、パラメータから取得したジャンプ先の URL 情報を、 Location ヘッダのフィールド値に使用する場合や、掲示板等において入力された名前等を Set-Cookie ヘッダのフィールド値に使用する場合等が挙げられます。

このようなウェブアプリケーションで、 HTTP レスポンスヘッダの出力処理に問題がある場合、攻撃者は、レスポンス内容に任意のヘッダフィールドを追加したり、任意のボディを作成したり、複数のレスポンスを作り出すような攻撃を仕掛ける場合があります。

このような問題を「 HTTP ヘッダ・インジェクションの脆弱性」と呼び、この問題を悪用した攻撃手法は「 HTTP ヘッダ・インジェクション攻撃」と呼びます。

Page 10: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

HTTP ヘッダインジェクションの概要

10

Page 11: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

目次

11

前半 – 脆弱性の調査—脆弱性調査の経緯—HTTP ヘッダインジェクションの概要—脆弱な URLConnection クラス—Proof of Concept code—脆弱性の影響を受ける Android バージョン

Page 12: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

脆弱な URLConnection クラス

12

脆弱な 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.

Page 13: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

脆弱な URLConnection クラス

13

脆弱性なメソッド —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() は冗長なので記載を省く

Page 14: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

目次

14

前半 – 脆弱性の調査—脆弱性調査の経緯—HTTP ヘッダインジェクションの概要—脆弱な URLConnection クラス—Proof of Concept code—脆弱性の影響を受ける Android バージョン

Page 15: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

Proof of Concept code

15

・改行コード による意図しない改行の挿入この例では開発者が意図しない改行コードと Cookie の値を設定するコードを挿入

・入力値検査を行っていない脆弱なクラスメソッド入力値検査を行っていないため、意図しない Cookie を設定されてしまう

Page 16: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

目次

16

前半 – 脆弱性の調査—脆弱性調査の経緯—HTTP ヘッダインジェクションの概要—脆弱な URLConnection クラス—Proof of Concept code—脆弱性の影響を受ける Android バージョン

Page 17: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

脆弱性の影響を受ける Android バージョン

17

影響範囲の調査—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

Page 18: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

影響範囲調査の結果

18

6.0 まで全ての Android バージョンが影響を受ける—脆弱性報告のとおり Android Platform の URLConnection クラ

スに HTTP ヘッダインジェクションの脆弱性がある

OpenJDK や OracleJDK では改行コードを挿入しようとすると例外がスローされ、脆弱性は存在しなかった—OracleJDK バージョン : “1.8.0_72” で確認

Page 19: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

検証コード実行結果のスクリーンショット

19

Android 2.3.3 Gingerbread (API Level 10)

Android 4.0.3 IceCreamSandwich (API Level 15)

Page 20: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

検証コード実行結果のスクリーンショット

20

Android 4.3.1 Jelly Bean (API Level 18)

Android 4.4.2 KitKat (API Level 19)

Page 21: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

検証コード実行結果のスクリーンショット

21

Android 5.1.1 Lollipop (API Level 22)

Android 6.0 Marshmallow (API Level 23)

Page 22: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

後半 - ソースコードの詳細調査

22

Page 23: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

前半 – 脆弱性の調査を踏まえ

Android Platform の URLConnection クラスにどのような問題があり、どのように修正されたのかを確認した

23

Page 24: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

目次

24

後半 – ソースコードの詳細調査—Android Platform が提供している Java 実行環境—正しい URLConnection クラスの実装 (OpenJDK)—脆弱な URLConnection クラスの実装 (Android 6.0)—修正された URLConnection クラスの実装 (master ブラン

チ )まとめ参考情報謝辞

Page 25: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

Android Platform が提供している Java 実行環境

25

中身は他のオープンソースから移植や独自実装が混在URLConnection クラスは Android バージョンにより実装が異なる ( 詳細は次ページ )

OracleJava

Google AndroidJava

OpenJDK ( リファレンス )Java

Apache Harmony etcJAVA

ほぼ同一実装 オープンソースから移植

or 独自実装

Apache Harmony etcJava

Page 26: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

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 準拠の抽象クラス

Page 27: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

Android Platform の URLConnection クラス

27

Android バージョンによる実装の違い

Android 2.2 ~Apache Harmony

Android 4.4.2 ~OkHttp

Android 4.0.3 ~独自実装?

標準 API 準拠の抽象クラスデザインパターン? Strategy?

いえいえ、ベタっと実装してますちょっと読みづらい

全ての Android バージョンの URLConnection クラスの実装で脆弱性が存在している Apache Harmony も OkHttp も同じ脆弱性を持っていたんですね

これらを踏まえて URLConnection クラスの実装を確認してみましょう

Page 28: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

目次

28

後半 – ソースコードの詳細調査—Android Platform が提供している Java 実行環境—正しい URLConnection クラスの実装 (OpenJDK)—脆弱な URLConnection クラスの実装 (Android 6.0)—修正された URLConnection クラスの実装 (master ブランチ )

まとめ参考情報謝辞

Page 29: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

正しい URLConnection の実装 (OpenJDK)

29

脆弱性を持つ Android Platform の URLConnection クラスを確認する前に、脆弱性のない Java のリファレンス実装である OpenJDK の正しい実装を確認する—URLConnection クラスと関連クラス図—HTTP ヘッダを設定する処理のシーケンス図—HTTP ヘッダ設定時に実施される入力値検査—RFC との整合性

Page 30: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

URLConnection クラスと関連クラス図

30

Page 31: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

URLConnection クラスと関連クラス図 (抽象クラス )

31

アプリケーションの実装者が扱う抽象クラス(Java 標準 API 準拠 )

Page 32: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

URLConnection クラスと関連クラス図 ( 実装クラス )

32

Java 標準 API の URLConnection クラスを継承し setRequestProperty() を実装して

いる HttpURLConnection クラス

HTTP ヘッダのキーと値を保持するクラス

Sun のパッケージって残ってたんですね

Page 33: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

HTTP ヘッダを設定する処理のシーケンス図

33

HttpURLConnection.checkMessageHeader() で改行コードの入力値検査を行っている

Page 34: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

HTTP ヘッダ設定時に実施される入力値検査

34

改行コード LF (‘\n’) の後がスペースまたは水平タブなら OK条件を満たさなければIllegalArgumentException をスローする実装になっている

Page 35: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

RFC との整合性

35

改行コード LF (‘\n’) の後がスペースまたは水平タブなら OK— RFC2616 で定義されている内容と一致する

RFC 2616 とは

Page 36: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

RFC 2616 (2.2 Basic Rule)

36

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 で定義

改行コード後のスペースと水平タブを許可いわゆる「継続行」を許可している

Page 37: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

RFC 2616 から RFC 723x へ

37

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 の扱いはどう変わったか?

Page 38: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

RFC 7230 (3.2 Header Fields)

38

RFC 7230 HTTP/1.1 Message Syntax and Routing June 2014—https://www.ietf.org/rfc/rfc7230.txt—3.2 Header Fields

改行後のスペースと水平タブも禁止につまり継続行は廃止された

Page 39: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

RFC 7230 (3.2.4 Field Parsing)

39

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 では有効となってい

Page 40: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

OpenJDK の URLConnection クラスの実装まとめ

40

RFC 2616 に準拠した実装になっている改行コード後にスペースか水平タブ以外の値を設定すると例外 (IllegalArgumentException) をスローする

Android Platform の URLConnection クラスではどうなっているのか?

Page 41: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

目次

41

後半 – ソースコードの詳細調査—Android Platform が提供している Java 実行環境—正しい URLConnection クラスの実装 (OpenJDK)—脆弱な URLConnection クラスの実装 (Android 6.0)—修正された URLConnection クラスの実装 (master ブランチ )

まとめ参考情報謝辞

Page 42: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

脆弱な URLConnection クラスの実装

42

Android Platform の 脆弱な URLConnection クラスの実装を確認する本稿では Android 6.0 を対象に実装の確認を行う—Android バージョンによる実装の違い—URLConnection クラスと関連クラス図—HTTP ヘッダを設定する処理のシーケンス図—HTTP ヘッダ設定時に実施される入力値検査—RFC との整合性

Page 43: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

Android バージョンによる実装の違い

43

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 ヘッダインジェクションの脆弱性が存在した

Page 44: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

OkHttp とは

44

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 から取り込んだ実装 ) を示す

Page 45: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

URLConnection クラスと関連クラス図

45

Page 46: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

URLConnection クラスと関連クラス図 (抽象クラス )

46

アプリケーションの実装者が扱う抽象クラス(Java 標準 API 準拠 )

Page 47: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

URLConnection クラスと関連クラス図 ( 実装クラス )

47

HTTP ヘッダのキーと値を保持するクラス

Java 標準 API の URLConnection クラスを

継承し setRequestProperty() を実装している HttpURLConnectionImp クラス

Page 48: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

HTTP ヘッダを設定する処理のシーケンス図

48

Android Platform では HTTP ヘッダの設定に関わる全てのクラスとメソッドで入力値検査をしていないのか?

これらのクラスとメソッドで入力値検査をしているか確認した

Page 49: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

HTTP ヘッダ設定時に実施される入力値検査

49

]

引数に対する Null Check はされているが・・・

Page 50: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

HTTP ヘッダ設定時に実施される入力値検査

50

内部メソッドを呼び出してるだけ

Page 51: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

HTTP ヘッダ設定時に実施される入力値検査

51

ヘッダフィールド名が既に存在していたら上書き配列の偶数要素がフィールド名で、奇数要素が値・・・

Page 52: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

HTTP ヘッダ設定時に実施される入力値検査

52

2度目の Null Check をしているが、改行コードが含まれるか入力値検査は行われていない

Page 53: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

RFC との整合性

53

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 ブランチでは、どのように修正されたのか?

Page 54: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

目次

54

後半 – ソースコードの詳細調査—Android Platform が提供している Java 実行環境—正しい URLConnection クラスの実装 (OpenJDK)—脆弱な URLConnection クラスの実装 (Android 6.0)—修正された URLConnection クラスの実装 (master ブランチ )

まとめ参考情報謝辞

Page 55: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

修正された URLConnection クラスの実装

55

master ブランチに取り込まれた URLConnection クラスの実装を確認する—URLConnection クラスと関連クラス図—HTTP ヘッダを設定する処理のシーケンス図—HTTP ヘッダ設定時に実施される入力値検査—RFC との整合性

Page 56: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

URLConnection クラスと関連クラス図

56

checkNameAndValue() が追加された

Page 57: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

HTTP ヘッダを設定する処理のシーケンス図

57

checkNameAndValue() で入力値検査を実施

Page 58: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

HTTP ヘッダ設定時に実施される入力値検査

58

HTTP ヘッダフィルード名、値ともにアスキーコードの 0x1f 以下、及び 0x7f 以上が含まれていたら IllegalArgumentException をスローする

Page 59: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

RFC との整合性

59

改行コードを含む制御文字が全て禁止され RFC 7230 に準拠した修正が行われた— IT 用語辞典 e-Words より ASCII 文字コード表を引用— http://e-words.jp/p/r-ascii.html

修正で禁止された制御文字

Page 60: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

目次

60

後半 – ソースコードの詳細調査—Android Platform が提供している Java 実行環境—正しい URLConnection クラスの実装 (OpenJDK)—脆弱な URLConnection クラスの実装 (Android 6.0)—修正された URLConnection クラスの実装 (master ブラン

チ )まとめ参考情報謝辞

Page 61: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

まとめ

61

誰が本脆弱性の影響を受けるか—HTTP ヘッダフィールドを外部入力として受け取る

Android アプリ対策1. master ブランチの checkNameAndValue() を

Android アプリに移植して、 HTTP ヘッダの入力値検査を行うように修正する (推奨 )

2. 脆弱性が修正されている OkHttp version 2.5 以降を使いアプリケーションを実装し直す (大変 )

全ての開発者が注意すべきこと—セキュアコーディングの原則として、信頼境界の外から受

け取るパラメータを信用せず入力値検査を行う

Page 62: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

目次

62

後半 – ソースコードの詳細調査—Android Platform が提供している Java 実行環境—正しい URLConnection クラスの実装 (OpenJDK)—脆弱な URLConnection クラスの実装 (Android 6.0)—修正された URLConnection クラスの実装 (master ブラン

チ )まとめ参考情報謝辞

Page 63: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

参考情報

63

本稿では 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側の責任と考

えたうえで、アプリケーション側でもヘッダ文字列のバリデーション等で対策をしておくことを推奨します」

Page 64: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

目次

64

後半 – ソースコードの詳細調査—Android Platform が提供している Java 実行環境—正しい URLConnection クラスの実装 (OpenJDK)—脆弱な URLConnection クラスの実装 (Android 6.0)—修正された URLConnection クラスの実装 (master ブラン

チ )まとめ参考情報謝辞

Page 65: Android Platform の URLConnection に HTTP ヘッダインジェクションの脆弱性

Copyright©2016 JPCERT/CC All rights reserved.

謝辞

65

JVN#21612597 で公開された Apache Cordova に関する脆弱性の報告者である、ソニーデジタルネットワークアプリケーションズ株式会社の西村宗晃氏の追加調査により本脆弱性が存在する事が判明しました。本脆弱性情報を JPCERT/CC に報告いただいた西村氏に御礼申し上げます。