< 返回版块

lidongjies 发表于 2021-08-08 21:01

Rust Meetup 杭州站

由rust.cc举办的Rust Meetup今天在杭州鼎创财富中心B2座2层举办,主要议程如下:

  • 《Rust+Tokio/mio在又拍云的实践》 夏功勋 又拍云工程师
  • 《Tokio Internals》 王福音 溪塔工程师
  • 《Rust 生态的性能调试器》 pprof-rs 杨可真 pprof-rs 作者
  • 《深挖 move 语义》丁邵顺
  • 《Rust 的 Web 开发见解》赵春霖 Rust Web 开发者
  • 《ARM 上的 Cloud- Hypervisor》李枫 独立开发者
  • 《cps 变化在 Rust 语言中尾递归应用及其性能分析》常开颜 中科院博士

本次会议联合主办方:又拍云、CITA Hub;直播支持:CSDN。

大会录播视频剪辑好后,将会在MikeTang的B站主页公布。

《Rust In Action》书籍第一版发布

作何 Tim McNamara 是一位经验丰富的程序员,对自然语言处理、文本挖掘以及更广泛的机器学习和人工智能形式有着浓厚的兴趣。 他在包括新西兰开源协会在内的开源社区中非常活跃。Rust in Action 是使用 Rust 进行系统编程的实践指南,它是为具有好奇心的程序员编写的,提供了远远超出语法和结构的实际用例。

国外最近的Rust的书籍,除了《Rust In Action》还有另外两本,《Refactor to Rust》和 《Rust Servers, Services, and Apps》。

Amazon

[CVE-2021-29922] Rust 标准库net 模块漏洞: 前导零改变 IP 地址

Golang、Rustlang net 库受到之前在 Netmask 中发现的严重 IP 地址验证漏洞的影响。 GitHub 上 “import net” 的结果超过 400 万条,Kubernetes 也 cherry picked 了修复程序。

本周,在DEF CON上,安全研究人员Cheng Xu、Victor Viale、Sick Codes、Nick Sahler、Kelly Kaoudis、opennota和John Jackson披露了 Go 和 Rust 语言的 net 模块的一个缺陷。CVE-2021-29922(针对Rust) 和 CVE-2021-29923(针对Golang)。

IP地址可以用多种格式表示,包括十六进制和整数,不过最常见的IPv4地址是用十进制格式表示的。

例如,BleepingComputer的IPv4地址以十进制格式表示为104.20.59.209,但同样的地址也可以以八进制格式表示为:0150.0024.0073.0321

假设你得到一个十进制格式的IP地址,127.0.0.1,这被广泛理解为本地回环地址或localhost

如果你在它前面加上一个0,应用程序是否仍应将0127.0.0.1解析为127.0.0.1或其他什么?在Chrome的地址栏中输入0127.0.0.1,浏览器会将其视为八进制格式的IP。在按下回车键或返回键时,该IP实际上变成了十进制的87.0.0.1,这就是大多数应用程序应该处理这种模糊的IP地址的方式。

根据IETF的原始规范,IPv4地址的部分内容如果前缀为 "0",可以解释为八进制。

但是Go和Rust中的net模块都忽略了这一点,将部分地址视为十进制。

rust 1.52.1 std::net 及以下版本中IP地址输入未按八进制处理而导致不确定的 SSRF 和 RFI 漏洞。

例如,攻击者向依赖std::net::IpAddr的网络程序提交IP地址,可以通过输入位组的输入数据引起 SSRF;

如果位组(octet)是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.1,但Rust将其计算为127.0.26.1。

  • SSRF是Server-side Request Forge的缩写,中文翻译为服务端请求伪造。
  • RFI 是Remote File Inclusion的缩写,客户端可控制网页包含远程文件。

受影响 Rust 版本: 1.52.1 及以下。

PoC 代码:

// ##!/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

https://github.com/sickcodes/security/blob/master/advisories/SICK-2021-015.md

https://www.bleepingcomputer.com/news/security/go-rust-net-library-affected-by-critical-ip-address-validation-vulnerability/

Read More

使用 Rust 进行端到端加密

《End-to-End Encryption with Rust》是一本实践指南, 在本指南中,我们将创建两个名为 Alice 和 Bob 的小型 Rust 程序。 Alice 和 Bob 将通过云服务通过网络相互发送消息。 在我们的代码示例中,Alice 和 Bob 将相互进行身份验证,并将获得加密保证,以确保其消息的完整性、真实性和机密性得到端到端的保护。

网络上的中间云服务和攻击者将无法看到或更改途中消息的内容。 在后面的示例中,我们还将看到即使当 Alice 和 Bob 之间的通信路径更复杂 - 具有多个传输连接、各种传输协议和许多中介时,我们如何才能实现这种端到端保护。

Read More


From 日报小组 李冬杰

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页