点击上方蓝字“Ots安全”一起玩耍
标题
CVE-2021-29922 rust 标准库“net”——rust 1.52.0 std::net 及以下版本中八进制文字的不正确输入验证导致不确定的 SSRF 和 RFI 漏洞。
CVE ID
CVE-2021-29922
内部标识
SICK-2021-015
产品版本
1.52.1 及以下
漏洞详情
rust-lang 标准库“net”中八进制字符串的不正确输入验证允许未经身份验证的远程攻击者对许多依赖 rust-lang std::net 的程序执行不确定的 SSRF、RFI 和 LFI 攻击。IP 地址八位字节被剥离而不是被评估为有效的 IP 地址。例如,攻击者向依赖 std::net::IpAddr 的 Web 应用程序提交 IP 地址,可以通过输入八进制输入数据导致 SSRF;如果八位字节为 3 位,攻击者可以提交可利用的 IP 地址,最小可利用八位字节为 08(拒绝服务),最大可利用八位字节为 099(拒绝服务)。例如,攻击者可以提交 010.8.8.8,即 8.8.8.8 (RFI),但 std::net::IpAddr 会将其评估为 10.8.8.8。同样,攻击者可以输入 127.0.026.1,这实际上是 127.0.22。
供应商回应
在 rust 1.53 中修复:https : //github.com/rust-lang/rust/pull/83652
概念证明
#!/bin/bash# Authors: https://github.com/sickcodes, https://twitter.com/sickcodes# https://doc.rust-lang.org/std/net/struct.Ipv4Addr.html#method.is_private# License: GPLv3+# https://play.rust-lang.org/?version=stable&mode=release&edition=2015&gist=62f6f98dc1de7d162ee4e62d09825035
cat <<EOF>poc.rs#![allow(unused)]
fn main() { use std::net::Ipv4Addr;
let localhost = Ipv4Addr::new(127, 0, 0, 1); assert_eq!("0127.0.0.1".parse(), Ok(localhost)); assert_eq!(localhost.is_loopback(), true);}EOF
# vulnerabledocker run -it -v ~/poc.rs:/poc.rs rust:1.51 /bin/bash -c "rustc -V; rustc /poc.rs; ./poc && echo VULNERABLE"
# vulnerabledocker run -it -v ~/poc.rs:/poc.rs rust:1.52 /bin/bash -c "rustc -V; rustc /poc.rs; ./poc && echo VULNERABLE"
# fixeddocker run -it -v ~/poc.rs:/poc.rs rust:1.53 /bin/bash -c "rustc -V; rustc /poc.rs; ./poc && echo VULNERABLE"
# fixeddocker run -it -v ~/poc.rs:/poc.rs rust:1.54 /bin/bash -c "rustc -V; rustc /poc.rs; ./poc && echo VULNERABLE"
# fixeddocker run -it -v ~/poc.rs:/poc.rs rust:1.58 /bin/bash -c "rustc -V; rustc /poc.rs; ./poc && echo VULNERABLE"// ##!/usr/bin/env rustc// # Authors: https://twitter.com/sickcodes, https://twitter.com/kaoudis// # License: GPLv3+
use std::net::IpAddr;
fn main() {let addr = "127.026.0.1".parse::<IpAddr>().unwrap(); println!("{}", addr.to_string());let addr1 = "127.0.026.1".parse::<IpAddr>().unwrap(); println!("{}", addr1.to_string());let addr2 = "127.0.0.093".parse::<IpAddr>().unwrap(); println!("{}", addr2.to_string());let addr3 = "099.0.0.01".parse::<IpAddr>().unwrap(); println!("{}", addr3.to_string());}
// $ rustc -o main main.rs// $ ./main// 127.26.0.1// 127.0.26.1// 127.0.0.93// 99.0.0.1
披露时间表
2021-03-29 – 研究人员发现漏洞
2021-03-29 – CVE 请求
2021-03-30 – 修复合并到 master https://github.com/rust-lang/rust/pull/83652
2021-08-07 – 发布@ DEF CON 29 https://www.youtube.com/watch?v=_o1RPJAe4kU
链接
https://github.com/rust-lang/rust/issues/83648
https://github.com/rust-lang/rust/pull/83652
https://doc.rust-lang.org/beta/std/net/struct.Ipv4Addr.html
https://github.com/sickcodes/security/blob/master/advisories/SICK-2021-015.md
https://sick.codes/sick-2021-015
https://www.youtube.com/watch?v=_o1RPJAe4kU
https://defcon.org/html/defcon-29/dc-29-speakers.html#kaoudis
CVE 链接
https://sick.codes/sick-2021-015
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-29922
https://nvd.nist.gov/view/vuln/detail?vulnId=CVE-2021-29922
还没有评论,来说两句吧...