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
2
3
4
5
6
flask
django
bottle
scikit-learn
pymysql
...

用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效果,会产生误报