91
Tsukasa OI a4lg.com 2015-09-09 日本 Android の会 | 20159月 定例会 さらば、Stagefright 脆弱性 結局この脆弱性は何だったのか / 混乱と騒動の中から見出すべきものは? [JAPANESE : version 1.1]

さらば、Stagefright 脆弱性

Embed Size (px)

Citation preview

Page 1: さらば、Stagefright 脆弱性

Tsukasa OIa4lg.com

2015-09-09日本 Android の会 | 2015年 9月 定例会

さらば、Stagefright 脆弱性結局この脆弱性は何だったのか / 混乱と騒動の中から見出すべきものは?

[JAPANESE : version 1.1]

Page 2: さらば、Stagefright 脆弱性

注意点 (日本語版)• このプレゼンは日本向けに書かれています

• 後述するように、日本固有のキャリア事情や報道などに強く依存しています

• そのため、日本国外ではこのスライド内の情報の一部が適用できないことがあります

• このプレゼンの対象者は、主に非セキュリティ分野の情報技術者です• 技術的すぎる部分はほとんどスライドから外しています

Page 3: さらば、Stagefright 脆弱性

この資料について (version 1.1)• 9月9日の “日本 Android の会 定例会” にて

用いた version 1.0 の拡張版です• 一部情報の追加、(スピーチには入れなかったが)

訂正、構成上の順番の変更などを含みます

Page 4: さらば、Stagefright 脆弱性

自己紹介 (1 of 2)• 大居 司 (Tsukasa OI; @a4lg)

• 現在無所属のセキュリティ研究者• Black Hat Abu Dhabi 2011 / USA 2012 スピーカー

• 本来の専門は低レイヤーのアーキテクチャ• モバイル OS 研究においては主に低レイヤーにおいて

どのようにシステムが構築され、それにどのようなセキュリティの問題があるかを扱っていた

• ただし必要に応じて高レイヤーの問題も扱う(というか……扱いすぎた?)

Page 5: さらば、Stagefright 脆弱性

自己紹介 (2 of 2)• 大居 司 (Tsukasa OI; @a4lg)

• 現在無所属のセキュリティ研究者• Black Hat Abu Dhabi 2011 / USA 2012 スピーカー

• FFRI にてモバイル OS 研究などに従事 (-2014)• Android

• “Inside Android Security” などのAndroid セキュリティに関する基礎的なドキュメントを執筆

• Android 4.0 の ASLR が完全でないことを暫定パッチとともにGoogle に指摘し (ただし内部的には既に問題を把握していた模様)Android 4.1 の修正時に世界で初めて詳細な記事を公表 1

• Windows Phone 7.x• Windows Phone 7 の脆弱性攻撃への耐性と

構造的な一部問題点についてある程度体系的にまとめる(Microsoft の宣伝において “第三者機関の調査” として紹介 2)

1. https://ja-jp.facebook.com/notes/4559315177579362. https://www.microsoft.com/ja-jp/windowsphone/products/merit/security/default.aspx

Page 6: さらば、Stagefright 脆弱性

今回のセッションでは……• 騒動の全体を振り返る• Stagefright 脆弱性とは

なんだったのか、技術的観点から整理する• 騒動の問題点を振り返る• 反省点と課題を見出す

Page 7: さらば、Stagefright 脆弱性

振り返り編結局何があったのか(そしてこの発表の中でどう見ていくのか)

Page 8: さらば、Stagefright 脆弱性

脆弱性振り返り (1 of 5)• 2015年 7月 27日、Zimperium (zLabs) の

Joshua J. Drake (@jduck) 氏が4月と5月に報告した脆弱性の概要が公表される 1

• Android 共通コンポーネントの脆弱性• 脆弱なコンポーネント “Stagefright” と

同名の “Stagefright” と命名される (要曖昧さ回避)

1. https://blog.zimperium.com/experts-found-a-unicorn-in-the-heart-of-android/

Page 9: さらば、Stagefright 脆弱性

脆弱性振り返り (2 of 5)• 脆弱性の “深刻さ” を物語る報道が次々と現れる

• Android 2.2-5.1 に影響• リモートからアプリ権限での任意コード実行• 悪意ある MMS を送るだけで感染させることが可能

• MMS 受信の無効化が対策になる• Android 端末の 90% 以上が影響を受ける

• 最大規模のアップデートとなりうる

• が、問題ある報道も多数(赤字はすべて [程度の差はあれ] 問題のある報道)• 大人気ないが、あんまりだった記事の例 (後述):

95%のAndroid端末にMMSを受信するだけで端末を乗っ取られる脆弱性が発覚、対策はこれ – GIGAZINE 1

• また報道ではほとんど語られなかった “問題” も……

1. http://gigazine.net/news/20150728-android-hack-stagefright/

Page 10: さらば、Stagefright 脆弱性

脆弱性振り返り (3 of 5)• Zimperium (zLabs) による実証動画

(8月 5日投稿) も混乱を一部もたらす• MMS 送信によってリバースシェルを取るだけではなく

root 化まで実施してしまう• 予備知識がないと誤ったメッセージを

受け取ってしまう危険性がある• 少なくとも、専門家以外が見る場合に

注意するべき点が幾つか……• Google と Samsung が OTA において

毎月セキュリティアップデートを配信へ• 良さそう (だけど追従できるのか?)

Page 11: さらば、Stagefright 脆弱性

脆弱性振り返り (4 of 5)• 8月17日前後 (Black Hat USA より遅れて)

Drake 氏のスライドがオンライン公開される• 報道でカバーされていない点も含めて、

技術的には非常に誠実に書かれている• Stagefright 経由の攻撃に関して私の独自発見だと

思っていた部分も、大半は Drake 氏によって既に指摘されていた• しかし、日本の報道のほとんどでは

その重要な多くが省略されてしまっていた• そもそも事前の予告だけ記事にして

Black Hat USA の発表をベースにした記事が出てない例も……

1. https://www.blackhat.com/docs/us-15/materials/us-15-Drake-Stagefright-Scary-Code-In-The-Heart-Of-Android.pdf

Page 12: さらば、Stagefright 脆弱性

脆弱性振り返り (5 of 5)• 9月 9日 (日本時間 10日)、

Drake 氏による攻撃コードが公開される• CVE-2015-1538 #1 (‘stsc’ chunk)• Android 4.0 においては

完全な ASLR バイパスを行っている• これから第三者による分析がさらに進むだろう!

Page 13: さらば、Stagefright 脆弱性

今回まとめておきたいこと• Stagefright の立ち位置• Stagefright 脆弱性の技術的要素

• 何がマズいのか• 考えられる攻撃ルート• 考えられる影響

• 混乱した情報の整理• 報道のどこがマズかったのか• MMS は日本において本当に深刻なものなのか• その他 (数トピック)

• Android のアップデート問題• 今後どうするべきか? (他社から見えてくる例)

Page 14: さらば、Stagefright 脆弱性

基礎編Stagefright とメディア処理 (Stagefright の立ち位置)

Page 15: さらば、Stagefright 脆弱性

Stagefright とは??• Stage fright (不可算名詞)

→ 舞台負け / アガり• Stage flight と勘違いしやすいとか?• ……について聞きたいわけではないですよね。

