Python库的ReDos漏洞检测
问题背景
之前分析了正则表达式原理与ReDos攻击,最近尝试检测Python常用库是否存在ReDos问题。
我的思路是:
- 先看看有没有人已经做过”挖掘常用库的ReDos”工作
- 下载Python的常用库,写程序自动检测库中的ReDos问题
分析过程
已有的研究
这篇2018年的论文JavaScript Web服务器ReDoS漏洞分析中
研究人员先下载了热门的npm模块,然后提取正则表达式,最后测试正则表达式是否存在漏洞。最终发现存在ReDos漏洞的库影响超过339个主流网站。
其中的一点细节:
- 通过遍历JavaScript代码的AST提取正则表达式
- traversing the abstract syntax trees of the JavaScript code
- removing regular expressions that contain no repetitions
- 半人工地测试正则表达式是否存在漏洞
检测Python常用库的ReDos问题
检测目标(基本都是我之前写Python项目时装的一些库)
1 | flask |
用Python的ast
模块解析出库里Python代码中所有的字符串常量,把这些字符串常量都当作正则字符串,最后用rxxr2工具检测是否存在ReDos问题。
代码见 find_vuln_pattern.py 文件
检出结果
所有的漏洞结果在RESULTS.md,验证了部分结果,提交了三个issue。
https://github.com/scikit-learn/scikit-learn/issues/19522
https://github.com/PyMySQL/PyMySQL/issues/967
https://github.com/scrapinghub/dateparser/issues/869
总结
这次测试过程中,存在一些问题:
- 常用库收集得并不多
- rxxr2工具也有误报和漏报的情况
- Python正则中会有
?P<major>
命名组的写法,因为rxxr2不能处理这种特殊情况,所以可能会产生漏报; - 部分正则使用非贪婪匹配时,似乎无法产生ReDos效果,会产生误报
- Python正则中会有