公開日:2016/02/19 最終更新日:2016/02/19

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

概要

Android Platform の URLConnection クラスには、HTTP ヘッダインジェクションの脆弱性が存在します。

影響を受けるシステム

  •   Android 2.2 から 6.0 に含まれる URLConnection クラス
Android 2.2 より前のバージョンに含まれる URLConnection クラスも影響を受ける可能性があります。

詳細情報

Android Platform の URLConnection クラスは、Android のバージョンにより実装が異なっており Android 4.4.2 からは、オープンソースの OkHttp から取り込んだソースコードを使用しています。
OkHttp の 2.5.0 より前のバージョンには HTTP ヘッダインジェクションの脆弱性があります。
Android Platform では OkHttp 2.5.0 より前のバージョンのソースコードを取り込んでいる URLConnection クラスに同じ脆弱性が存在しています。

Android Platform の URLConnection.setRequestProperty() や URLConnection.addRequestProperty() を使っている実行環境では、アプリケーションが HTTP ヘッダを設定・追加する際に、外部から受け取った信頼できない値を検証しないまま使っていると HTTP ヘッダインジェクションが行なわれる可能性があります。

RFC 2616 の 2.2 Basic Rules によると HTTP ヘッダフィールド値は継続行が許可されています。

HTTP/1.1 header field values can be folded onto multiple lines if the
continuation line begins with a space or horizontal tab. All linear
white space, including folding, has the same semantics as SP. A
recipient MAY replace any linear white space with a single SP before
interpreting the field value or forwarding the message downstream.

RFC 2616 は RFC7230 から RFC7235 が発行された際に obsoleted になりました。
RFC 7230 の 3.2.4 Field Parsing によると message/http media type 以外は継続行が許可されなくなりました。

Historically, HTTP header field values could be extended over
multiple lines by preceding each extra line with at least one space
or horizontal tab (obs-fold).  This specification deprecates such
line folding except within the message/http media type
(Section 8.3.1).  A sender MUST NOT generate a message that includes
line folding (i.e., that has any field-value that contains a match to
the obs-fold rule) unless the message is intended for packaging
within the message/http media type.

想定される影響

想定される影響はアプリケーションによって異なりますが、表示されるページが改ざんされたり任意のスクリプトが実行されたりクッキーに任意の値を設定されたりする可能性があります。

対策方法

対策済みの OkHttp を使用する
OkHttp では本脆弱性はバージョン 2.5.0 で修正されています。最新の OkHttp を使いアプリケーションを再実装することで対策を行う事が可能です。
Android Platform では、Android 6.0 をリリースした後に Github の master branch で OkHttp 2.5.0 の修正を取り込んでいます。

ワークアラウンド
Android Platform の URLConnection.setRequestProperty() や URLConnection.addRequestProperty() の引数として渡される文字列の中に、制御文字など不正な文字が含まれないように入力値検査を行ってください。
詳細は RFC7230 3.2.4 Field Parsing を参照してください。

参考情報

  1. Japan Vulnerability Notes JVN#21612597
    Apache Cordova プラグイン cordova-plugin-file-transfer における HTTP ヘッダインジェクションの脆弱性
  2. SlideShare
    Android Platform の URLConnection クラスに HTTP ヘッダインジェクションの脆弱性

JPCERT/CCからの補足情報

JPCERT/CCによる脆弱性分析結果

CVSS v3 CVSS:3.0/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N
基本値: 4.3
攻撃元区分(AV) 物理 (P) ローカル (L) 隣接 (A) ネットワーク (N)
攻撃条件の複雑さ(AC) 高 (H) 低 (L)
必要な特権レベル(PR) 高 (H) 低 (L) 不要 (N)
ユーザ関与レベル(UI) 要 (R) 不要 (N)
スコープ(S) 変更なし (U) 変更あり (C)
機密性への影響(C) なし (N) 低 (L) 高 (H)
完全性への影響(I) なし (N) 低 (L) 高 (H)
可用性への影響(A) なし (N) 低 (L) 高 (H)
CVSS v2 AV:N/AC:M/Au:N/C:N/I:P/A:N
基本値: 4.3
攻撃元区分(AV) ローカル (L) 隣接 (A) ネットワーク (N)
攻撃条件の複雑さ(AC) 高 (H) 中 (M) 低 (L)
攻撃前の認証要否(Au) 複数 (M) 単一 (S) 不要 (N)
機密性への影響(C) なし (N) 部分的 (P) 全面的 (C)
完全性への影響(I) なし (N) 部分的 (P) 全面的 (C)
可用性への影響(A) なし (N) 部分的 (P) 全面的 (C)

謝辞

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

関連文書

JPCERT 緊急報告
JPCERT REPORT
CERT Advisory
CPNI Advisory
TRnotes
CVE CVE-2016-1155
JVN iPedia