看我如何发现(并修复)Python 源代码中的漏洞

b81ac47ddc28f7678a94a4954d3efd55.gif 聚焦源代码安全,网罗国内外最新资讯!

编译:代码卫士

James Kettle 此前曾就 web 缓存投毒发布了一篇研究文章,本文作者为了更深入地了解这个领域的知识并查找开源领域中的相关漏洞,研究了最流行的 web 框架如 Flask、Bottle 和 Tornado。结果,作者从 Python 3.9 中发现并修复了一个安全漏洞。如下是作者叙述。

故事是这样开始的。在研究过程中,我搭建了上述框架的本地实例并对它们进行利用。虽然很多实例被指易受攻击,但 Tornado 实例引起了我的注意,因为 Tornado 的维护人员表示他们正通过 Python 的标准库解析该 URL。

862f03ae8d12241b2c5f8e6e55936f1d.gif

Python 源代码

当我查看 Python 源代码时,发现该漏洞比我之前想得更为严重:所有使用 Python 标准库的数据包均易受攻击。

模块 urlparse 将分号 “;” 视作一个分隔符,然而多数代理仅将 “&” 视作分隔符。这意味着当攻击者能够使用分号分隔查询参数时,可能会引发代理(以默认配置运行)和服务器之间对请求解释有所不同,从而导致恶意请求被缓存为安全请求。

39e69db18ad96c6c57811f94231ecfea.gif

利用举例

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 版本。

这件事说明,我们必须更加深入挖掘。你认为自己已经找到不错的东西了?推翻自己的假设并思考根因,尝试更深入地挖掘,就可能会发现更精彩的结果。


推荐阅读

在线阅读版:《2021中国软件供应链安全分析报告》全文

11个恶意python包被指窃取 Discord 令牌、安装shell

攻击者利用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”。

f394150108c114fe49b1fd5ef8b937da.png

489853ebaeda611959c16ad9e0d33726.png

奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的产品线。

   d1875cb0a087a75bdb348f094cbefab6.gif 觉得不错,就点个 “在看” 或 "赞” 吧~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值