Page 16: さらば、Stagefright 脆弱性

Stagefright とは? (1 of 3)• Android 中でメディア (音声/動画) を扱うための

共通インタフェースを定義するフレームワーク(libstagefright および周辺のいろいろ)• Android 2.2-2.3* において従来のメディア処理

フレームワーク (OpenCore) に代わる形で登場(既存ソフトウェアを取り込んだわけではない)

• OpenMAX (OMX) IL コンポーネントによる拡張• デフォルトのソフトウェアデコーダやエンコーダも

OpenMAX IL コンポーネントとして実装されている• 共通化されたインターフェースの提供

(エンコーダ、デコーダ、メディア情報取得)

* Android 2.0 でソースコード上は登場していたが、Android 2.2 でメディアフレームワークの選択肢に上がり、デフォルトで有効化されたのは Android 2.3 から

Page 17: さらば、Stagefright 脆弱性

Stagefright とは? (2 of 3)• Android 中でメディア (音声/動画) を扱うための

共通インタフェースを定義するフレームワーク(libstagefright および周辺のいろいろ)• 実際の処理の多くは副ライブラリか外部に丸投げ

• ソフトウェア処理の例: FLAC [libFLAC]• ハードウェア処理 (カスタム OMX コンポーネント)

• Stagefright ライブラリの中心的実装においては主に基本的なメタデータ等のパースや下位のデータ構造との橋渡しを行う

• Android で使用されている• ……だけかと思いきや……!

Page 18: さらば、Stagefright 脆弱性

Stagefright とは? (3 of 3)• Mozilla Firefox (PC 版含む!) においても

メディア処理に使用されている!• 当然のように、同じ脆弱性を共有してしまった

• ただし、Android そのものの Stagefright から独自で手を加えているらしい• そのため修正はやや混乱した状況にある• 重要な部分に関しては Firefox 38.0 で修正

• 一部は時期的に Drake 氏の発見とは独立に修正されたものとみられる

• 任意コード実行に発展しない可能性が高い一部の脆弱性 (クラッシュにはつながる) は未修正 *

• 今回のセッションでは主に Android を扱う

* Zimperium 公開の PoC (任意コード実行ではなくクラッシュのデモ) を Firefox 40.0.3 で再生させると、そのうちひとつのファイルにてクラッシュが発生する。

Page 19: さらば、Stagefright 脆弱性

Android におけるメディア処理 (1 of 3)例: MediaPlayer クラスを使用して音楽再生を行う場合

libstagefright.so (共通インターフェース)

3rd party OMX

VPU 等の HW

Stagefright 副ライブラリ

外部 libs (libvorbis 等)外部 libs

(libFLAC 等)

Stagefright があるが実はこの “外” が重要

Page 20: さらば、Stagefright 脆弱性

Android におけるメディア処理 (2 of 3)• Android の多くの “特権” 処理は

分離されたプロセス内のサービスで行われる• メディア処理は “mediaserver” プロセス

(MediaPlayerService) によって行われる• Binder を介した IPC (プロセス間通信)• “mediaserver” は “media” ユーザーで動作

(その他 GID 割り当て等に関しては後述)• 脆弱性の誤解:

攻撃に成功すると、アプリの権限を得る• 今回の攻撃の場合、アプリから分離された

“mediaserver” プロセス内でバッファオーバーフローが発生• 結果、当プロセス (“media” ユーザなど) の権限を得る

Page 21: さらば、Stagefright 脆弱性

Android におけるメディア処理 (3 of 3)例: MediaPlayer クラスを使用して音楽再生を行う場合

(おおむねコールスタック逆順)

app_process (アプリケーションプロセス)アプリケーション実装

…android.media.MediaPlayer クラス

libmedia.so (Media Library)

mediaserver (メディア処理サービス)

libmediaplayerservice.so (Media Player Service)

libstagefright.so (共通インターフェース)

3rd party OMX

VPU 等の HW

Stagefright 副ライブラリ

外部 libs (libvorbis 等)外部 libs

(libFLAC 等)

* Media Player Service による “Render” 処理の後、基本的には同一プロセス内の AudioFlinger (オーディオミックスなど) や別プロセスの SurfaceFlinger (描画結果の調停) によって最終的なメディア再生が行われる (ここでは省略)

Binder(IPC)

脆弱性!

Page 22: さらば、Stagefright 脆弱性

技術編 (1 of 2)Drake 氏が発見した脆弱性とはどのようなものだったのか?

Page 23: さらば、Stagefright 脆弱性

パッチを調べてみよう (1 of 2)• Drake 氏による 12 個のパッチ

パッチ 脆弱性の (主要な) 種別 あり得る結果の例 原因

1 NULL ポインタアクセス クラッシュ 状態管理の不備

2 NULL ポインタアクセス クラッシュ 状態管理の不備

3 0 除算 クラッシュ 値の検証不足など (分類困難)

4 バッファオーバーフロー メモリ破壊 * 整数オーバーフロー

5 C++ 例外の不適切な発生 クラッシュ 例外を投げうる new の使用

6 バッファオーバーフロー メモリ破壊 * 整数オーバーフロー

7 バッファオーバーフロー クラッシュ / 情報漏洩? 整数オーバーフロー

8 バッファオーバーフロー メモリ破壊 * 整数オーバーフロー

9 バッファオーバーフロー クラッシュ / 情報漏洩 文字列の null 終端忘れ

10 バッファオーバーフロー メモリ破壊 * 整数オーバーフロー

11 バッファオーバーフロー メモリ破壊 * 整数オーバーフロー

12 バッファオーバーフロー メモリ破壊 * 整数オーバーフロー

* “メモリ破壊” と記したものは、任意コードが実行できる可能性がある。攻撃者による破壊の (精密な) コントロールが困難である場合がある一方で、Stagefright 関連コンポーネントの一部はマルチスレッド動作することに注意。

* “情報漏洩” は必ずしも “秘匿” したいデータの漏洩に限らない (防御突破のための有効なポインタアドレス取得など)

Page 24: さらば、Stagefright 脆弱性

パッチを調べてみよう (2 of 2)• 特に重大な結果をもたらしうる脆弱性は

どれも整数オーバーフロー起因であるようだ• それ以外の修正もかなりあるが、どれも

直接の任意コード実行には発展させにくい(一部はそもそも発展が不可能)

• 整数オーバーフローがもたらすバッファオーバーフローとは?• 事前注意 : 符号の有無に関わらず発生しうる

(今回は [偶然にも] すべて符号無し整数型が関与するが)

Page 25: さらば、Stagefright 脆弱性

整数オーバーフローと脆弱性 (1 of 3)• 整数演算の結果、結果がその整数型の範囲内に

収まらなくなった際に発生する現象を見る• C/C++ の場合 (符号付き 8-bit 整数型 [-128〜127*]):

• 具体的な挙動は未定義!(-128 が得られるかもしれないが、それは単なる偶然)

• 他の言語では具体的挙動が定義される場合がある

0 1111111127

0 00000011

+ 128 1 0000000 (-128) ?

表現可能範囲を超える

?

結果や挙動は未定義

