ALBの無効なリクエストヘッダ削除(Drop Invalid Header Fields)設定を試してみた

2019.11.23

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

AWSチームのすずきです。

Application Load Balancers (ALB)、 ロードバランサー属性の設定として「Drop Invalid Header Fields」が追加され、 無効なHTTPリクエストヘッダをALBで削除可能になりました。

その動作を確認する機会がありましたので、紹介させていただきます。

routing.http.drop_invalid_header_fields.enabled Indicates whether HTTP headers with invalid header fields are removed by the load balancer (true) or routed to targets (false). The default is false.

設定

ALB(ロードバランサー属性)

Webコンソールを利用して、「Drop Invalid Header Fields」 の 有効化 が可能になりました。

※2019年11月23日現在、「Drop Invalid Header Fields」のデフォルト設定は「チェックなし」(無効)です。

ターゲット用EC2

Amazon Linux 2のEC2を起動し、ALBのターゲットとしました。

「ec2-user」でリモート接続したコンソールから 「nc」をポート80で起動、リクエストヘッダの確認環境としました。

while true; do { echo -e 'HTTP/1.1 200 OK\r\n'; } | sudo nc -l 80; done

クライアント

curl コマンドを利用し、「-H」で任意のヘッダーを付与して動作を確認しました。

ELB_DNSNAME='<ALBのホスト名>.elb.amazonaws.com'
curl http://${ELB_DNSNAME}/ -H 'X-hoge-hoge:fuga_fuga' -H 'X_hoge_hoge:fuga_fuga'

結果

ALBを経由してターゲット環境の「nc」に到達したリクエストヘッダを抜粋しました。

Drop Invalid Header Fields 無効

「-」「_」を含むリクエストヘッダーが到達している事を確認できました。

GET / HTTP/1.1
(...)
Accept: */*
X-hoge-hoge: fuga_fuga
X_hoge_hoge: fuga_fuga

Drop Invalid Header Fields 有効

「_」を含むリクエストヘッダ 「X_hoge_hoge: fuga_fuga」が削除されました。

GET / HTTP/1.1
(...)
Accept: */*
X-hoge-hoge: fuga_fuga

まとめ

「Drop Invalid Header Fields」を 有効 と設定したALB、 キーの文字列に「_」を含むリクエストヘッダーを除外できるようになりました。

CGIの動作について記述したRFC3875の4.1.18

The HTTP header field name is converted to upper case, has all occurrences of "-" replaced with "" and has "HTTP" prepended to give the meta-variable name.

こちらを悪用した攻撃対策として一定の効果が期待できると思われます。

ウィキペディア List of HTTP header fields に 掲載されている主要なヘッダについては副作用の恐れは少ないと予想されますが、 稼働中のシステムで ALBの「Drop Invalid Header Fields」を有効とする場合、 検証環境などで充分な事前検証を行うことをお勧めします。