由rust.cc举办的Rust Meetup今天在杭州鼎创财富中心B2座2层举办,主要议程如下:
本次会议联合主办方:又拍云、CITA Hub;直播支持:CSDN。
大会录播视频剪辑好后,将会在MikeTang的B站主页公布。
https://space.bilibili.com/25566598?from=search&seid=360512592641993419
作何 Tim McNamara 是一位经验丰富的程序员,对自然语言处理、文本挖掘以及更广泛的机器学习和人工智能形式有着浓厚的兴趣。他在包括新西兰开源协会在内的开源社区中非常活跃。Rust in Action 是使用 Rust 进行系统编程的实践指南,它是为具有好奇心的程序员编写的,提供了远远超出语法和结构的实际用例。
国外最近的Rust的书籍,除了《Rust In Action》还有另外两本,《Refactor to Rust》和 《Rust Servers, Services, and Apps》。
Amazon: https://www.amazon.com/dp/1617294551/ref=cm_sw_r_cp_awdb_imm_VJ4HZ4859SDB7K5B7VQK
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。
受影响 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
《End-to-End Encryption with Rust》是一本实践指南, 在本指南中,我们将创建两个名为 Alice 和 Bob 的小型 Rust 程序。Alice 和 Bob 将通过云服务通过网络相互发送消息。在我们的代码示例中,Alice 和 Bob 将相互进行身份验证,并将获得加密保证,以确保其消息的完整性、真实性和机密性得到端到端的保护。
网络上的中间云服务和攻击者将无法看到或更改途中消息的内容。在后面的示例中,我们还将看到即使当 Alice 和 Bob 之间的通信路径更复杂 - 具有多个传输连接、各种传输协议和许多中介时,我们如何才能实现这种端到端保护。
Read More: https://github.com/ockam-network/ockam/tree/develop/documentation/use-cases/end-to-end-encryption-with-rust#readme