我扫描了20个流行的Python软件包,以查找危险的正则表达式模式。以下是我的发现。

发布日期:2026-04-08 10:01:15   浏览量 :6
发布日期:2026-04-08 10:01:15  
6

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

2019年7月2日13时42分(协调世界时),一名为 Cloudflare 工作的工程师修改了其 Web 应用防火墙正在使用的常规规则集。不到三分钟内,全球流量骤降80%。其网络中所有处理 HTTP 请求的 CPU 负载飙升至100%。问题根源在于一条用于检测跨站脚本(XSS)攻击的正则表达式,其模式为 .*(?:.*=.*)。该模式在同一字符类上使用了两个由 .* 构成的量词。

这就是一次生产环境中的正则表达式拒绝服务(ReDoS)事件。

我很好奇,在我们日常使用的 Python 库中,这类模式究竟有多常见。

实际发生了什么

正则表达式的工作原理是尝试找出所有将模式与字符串匹配的方式。通常情况下这没有问题,因为匹配器要么很快找到匹配项,要么迅速排除某些可能性。但当设计的模式允许输入字符以多种方式被模式的不同部分消耗时,问题就出现了。在匹配失败的情况下,匹配器必须尝试所有可能的路径。

这种增长并非线性。以下是我们测试框架针对非匹配字符串运行正则表达式 (a+)+ 时得到的实际数据:

n=10   ->  0.001秒
n=20   ->  0.884秒   (比 n=10 慢884倍)
n=30   ->  数小时

当输入长度翻倍时,所需时间呈指数级增长——n=20 比 n=10 慢了884倍。到了 n=30,这种趋势并未减缓,而是直接停滞。如果某个接口在用户输入上使用了这种模式,那无异于埋下了一颗拒绝服务的定时炸弹。

redos-analyzer 的工作原理

然而,几乎所有现有的检测工具都是通过向正则表达式提供恶意输入并测量执行时间来进行测试的。虽然这种方法通常有效,但它需要为特定模式专门构造恶意输入,而这项任务有时颇具挑战性。

我们的解决方案则另辟蹊径:利用 Python 在解析正则表达式代码并编译时,会先调用内部模块 sre_parse 生成抽象语法树这一事实。生成的抽象语法树由一系列 (操作码, 值) 元组组成,以结构化形式表示该模式。如果抽象语法树中存在一个 MAX_REPEAT 节点,其内部包含一个 SUBPATTERN,而该子模式自身又包含另一个 MAX_REPEAT,那么无论输入内容如何,都能独立识别出嵌套量词结构。

这使我们能够对抽象语法树进行静态分析,并检测出四类潜在危险的模式:嵌套量词、量词内部的空匹配、重叠的备选项,以及我们意外发现的第四类自有模式。

在20个软件包中的发现

我们对20个最受欢迎的 Python 库的源代码发行版进行了分析:requests、flask、django、fastapi、sqlalchemy、pydantic、pytest、numpy、pandas、pillow、scrapy、celery、boto3、httpx、aiohttp、click、rich、typer、black 和 mypy。解析器遍历所有以 .py 结尾的文件,提取所有对 re.compile 和 re.search 的调用,并对每个调用执行分析流程。

初步报告了90条警告。在排除测试代码、第三方库和构建工具后,运行时代码中仍剩23条警告。

在所有发现中,aiohttp 的案例或许最值得深入探究。该工具检测到 _WS_EXT_RE 可能存在风险,因为它正是上述问题的一个实例

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部