* 内部表現が 2 の補数である場合を例として示したが、どの内部表現でも未定義であることには変わらない(余談: C++ では内部表現の具体的規定は無く、C では 2 の補数、1 の補数ないし符号付き絶対値のいずれか、という規定がある)

Page 26: さらば、Stagefright 脆弱性

整数オーバーフローと脆弱性 (2 of 3)• 整数演算の結果、結果がその整数型の範囲内に

収まらなくなった際に発生する現象を見る• C/C++ の場合 (符号無し 8-bit 整数型 [0〜255]):

• 桁あふれされたビットが切り捨てられる(例えば 8-bit の場合、2^

8 = 256 のモジュロに等しい)• 結果は明確に定義されている (ただそれが “安全” かは別)

11111111255

000000011

+ 1 00000000 (256)

00000000 0

桁あふれが発生

あふれたビットを切り捨て

Page 27: さらば、Stagefright 脆弱性

整数オーバーフローと脆弱性 (3 of 3)• 特にバッファサイズの計算などで

不適切な整数オーバーフローが起こると、バッファオーバーフローの直接的な原因となりうる• 例えば、こんなコード、書いてませんか?

size_t sz;if (fread(&sz, sizeof(size_t), 1, fin) < 1) goto error;int *buf = new int[sz + 4];// ...

• sz の与え方によって (sz + 4) にてオーバーフローが発生• sz が SIZE_MAX である場合 (sz + 4) は 3

• 明示的な演算以外の要因 : 型変換など• 実は、上記のコードには (C++ の規格バージョン等によっては)

足し算以外のオーバーフローもある! *

• 具体的実装によってはかなり深刻なバッファオーバーフローが発生してしまう!

* 答えはおまけセクションにて

Page 28: さらば、Stagefright 脆弱性

バッファオーバーフロー入門 (1 of 2)• “メモリの破損” を攻撃者が精密に制御する

ことにより、プログラムの動作を改変する• 古典的なスタックオーバーフローの例

スタック上の配列 (バッファ)

決められた範囲からはみ出すと右側の戻りアドレスなどが

上書きされる

戻りアドレス その他

呼び出し履歴サブルーチン

Aサブルーチン

B

攻撃者によって書き換えられる!スタック上の配列 (バッファ)

戻りアドレス その他

呼び出し履歴

攻撃者のコード サブルーチンB

攻撃によって、“サブルーチン A” から呼び出されていたはずのフローが “攻撃者のコード” に置き換わっている!

Page 29: さらば、Stagefright 脆弱性

バッファオーバーフロー入門 (2 of 2)• データ領域の実行防止 (DEP) などを躱すため、

既存の実行可能コードの断片を繋ぎあわせて必要な攻撃を行う手法なども多く使われる• 例: 古典的なスタックオーバーフローに DEP 回避の

ROP (Return-Oriented Programming) が用いられた場合

攻撃者によって書き換えられる!スタック上の配列 (バッファ)

戻りアドレス 攻撃コード

DEP により、書き込まれた攻撃コードを直接実行できない

攻撃者によって書き換えられる!スタック上の配列 (バッファ)

戻りアドレス

戻りアドレス

戻りアドレス

戻りアドレス

正規の実行

モジュール

正規の実行モジュールのうち都合の良いアドレスを選択

呼び出し履歴

コード断片 4

コード断片 3

コード断片 2

コード断片 1

サブルーチン

断片をパズルのように繋ぎあわせて攻撃コードになるよう組み上げる

Page 30: さらば、Stagefright 脆弱性

脆弱性のひとつを見る (1 of 2)• ‘tx3g’ チャンクの処理における整数オーバーフロー

• これは字幕などのための MPEG-4 チャンク• 重要な前提 :

複数の tx3g チャンクが現れたとき、中身は連結してひとつにする

• 脆弱性を発見してみよう!

Page 31: さらば、Stagefright 脆弱性

脆弱性のひとつを見る (2 of 2)• ‘tx3g’ チャンクの処理における整数オーバーフロー

chunk_size : MPEG-4 チャンクの(攻撃者が偽装可能な) サイズ

mLastTrack : 処理中の MPEG-4 トラック

