フレーム埋込みの制限
会員向けの Web ページ https://www.example.com/settings は,次のヘッダを付けて応答している。罠サイト https://trap.example.net/ がこのページを透明な iframe で重ねて表示し,利用者に退会ボタンをクリックさせようとした場合の記述として,適切なものはどれか。
HTTP/1.1 200 OK
Content-Security-Policy: default-src 'self'; frame-src 'self'- アframe-src 'self' が指定されているので,このページは同一オリジン以外のページの iframe 内には表示されず,攻撃は成立しない。
- イこのページは罠サイトの iframe 内に表示され得るので,応答のヘッダで frame-ancestors 'self' を指定し,他のオリジンのページからの埋込みを禁止する必要がある。
- ウdefault-src 'self' は frame-ancestors の既定値としても働くので,他のオリジンのページからの埋込みは拒否され,攻撃は成立しない。
- エ同一オリジンポリシーによって,罠サイトのスクリプトは iframe 内のページの DOM を操作できないので,攻撃は成立しない。
正解と解説を見る
正解 イ
この問題の基礎知識
- クリックジャッキングは,標的のページを透明な iframe などで罠サイトに重ねて表示し,利用者に意図しないクリックをさせる攻撃である。
- ページを埋め込めるオリジンは,埋め込まれる側のページの応答ヘッダで制限する。CSP の frame-ancestors ディレクティブや X-Frame-Options ヘッダ(DENY,SAMEORIGIN)を用いる。
- CSP の frame-src は,そのページが子フレームとして読み込む先を制限するディレクティブであり,埋め込まれる側の制限ではない。また,frame-ancestors は default-src の値にフォールバックしない。
- 同一オリジンポリシーはスクリプトによる他のオリジンの DOM などへのアクセスを制限するが,利用者自身がフレーム内をクリックすることは制限しない。
アframe-src 'self' が指定されているので,このページは同一オリジン以外のページの iframe 内には表示されず,攻撃は成立しない。
frame-src は,このページが iframe などで読み込む子のフレームの URL を制限するディレクティブである。このページ自体が他のページに埋め込まれることは制限しない。
イこのページは罠サイトの iframe 内に表示され得るので,応答のヘッダで frame-ancestors 'self' を指定し,他のオリジンのページからの埋込みを禁止する必要がある。正解
このページを埋め込めるオリジンを制限するのは frame-ancestors ディレクティブであり,この応答には指定がない。'self' の指定は X-Frame-Options: SAMEORIGIN とおおむね同等である。
ウdefault-src 'self' は frame-ancestors の既定値としても働くので,他のオリジンのページからの埋込みは拒否され,攻撃は成立しない。
CSP Level 3 は,frame-ancestors が default-src の値にフォールバックしないと定めている。default-src 'none' だけを指定しても,誰からでも埋め込まれ得る。
エ同一オリジンポリシーによって,罠サイトのスクリプトは iframe 内のページの DOM を操作できないので,攻撃は成立しない。
罠サイトから iframe 内の DOM を操作できないのは正しいが,クリックジャッキングは利用者自身にフレーム内のボタンをクリックさせる攻撃であり,DOM の操作を必要としない。
検証用の出典出典照合済み
W3C Content Security Policy Level 3 / OWASP Clickjacking Defense Cheat Sheet照合の根拠(5 件)
- ア(誤り): frame-src はこのページが子フレームに読み込む URL を制限するものであり,このページが埋め込まれることは制限しない
The frame-src directive restricts the URLs which may be loaded into child navigables .
W3C Content Security Policy Level 3 · 6.1.5 frame-src(新しいタブで開きます) - イ(正解): このページを埋め込めるオリジンを制限するのは frame-ancestors である
The frame-ancestors directive restricts the URL s which can embed the resource using frame , iframe , object , or embed .
W3C Content Security Policy Level 3 · 6.4.2 frame-ancestors(新しいタブで開きます) - ウ(誤り): frame-ancestors は default-src にフォールバックしない
frame-ancestors will not fall back to the default-src directive’s value if one is specified. That is, a policy that declares default-src 'none' will still allow the resource to be embedded by anyone.
W3C Content Security Policy Level 3 · 6.4.2 frame-ancestors (Note)(新しいタブで開きます) - イ(正解): frame-ancestors 'self' は X-Frame-Options: SAMEORIGIN とおおむね同等
The 'none' source expression is roughly equivalent to that header’s ` DENY `, and 'self' to that header’s ` SAMEORIGIN `.
W3C Content Security Policy Level 3 · 6.4.2.2 Relation to X-Frame-Options(新しいタブで開きます) - エ(誤り): クリックジャッキングは利用者自身に隠された操作をさせる攻撃であり,iframe 内の DOM 操作を必要としない
An attacker can trick a user into performing actions that are masked and hidden from the user's view.
CWE-1021 · Common Consequences(新しいタブで開きます)
応答のヘッダには frame-ancestors がなく,frame-src と default-src はいずれも埋込みを制限しないので,罠サイトの iframe 内に表示され得る。