聚焦源代码安全,网罗国内外最新资讯!
编译:代码卫士
ReDoS 攻击为人熟知。
多数计算机语言包括Rust在内都具有防御措施来限制正则表达式字符串的复杂度并阻止 ReDoS 攻击。但Rust 正则表达式库中的漏洞耗尽了服务器资源,而耗尽方式并未在默认防御措施中提供。
安全研究员 Addison Crump 报告了该漏洞并指出,“多数 ReDoS 攻击发生在攻击者控制了正则表达式输入时且能够加载填充内存或耗费长时间执行/编译的时候。Rust_lang/regex 具有缓解措施,因此开发人员可允许不受信任的正则表达式并能保证线性时间复杂度以阻止拒绝服务和最大化的内存开销。”
Crump 还指出,“我发现的输入可使正则表达式编译过程增加复杂度,从而违反了crate的安全保证。”
从补丁来看,空的正则表达式子表达式具有大量重复,从而避免触发任何和内存使用而非编译时间相关的现有缓解措施。因此,仔细构造正则表达式可导致正则表达式编译器尝试生成呈指数增长的空子表达式数量。
从受影响库的 Git 历史来看,该漏洞至少存在于2018年,当时regex-syntax 被重写。Crump 指出,“当’regex’ crate 用于解析不可信的正则表达式时,该漏洞的严重程度为‘高危’。”
Crump 是在模糊测试 cargo-fuzz crate 时发现了该漏洞。
Crump 指出,“我所做的是使用 Arbitrary 生成结构性输入,仅生成有效的正则表达式(至少仅生成正则表达式ASTs),之后在执行时转向字符串形式。”该方法不同于传统的模糊测试方法,后者会生成很多随即输出,其中大部分是无用的噪音。
Crump 表示,“我开始注意到执行时间中的奇怪差异前,运行了大约20秒钟的模糊测试器。我在每次测试案例中都会设置时间,并弹出可用于执行拒绝服务攻击的其中一个正则表达式变体。”
Crump 建议Rust 开发人员使用结构模糊测试发现代码中的潜在内存损坏和逻辑漏洞。他表示,“仅仅因为你使用的语言是内存安全,并不意味着不会发生因为未思考所有可能的案例而造成的崩溃或数据损坏,而模糊测试就是找到这类情况的好方法。结构模糊测试将使你识别出代码中的深层问题,以便让你找到作为人类从未思考到的极端案例。”
原文始发于微信公众号(代码卫士):Rust 修复隐秘的ReDoS 漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论