Rust 修复隐秘的ReDoS 漏洞

Rust安全团队发现Regexcrate中的漏洞,可能导致正则表达式拒绝服务攻击。攻击者利用复杂正则消耗资源,安全研究员AddisonCrump通过结构fuzzing发现并建议结构模糊测试预防内存损坏。
摘要由CSDN通过智能技术生成

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

编译:代码卫士

d8bc1229a760c6f9f89e7cf62c549c4b.png

Rust 安全团队修复了位于 Regex crate 中的一个漏洞,可导致应用程序遭拒绝服务攻击。如正则表达式字符串太复杂而不易解析,则会消耗资源并拖慢应用服务器。攻击者利用这一特征在应用特性如搜索页面和API中发动正则表达式拒绝服务 (ReDoS) 攻击。

9386176b9fa1ac420f64997703de52a2.png

d7131c86b016c72747c6f55d9ef3677b.png

正则表达式编译的复杂度

ReDoS 攻击为人熟知。

多数计算机语言包括Rust在内都具有防御措施来限制正则表达式字符串的复杂度并阻止 ReDoS 攻击。但Rust 正则表达式库中的漏洞耗尽了服务器资源,而耗尽方式并未在默认防御措施中提供。

安全研究员 Addison Crump 报告了该漏洞并指出,“多数 ReDoS 攻击发生在攻击者控制了正则表达式输入时且能够加载填充内存或耗费长时间执行/编译的时候。Rust_lang/regex 具有缓解措施,因此开发人员可允许不受信任的正则表达式并能保证线性时间复杂度以阻止拒绝服务和最大化的内存开销。”

Crump 还指出,“我发现的输入可使正则表达式编译过程增加复杂度,从而违反了crate的安全保证。”

从补丁来看,空的正则表达式子表达式具有大量重复,从而避免触发任何和内存使用而非编译时间相关的现有缓解措施。因此,仔细构造正则表达式可导致正则表达式编译器尝试生成呈指数增长的空子表达式数量。

从受影响库的 Git 历史来看,该漏洞至少存在于2018年,当时regex-syntax 被重写。Crump 指出,“当’regex’ crate 用于解析不可信的正则表达式时,该漏洞的严重程度为‘高危’。”

ace962ac602783691362129d6c2eec63.png

结构fuzzing

Crump 是在模糊测试 cargo-fuzz crate 时发现了该漏洞。

Crump 指出,“我所做的是使用 Arbitrary 生成结构性输入,仅生成有效的正则表达式(至少仅生成正则表达式ASTs),之后在执行时转向字符串形式。”该方法不同于传统的模糊测试方法,后者会生成很多随即输出,其中大部分是无用的噪音。

Crump 表示,“我开始注意到执行时间中的奇怪差异前,运行了大约20秒钟的模糊测试器。我在每次测试案例中都会设置时间,并弹出可用于执行拒绝服务攻击的其中一个正则表达式变体。”

Crump 建议Rust 开发人员使用结构模糊测试发现代码中的潜在内存损坏和逻辑漏洞。他表示,“仅仅因为你使用的语言是内存安全,并不意味着不会发生因为未思考所有可能的案例而造成的崩溃或数据损坏,而模糊测试就是找到这类情况的好方法。结构模糊测试将使你识别出代码中的深层问题,以便让你找到作为人类从未思考到的极端案例。”


代码卫士试用地址:https://codesafe.qianxin.com

开源卫士试用地址:https://oss.qianxin.com


推荐阅读

Rust 编程语言曝高危漏洞,可导致文件和目录遭删除

因严重缺陷,Rust 撤销所有 Crates 包的 API 令牌

Apache Strusts2出现高危反序列化漏洞 攻击者可控制web服务器

原文链接

https://portswigger.net/daily-swig/rust-patches-sneaky-redos-bug

题图:Pixabay License

本文由奇安信编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。

4376cf11e3c0b63198b6d5cb43d089d4.png

d95cae2622ac47afda4e2df61ebb6b40.png

奇安信代码卫士 (codesafe)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值