結論(レガシーなクロスドメイン許可を制限)
レガシーなクロスドメイン許可を制限するとは、レスポンスヘッダー X-Permitted-Cross-Domain-Policies: none を返し、Adobe Flash Player や Adobe Acrobat/Reader が参照するクロスドメインポリシーファイル(通常は /crossdomain.xml)をすべて無効にすることです。これにより、これらのクライアントから他ドメインのデータを読み取る許可を与えなくなります。Flash Playerはサポート終了済みですが、Acrobat/Readerは現在もこの仕組みを利用するため、ヘッダー1行で残置ファイルの悪用を予防できます。
この記事のポイント
- 対象ヘッダーは X-Permitted-Cross-Domain-Policies で、推奨値は none(OWASP Secure Headers Project)です。
- Flash Playerは2020年末でサポート終了しましたが、Acrobat/Readerは現在もクロスドメインポリシーを利用します。
- 古い crossdomain.xml に domain="*" が残っていないかも確認し、不要なら削除します。
- このヘッダーはブラウザのCORSとは無関係で、PDFの表示やダウンロードにも影響しません。
- セキュリティAIチェッカーは none または master-only なら○、未設定やその他の値は△(重み1)と判定します。
| 診断項目名 | レガシーなクロスドメイン許可を制限 |
|---|---|
| 項目ID | headers.crossdomain |
| 分類 | セキュリティヘッダー |
| 重大度・配点の重み | 低(low) 重み 1 |
| 関連する標準・ガイドライン | OWASP Secure Headers Project(推奨値 none)、Adobe「Cross Domain Configuration」(Acrobat/Reader のクロスドメインポリシーとメタポリシー)、OWASP ASVS 5.0.0 V3.7.1(サポートが終了した、または安全でないクライアント技術を使わない。例として Flash などを列挙。Level 2)、OWASP WSTG-CONF-08(RIA Cross Domain Policy。現行版では本文が削除され、項目番号のみ残っています)、CWE-942(Permissive Cross-domain Security Policy with Untrusted Domains) |
レガシーなクロスドメイン許可を制限する(X-Permitted-Cross-Domain-Policies)とは
レガシーなクロスドメイン許可を制限する対策とは、レスポンスヘッダー X-Permitted-Cross-Domain-Policies を返して、Adobe Flash Player や Adobe Acrobat/Reader などのクライアントが参照する「クロスドメインポリシーファイル」(通常はサイト直下の crossdomain.xml)のうち、どれを有効とみなすかを宣言することです。
X-Permitted-Cross-Domain-Policies: none
none を指定すると、そのサーバー上のポリシーファイルはすべて無効になり、これらのクライアントから他ドメインのデータを読み取る許可を与えなくなります。
Flash Player は2020年末でサポートが終了していますが、Adobe のドキュメントによれば Acrobat/Reader は現在もクロスドメインポリシーファイルを利用します。自治体サイトでは PDF の申請様式やフォームを多数配布しているため、古い crossdomain.xml が残っていないか、意図しない許可を出していないかを確認する意味があります。対策はヘッダー1行で、通常のブラウザ表示には影響しません。
クロスドメインポリシーファイルの仕組み
crossdomain.xml とは
Flash や Acrobat のコンテンツが、自分の配信元とは別のドメインへデータを要求するとき、クライアントは要求先ドメインのポリシーファイル(既定ではルートの /crossdomain.xml)を取得し、要求元ドメインが許可されているかを確認します。例えば次のようなファイルは、すべてのドメインからの読み取りを許可します。
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
Adobe のドキュメントは、Acrobat/Reader がフォームデータの送信、SOAP リクエスト、Net.HTTP.request など、複数ドメインへのデータ要求でこの仕組みを使うと説明しています。
メタポリシーと X-Permitted-Cross-Domain-Policies の値
ルートのポリシーファイル(マスターポリシー)に加え、サブディレクトリに置いたポリシーファイルや、スクリプトが動的に生成した応答もポリシーとして扱われることがあります。これを制御するのが「メタポリシー」で、マスターポリシー内の <site-control> 要素か、このヘッダーで宣言します。
| 値 | 意味 |
|---|---|
none | サーバー上のポリシーファイルをすべて無効にする(マスターポリシーを含む) |
master-only | ルートのマスターポリシーファイルだけを有効にする |
by-content-type | Content-Type が text/x-cross-domain-policy のものだけ有効(HTTP/HTTPS) |
by-ftp-filename | ファイル名が crossdomain.xml のものだけ有効(FTP) |
all | すべてのポリシーファイルを有効にする |
none-this-response | この応答をポリシーファイルとして扱わない(ヘッダー専用) |
Adobe のドキュメントは、暗黙の動作に頼らずメタポリシーを明示的に宣言するよう勧めています。none-this-response については、サーバー側スクリプトがポリシーファイルとして解釈される応答を生成することを防ぐための仕組みと説明しています。
Silverlight の clientaccesspolicy.xml
Microsoft Silverlight は clientaccesspolicy.xml を参照し、なければ crossdomain.xml も参照しました。Silverlight もサポートが終了しています。古いシステム移行の名残でこれらのファイルが残っていることがあります。サイト内で Flash などの廃止技術を使い続けていないかは「廃止されたクライアント技術を使用していない」の項目で確認します。
クロスドメイン許可についてよくある誤解
- 「Flash は終わったので関係ない」:Flash Player はサポート終了済みですが、Acrobat/Reader はクロスドメインポリシーを参照します。また、
crossdomain.xmlにdomain="*"が残っていると、診断ツールや第三者から「設定が甘いサイト」と判断されます。 - 「このヘッダーでブラウザの CORS も制限できる」:関係ありません。ブラウザの JavaScript によるクロスオリジン通信は CORS(
Access-Control-Allow-Origin)で制御されます。CORS の設定は「危険なCORSワイルドカードがない」で確認します。 - 「
noneにすると PDF が開けなくなる」:PDF の表示やダウンロードには影響しません。影響があるのは、PDF 内の JavaScript やフォームが「別ドメイン」の本サーバーからデータを読み取る場合などに限られます。
レガシーなクロスドメイン許可を制限の診断基準(セキュリティAIチェッカー)
取得方法
- 入力URLへ GET を1回送り、リダイレクト(最大4回)後の最終応答の
X-Permitted-Cross-Domain-Policiesヘッダーを評価します。値はカンマで分割し、各値の前後の空白を除いて判定します(大文字小文字は区別しません)。 /crossdomain.xmlや/clientaccesspolicy.xmlの取得は、この項目では行いません。
判定条件
| 判定 | 条件 | 得点への影響 |
|---|---|---|
| ○ 問題なし(pass) | すべての値が none または master-only に完全一致する | 重み1を満点加算 |
| △ 要確認(warn) | ヘッダーがない、または by-content-type / by-ftp-filename / all / none-this-response など上記以外の値を含む | 1×0.45=0.45点 |
| × 要改善(fail)/対象外(na) | この項目では使いません | ― |
none-this-responseは「この応答をポリシーファイルとして扱わない」という指定にとどまり、サイト全体のメタポリシーを制限するものではないため、○ にはしません。- 根拠欄にはヘッダー値、または「X-Permitted-Cross-Domain-Policiesがありません。」を表示します。
- × を使わないのは、ヘッダーがないことだけでは、実際に危険なポリシーファイルが存在するかが分からないためです。ヘッダーは、ポリシーファイルが誤って配置された場合の保険として機能します。
- 重大度 low・重み1は、影響するクライアントが限られていることを反映しています。
自治体サイトでの判定例
| 応答ヘッダー | 判定 | 補足 |
|---|---|---|
X-Permitted-Cross-Domain-Policies: none | ○ | 推奨設定 |
X-Permitted-Cross-Domain-Policies: master-only | ○ | ルートの crossdomain.xml の内容は別途確認が必要 |
| ヘッダーなし | △ | 多くのサイトで見られる状態 |
X-Permitted-Cross-Domain-Policies: all | △ | すべてのポリシーファイルを有効にしており、意図を確認すべき |
X-Permitted-Cross-Domain-Policies: none-this-response | △ | メタポリシーの宣言にならない |
クロスドメイン許可を制限しないとどんなリスクがあるか
攻撃シナリオ
- 緩いポリシーファイルの悪用:過去に Flash コンテンツのために配置した
crossdomain.xmlにallow-access-from domain="*"が残っている。攻撃者が用意したコンテンツ(PDF など、ポリシーファイルを参照するクライアントで動くもの)から、住民がログインした状態の本サイトへ要求を送り、応答を読み取る。ログイン後の画面や API があるサイトでは個人情報の漏えいにつながります。 - アップロードファイルをポリシーファイルとして悪用:メタポリシーが緩い場合、利用者がアップロードした XML ファイルや、スクリプトが生成した応答がポリシーファイルとして解釈され、攻撃者が自分のドメインを許可するポリシーを作り出せる可能性があります。
noneやmaster-onlyはこれを防ぎます。 - CSRF 対策の迂回:クロスドメインでの読み取りが許可されると、ページ内の CSRF トークンを読み取られ、フォーム送信の保護が無効になるおそれがあります。
想定される被害
- ログインが必要なページや API の内容(申請情報、個人情報)の読み取り
- CSRF トークンの窃取による不正な操作
現在は対応するクライアントが限られ、主要ブラウザ自体はこの仕組みを使わないため、リスクは限定的です。ただし、残置されたポリシーファイルは長期間気付かれないことが多く、ヘッダーによる明示的な無効化は低コストの予防策です。
クロスドメイン許可を制限する設定方法(Apache・nginx・IIS・Next.js)
対応の手順
- 残置ファイルの確認:
/crossdomain.xmlと/clientaccesspolicy.xmlが存在するか確認し、不要なら削除します。必要な場合はdomain="*"を使わず、具体的なドメインだけを許可します。 - ヘッダーの付与:全応答に
X-Permitted-Cross-Domain-Policies: noneを付けます。どうしてもcrossdomain.xmlを使う必要がある場合だけmaster-onlyにします。
Apache(.htaccess)
<IfModule mod_headers.c>
Header always set X-Permitted-Cross-Domain-Policies "none"
</IfModule>
nginx
add_header X-Permitted-Cross-Domain-Policies "none" always;
IIS(web.config)
<httpProtocol>
<customHeaders>
<add name="X-Permitted-Cross-Domain-Policies" value="none" />
</customHeaders>
</httpProtocol>
Next.js(Vercel)
// next.config.js
module.exports = {
async headers() {
return [{
source: "/:path*",
headers: [{ key: "X-Permitted-Cross-Domain-Policies", value: "none" }],
}];
},
};
サイトを壊さないための注意点
- 職員向けに、PDF フォームから別ドメインのサーバーへデータを送受信する仕組み(古い電子申請や集計システムなど)を使っていないか確認します。そうした仕組みが本サーバーのポリシーファイルに依存している場合、
noneにすると動作しなくなります。その場合はmaster-onlyとし、crossdomain.xmlの許可ドメインを最小限にします。 - ヘッダーの付与は Web サーバーの共通設定で行い、CMS とサーバーの二重付与を避けます。
設定後の確認方法
curl -sI https://www.example.lg.jp/ | grep -i x-permitted-cross-domain-policies
# 残置ポリシーファイルの確認(404 であれば存在しない)
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.lg.jp/crossdomain.xml
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.lg.jp/clientaccesspolicy.xml
ポリシーファイルが 200 を返す場合は、内容に domain="*" が含まれていないかを確認します。ソフト404(存在しないURLでも 200 とトップページを返す構成)の場合は、本文が XML かどうかで判断してください。設定後はセキュリティAIチェッカーで再診断し、根拠欄に none が表示されていることを確認します。
よくある質問(FAQ)
Flashは終了したのに、X-Permitted-Cross-Domain-Policiesは必要ですか?
Flash Playerはサポート終了済みですが、Adobeのドキュメントによれば Acrobat/Reader はフォームデータの送信やSOAPリクエストなどでクロスドメインポリシーを参照します。また crossdomain.xml に domain="*" が残っていると、第三者から設定が甘いサイトと判断されます。
X-Permitted-Cross-Domain-Policies: noneにするとPDFが開けなくなりますか?
PDFの表示やダウンロードには影響しません。影響があるのは、PDF内のJavaScriptやフォームが別ドメインから本サーバーのデータを読み取る場合などに限られます。
このヘッダーでブラウザのCORSも制限できますか?
できません。ブラウザのJavaScriptによるクロスオリジン通信はCORS(Access-Control-Allow-Origin)で制御されます。X-Permitted-Cross-Domain-Policiesはポリシーファイルを参照するクライアント向けのメタポリシーです。
noneとmaster-onlyはどう使い分けますか?
基本は none でサーバー上のポリシーファイルをすべて無効にします。PDFフォームなどが本サーバーの crossdomain.xml に依存していてどうしても必要な場合だけ master-only とし、ルートのファイルの許可ドメインを最小限にします。
none-this-responseを設定すれば○になりますか?
なりません。none-this-response は「この応答をポリシーファイルとして扱わない」という指定にとどまり、サイト全体のメタポリシーを制限しないため、セキュリティAIチェッカーでは「△ 要確認」です。
crossdomain.xmlが残っているかはどう確認しますか?
curlで /crossdomain.xml と /clientaccesspolicy.xml のステータスコードを確認します。200を返す場合は内容に domain="*" がないかを確認し、存在しないURLでも200を返すソフト404の構成では本文がXMLかどうかで判断します。
この項目を含む127項目を、URLを入れるだけで無料診断します。