case FOURCC('t', 'x', '3', 'g'):{

uint32_t type;const void *data;size_t size = 0;if (!mLastTrack->meta->findData(

kKeyTextFormatData, &type, &data, &size)) {size = 0;

}

uint8_t *buffer = new uint8_t[size + chunk_size];

if (size > 0) {memcpy(buffer, data, size);

}

// ...処理済み字幕のコピー

(後で新しい字幕を追記)

整数オーバーフロー!

バッファオーバーフロー!(攻撃者によって制御されたサイズ)

* 本脆弱性においては同じ処理に起因して最大 2 回のバッファオーバーフローが発生しうる (データソースによって異なる) のだが、ここでは必ず実行される方のバッファオーバーフローのひとつ (バッファ前半) と双方共通の原因になっている前半部分を抜粋。

Android 4.4 (r1) : frameworks/av/media/libstagefright/MPEG4Extractor.cpp より一部抜粋

Page 32: さらば、Stagefright 脆弱性

実証編一部の人にとってはお楽しみのタイム一部の人にとっては恐怖のタイム

Page 33: さらば、Stagefright 脆弱性

デモに際して• 現地でのデモはできません (sorry!)

• デモの payload 配置にて不確定要素が排除できておらず、最悪の場合 1 時間以上トライし続けることになるため

• そのため、あらかじめ用意したムービーを再生する形になります

• “実証編” では、まず攻撃経路を確認してもらう• 後々も、デモ (で配置した payload) を使って

何ができるかなどを確認してもらう

Page 34: さらば、Stagefright 脆弱性

Demo (1 of 2)• まずは報道で散々騒がれた、

MMS 経由の攻撃について……見てみよう• ごめんなさい、キャンセルします• ソフトバンク回線が実家にて非常に安定せず、

また開発途中の exploit の成功率が低いためにうまく動画を撮れなかった• ドコモ回線ですらたまに捉まらない場所なのでお察しください……

• Android 4.4 を当初の攻撃対象としたため、MMS のみの純粋な攻撃ルートではなく、別の脆弱性を用いて ASLR を回避するものだった

Page 35: さらば、Stagefright 脆弱性

Demo (2 of 2)• 一方報道でほとんど騒がれなかった、

Web ブラウザの罠ページ経由での攻略も見てみよう• 特定のファイルをダウンロードし、

メモリ上で実行 (exec ではない!) してしまう• Nexus 5 + Android 4.4.0 (r1)

• 後のデモの一部は Android 5.0.0 (r1) でも見せる

Page 36: さらば、Stagefright 脆弱性

技術編 (2 of 2)Stagefright 脆弱性を使って何ができる/できたのか

Page 37: さらば、Stagefright 脆弱性

攻撃ルート• Stagefright によるメディア取り扱い

(に伴うメタデータ取得) が絡むならなんだって攻撃ルートになってしまう• 通信路への介入 (通信の最適化)• Web サイトの不正書き換え• 罠ページへの誘導• MMS へのメディア添付• 悪意あるアプリケーション

Page 38: さらば、Stagefright 脆弱性

影響 (1 of 2)• “mediaserver” プロセスの権限を奪われる

• アプリ固有のデータには基本的にアクセスできないが……• 当プロセスは各種メディア処理に関する

数々の特権を持っている!• GID: inet

インターネット経由で遠隔操作や情報送信が可能(Zimperium のデモでリモートのシェルが取れた理由)

• GID: audio / cameraマイク / カメラの完全な操作権が得られてしまう

• その他 (Bluetooth 周りなど)

Page 39: さらば、Stagefright 脆弱性

影響 (2 of 2)• “mediaserver” プロセスの権限を奪われる

• アプリ固有のデータには基本的にアクセスできないが……• 当プロセスは各種メディア処理に関する

数々の特権を持っている!• 同プロセスで動くサービス : AudioFlinger

音声出力を全て握られる• また、関連するデバイスノードに対する直接アクセス権を

持っていることにも注目すべきかもしれない(端末依存だが、root 化などの危険性が比較的高い)

• 一部端末では他の (さらに危険な)特権が割り当てられていることがある• Drake 氏のスライド (英語) 参照

Page 40: さらば、Stagefright 脆弱性

緩衝要素? (1 of 2) : SEAndroid• NSA などによる SELinux の拡張で、

Android 固有の Binder なども保護対象に• Android 4.3 で追加

(ただしログは出すが違反を止めない Permissive モード)• Android 4.4 で違反を阻止する Enforcing モードに

• こちらは権限拡大や一部の攻撃を阻止する役目があるはずのだが……• 権限拡大の前の “正当な” 権限が既に十分広い• (デバイス依存だが) カーネル脆弱性を突かれると

SEAndroid が (SELinux 含め) 突破されてしまう• Android 4.4 においては、mediaserver 動作ドメインは

事実上 SELinux が無効である! (permissive + unconfined)• Android 5.0 においてまだマシなポリシーに

Page 41: さらば、Stagefright 脆弱性

SEAndroid@すこしがんばる?• 必要な権限以外を見ていくと… (Android 5.0)• 良いところ

• Permissive でも Unconfined でもない (ポリシー制限有効)• シェルの起動はできない

• 前提条件のうちひとつ、execute 権限がない (target: shell_file)• その他多くのツール (target: system_file)も execute 権限があったとしても

execute_no_trans 権限 * がないために起動できない• 自身や非特権アプリが書き込めるファイルは実行禁止

• 共有ライブラリとしてのロード (mmap) 含む

• 悪いところ• 自身に execmem 権限が付与されている *

* execute_no_trans 権限は、ドメイン (権利区分) を移動せずに実行できるか否かを示す権利。例えば多くのシェル向けツールは実行元と同じ権限で動作した方が良いが、そのような動作は execute_no_trans によって支配される (ドメイン移動する場合は transition と entrypoint)。

* execmem 権限は自プロセスの書き込み可能だったデータ領域を実行できるようにするか否かを示す権利。これがないと JIT が使えないが、一方で大きなコードを実行可能にする攻撃の一部が防ぎやすくなる。なお、領域によっては execstack / execheap (brk 周りの領域のみ) / execmod によっても追加チェックされる。

Page 42: さらば、Stagefright 脆弱性

緩衝要素? (2 of 2) : ASLR• 今回使用した脆弱性の場合、

ASLR (非専門家向けの喩え: 分身の術) による攻撃の信頼性低下を図ることができる??• Android 4.0 にて追加 (+ 開発者サイトにて宣伝) されたが、

その時点では不完全 (2 つの実行可能モジュールが固定)• Android 4.1 において完全な ASLR が有効に• 実行ごとにメモリ配置をわざとランダムにする

実行 1

実行 2

実行 3

攻撃者は非常に精密にメモリを破壊しなければならないが…

特定アドレス (白色) を狙おうとしてもなかなか当たらない

Page 43: さらば、Stagefright 脆弱性

ASLR@(あまり)がんばらない• しかし、攻撃が不可能ではないことに注意

• (別途) 実行中のポインタ漏洩に関する脆弱性の利用• mediaserver はクラッシュ後すぐ再起動し、アプリ実装に

よっては何事もなかったかのように継続実行するため……ASLR などを突破できるまで叩き続けることが可能!• 先ほど、Web 攻撃が成功した理由

• ASLR は、一度攻撃に失敗すれば次の攻撃が不可能か、少なくとも不連続になる暗黙の前提がある• この場合、攻撃失敗が見た目上わかりにくく、

かつすぐに再攻撃を行うことができるため、ASLR の安全性の根拠が崩壊する

Page 44: さらば、Stagefright 脆弱性

まとめ : 技術的要素• 攻撃ルートは色々ある• 影響は単一アプリの範囲を超えてしまう

• カメラ、マイク、スピーカーの完全制御含む• 緩衝要素も色々ある

• が、ルートによっては攻撃を十分緩衝できない (SE+ASLR)• 攻撃が成功するとその後の緩衝要素 (SEAndroid) によらず

ある程度実用的な応用が行えてしまう(今回は Zimperium のデモとは別種のインパクトを!)

Page 45: さらば、Stagefright 脆弱性

混乱編報道の混乱と、そこから生まれる反省

Page 46: さらば、Stagefright 脆弱性

Stagefright 報道に関する混乱• 軽重はあれど、数々の報道において

さまざまな混乱が生じてしまった• 考えられる要因

• 報道記者の知識不足 (全部これのせいなら話は簡単だが…)• セキュリティ研究者と一般人の本質的な視点の差• 国などの事情を考慮した “ローカライズ” 不足

• 特に、この脆弱性の攻撃ルートとして有名となった MMS は、3 つの要因すべてに基づく混乱を引き起こした• “混乱編” では特にこれについて詳しく見ていこう• その前に、問題ある報道が行われた他のトピックを……

Page 47: さらば、Stagefright 脆弱性

問題 (1) : 影響はアプリ権限?• 要因はおそらく、この種の脆弱性の “一般的な”

影響範囲からくる思い込み• Engadget Japanese のようなニュースサイト1 でも

間違いが拡散されてしまった• 恥ずかしながら、私も当初勘違いしていた……• Stagefright が直接アプリ内で動作するなら、

影響範囲は当初アプリ内に限られる(それでも攻撃可能なアプリや経路を考えると深刻だが)

• 実際にはプロセス間通信した先がやられるので、広い範囲に影響が出てしまう可能性がある• カメラ権限を持たないアプリへの攻撃が

カメラへのアクセスに直接つながるなど

1. http://japanese.engadget.com/2015/07/27/android-95-mms/

Page 48: さらば、Stagefright 脆弱性

問題 (2) : MMS 送信履歴の消去?• 一部報道において MMS 送信履歴を

バックグラウンドで消去できるという言及がある• 可能性は否定できないが、少なくともそれは

デバイス依存もしくは複数脆弱性を用いている!• media ユーザーは root でも system でもないため、

Android システム全体を好きにコントロールすることは(基本的に) 直接は不可• しかし、Drake 氏によれば一部の端末においては

mediaserver に system GID が割り当てられている(system UID と等価ではないがそれに迫る権限)

Page 49: さらば、Stagefright 脆弱性

問題 (3) : MMS 攻撃の権限• 一部報道において MMS 経由で攻撃すると

“より高い” 権限を得られるという言及がある• おそらくこれは、Drake 氏によるスライドの

“SILENT, REMOTE, PRIVILEGED” の誤訳 / 誤解釈• MMS でもそれ以外でも得られる権限は同じ

Page 50: さらば、Stagefright 脆弱性

問題 (4) : MMS 無効化が対策? (1 of 2)• 結論 (前提):

日本においては MMS 無効化は十分有効な緩和策と言い切れず、無効化後も攻撃手段が残る

• 問題については、(大人気ないが)まず私が怒った記事を再度見てもらう• 95%のAndroid端末にMMSを受信するだけで端末を乗っ取ら

れる脆弱性が発覚、対策はこれ – GIGAZINE 1

• この記事を斜め読みしたりタイトルで内容を判断した場合、何が起こる?• 最後から二番目の段落だけは私が GIGAZINE に

抗議した結果 “大幅に修正” されている• これは不誠実な記事だったが、

誠実な記事でも悲劇は終わらない……

1. http://gigazine.net/news/20150728-android-hack-stagefright/

Page 51: さらば、Stagefright 脆弱性

問題 (4) : MMS 無効化が対策? (2 of 2)• MMS 無効化が緩和策になるというのは多くの

セキュリティニュースすら書いてしまっている• ……が、日本においては安定した緩和策になるか微妙

(ローカライズの問題)• それに限らず、MMS という単なるひとつの

攻撃ルートが、報道によって注目されすぎている• 確かに、MMS という攻撃ルートは “より深刻” ではある

(セキュリティ技術者と一般人との視点の差の問題)• だが、報道がそこに偏りすぎると、日本以外においても

攻撃の対象が MMS だけに矮小化されてしまう(報道記者が伝えるべき部分を外してしまった問題 + α)

• “正確”、“十分” かつ “バランス良く” 記述していた日本語の主要ソースは 8 月末時点で 1 つ 1 のみ!

1. http://blog.trendmicro.co.jp/archives/12060 (速報の後で、正直あまり広まらなかった……)

Page 52: さらば、Stagefright 脆弱性

MMS : そもそも MMS とは?• SMS の制限 (140 文字) を突破できる

(3GPP/OMA 標準の) 携帯電話用メッセージングサービス• SMS と同じような電話番号宛の送受信も、

“メールアドレス” 形式での送受信もサポート• ただし規格上キャリア間の相互接続方式を厳密に定めておらず、

かつ相互接続はキャリア間の協力によって行われるものであるため、通信に関わるキャリアの内情によって制限が生じうる

• メディアファイルの添付をサポート• 含 : MPEG-4 ムービー

• 受信通知は特殊な SMS によって行う(この SMS の処理方法によって自動/手動受信が決まる)• この SMS による遠隔コントロール / 遠隔通知は、

MMS に限らず幾つかのプロトコルにて行われる

Page 53: さらば、Stagefright 脆弱性

MMS : 日本における MMS• Docomo : 非サポート (iOS 含む)• au (KDDI) : iOS 用回線でのみ? サポート

(粗い端末調査によると MMSC がセットされていない)(端末デフォルトでは MMS は無効)

• SoftBank : サポート

• SoftBank 回線以外ではいわゆる “緩和策” は何の効果も持たない• 安定した緩和策とは言い切れない• MMS 以外の攻撃ルートも丸々残っている• 日本でこの問題を取り上げられた tripleshot さん 1 曰く……

“「だが日本ではMMSを受信可能なAndroidはスマートフォンユーザ全体のわずか8%である!」とも書けます。(とても恣意的!)”

1. http://tripleshot.hatenablog.com/entry/2015/07/28/222103

Page 54: さらば、Stagefright 脆弱性

MMS : 注目の理由• ユーザーの入力を全く必要としないから

• 例えば一般的な攻撃ルートでは、ユーザーを騙すなどしてユーザーに何らかの操作を行わせなければならない• あるいは、攻撃ができる条件を頑張って整えなければならない

• MMS は勝手に送りつけることができ、しかも (自動受信が有効なら) 受信段階で攻撃が発動するため、攻撃者にとって極めて使い勝手が良い

• 脆弱性の深刻度を単純な判定によってスコア化する CVSS 1 の version 3 では、このような点を “User Interaction” として取り込んでいる

1. https://www.first.org/cvss

Page 55: さらば、Stagefright 脆弱性

MMS : 過剰な注目• とはいえ攻撃ルートの 1 つでしかないことから、

ここを過度に強調するべきではなかった• 一般に、脆弱性の対策 / 緩和のためには

直面するあらゆる、少なくとも主要なすべての攻撃ルートを意識する必要がある

• だが MMS は、日本以外においても主要なすべての攻撃ルートとはいえない

• 専門家の発表と一般向けであるべきメディアの間にそれぞれの視点の差があることに注意• セキュリティ技術者が MMS に対して注目するのは、

ある面では正しいし “普通” なことである• が、一般人の保護のために必要なのは

専門家によって注目されたその点だけではなかった

Page 56: さらば、Stagefright 脆弱性

MMS : 反省点• 緩和策として紹介する際は、少なくとも

国などに応じたローカライズを行うべきであった• “ローカライズ” は単なる “翻訳” に留まらない!• 報道に際して、特に緩和策の紹介に関しては

日本固有の事情を考慮した上で紹介すべきだった• 緩和策をした上で残るルートにも注意を払うべきだった• 常に、“偽の安心感” をもたらす行為を避けるべき

• 攻撃ルートは、ある程度網羅的に注目するべきであった• ひとつの攻撃ルートだけが注目されすぎると、

他の攻撃ルートに対する注目が疎かになりがち• これは、セキュリティ技術者とメディアの双方が

取り組むべき課題だと考える

Page 57: さらば、Stagefright 脆弱性

未来編これからどうするべきか……答えを示さずとも (比較的) 良い例は既にある

Page 58: さらば、Stagefright 脆弱性

Android 端末の 90% 以上という脅威• 決して無視して良いものではない• しかも、起因が共通部分であることに注意

• Android の “深刻な” 脆弱性の多くは、Android 起因というよりは (言い切れない)各種ベンダーによる変更に起因する場合が多かった• ベンダーサポート用アプリに意図的な

(しかもベンダー以外まで悪用可能な粗雑な造りの) バックドア• ドライバに初歩の初歩と言わんばかりの

バッファオーバーフローがあったり……

• 端末がアップデートされるのかという懸念• Android 端末を名乗る上でセキュリティアップデートの

期間は基本的に定められているものではない• サポート期間の問題は iOS (というか Apple 製品全般) にも

Page 59: さらば、Stagefright 脆弱性

Android : 月例アップデート?• Google と Samsung が

セキュリティアップデートを毎月 OTA 配信へ 1

• しかも一定期間のアップデートを保証するという!• それ自体はたいへん喜ばしいこと

• サポート期間の明確化3 OS の中で Windows Phone 以外のそれは不明確だった

• 定期的サポートの確約機能アップデートにくっつけてセキュリティアップデートをするようなことに伴う遅延が避けられる

• ……が、これを多くの製造者が適用しようとするとひとつの問題に直面することになる

1. http://jp.techcrunch.com/2015/08/06/20150805google-and-samsung-will-now-release-monthly-ota-android-security-updates/

Page 60: さらば、Stagefright 脆弱性

Android : Update Hell for OEM• 前提 : アップデートは主に製造者の役割

• もちろん製造者に責任を求めるのは簡単だが……• 製造者にかかる責任 / 負担が大きすぎる!

• 製造者は端末に合わせて、Android の“全て” をコンパイルしなければならない(共有可能な部分がかなりあるにも関わらず!)• 例: 各種 ARM 用 Linux ディストリビューション

大きなアーキテクチャ差やハードウェア依存のものを別として多くのパッケージをバイナリ的に共有することができている

• 製造者の責任にないセキュリティアップデートまで都度の対応を要求される

• 私は、Google やその他の企業の協力によって問題がある程度は (全てではない) 乗り越えることが可能だと考える

Page 61: さらば、Stagefright 脆弱性

共通のユーザーランドの例• Arch Linux ARM on...

• Raspberry Pi 2 Model BSoC : Broadcom

• USB ArmorySoC : Freescale

Page 62: さらば、Stagefright 脆弱性

モジュラーアップデート (1 of 4)• システムのレイヤーを明確に分割

(共通部分と端末固有部分のパッケージ化)• それぞれを独立してアップデート可能にする

• バグが生じがちなベンダー固有部分の問題は解消されないが、バグが発生した時広い問題になる共通部分に関してアップデートの負荷を軽減する

Android 端末

カーネル (Type A)

共通部分 oem.ko 共通userland

OEM固有部分

大まかなハードウェア差でカーネルは分ける必要があるだろう

それぞれパッケージ化し個別アップデート可能にしていく

* あくまで理想論だが、そうなってくれると嬉しい図

Page 63: さらば、Stagefright 脆弱性

モジュラーアップデート (2 of 4)• 例 : Windows Phone (7-8)

• コア部分は Microsoft が完全に権限を握り、製造者は基本的にその下の OEM 権限のみを得る

• それぞれのアップデートがモジュール化されている• ただし、アップデートの有無自体は

キャリアが主にコントロールしているらしい• そのためアップデートを拒否されることもあったとか

(例: Verizon は WP8 の “Cyan” アップデートを継続的に拒否) 1

• 例 : Windows 10 Mobile (発表時点では予定)• キャリアではなく Microsoft 自身が

ほぼ全てのアップデートをコントロールするようになる 1

1. http://www.zdnet.com/article/microsoft-says-its-taking-over-updates-for-windows-10-mobile-devices/

Page 64: さらば、Stagefright 脆弱性

モジュラーアップデート (3 of 4)• 例 : Ubuntu Touch

• こちらについては私が詳しく中身を調べたわけではないが……

• Canonical の Michael Hall 氏曰く…… 1

• システム全体を複数レイヤーで構成している• OEM レイヤーに影響を与えずに

ベースシステムのアップデートを行うことが可能である

1. http://news.softpedia.com/news/ubuntu-touch-support-will-be-provided-as-long-as-technically-possible-488449.shtml

Page 65: さらば、Stagefright 脆弱性

モジュラーアップデート (4 of 4)• もちろん、欠点もある

• 弱いハードウェアへのロック例 : Windows Phone (Qualcomm 製ハードウェアへの依存)• どちらかというと “どう集中させるか” の問題• おおむね問題ではない……はず

• カスタマイズ性の低下• Android にはハードコードされた部分はそこそこある

• そのため、現状の設計 “そのまま” ではモジュラー化は難しいかも• 組み込み系では高速化などのために複数レイヤーのソースコードに

手を入れるカスタマイズテクニックが紹介されている• 例: 動画再生においてメモリコピーを避けるための

OpenMAX コンポーネントを超えた Android ソースコード自体への手入れ• ベンダー固有部分はやはりベンダー責任

• カスタマイズに起因する脆弱性もやはり多い(最近だと Check Point が指摘した Certifi-gate 1 など)

1. http://www.itmedia.co.jp/enterprise/articles/1508/07/news064.html

Page 66: さらば、Stagefright 脆弱性

まとめ混乱を克服し、Stagefright 脆弱性に終止符を打つために

Page 67: さらば、Stagefright 脆弱性

まとめ (1 of 3) : 誤解を解消する• 攻撃ルートは MMS だけではない

• 矮小化された攻撃者像を是正することが必要• 攻撃後権限はアプリではない (アプリに留まらない)

• root 化抜きでも、実用的なスパイ行為が、カメラやマイク権限抜きのアプリからも行える

• Google の主張する ASLR による保護は、今回の場合不十分かもしれない• クラッシュによる再起動が見た目には分からない場合、

ASLR の安全性の根拠は事実上崩壊する• その場合、ASLR を “回避” する必要すらない

Page 68: さらば、Stagefright 脆弱性

まとめ (2 of 3) : 将来につなげていく• 今回は紛れも無く最大規模の

Android セキュリティ修正となりうる• (ほぼ) Android 固有• かつ、Android 間で共通• 対象バージョンがかなり広い

• 根本的な解決はアップデートのみであるため、どうユーザーに浸透させるかが直近の課題• 申し訳ない、今回はうまく触れられなかった!

• 将来的には、Android のアップデートに関して責任分割と負担軽減の仕組みが必要になるだろう• 現実にある例 : モジュラーアップデート

Page 69: さらば、Stagefright 脆弱性

まとめ (3 of 3) : “伝わる” 報道のために• 著しい誤解を生む (特に偽の安心感を生む) 報道は

正しい対処を行う上で極めて有害• 脆弱性に関する報道について、今回のような

混乱を避けるためには技術者とメディアの協力はもはや必要不可欠といえる!• 脆弱性に関して、“過不足なく” 伝わる報道を行うため

• 第三者による独立検証や補助も必要となるだろう• 今回とは逆に、発見者によって深刻だと宣伝されながら、

実際には深刻な影響がかなり考えにくいケースが複数あった(e.g. GHOST)

• 国などの状況に沿った情報提供• 一般人の視点で有益な情報発信をしていこう!

Page 70: さらば、Stagefright 脆弱性

END_OF_TRANSMISSIONご清聴ありがとうございました!

Special Thanks : Mr. Joshua J. Drake (@jduck)

Presented by : Tsukasa OI (大居 司; @a4lg)http://a4lg.com/

Email (フィードバック) : [email protected]

Page 71: さらば、Stagefright 脆弱性

おまけ技術的な情報が少なくて気に入らない人のために注: 専門家向け

Page 72: さらば、Stagefright 脆弱性

インデックス• Slide 73

• 算術オーバーフロー (Java / C# の場合)• Slide 74-78

• Slide 27 : 脆弱な C++ コードの答え合わせ• Slide 79-82

• ヒープオーバーフローの悪用と ROP• Slide 83-85

• SEAndroid と mediaserver• Slide 86-91

• 日本における報道とその分析?

Page 73: さらば、Stagefright 脆弱性

整数オーバーフロー (Java / C#)• Java / C# いずれにおいても、

整数オーバーフローを検出しない場合の結果は2 の補数表現で高位ビットを切り捨てた結果

• C# は checked ステートメントの使用により整数オーバーフローを検出可能である• 逆に unchecked を用いた場合意図的に検出しない

• Java 8 は java.lang.Math クラスに整数オーバーフローを検出するメソッドを追加• addExact / multiplyExact など• Android では現在使用不可

Page 74: さらば、Stagefright 脆弱性

new の隠れたオーバーフロー (1 of 5)• new 演算子による配列確保はときに危険である

• ISO/IEC 14882:1998 (C++98) の段階では new 演算子による配列確保内の整数オーバーフローによって何が起こるかが規定されていなかった

• (脆弱性含め) ほぼ同じセマンティクス• int* intarray = new(std::nothrow) int[size];• int* intarray = (int*)malloc(sizeof(int) * size);

• new 演算子は size_t 引数のallocation function (確保関数) を呼び出すと規定されている• 配列を含めて、SIZE_MAX が確保できるオブジェクトの最大サイズ

• これに対して、コンパイラ、C++ 規格双方で対処が行われている• 規格で対処が行われているのは非常に興味深いし、

プログラムを安全にする上で役立つこと

明示的な整数オーバーフロー

暗黙の整数オーバーフロー

Page 75: さらば、Stagefright 脆弱性

new の隠れたオーバーフロー (2 of 5)• gcc 4.8 や Visual C++ 2005 において、

隠された整数オーバーフローに歯止めをかける独自機能が搭載された• サイズがオーバーフローしたとき (Visual C++ 2005)

またはオーバーフローしそうなとき (gcc 4.8)、代わりに SIZE_MAX を確保させようとしてわざとメモリ確保を失敗させる

• Clang 3.0 以降にも同様の機能が搭載される(機能は Visual C++ 2005 に類似)

Page 76: さらば、Stagefright 脆弱性

new の隠れたオーバーフロー (3 of 5)• ISO/IEC 14882:2011 (C++11) において、

整数オーバーフロー防止のための規定が追加された• 5.3.4 [new 演算子] 第7パラグラフより引用、翻訳:

(前略) 確保されるオブジェクトのサイズが実装によって定義された限界を超えうる場合、(中略) メモリ領域は取得されず、std::bad_array_new_length 型のハンドラにマッチする例外を送出することによって new-expression は強制終了される。

• これは new によって呼ばれる allocation function の例外送出の有無 (nothrow_t) とは無関係に規定されるため、new(std::nothrow) でも例外が送出される• C++11 において例外ハンドリングをきちんと行う必要がある場合、

この点については新しく注意する必要がある• つまり、C++98 において等価だった前述コードは

C++11 においてはもはや等価ではない

Page 77: さらば、Stagefright 脆弱性

new の隠れたオーバーフロー (4 of 5)• ISO/IEC 14882:2011 (C++11) において、

整数オーバーフロー防止のための規定が追加された• しかし、本発表時点で厳密に準拠している

コンパイラは gcc 4.9 以降のみ• しかも、gcc 4.9 においても Android NDK 版では

この仕様に (なぜか) 準拠していないことを確認• 厳密に C++11 規格に準拠しないコンパイラは、

std::bad_array_new_length にマッチする例外を送出しない• 代わりに、allocation function が SIZE_MAX という

事実上の無効値を受け取る可能性がある• Visual C++ 2015 製品版は非準拠• Clang 開発版は一時的に準拠したものの、

別の問題があったらしく再び非準拠に戻っている 1

1. https://llvm.org/bugs/show_bug.cgi?id=11644

Page 78: さらば、Stagefright 脆弱性

new の隠れたオーバーフロー (5 of 5)• ISO/IEC 14882:2011 (C++11) において、

整数オーバーフロー防止のための規定が追加された• 規定の細部に注意しよう

• 限界を “超える” ときではなく “超えうる” ときであり、かつ実装依存の限界は SIZE_MAX とは限らない

• gcc 4.8 以降の実装はアドレス空間の約半分(SIZE_MAX のおよそ半分) を実装依存の限界と定め、かつ正確な限界ではなく 7-bit 精度の近似整数で比較を行う• つまり、実際にアドレス空間の半分や全部を占めない場合でも

オーバーフローとみなされる場合がある(この挙動は直感に反するが、間違いなく C++11 規格に準拠)

• これはおそらく、任意即値の代入が効率的でない一部のアーキテクチャ (ARM 含む) に合わせたものであろう

• Clang と Visual C++ は SIZE_MAX を “超える” ときに処理

Page 79: さらば、Stagefright 脆弱性

ヒープオーバーフローの悪用 (概要)• 可能性としては色々あるが……

• 直接書き換え• ヒープで近い関係にあるデータを直接書き換えて

プログラムのフローを攻撃者の好きに誘導する• 特にポインタの上書きは直接攻撃にかなり近い

(脆弱性と exploit の性質によって異なるが)• 間接的な攻撃

• ヒープアロケータ自体を攻撃対象とする (アロケータ依存)• dlmalloc (Android 4.4 まで)• jemalloc (Android 5.0 以降)

• 古典的な dlmalloc に対しては複数の上書き手法が知られており、オーバーフローを用いて任意アドレスに任意の値を書き込むことが可能な場合がある

• 私のものも Drake 氏のものも直接書き換えベース

Page 80: さらば、Stagefright 脆弱性

ヒープオーバーフローと ROP (1 of 3)• スタックオーバーフローとの比較

• スタックオーバーフロー:• canary (SSP) さえ通過していれば ROP に

直接つながる場合が多い• ヒープオーバーフロー

• スタック書き換えができない場合、直接 ROP に移ることができない (戻りアドレス書き換えができていないため)

• 定番は関数ポインタの書き換えだが、単に関数に移るだけでは “任意” コード実行には結びつきにくい

• そのため、スタックポインタを操作するためのstack pivot という手段が用いられるケースが多い• 9月9日見せたデモ動画では時間の制約上

良い stack pivot が見つかっていない状態で強引なコード実行を行っていた

Page 81: さらば、Stagefright 脆弱性

ヒープオーバーフローと ROP (2 of 3)• “Android Hacker‘s Handbook” 1 において、

Android 4.0 における有望な stack pivot が指摘されている• Drake 氏曰く Georg Wicherski 氏が指摘したものとのこと• __restore_core_regs (動的リンカー中)

• libgcc の一部で、レジスタの unwind を行う関数• R0 (第一引数) と PC (関数ポインタ) を操作できる場合、

16 レジスタ中 15 個を任意の値に設定することができる• R0 はレジスタ書き換えのためのバッファ• PC は __dl_restore_core_regs またはこれを呼び出す箇所

• SP と PC を適切に書き換えれば ROP 実行可能• Android 4.0 の動的リンカーは固定であるため、

条件さえ整えば ASLR 回避が容易

1. http://as.wiley.com/WileyCDA/WileyTitle/productCd-111860864X.html (ISBN: 978-1-60864-7)

Page 82: さらば、Stagefright 脆弱性

ヒープオーバーフローと ROP (3 of 3)• ただし、すべてのバージョンにおいて

無条件に使えるわけではない• Galaxy Nexus のイメージ解析によれば

このガジェットが linker 内にあるのは Android 4.2 まで• Android 4.1 以降では完全な ASLR が有効であるため

linker 上にあることが特に便利とは言い切れない• これらの場合でも、条件次第では

代替の stack pivot を検索することが十分可能• mmap に対する ASLR はベースアドレスの

オフセットを基盤としているため、条件さえ整えば大量のガジェットを検索可能

• また、__restore_core_regs はlibc 等他のライブラリでも見つけることが可能

Page 83: さらば、Stagefright 脆弱性

SELinux + mediaserver (1 of 3)• Android 4.4 (r1) のソースコードより全文:

external/sepolicy/mediaserver.te

# mediaserver - multimedia daemontype mediaserver, domain;permissive mediaserver;type mediaserver_exec, exec_type, file_type;

net_domain(mediaserver)init_daemon_domain(mediaserver)unconfined_domain(mediaserver)

mediaserver ドメインをPermissive モードに

mediaserver ドメインに対してほぼ? 全ての動作を許可

(unconfined ドメインに設定)

Permissive ドメインの場合、ポリシー違反が起こると

dmesg にログが出力される

Page 84: さらば、Stagefright 脆弱性

SELinux + mediaserver (2 of 3)• Android 4.4 (r1) のソースコードより全文:

external/sepolicy/unconfined.teallow unconfineddomain self:capability_class_set *;allow unconfineddomain kernel:security ~load_policy;allow unconfineddomain kernel:system *;allow unconfineddomain self:memprotect *;allow unconfineddomain domain:process *;allow unconfineddomain domain:fd *;allow unconfineddomain domain:dir r_dir_perms;allow unconfineddomain domain:lnk_file r_file_perms;allow unconfineddomain domain:{ fifo_file file } rw_file_perms;allow unconfineddomain domain:socket_class_set *;allow unconfineddomain domain:ipc_class_set *;allow unconfineddomain domain:key *;allow unconfineddomain fs_type:filesystem *;allow unconfineddomain {fs_type dev_type file_type}:{ dir blk_file lnk_file sock_filefifo_file } ~relabelto;allow unconfineddomain {fs_type dev_type file_type}:{ chr_file file } ~{entrypointrelabelto};allow unconfineddomain node_type:node *;allow unconfineddomain node_type:{ tcp_socket udp_socket rawip_socket } node_bind;allow unconfineddomain netif_type:netif *;allow unconfineddomain port_type:socket_class_set name_bind;allow unconfineddomain port_type:{ tcp_socket dccp_socket } name_connect;allow unconfineddomain domain:peer recv;allow unconfineddomain domain:binder { call transfer set_context_mgr };allow unconfineddomain property_type:property_service set;

unconfined ドメインに対しては非常に多くの権限が

開放されてしまっている!(Permissive と違いログすら出ない)

Page 85: さらば、Stagefright 脆弱性

SELinux + mediaserver (3 of 3)• Android 5.0 以降ではまだマシなポリシーに

• Permissive ドメインでもunconfined ドメインでもなくなった

• しかし、それを回避することなく色々できることはデモにおいて示した通り

Page 86: さらば、Stagefright 脆弱性

日本における報道 : 分析 (1 of 2)• この分析に関する情報

• 一連のスライドの記述およびソースの再確認は9月11日から12日にかけて行った

• 時系列と記事クオリティの “改善”• 7 月に書かれたものは、すべて “落第”

• 発表の “翻訳” の鵜呑みや、不十分な “対策” の流布• 8 月以降の記事は技術的に正確な分析なものが

多くなっている• しかし、MMS の “バランスの悪い” 強調を

十分に止められているとは私は考えていない• 9 月には私の挙げる 3 条件を満たす記事も少数登場

• 攻撃ルートに関する、“正確さ” “十分さ (網羅されているか否か)” “バランスの良さ”

Page 87: さらば、Stagefright 脆弱性

日本における報道 : 分析 (2 of 2)• 初動の悪さ?

• ソーシャルメディアの投稿を大まかに調べると、多くの人が MMS 無効化を対策として信じる様子が見受けられる (8 月以降の記事に言及した場合含む)

• ソーシャルメディアの一部において、MMS の無効化が“対策” になるという空気が醸成されてしまっていた

• 8 月以降の記事 (の一部) の良さを考えると、初動 (速報) の悪さが尾を引いてしまっている可能性がある

• 改めてソースを分析• そこまで “悪くない” 報道も多数• しかし、ソーシャルメディアにおいて醸成された

空気を入れ替えるには至っていない• 次スライドから良くも悪くも目立った主要ソースを紹介

Page 88: さらば、Stagefright 脆弱性

日本の主要ソース分析 (1 of 4)• GIGAZINE

• 言及 (2 記事):• 95%のAndroid端末にMMSを受信するだけで端末を

乗っ取られる脆弱性が発覚、対策はこれ• 95%ものAndroidがTwitterのリンクをクリック

するだけ・動画再生するだけで乗っ取られる「Stagefright」攻撃への対応が始まる

• 良いところ• 情報ソースの選定自体は適切に見える

• 特に後者のソースは攻撃ルートに対する十分かつ正確な言及を含む• 悪いところ

• 前者における、いわゆる “タイトル釣り”• しかも、前者には “偽の安心感を生みかねない言及” を含む

• 私にこの資料を書かせたきっかけ (1 of 2)• 前者の記事についての言及を Twitter で見たのが全ての始まり

Page 89: さらば、Stagefright 脆弱性

日本の主要ソース分析 (2 of 4)• Security Next

• 言及 (1 記事):• Androidに深刻な脆弱性、MMSで攻撃受けるおそれ

• 良いところ• 発表に忠実

• 悪いところ• 発表に忠実• この速報記事以外を出していない

• 私にこの資料を書かせたきっかけ (2 of 2)• この言及だけで済ませてしまうことは明らかにマズい

(一般人の保護に十分役立たない)• この記事以降にフォローアップがあれば良かったが、

情報セキュリティニュースサイトであるにも関わらずそれが無かった

Page 90: さらば、Stagefright 脆弱性

日本の主要ソース分析 (3 of 4)• ASCII.jp + McAfee Blog

• 言及 (1 記事):• メッセージだけで感染!? 95%のAndroidユーザーに影響する脆弱性

• 良いところ• MMS 以外の “攻撃” を十分に示せていないものの、

攻撃ルートについては示唆できている• 悪いところ

• 不十分な “ローカライズ” (翻訳の鵜呑み)• 日本においては有効に機能しない可能性のある “ヒント” についての言及を含む

• 技術的に十分な対策ができていない製品の宣伝• McAfee Mobile Security の動作原理上、

当該製品は十分に有効な対策は取れていない (かつ、取れない)

Page 91: さらば、Stagefright 脆弱性

日本の主要ソース分析 (4 of 4)• マイナビニュース

• 言及 (5 記事):• 「MMSに気をつけろ」って

どういうこと? - いまさら聞けないAndroidのなぜ• Androidの脆弱性、

応急処置は「MMSメッセージの自動取得無効化」 - Lookout• 良いところ

• 技術的な分析に関する記述はほぼ正確• Lookout の記事をソースにするものは

攻撃ルートに関する正確かつ十分な言及を含む• 悪いところ

• MMS という攻撃ベクトルの “不適切な” 強調• MMS 以外の攻撃ベクトルに関する記述は MMS に比べて目立たない