pwniumで勝つ方法 セキュリティ入門 - pacsec...use-after-free脆弱性の軽減 a =...

22
[email protected] Chromeセキュリティチーム スイス チューリッヒ Pwniumで勝つ方法 Chrome セキュリティ入門

Upload: others

Post on 28-May-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

[email protected]

Chromeセキュリティチームスイス チューリッヒ

Pwniumで勝つ方法 Chrome セキュリティ入門

Page 2: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

概要

● アーキテクチャ

● サンドボックスの中へ

○ レンダラーのバグ

○ Use-after-Free脆弱性の軽減

● サンドボックスの外へ

○ プロセス間通信

● これから

Page 3: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

アーキテクチャ

Browser

Filesystem Network

RendererPlugin

Renderer

GPU

Worker

= サンドボックス内= プロセス間通信

Page 4: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

アーキテクチャ / Architecture

Browser

Filesystem Network

RendererPlugin

Renderer

GPU

Worker

Network Plugin

V8

OSOS

OS OS

OS

= サンドボックス内= プロセス間通信

Page 5: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

Blink/V8 バインディング入門

= 強い参照

ABlink Object

interface A { attribute DOMString width;}

V8_A

V8 Wrapper

インターフェース定義IDL

Blink heap参照カウント

V8 heapGC

Page 6: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

循環参照

AB

D C

Page 7: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

循環参照

AB

D C

1

2

1 1

= 強い参照

Page 8: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

循環参照

AB

D C

0

2

1 1

= 強い参照

Page 9: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

循環参照

B

D C

1

1 1

= 強い参照

Page 10: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

循環参照

AB

D C= 強い参照

= 弱い参照(生ポインタ)

Page 11: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

B

循環参照

AB

D C= 強い参照

= 弱い参照(生ポインタ)

Page 12: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

B

循環参照

AB

D CWebCore::SourceBufferList

WebCore::MediaSource

WebCore::SourceBuffer

WebCore::HTMLMediaElement

http://scarybeastsecurity.blogspot.com/2013/02/exploiting-64-bit-linux-like-boss.html

= 強い参照

= 弱い参照(生ポインタ)

Page 13: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

B

Use-after-Free脆弱性の軽減

A V8_A

V8_Uint8Array

Blink heap参照カウント

V8 heapGC

= 強い参照

= 弱い参照(生ポインタ)

Page 14: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

B

Use-after-Free脆弱性の軽減

A V8_A

V8_Uint8Array

V8_B

V8 heapGC

Blink heap参照カウント

= 強い参照

= 弱い参照(生ポインタ)

Page 15: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

B

Use-after-Free脆弱性の軽減

A V8_A

Blink heap参照カウント

V8 heapGC

= 強い参照

= 弱い参照(生ポインタ)

Page 16: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

Partition Alloc

● 同じ基底クラスから派生しているクラス● 同じ大きさ

Partition外では仮想メモリ領域を再利用しない

実施済 ● DOM● RenderObject● ArrayBuffer● String, Vector,

Hashtable

未実施● ScriptWrappables not under Node● everything else

現状

一定条件を満たすオブジェクトを同じ仮想メモリ領域に確保

dev channel

Page 17: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

B

Use-after-Free脆弱性の軽減

A

= 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

V8_A

V8_B

ポインタは本当にBを指してる?

たぶん

指してない

CRASH

Blink heap参照カウント

V8 heapGC

Page 18: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

Browser

プロセス間通信の概要

引数のデシリアライズ /

Renderer

引数のシリアライズ

new IPC::Message

Send

対象オブジェクトの特定

コールバックの呼 OnMessageReceived(...)

ソケットもしくは名前付きパイプ

= サンドボックス内= プロセス間通信

Page 19: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

プロセス間通信での頻出バグ

enum値チェックの欠如

content_accessed_[type] = true;

some_map[key]->second.some_method();

連想配列キーチェックの欠如

複雑なステートマシン

パストラバーサルhttps://codereview.chromium.org/12212091

レースコンディション

crbug.com/121726

整数オーバーフロー

crbug.com/169685

ロジックの誤り

crbug.com/162114

https://src.chromium.org/viewvc/chrome?revision=206130&view=revision

crbug.com/169770

https://src.chromium.org/viewvc/chrome?revision=203389&view=revision

Page 20: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

WebUIバインディング

chrome.send(“openFile”, [“1”]);

chrome://history chrome://downloads

Browser

ChildProcessSecurityPolicy

Page 21: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

これから

● NaCl移行の推進

● Partition化の推進

● ランタイムのメモリ安全性強化

● カーネル攻撃対象領域の最小化

● 頻出バグ種の根絶

● サイト間分離

● ______ での書き換え?

Page 22: Pwniumで勝つ方法 セキュリティ入門 - PacSec...Use-after-Free脆弱性の軽減 A = 強い参照 = 弱い参照(生ポインタ)もしくは型情報が失われたポインタ

さいごに

https://code.google.com/p/chromium/codesearch

Chromiumのクロスレファレンスコードビューアです。大変便利なので是非ご覧になってください!