AWS WAF の GenericLFI_BODY が PDF アップロードを誤検知してブロックする
AWS WAF の GenericLFI_BODY が PDF アップロードを誤検知してブロックする
現象
ユーザーが PDF ファイルをアップロードすると「問題が発生しました」エラーが表示される。別のファイルは正常にアップロードでき、時間をおいても解消しない。サポート担当が同じファイルをアップロードすると成功する場合もある。
調査
S3 に保存されている WAF ログを確認すると、該当リクエストが BLOCK されていた。
{
"action": "BLOCK",
"terminatingRuleId": "AWSManagedRulesCommonRuleSet",
"ruleGroupList": [
{
"ruleGroupId": "AWS#AWSManagedRulesCommonRuleSet",
"terminatingRule": {
"ruleId": "GenericLFI_BODY",
"action": "BLOCK"
}
}
],
"labels": [
{ "name": "awswaf:managed:aws:core-rule-set:GenericLFI_Body" }
],
"oversizeFields": ["REQUEST_BODY"],
"requestBodySize": 111379,
"requestBodySizeInspectedByWAF": 8192
}原因
GenericLFI_BODY は リクエストボディ内の LFI(Local File Inclusion)パターン(../ 等のパストラバーサル)を検知するルール。PDF のバイナリデータにこのパターンと一致するバイト列が含まれており、誤検知が発生していた。
WAF はボディの先頭 8,192 bytes のみを検査する。multipart/form-data のバウンダリやフィールド順序はブラウザ・環境により異なるため、同じファイルでも環境によって検知されたりされなかったりする。
対処
AWSManagedRulesCommonRuleSet に scope-down statement を追加し、multipart/form-data リクエストを検査対象から除外する。
rule {
name = "AWSManagedRulesCommonRuleSet"
priority = 0
override_action { none {} }
statement {
managed_rule_group_statement {
vendor_name = "AWS"
name = "AWSManagedRulesCommonRuleSet"
# multipart/form-data(ファイルアップロード)を除外
scope_down_statement {
not_statement {
statement {
byte_match_statement {
search_string = "multipart/form-data"
positional_constraint = "STARTS_WITH"
field_to_match {
single_header { name = "content-type" }
}
text_transformation {
priority = 0
type = "NONE"
}
}
}
}
}
}
}
}同じ scope-down は AWSManagedRulesSQLiRuleSet でも運用実績がある。ファイルアップロードではボディにバイナリが含まれるのが正常であり、パターンマッチの誤検知が避けられないため、この除外は妥当。