OWASP 核心规则警告 "invalid http request line" 由 CONNECT 方法触发
OWASP corerulet warning "invalid http request line" triggered by CONNECT method
总结:
我已经设置了一个带有 mod-security 和 OWASP coreruleset 3.3.2 的基本 WAF。使用 WAF 时,我在 modsec_audit.log 中看到很多关于 CONNECT 方法的 警告 ,这会触发 crs 规则 920100:
Message: Warning. Match of "rx
^(?i:(?:[a-z]{3,10}\s+(?:\w{3,7}?://[\w\-\./](?::\d+)?)?/[^?#](?:\?[^#\s])?(?:#[\S])?|connect
(?:\d{1,3}\.){3}\d{1,3}\.?(?::\d+)?|options
\)\s+[\w\./]+|get /[^?#](?:\?[^#\s])?(?:#[\S])?)$" against
"REQUEST_LINE" required. [file
"/etc/httpd/modsecurity.d/owasp-modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"]
[line "63"] [id "920100"] [msg "Invalid HTTP Request Line"] [data
"CONNECT oneofmy.longer.hostname.here.abcde.com:443 HTTP/1.1"]
[severity "WARNING"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"]
[tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"]
[tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/210/272"]
有关设置的详细信息:
我用 mod_security 2.9.2 和 httpd 设置了 WAF。我使用了 crs 提供的 crs-setup.conf.example
并且仅 mod 确定了这两个关于阈值和允许 CONNECT http 方法的设置。 (CONNECT 方法在我们的设置中用于代理目的)。
SecAction \
"id:900110,\
phase:1,\
nolog,\
pass,\
t:none,\
setvar:tx.inbound_anomaly_score_threshold=5,\
setvar:tx.outbound_anomaly_score_threshold=4"
SecAction \
"id:900200,\
phase:1,\
nolog,\
pass,\
t:none,\
setvar:'tx.allowed_methods=GET HEAD POST OPTIONS CONNECT'"
到目前为止我已经尝试过:
查看处理 CONNECT
方法的规则 920100 的正则表达式部分:
connect (?:\d{1,3}\.){3}\d{1,3}\.?(?::\d+)?
我们可以看到它正在寻找 IPv4 地址。例如,它将匹配(因此不会发出警报)如下请求行:
CONNECT 1.2.3.4:80 HTTP/1.1
正如您所说,RFC 似乎允许将域名与 CONNECT
方法一起使用,但是,目前并未编写规则 920100 来允许这样做。这似乎是您遇到问题的原因。
通过进一步调查和测试,该规则可能会在未来的 CRS 版本中扩展,以允许 CONNECT
请求中的域名。
此时此刻您可以做什么?
要立即解决此问题,您可以在 Apache 配置中添加排除规则。您可以通过两种方式执行此操作:
- 通过在配置时排除它来完全删除有问题的规则,如下所示:
#
# -- CRS Rule Exclusion: 920100 - Invalid HTTP Request Line
#
# Turn off rule due to issues with CONNECT requests
#
SecRuleRemoveById 920100
作为配置时间规则排除,这应该放在之后 在您的 Apache 配置中包含核心规则集(因为要删除的规则必须是 added/included 放在首位,然后才能将其删除!)。
- 删除违规规则 有条件地,仅 用于 CONNECT 请求,在 运行 时间将其排除,如下所示:
#
# -- CRS Rule Exclusion: 920100 - Invalid HTTP Request Line
#
# Turn off rule for CONNECT requests, which cause issues
#
SecRule REQUEST_METHOD "@streq CONNECT" \
"id:1000,\
phase:1,\
pass,\
nolog,\
ctl:ruleRemoveById=920100"
作为 运行time 时间规则排除,这应该放在 before 在您的 Apache 配置中包含 CRS(因为正在修改的规则必须是在执行期间触发之前修改)。
一个小小的警告
我找不到任何其他人以这种方式使用 ModSecurity 和 CRS,即处理 CONNECT
请求。 CRS 规则不是为在请求行中包含域名而编写的,因此您可能会发现 运行 结果是进一步的误报。您需要以与上述类似的方式处理这些问题。
(您可以在此处找到有关编写规则排除主题的优秀教程:https://www.netnea.com/cms/apache-tutorial-8_handling-false-positives-modsecurity-core-rule-set/)。
希望这对您有所帮助。
总结:
我已经设置了一个带有 mod-security 和 OWASP coreruleset 3.3.2 的基本 WAF。使用 WAF 时,我在 modsec_audit.log 中看到很多关于 CONNECT 方法的 警告 ,这会触发 crs 规则 920100:
Message: Warning. Match of "rx ^(?i:(?:[a-z]{3,10}\s+(?:\w{3,7}?://[\w\-\./](?::\d+)?)?/[^?#](?:\?[^#\s])?(?:#[\S])?|connect (?:\d{1,3}\.){3}\d{1,3}\.?(?::\d+)?|options \)\s+[\w\./]+|get /[^?#](?:\?[^#\s])?(?:#[\S])?)$" against "REQUEST_LINE" required. [file "/etc/httpd/modsecurity.d/owasp-modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "63"] [id "920100"] [msg "Invalid HTTP Request Line"] [data "CONNECT oneofmy.longer.hostname.here.abcde.com:443 HTTP/1.1"] [severity "WARNING"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "capec/1000/210/272"]
有关设置的详细信息:
我用 mod_security 2.9.2 和 httpd 设置了 WAF。我使用了 crs 提供的 crs-setup.conf.example
并且仅 mod 确定了这两个关于阈值和允许 CONNECT http 方法的设置。 (CONNECT 方法在我们的设置中用于代理目的)。
SecAction \
"id:900110,\
phase:1,\
nolog,\
pass,\
t:none,\
setvar:tx.inbound_anomaly_score_threshold=5,\
setvar:tx.outbound_anomaly_score_threshold=4"
SecAction \
"id:900200,\
phase:1,\
nolog,\
pass,\
t:none,\
setvar:'tx.allowed_methods=GET HEAD POST OPTIONS CONNECT'"
到目前为止我已经尝试过:
查看处理 CONNECT
方法的规则 920100 的正则表达式部分:
connect (?:\d{1,3}\.){3}\d{1,3}\.?(?::\d+)?
我们可以看到它正在寻找 IPv4 地址。例如,它将匹配(因此不会发出警报)如下请求行:
CONNECT 1.2.3.4:80 HTTP/1.1
正如您所说,RFC 似乎允许将域名与 CONNECT
方法一起使用,但是,目前并未编写规则 920100 来允许这样做。这似乎是您遇到问题的原因。
通过进一步调查和测试,该规则可能会在未来的 CRS 版本中扩展,以允许 CONNECT
请求中的域名。
此时此刻您可以做什么?
要立即解决此问题,您可以在 Apache 配置中添加排除规则。您可以通过两种方式执行此操作:
- 通过在配置时排除它来完全删除有问题的规则,如下所示:
#
# -- CRS Rule Exclusion: 920100 - Invalid HTTP Request Line
#
# Turn off rule due to issues with CONNECT requests
#
SecRuleRemoveById 920100
作为配置时间规则排除,这应该放在之后 在您的 Apache 配置中包含核心规则集(因为要删除的规则必须是 added/included 放在首位,然后才能将其删除!)。
- 删除违规规则 有条件地,仅 用于 CONNECT 请求,在 运行 时间将其排除,如下所示:
#
# -- CRS Rule Exclusion: 920100 - Invalid HTTP Request Line
#
# Turn off rule for CONNECT requests, which cause issues
#
SecRule REQUEST_METHOD "@streq CONNECT" \
"id:1000,\
phase:1,\
pass,\
nolog,\
ctl:ruleRemoveById=920100"
作为 运行time 时间规则排除,这应该放在 before 在您的 Apache 配置中包含 CRS(因为正在修改的规则必须是在执行期间触发之前修改)。
一个小小的警告
我找不到任何其他人以这种方式使用 ModSecurity 和 CRS,即处理 CONNECT
请求。 CRS 规则不是为在请求行中包含域名而编写的,因此您可能会发现 运行 结果是进一步的误报。您需要以与上述类似的方式处理这些问题。
(您可以在此处找到有关编写规则排除主题的优秀教程:https://www.netnea.com/cms/apache-tutorial-8_handling-false-positives-modsecurity-core-rule-set/)。
希望这对您有所帮助。