dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

「Webブラウザセキュリティ」の社内輪読会をやった

読みたいなと思って2年近く積読状態だった本を、会社の同僚と一緒に輪読会形式で読んだ。
自分一人じゃ挫折してたと思うので誰かを巻き込んでよかった!

本書の目次

第1章 WebとWebセキュリティ
   1.1 Webを構成する基本の3つのコンポーネント
   1.2 プラットフォームとしてのWeb
   1.3 Webセキュリティ
   1.4 サーバーサイドWebシステムのセキュリティ
   1.5 クライアントサイドWebシステムのセキュリティ
   1.6 まとめ

第2章 Origin を境界とした基本的な機構
   2.1 Webリソース間の論理的な隔離にむけて
   2.2 OriginとSame-Origin Policy(SOP)
   2.3 CORS(Cross-Origin Resource Sharing)
   2.4 CORSを用いないSOPの緩和方法
   2.5 SOPの天敵、XSS(Cross-Site Scripting)
   2.6 CSP(Content Security Policy)
   2.7 Trusted Types
   2.8 まとめ

第3章 Webブラウザのプロセス分離によるセキュリティ
   3.1 Webブラウザが単一のプロセスで動作することの問題
   3.2 プロセスを分離した場合の問題
   3.3 Process-per-Browsing-Instanceモデルに対する攻撃
   3.4 Process-per-Site-Instanceモデルとその補助機能
   3.5 まとめ

第4章 Cookie に関連した機構
   4.1 Cookieの導入の動機
   4.2 属性によるCookieの保護
   4.3 Cookieの性質が引き起こす問題とCookieの今後
   4.4 まとめ

第5章 リソースの完全性と機密性に関連する機構
   5.1 問題と脅威の整理
   5.2 HTTPSとHSTS
   5.3 Mixed Contentと安全でないリクエストのアップグレード
   5.4 Webブラウザが受け取るデータの完全性とSRI
   5.5 Secure Context
   5.6 まとめ

第6章 攻撃手法の発展
   6.1 3種類の攻撃手法
   6.2 CSP下でのXSS
   6.3 Scriptless Attack
   6.4 サイドチャネル攻撃
   6.5 まとめ

第6章は発展的な話題ぽかったのでスキップ。

この本について

今回は輪読会の最後にそこそこ労力をかけて書籍の内容をまとめるという活動をやった。 せっかくなので冒頭の内容をそのままこちらに記載しようと思う。
(ほんとは全部書きたいけど書籍のネタバレになってしまうので控える)


本書の全体像

この書籍は、一貫して

WebブラウザはどのようにしてWebリソース間を適切に隔離(isolation)するか」

について書かれている。

具体的には、

  1. リソース間の論理的な隔離をどう達成するか
  2. リソース間のプロセスレベルの隔離をどう達成するか
  3. Cookieをどうセキュアに取り扱うか
  4. 出入りするリソースの信頼性をどう確保するか

の4つの問題に焦点をあて、第2章〜第5章まで各章ごとにそれぞれのトピックを掘り下げている。

本書の「序文」より引用

なぜ、このような観点を気にする必要があるのか?

1, 2:リソース間の論理的な|プロセスレベルの隔離

  • WebブラウザはさまざまなWebアプリケーションが同時に動作するプラットフォーム
  • 悪意のあるWebページを開いたことで、
    • 同時に開いている別タブの情報が読み出せたら?
    • Webブラウザに保存されているすべての情報(localStorageなど)にアクセスできたら?
    • →ユーザーが受ける被害は甚大
  • そのため、Webブラウザは、自身が取り扱うさまざまなリソース間を適切に隔離する必要がある
  • リソース間の隔離、と言ったときに、論理的な隔離プロセスレベルの隔離に分類して考えることができる
  • 論理的な隔離
    • たとえば「悪意のあるページを開いたときに、別のサービスへのHTTPリクエストが発行され、そのレスポンスの中身にアクセスできる」といったことがあってはならない
    • そのため、ブラウザは「そのリクエストを発行してよいか?」「レスポンスの中身にアクセスできるか?」という形で、論理的な制限を行う必要がある
  • プロセスレベルの隔離
    • たとえば、Webブラウザに任意のコードを実行できる脆弱性があり、悪意のあるページにアクセスしたときにメモリ空間上の任意の位置にある値を読み出せると仮定する
    • すると、攻撃者の罠ページから論理的には読み出せなくても、一度リソースに対してリクエストしてからメモリ空間を直接探索することで、Webリソースを読み出せてしまう
      • →といったことはあってはならない
    • このような問題は、Webブラウザのプロセスが適切に分離されていれば起こらない

3: Cookieのセキュアな取り扱い

  • リソース間の隔離だけではなく、リソースとWebブラウザ内のデータストレージとの隔離も考えなくてはいけない
  • Cookieは、Webブラウザ中に保存されており、かつHTTPリクエストを通して外部に送信されるという特徴がある。そのため、リソースの論理的な隔離、プロセスレベルの隔離に関する議論をそのままCookieにも適用するのは心もとない

4: 出入りするリソースの信頼性

  • ブラウザ内でリソースを隔離できていたとしても、リソースがブラウザに届く前に改ざんしたり盗聴したりできてしまっては意味がない
  • そのため、出入りするリソースの信頼性をどう確保するかにも関心がむけられるべき

各章ごとに学ぶキーワード

  • 2章(Webリソースの論理的な隔離)
    • OriginとSame-Origin Policy(SOP)
    • CORS
    • CSP(Content Security Policy)
    • (おまけ程度に)Trusted Types
  • 3章(Web ブラウザのプロセス分離によるセキュリティ)
    • ブラウザのIsolation Model
    • Site Isolation
    • CORB、CORP、COEP、COOP(ぐへえ)
  • 4章(Cookie
  • 5章 出入りするリソースの信頼性

感想

「本書の全体像」のところにも書いたけど、リソース間を適切に隔離するには?というテーマで一貫しており、かつ章ごとの内容は独立性が高いので気になるトピックだけかいつまんで読むこともできて良かった。

ただ、場所によっては説明が少々難しいと感じる部分があり、そのあたりはMDNなども適宜参照しながら知識を補っていった。

こちらの本も並行して読むとよかったかもしれない。

Same-Origin PolicyだったりCORS、CSRF、CSPのような略語表記の「なんか聞いたことあるけど人に説明できない」系の用語について、なぜそれが必要か?を理解しながら知識を整理できた。数ヶ月後に説明できるかは自信ないが、最後にちゃんとまとめたのでそれが活きると思いたい。

輪読会をやって良かったこと

まず何よりも、誰かと一緒にやることで最後までくじけずにやりきることができたので、同僚氏が誘いに乗っかってくれたのはほんとにありがたかった。わからないところも「うーんわからん!こういうことでは?」って言いながら前に進められたのは良かった。

あとは、CSPなどは特に業務ではあまり意識する機会がなかったせいか、みんな本当に使ってるの?とかイメージしきれない部分があったのだが、そういうときに実世界のユースケースをググってみたり実際のサービスでのリクエストをDevToolで覗いてなるほど〜とかやれたのはワイワイ感あって楽しかった。

CSPの事例でいうとこのあたり。