「讨论」Rust的安全性
#security
今天的讨论有两个主题,第一个是关于在Safe Rust中绕过借用检查的一个问题,第二个是关于Libra区块链依赖Rust单一语言而引起的安全性讨论。
一、Safe Rust中绕过借用检查:
几天前(2019 年 7 月 27 日)一位用户将 Rust issue #25860 Implied bounds on nested references + variance = soundness hole
中的用例上传到了 crates.io(fake-static)。意在使大家注意到这个在此之前已经超过两年没有动静的 issue。这使我了解到原来目前的 Rust 实现还在一些边角存在着可怕的缺陷。以致于在安全 Rust 中通过精心构造的数行代码便能绕过借用检查,正如 issue 中的用例:
static UNIT: &'static &'static () = &&();
fn foo<'a, 'b, T>(_: &'a &'b (), v: &'b T) -> &'a T { v }
fn bad<'a, T>(x: &'a T) -> &'static T {
let f: fn(_, &'a T) -> &'static T = foo;
f(UNIT, x)
}
二、在今天某微信社区的一次区块链安全的分享中,提到Libra
墨子安全实验室创始人 苗知秋 谈到Libra选择Rust:
在实现语言上,Libra项目选择了一个非常小众但宣称安全性突出的语言RUST。然而,宣称的安全不表示实际上的安全。过于小众的语言往往缺乏长时间的锤炼,导致隐藏的问题较多。再安全的语言也无法确保实现的安全,漏洞常常来自代码实现过程,来自于人。RUST社区也在讨论随机数生成函数的安全升级。所以RUST语言虽然具有安全的特色,但是并不完美,不排除有可能成为Libra项目的阿喀琉斯之踵。 最后,过于依赖RUST语言有可能带来单一性依赖问题,如果RUST语言出现安全问题,则会波及整个Libra系统,这一点可能需要时间来解决,毕竟Libra出现时间尚短,需要时间来实现必要的多样化部署。
日报君(Chaos)发出质疑:
不过话说回来,有一点我不太同意。安全漏洞比例最大的是内存安全问题,(见微软安全响应中心的文章,70%的安全漏洞是内存问题引起的)。而Rust语言的安全性恰恰就是解决内存安全(常见的内存安全问题,当然不完美,也不可能完美)。内存漏洞是跨语言漏洞,多用一种语言就多一份风险,其实并不能改善安全性。
苗知秋回复:
这是一种经典的安全防护思路,安全问题必须从整体上考虑,不能只看局部。区块链作为去中心化的P2P架构,不怕部分节点出问题,担心的是全部节点出问题。因此如果单一使用rust语言实现,谁敢打包票说rust万寿无疆、刀枪不入?万一某天rust爆出系统性漏洞,Libra就全军覆没了。因此为了实现系统级的安全,必须要把风险分散。如果所有的rust部署节点出问题,在解决rust问题期间Go语言节点还可以支撑系统运行,Go语言出问题,在解决Go语言问题期间Java节点也可以让系统正常运行。那么如果rust,go,java同时出问题呢?概率比rust一个出问题的概率小多了啊,这就叫千斤重担万人挑,人人头上有指标[呲牙]
小结: 从安全角度来看,苗知秋的观点是有一定道理的。这可能也是以太坊多语言实现的一个原因。
关于以上两个讨论,大家怎么看呢?
boggle-solver:Boggle游戏的Rust实现
#crossbeam
Boggle是一款受欢迎的益智拼字游戏,作者用Rust来实现了它,作者主要是想练手crossbeam,因为他最近找工作的时候碰到的白板手写代码就是这个Boggle Slover。
「讨论」为什么Rust突然被广泛使用?
为什么Rust突然被Facebook、微软等广泛推崇? 下面一个评论总结的很到位:当「工程质量」高于一切的时候,选择Rust是自然而然的事。
Rustsim 报告 #7
#rustsim
Rustsim组织是一个GitHub组织,聚焦于提供各种数值模拟的库。包括
- alga, 抽象代数库
- nalgebra, 线性代数库
- ncollide, 2D和3D的碰撞检测库
- nphysics, 2D和3D的物理模拟库
最新报告称:
- nphysics 0.12 已经支持了连续碰撞检测
- ncollision 0.20 对非线性冲击时间计算和Pipeline进行了重构
当你没时间维护自己的crate时,最好的善后方法是什么呢?
#crate
这个帖子给出了一个办法,就是把它交给Rust Bus组织(社区义务者),该组织会帮你管理crate。倒也是个不错的办法。
slingshot : 一个新的区块链框架
#blockchain
stellar公司出品。wow,挖掘出一点点关于Rust之父的秘史,不知道大家是否知道:Rust之父Graydon Hoare在2014年加入过这家公司作为核心团队成员(当然现在不在了),可以看下面的Stellar Report 2014。
emosaic: 马赛克生成器
#mosaic
万恶的马赛克。
「新手向」「视频」和借用检查器战斗实录
#BorrowChecker
主要是简单地使用scope(花括号块)来解决生命周期问题
Polaris:一个用Rust编写的web音乐播放器
#music #web
Codenano: 一种在浏览器中设计DNA(脱氧核糖核酸)纳米结构的工具
#DNA #wasm
Codenano还能够计算出一些简单的DNA碱基之间的相互作用,以帮助用户根据一些简单的标准设计出可行的DNA纳米结构。
创建纳米结构设计可能是一个乏味的过程,而codenano的设计目的是减少这一过程。它给出了一个简单的应用编程接口,在这个接口中,我们使用一个小的、简单的Rust编程语言子集来指定一个DNA纳米结构。使用这个应用编程接口不需要任何Rust的知识。然而,高级用户可以从Rust的表达中受益。
From 日报小组 Chaos
日报订阅地址:
独立日报订阅地址:
社区学习交流平台订阅:
评论区
写评论多语言分担风险也轮不到那些修了几十年都没修好的,以及完全不考虑安全设计的新语言。而是应该采用其他依照某种安全哲学设计的语言。
感觉大家的rust都玩出了花,而我连 borrow checker 都要过半天 QAQ