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 配置中添加排除规则。您可以通过两种方式执行此操作:

  1. 通过在配置时排除它来完全删除有问题的规则,如下所示:
#
# -- CRS Rule Exclusion: 920100 - Invalid HTTP Request Line
#
# Turn off rule due to issues with CONNECT requests
#
SecRuleRemoveById 920100

作为配置时间规则排除,这应该放在之后 在您的 Apache 配置中包含核心规则集(因为要删除的规则必须是 added/included 放在首位,然后才能将其删除!)。

  1. 删除违规规则 有条件地 用于 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/)。

希望这对您有所帮助。