[アップデート] Amazon CloudFront のレスポンスヘッダーポリシーで指定したレスポンスヘッダーの削除が出来るようになりました

2023.01.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

Amazon CloudFront ではレスポンスヘッダーポリシーを使うことで、Lambda@Edge や CloudFront Functions を使わずに CloudFront でレスポンスヘッダーの上書きや追加を行うことが出来ます。
これを使って CORS やセキュリティ用など様々な対応を行うことが出来ていました。

本日のアップデートでこのレスポンスヘッダーポリシーにヘッダーの削除機能が追加されました。

従来はオリジンから特定のヘッダーが送信される場合にオリジンの種別を特定し攻撃者にヒントを与える場合がありましたが、アプリケーションの動作上必須ではないヘッダーを意図的に非表示にすることでそういったリスクを軽減することが出来ます。

レスポンスヘッダーを制御しない状態で解析してみる

CloudFront + S3 の静的コンテンツを用意しました。

Wappalyzer というオープンソースのツールをご存知でしょうか。
指定した Web サイトのレスポンス情報をチェックし、どういうテクノロジが使われているのか検査することが出来るツールです。
Google Chrome の拡張機能としても提供されています。

先程用意した静的 Web サイトをチェックしてみます。

このように CloudFront + S3 であることが閲覧者からわかる状態になっていますね。
これは色々な要素によって特定が可能なのですが、CloudFront + S3 の場合は以下のようなレスポンスヘッダーとなっており、ツールを使わなくても簡単に判別することが出来ます。

% curl -I d22foa1unc7clm.cloudfront.net
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 6
Connection: keep-alive
Date: Tue, 03 Jan 2023 21:32:54 GMT
Last-Modified: Tue, 03 Jan 2023 21:26:25 GMT
ETag: "4c850c5b3b2756e67a91bad8e046ddac"
Server: AmazonS3
X-Cache: Miss from cloudfront
Via: 1.1 3f2661f781af01fc8c4d6e12e0b94afc.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: NRT12-C4
X-Amz-Cf-Id: vMmPVqbo-9Q9MvhMGQmLggOSo6slkw9l53Gpbz7yRhz2myMymN3Jgg==
Cf-Team: 161b26467700000b9313d90400000001

Wappalyzer の実装としても以下のようにレスポンスヘッダーなど、いくつかの条件からチェックを行っています。

wappalyzer/a.json at master · wappalyzer/wappalyzer · GitHub

:
  "Amazon S3": {
    "cats": [
      31
    ],
    "description": "Amazon S3 or Amazon Simple Storage Service is a service offered by Amazon Web Services (AWS) that provides object storage through a web service interface.",
    "headers": {
      "Content-Security-Policy": "s3[^ ]*amazonaws\\.com",
      "Content-Security-Policy-Report-Only": "s3[^ ]*\\.amazonaws\\.com",
      "server": "^AmazonS3$"
    },
    "icon": "Amazon S3.svg",
    "implies": "Amazon Web Services",
    "saas": true,
    "scriptSrc": "s3[^ ]*\\.amazonaws\\.com/",
    "website": "http://aws.amazon.com/s3/"
  },
:
  "Amazon Cloudfront": {
    "cats": [
      31
    ],
    "description": "Amazon CloudFront is a fast content delivery network (CDN) service that securely delivers data, videos, applications, and APIs to customers globally with low latency, high transfer speeds.",
    "dns": {
      "CNAME": "^[a-z0-9]+\\.cloudfront.net\\.?$"
    },
    "headers": {
      "Via": "\\(CloudFront\\)$",
      "X-Amz-Cf-Id": ""
    },
    "icon": "Amazon Cloudfront.svg",
    "implies": "Amazon Web Services",
    "saas": true,
    "website": "http://aws.amazon.com/cloudfront/"
  },
:

このようにオリジンでホストされているフレームワークだったり、CMS だったりというは実はレスポンスから何が使用されているのか判別出来たりします。
その際に特定製品の脆弱性を狙った攻撃対象となってしまう場合があります。

指定したレスポンスヘッダー非表示にしてみる

今回のアップデートはこのレスポンスヘッダーを意図的に削除することで製品を特定出来ないようにして攻撃リスクを下げることが出来るということのようです。
やってみましょう。

以下のようにレスポンスヘッダーポリシーを指定します。

Remove headersが追加されていますのでそちらで削除するヘッダー名を指定します。
複数指定することが可能です。

ここではServerレスポンスヘッダーを削除してみました。
削除後に試してみると以下のようにレスポンスから非表示になっていることがわかります。

% curl -I d22foa1unc7clm.cloudfront.net
HTTP/1.1 200 OK
Server: CloudFront
Content-Type: text/html
Content-Length: 6
Connection: keep-alive
Date: Tue, 03 Jan 2023 21:44:27 GMT
Last-Modified: Tue, 03 Jan 2023 21:26:25 GMT
ETag: "4c850c5b3b2756e67a91bad8e046ddac"
X-Cache: Miss from cloudfront
Via: 1.1 021d809837e6e4eba84f56890c8ccbb4.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: KIX50-P1
X-Amz-Cf-Id: f6CjExnfk8U3kVX1G-KQuEtbyDipjdgmBg_3ndrl_orMZbyMqmLcRg==
Cf-Team: 161b30d96900000b9313f36400000001

Wappalyzer でも見てみましょう。

先程と表示が異なって Amazon S3 であることがわからなくなりましたね。
利用にあたってはアプリケーションに影響があるヘッダーかどうか注意が必要そうですが、影響のないヘッダーであればこのように不要な情報開示を抑えることが出来そうです。

なお、本機能の利用にあたって追加料金は発生しません。

消せないヘッダーもある

この機能に関して公式ドキュメント上まだ記述が見当たらなかったので確認出来ていませんが、CloudFront が明示的に追加するヘッダーは制御出来ないようです。
以下のようにX-Amz-Cf-PopX-Amz-Cf-Idも削除して CloudFront であること自体を隠してみようと思ったのですがこれは出来ませんでした。

さいごに

本日は Amazon CloudFront のレスポンスヘッダーポリシーで指定したレスポンスヘッダーの削除が出来るようになったので試してみました。

試してみたところ実際にオリジンが何かがわからなくなったので攻撃者に対する一定の効果は期待出来そうです。
今まで Lambda@Edge や CloudFront Functions で頑張っていた方はこちらの機能も試してみては如何でしょうか。