MesaLink是百度安全实验室开发的一个内存安全并兼容OpenSSL的传输层安全(Transport Layer Security, TLS)协议栈。近年来TLS漏洞频发,以2014年的OpenSSL"心血"为代表的内存安全漏洞对业界造成了巨大损失。MesaLink的主要目标是用Rust这样一个保证内存安全的语言,根除TLS协议栈中威胁通信安全性和完整性的内存安全漏洞,减小攻击面且保证攻击面收敛可审计。此外,MesaLink支持跨平台,提供兼容OpenSSL的C API,更可在安卓和libcurl中无缝替换OpenSSL。这极大地降低了开发成本,方便智能设备厂商快速获取安全通信的能力,从而实质性提升智能设备生态的安全性。MesaLink已经在Github上以BSD协议开源,同时MesaLink也是OASES智能终端安全生态联盟的核心开放技术之一;我们欢迎更多合作伙伴的加入,共建安全生态。
为提供完善的功能,并保证强健的安全性,MesaLink 将遵循 Rust SGX SDK 项目中提出的混合代码内存安全架构三原则:
- 隔离并模块化由非内存安全代码编写的组件,并最小化其代码量;
- 由非内存安全代码编写的组件不应减弱安全模块的安全性,尤其是公共 API 和公共数据结构;
- 由非内存安全代码编写的组件需清晰可辨识并且易于更新。
MesaLink与OpenSSL、LibreSSL、mbedTLS、wolfSSL等流行TLS协议栈相比,有以下特色:
2014年的OpenSSL“心血”漏洞是近年来TLS协议栈内存安全漏洞的一个代表。其影响之恶劣,导致Alexa排名前100万的网站不得不重新签发数字证书,初期损失达40亿美元 [1]。这个漏洞导致了业界对OpenSSL的重新审视和反思,也促成了一系列重视内存安全的TLS库的诞生,例如由BSD基金会支持的LibreSSL项目和Google主导的BoringSSL项目。然而由于TLS协议自身的复杂性和C/C++语言的固有缺陷 [2],写出内存安全的代码并不是一件简单的事。目前主流TLS协议栈均依赖fuzzing测试寻找漏洞,在代码层面并不能提供一个内存安全的保证,例如CVE-2017-3730、CVE-2017-3735、CVE-2017-2800均为2017年被发现的内存越界读写漏洞。
MesaLink项目的诞生即在此背景下。MesaLink及其依赖均使用Rust语言实现,得益于Rust语言独特的所有权(ownership)、生命周期(lifetime)、和零开销抽象(zero cost abstraction)等机制,MesaLink能够在接近C++性能的前提下提供内存安全的保证。在此基础上,MesaLink遵循混合代码内存安全架构三原则,限制和最小化攻击面,方便审计。
OpenSSL作为历史最悠久的TLS协议栈,几乎成为了TLS的代名词;诸如git、curl、apache、nginx等知名项目均使用OpenSSL,数以亿计的安卓和苹果设备均使用OpenSSL或与OpenSSL兼容的衍生TLS栈。为了方便既有项目迁移,MesaLink提供与OpenSSL兼容的C API。MesaLink的兼容性目标是:对于直接依赖OpenSSL的项目,替换头文件并重新链接到libmesalink,即可完成迁移。为了保证API行为的正确性,MesaLink使用Google BoringSSL的测试集模拟TLS握手和通信过程的各种场景和错误。而且我们也在libcurl和安卓应用中验证了MesaLink替代OpenSSL的潜力;例如,我们修改的能够兼容MesaLink的libcurl可直接用于git客户端。对于安卓应用,集成MesaLink的Java Secure Socket Extension (JSSE)的aar包后即可透明无缝替换OpenSSL,无需刷机无需修改安卓API;这对一些还停留在安卓4.x使用老旧OpenSSL版本的设备有重要意义。未来MesaLink会在迭代的过程中逐渐支持更多的OpenSSL API,也会开放libcurl、JSSE等更多能力方便开发者接入。
TLS协议的复杂性导致其容易引入不安全配置造成的安全问题。例如启用了老旧的SSLv3、TLSv1.0协议,使用了受选择密文攻击影响的AES-CBC加密算法,没有使用支持前向加密(forward secrecy)的密钥交换算法,没有检查服务器名称(Server Name Indication, SNI)是否与服务器X.509证书中的DNS名称一致等。为了帮助开发者绕过这些使用TLS过程中的常见错误,MesaLink提供业界最佳实践的默认配置,且支持在线证书状态协议(Online Certificate Status Protocol, OCSP)和证书签名时间戳(Signed Certificate Timestamp, SCT)等最新的TLS安全扩展。
MesaLink的一个主要应用场景是嵌入式智能设备,例如安卓手机平板、智能音箱、智能电视等。为了满足这个需求,MesaLink支持ARM/AArch64设备和跨平台交叉编译,也提供编译好的动态链接库和头文件方便厂商直接集成使用。MesaLink的加密算法和密钥交换算法均可裁剪,方便对文件大小有需求的用户。在性能方面,MesaLink提供不弱于竞品的表现。具体请参考下一节。
以常用的AES-256-GCM和Chacha20-Poly1305加密算法为例,我们在Raspberry Pi 3上使用MesaLink的crypto-bench分别测试了MesaLink 0.6.0、OpenSSL 1.1.0f、和wolfSSL 3.14加密8KB数据块的性能,结果如下表所示:
MesaLink 0.6.0 | OpenSSL 1.1.0f | wolfSSL 3.14 | |
---|---|---|---|
AES-256-GCM | 35 MB/s | 20 MB/s | 3 MB/s |
Chacha20-Poly1305 | 167 MB/s | 77 MB/s | 30 MB/s |
我们又分别运行了OpenSSL和wolfSSL各自的性能测试工具,结果如下表所示,可见与crypto-bench对OpenSSL和wolfSSL的测试结果是吻合的。
openssl speed -evp | wolfcrypt/benchmark | |
---|---|---|
AES-256-GCM | 20.7 MB/s | 3.6 MB/s |
Chacha20-Poly1305 | 83.2 MB/s | 27.4 MB/s |
虽然在ARM平台上Chacha20-Poly1305的性能强于AES;在x86_64上由于AES指令集的帮助,AES算法能提供更好的性能。我们在一台2015年的MacBook Pro (Core i7 2.5GHz, macOS 10.13.4)上重复了上述实验,结果如下:
MesaLink 0.6.0 | LibreSSL 2.2.7 | wolfSSL 3.14 | |
---|---|---|---|
AES-256-GCM | 2364 MB/s | 1954 MB/s | 2125 MB/s |
Chacha20-Poly1305 | 1603 MB/s | 1475 MB/s | 345 MB/s |
更多性能测试数据请使用Nightly Rust 2017-12-24版本运行crypto-bench目录下的bench_all
脚本。
MesaLink支持的各个平台的发布版动态链接库和头文件可从https://github.com/mesalock-linux/mesalink/releases下载。
编译MesaLink需要GCC、Rust工具链和autotools支持,以Ubuntu为例,执行下列命令即可:
$ sudo apt-get install m4 autoconf automake libtool make gcc curl
$ curl https://sh.rustup.rs -sSf | sh
$ git clone --recurse-submodules [email protected]:mesalock-linux/mesalink.git
$ ./autogen.sh
$ make
MesaLink 0.6.0版本目前支持以下可裁剪选项:
--enable-examples 编译示例程序 (默认关闭)
--enable-debug 启用调试符号 (默认关闭)
--enable-rusthost=[ARCH] 指定交叉编译目标 (默认关闭)
--enable-client 开启TLS客户端支持 (默认开启)
--enable-server 开启TLS服务器支持 (默认开启)
--enable-errorstrings 开启错误信息 (默认开启)
--enable-aesgcm 开启AES-GCM (默认开启)
--enable-chachapoly 开启Chacha20-Poly1305 (默认开启)
--enable-tls13 开启TLS 1.3支持 (默认开启)
--enable-x25519 开启基于curve25519的密钥交换 (默认开启)
--enable-ecdh 开启基于secp256r1和secp384r1的密钥交换 (默认开启)
--enable-ecdsa 开启ECDSA证书签名验证 (默认开启)
对于一个典型的嵌入式开发场景,我们建议可以关闭错误信息(—disable-errorstrings),关闭TLS 1.3 (—disable-tls13),以及关闭暂时还不是很流行的X25519密钥交换 (—disable-x25519)。
更多交叉编译的介绍可参考https://github.com/mesalock-linux/mesalink/blob/master/CROSS_COMPILE.md
MesaLink项目文档位于https://mesalock-linux.github.io/mesalink-doc。
MesaLink提供了以下两个样例程序,位于https://github.com/mesalock-linux/mesalink/tree/master/examples
client
客户端:一个简单的HTTPS客户端,下载服务器上的index.html并打印协商的密钥算法;server
服务端:一个对所有请求均返回“Hello from MesaLink”的HTTPS服务器,server目录下提供了自签名的证书和私钥以供测试。
##如何参与到MesaLink项目中
MesaLink项目在BSD协议下开源,我们选择这个相对宽松协议也是希望有更多的人能够参与进来,共同完善MesaLink项目和智能设备生态。欢迎在Github上提交pull request。
更多细节请移步MesaLink项目主页:https://github.com/mesalock-linux/mesalink
参考文献:
[1] The matetr of heart bleed, Durumeric et al., (http://web.engr.illinois.edu/~mdbailey/publications/imc14-heartbleed.pdf)
[2] How to prevent the next heartbleed, David Wheeler,(https://www.dwheeler.com/essays/heartbleed.html)