許可範囲が広すぎる AngularJS の URL 許可リスト

AngularJS $sce の許可範囲が広すぎるリソース URL 許可リスト

説明

AngularJS の $sceDelegateProvider.resourceUrlWhitelist() は、テンプレート、ng-include の内容、実行に使うリソースなどの取得元 URL を制限します。AngularJS 1.8.1 以降では、同じ設定を trustedResourceUrlList() という名前で使用することが推奨されています。スキームのワイルドカード(*://)、ホストの二重ワイルドカード(**)、example.* などのトップレベルドメインのワイルドカードを使うと、攻撃者が所有するドメインや類似ドメインから悪意のあるリソースを読み込む場合があります。その結果、XSS、任意の JavaScript の実行、セッションの窃取、情報漏えいにつながるおそれがあります。

AngularJS の公式サポートは 2022 年 1 月に終了しました。以下は、既存の AngularJS 1.8.x のコードを保守するための例です。

想定される影響

  • 広すぎる許可規則により、攻撃者のドメインからテンプレートやリソースを読み込み、XSS が起こる可能性があります。
  • セッショントークン、Cookie、ユーザーデータが外部に送信されるおそれがあります。
  • テンプレートの挿入によって信頼された画面を改ざんし、フィッシングに利用される可能性があります。
  • TLD や二重ワイルドカードにより、CDN に似せたドメインから悪意のあるリソースを配布されるおそれがあります。

対処方法

  • 許可リストを最小限にしてください。可能なら 'self' だけを許可し、必要な場合に少数の信頼できる出所を正確に指定してください。
  • *:// ではなく https:// を指定してください。http:// は原則として拒否し、必要な場合だけ個別に確認して範囲を限定してください。
  • 許可リストのホストには ** を使わないでください。必要な場合は *.sub.example.com のように一階層のサブドメインに限定してください。
  • example.* や example.** ではなく、example.co.kr、example.com などのドメインを列挙してください。
  • AngularJS 1.8.x では、bannedResourceUrlList() で data:、blob:、http: などの危険なスキームやドメインを明示的に拒否してください。resourceUrlBlacklist() は旧名称です。
  • 正規表現やパターンを変更したときは、意図しない URL まで許可しないかテストし、セキュリティレビューを行ってください。
  • CSP(Content Security Policy)で外部リソースの出所をさらに制限してください。

例

変更前

javascript
angular.module("shopApp", []).config(function ($sceDelegateProvider) {
  // 許可範囲が広すぎるパターン
  $sceDelegateProvider.resourceUrlWhitelist([
    "*://*.trusted.net/*", // BAD: スキームのワイルドカード
    "https://**.mycdn.com/*", // BAD: ホストの二重ワイルドカード
    "https://partner.*/*", // BAD: TLD のワイルドカード
  ]);
});

変更後

javascript
angular.module("shopApp", []).config(function ($sceDelegateProvider) {
  // 必要な出所だけを正確に許可
  $sceDelegateProvider.resourceUrlWhitelist([
    "self",
    "https://static.mycorp.com/*",
    "https://cdn.mycorp.co.kr/*",
    "https://assets.sub.mycorp.com/*", // 必要な場合だけ特定のサブドメインを指定
  ]);

  // 危険なスキームやドメインを明示的に拒否(任意)
  $sceDelegateProvider.bannedResourceUrlList(["http://**", "data:**", "blob:**"]);
});

説明:

  • 変更前: スキーム(*://)、二重(**)、TLD(example.*)のワイルドカードによって、攻撃者が管理するドメインや類似ドメインまで許可する場合があります。そこからテンプレートやリソースを読み込むと、XSS やデータの窃取につながるおそれがあります。
  • 変更後: 許可リストを 'self' と少数の信頼できる HTTPS の出所に限定し、許可するホストに二重・TLD ワイルドカードを使いません。別途 bannedResourceUrlList() で危険なスキームを拒否し、リスクを減らします。

参考資料