【漏洞预警】CVE-2021-29922 – rust 标准库“net” – rust 1.52.0 std::net 及以下版

  • A+
所属分类:安全漏洞

点击上方蓝字“Ots安全”一起玩耍

【漏洞预警】CVE-2021-29922 – rust 标准库“net” – rust 1.52.0 std::net 及以下版

标题

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

【漏洞预警】CVE-2021-29922 – rust 标准库“net” – rust 1.52.0 std::net 及以下版

本文始发于微信公众号(Ots安全):【漏洞预警】CVE-2021-29922 – rust 标准库“net” – rust 1.52.0 std::net 及以下版

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: