看我如何发现(并修复)Python 源代码中的漏洞
编译:代码卫士
James Kettle 此前曾就 web 缓存投毒发布了一篇研究文章,本文作者为了更深入地了解这个领域的知识并查找开源领域中的相关漏洞,研究了最流行的 web 框架如 Flask、Bottle 和 Tornado。结果,作者从 Python 3.9 中发现并修复了一个安全漏洞。如下是作者叙述。
故事是这样开始的。在研究过程中,我搭建了上述框架的本地实例并对它们进行利用。虽然很多实例被指易受攻击,但 Tornado 实例引起了我的注意,因为 Tornado 的维护人员表示他们正通过 Python 的标准库解析该 URL。
当我查看 Python 源代码时,发现该漏洞比我之前想得更为严重:所有使用 Python 标准库的数据包均易受攻击。
模块 urlparse 将分号 “;” 视作一个分隔符,然而多数代理仅将 “&” 视作分隔符。这意味着当攻击者能够使用分号分隔查询参数时,可能会引发代理(以默认配置运行)和服务器之间对请求解释有所不同,从而导致恶意请求被缓存为安全请求。
GET /?link=http://google.com&utm_content=1;link='><t>alert(1)</script> HTTP/1.1
Host: somesite.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,imag e/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9 Connection: close
Urlparse 有三个参数:link、utm_content,以及另外一个 link。另一方面,代理认为完整字符串 1;link='><t>alert(1)</script> 是 utm_content 的值,这就是为何该缓存密钥仅包含 somesite.com/?link=http://google.com。
我立即联系 Python 安全团队并设立了一个漏洞工单,同时创建了 CPython 仓库上的 pull 请求。经过一个月与公关的拉锯战后,2月15日被合并且在2月19日发布。解决方案已经向后兼容更老旧的 Python 版本。
这件事说明,我们必须更加深入挖掘。你认为自己已经找到不错的东西了?推翻自己的假设并思考根因,尝试更深入地挖掘,就可能会发现更精彩的结果。
攻击者利用Python 勒索软件加密 VMware ESXi 服务器
Yamale Python 包受高危的代码执行漏洞影响
Python 官方软件库 PyPI 遭垃圾软件包洪水攻击
Python 紧急修复远程代码执行漏洞
https://www.tldr.engineering/how-i-found-and-fixed-a-vulnerability-in-python/
题图:Pixabay License
本文由奇安信编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的产品线。