Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Webフロントエンドの脆弱性つまみ食い 2024年版

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for tyage tyage
November 05, 2024
5.9k

Webフロントエンドの脆弱性つまみ食い 2024年版

Avatar for tyage

tyage

November 05, 2024
Tweet

Transcript

  1. 自己紹介 山崎啓太郎 / Twitter: @tyage GMOサイバーセキュリティ byイエラエ アプリケーションセキュリティ課 - 元々はWebサービスの開発をしていてセキュリティの職種は6年目。

    JavaScriptが好き。授業中に電子辞書でjQueryのソースを読み耽っていた。 - その他 - セキュリティ・キャンプ全国大会 2022, 2023 講師 - Bug Bounty Rewarded: Google GitHub, Twitter, etc - [ブログ] サーバサイドレンダリングの導入から生じるSSRF - [ブログ] 危険なCookieのキャッシュとRailsの脆弱性CVE-2024-26144
  2. (個人的)フロントエンドの脆弱性TOP10 1. 🥇 XSS 2. 🥈 XSS 3. 🥉 XSS

    4. CSRF 5. Information Leak 6. Open Redirect 7. APIのPath Traversal 8. DoS 9. XS-Leaks 10. Prototype Pollution
  3. XSS

  4. Webフロントエンドでの要注意ポイント - DOMElement#innerHTML - React dangerouslySetInnerHTML - window.location = …

    - <a href={...}> - <iframe src={...}> - <FOO {...props}> - eval(...), setTimeout(...) - などなど
  5. - DOMElement#innerHTML - dangerouslySetInnerHTML - window.location = … - <a

    href={...}> - <iframe src={...}> - <FOO {...props}> - eval(...), setTimeout(...) - などなど Webフロントエンドでの要注意ポイント // case1. Markdownによる入力をサポート <div dangerouslySetInnerHTML={{ __html: md2html(markdown) }} />
  6. - DOMElement#innerHTML - dangerouslySetInnerHTML - window.location = … - <a

    href={...}> - <iframe src={...}> - <FOO {...props}> - eval(...), setTimeout(...) - などなど Webフロントエンドでの要注意ポイント // case1. Markdownによる入力をサポート <div dangerouslySetInnerHTML={{ __html: md2html(markdown) }} /> __html: にJavaScriptを実行するHTMLが入り込むとアウト __html: '<img src=0 onerror="fetch(...)">'
  7. Webフロントエンドでの要注意ポイント - DOMElement#innerHTML - dangerouslySetInnerHTML - window.location = … -

    <a href={...}> - <iframe src={...}> - <FOO {...props}> - eval(...), setTimeout(...) - などなど // case2. 多言語対応テキストでHTMLを使用 // e.g. <a href={}>利用規約</a>に同意する <div dangerouslySetInnerHTML={{ __html: i18n(error.type, error.args) }} />
  8. Webフロントエンドでの要注意ポイント // case3. JSON-LDを埋め込みたいので「"」が HTMLエスケープされないように <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd)

    }} /> ref: https://nextjs.org/docs/app/building-your-application/optimizing/metadata#json-ld - DOMElement#innerHTML - dangerouslySetInnerHTML - window.location = … - <a href={...}> - <iframe src={...}> - <FOO {...props}> - eval(...), setTimeout(...) - などなど
  9. Webフロントエンドでの要注意ポイント <a href="javascript:alert('XSS')"> このユーザのWebサイト </a> ☝クリック - DOMElement#innerHTML - dangerouslySetInnerHTML

    - window.location = … - <a href={...}> - <iframe src={...}> - <FOO {...props}> - eval(...), setTimeout(...) - などなど
  10. <a href={...}>等でjavascript: URLが使えなくなった! ref: Generate safe javascript url instead of

    throwing with disableJavaScriptURLs is on #26507 https://github.com/facebook/react/pull/26507 【朗報】React 19から安全に ☝クリック
  11. (再掲)Webフロントエンドでの要注意ポイント - DOMElement#innerHTML - React dangerouslySetInnerHTML - window.location = …

    - <a href={...}> - <iframe src={...}> - <FOO {...props}> - eval(...), setTimeout(...) - などなど こういった箇所はDOM Based XSSのsinkと呼ばれる
  12. WebフロントエンドでのXSS対策 - 危険な関数、プロパティはどれ → Lint、SASTツールの警告も参考に - マイナーライブラリまではカバーできないが、ある程度はカバーできるはず - dangerouslySetInnerHTMLが必要 →

    サニタイズはDOMPurifyがオススメ - DOMPurify https://github.com/cure53/DOMPurify - XSSに詳しい人々がこぞって改善しまくっているサニタイジングライブラリ - Content-Security-Policyで十分? → ないよりマシだが回避可能なことが多い - 例: Google Tag Manager www.googletagmanager.com を許可するとなんでも実行できる - 厳格なCSPは導入コストが高い
  13. もちろんサーバ側もXSSの対策は必要 - HTML出力時のエスケープ - <script>, <a href>, <span onclick>等コンテキストに合わせたエスケープ -

    ファイルアップロード先はサンドボックスドメインに - 正確なContent-Typeヘッダの設定 - Content-Security-Policyの設定 - SSTIの対策 - キャッシュ汚染の対策 - パストラバーサルの対策 - などなど
  14. NO

  15. Case1. URLにアクセスすると処理が発生するもの 別サイトから遷移後、フロントエンドで自動的に処理(もしくはフロントエンドからバッ クエンドへリクエストを送信)するものに要注意 • ID連携 http://example.com/callback?token=eyJ…. • メールの購読停止 http://example.com/unsubscribe

    • 決済 http://example.com/purchase?token=abcabc • スマホアプリ連携 http://example.com/app?deviceId=blahblah もしこれらのURLに意図せずアクセスさせられてしまうと...? バックエンド側では意図したリクエストか攻撃か判断できないかも
  16. おまけ: 今回含められなかった内容 - XS-Leaks, BF-Cache等、新しい罠も - 新しいAPIは攻撃者にとって有用になりがち - Performance API,

    Service Worker, postMessage - 近年のブラウザのセキュリティ対策 - CSP, COOP, CORP等のヘッダ, Trusted Typesを適切に使えばいい感じになる。適切に設定できれば... - window.open等にはUser Interactionが必要になった - Private Network Accessの制限 - 逆にブラウザ独自のXSS保護機構はなくなった - ブラウザのセキュリティを回避するための”ハック”は攻撃者にとっても美味しい - Third party cookie対応のために”穴”を作っていませんか? - よく考えずに SameSite=None してませんか? - よく考えずに Access-Control-Allow-Origin したことはありませんか? - これはSameSite=Lax下では影響が小さくなった - 旧来からずっとある脆弱性 - DoS - 場合によってはサービスが止まりうる - Open redirect - あまり重要視されないし、実際そうだと思う - ただし、別の脆弱性と組み合わせてよくないことが起きることも