iframe を使って安全にブラウザ拡張機能を実装する
自己紹介
mizdra (みずどら) です
株式会社はてな
フロントエンドエキスパートやってます
https://gyazo.com/da5928ab09bbd9c450bef958e7c4d600
今日の話
DOM をとりまく ブラウザのセキュリティ の話
DOM 成分ほとんど無いです
「iframe」がちょっと登場するくらい
すみません...
ブラウザ拡張機能
皆さんご存知
ツールバーに機能を足したり
Webページをカスタマイズしたり
Content Script
Webページにスクリプトを埋め込める機能
Web ページをカスタマイズしたい時によく使う
code:content-script.js
// ページ中のテキストを真っ赤に
document.querySelectorAll('*')
.forEach(el => el.style.color = 'red');
(ここまで3分)
実は...
Chrome 開発チームが「Content Script の中で機密データを保持するな」と言ってる
Avoid sending sensitive data to a content script if it should not leak to the web page.
センシティブな情報 (パスワードなど) を Content Script のメモリに乗せるな、と書いてある
多分殆ど知られてないと思う
なぜ機密データを保持してはならないのか
Spectre という脆弱性が関係している
まずはそこから解説
Spectre とは
CPU の「投機的実行」という機能を利用した脆弱性
(これを悪用すると) 本来アクセスできないはずのメモリにアクセスし、データを盗める
2018 年に発見されて、それなりに話題になった
知ってる人手を上げて 🙋♀️
Spectre でできること (ざっくり)
あるプロセスから、別のプロセスのメモリが読める
あるアプリケーションから、同じプロセス内の別のアプリケーションのメモリが読める
https://gyazo.com/97d4bf6725134afc6fe51d675a504d1e
(ここまで6分)
OS・CPU 側の対策
OS や CPU にパッチが当てられた
「別プロセスにあるメモリ」は読めなくなった
ブラウザ側の対策
1. 高精度タイマーを無効化
の精度を落とす
(詳細は割愛するが) Spectre の成立には高精度タイマーが必要
無効化することで、Spectre がそもそも成立しないように
2. Site Isolation
ブラウザベンダによる対策
ブラウザでは (cross-site) iframe のプロセスが分けられた (Site Isolation)
Before
https://gyazo.com/aa24e74ab8dc21995cef458ad4ac74b9
今まではiframe が親 Document と同じプロセスに乗ってた
evil.exampleからa.exampleのメモリが読めた
DOM や Script のデータが盗まれる恐れ
After
https://gyazo.com/a39d2942ec562f20f7df55274a1fa34a
OS・CPU・ブラウザの対策が揃った結果...
現時点では Spectre を成立させるのは不可能とされてる
けど、"今後も" 不可能かはわからない
新たな高精度タイマーが発見されたり...
Spectre 発見直後に SharedArrayBufferでも高精度タイマーになることがわかり、塞がれた
高精度タイマー無しで成立させる方法が発見されたり...
2023/10 に見つかった: iLeakage
(ここまで9分)
もし発見されると...
「同じプロセスにあるメモリ」が読める
Content Script にあるデータが、読めてしまう
https://gyazo.com/2638bc11abf252bbf182a47325c0486f
これが Content Script に機密情報を持たせてはならない理由
将来うっかり Spectre が可能になった時に備えて持たせるな、ということ
どうすれば良いのか
持たせるなと言われても、扱いたい時はある
例: パスワードマネージャー
ポップアップを出すのに、Content Script を使いたい
パスワードも Content Script に持たせたい
https://gyazo.com/4b15c0507f2695f0a85d28dee9195363
1Password の Chrome 拡張機能では、iframe を使ってる
1Password の Chrome 拡張機能を devtools で覗く
https://gyazo.com/f37b95d63c5b24810633b7eb5540084f
1Password の Chrome 拡張機能の仕組み
https://gyazo.com/29f799a03b7caeb7cf9eece1bd71f21f
chrome-extension://...でポップアップを埋め込んでる
cross-site iframe なので、別プロセスになる
機密情報は、こちらに持たせる
パスワードを fill する時など、必要な時だけ...
必要最低限の機密情報を Content Script に送る
まとめ
センシティブな情報を Content Script に持たせるのは避ける
どうしても扱いたければ、iframe などでプロセスを分離
Content Script には必要最小限の情報だけを送る
参考資料
Spectre について
ブラウザにおける Spectre の対策について