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 项目中提出的混合代码内存安全架构三原则:

1.隔离并模块化由非内存安全代码编写的组件,并最小化其代码量;

2.由非内存安全代码编写的组件不应减弱安全模块的安全性,尤其是公共 API 和公共数据结构;

3.由非内存安全代码编写的组件需清晰可辨识并且易于更新。



为什么选择MesaLink


MesaLink与OpenSSL、LibreSSL、mbedTLS、wolfSSL等流行TLS协议栈相比,有以下特色:

1.内存安全,杜绝“心血”

2014年的OpenSSL“心血”漏洞是近年来TLS协议栈内存安全漏洞的一个代表。其影响之恶劣,导致Alexa排名前100万的网站不得不重新签发数字证书,初期损失达40亿美元 [1]。这个漏洞导致了业界对OpenSSL的重新审视和反思,也促成了一系列重视内存安全的TLS库的诞生,例如由BSD基金会支持的LibreSSL项目和Google主导的BoringSSL项目。然而由于TLS协议自身的复杂性和C/C++语言的固有缺陷 [2],写出内存安全的代码并不是一件简单的事。目前主流TLS协议栈均依赖fuzzing测试寻找漏洞,在代码层面并不能提供一个内存安全的保证,例如CVE-2017-3730(https://www.cvedetails.com/cve/CVE-2017-3730/)、CVE-2017-3735(https://www.cvedetails.com/cve/CVE-2017-3735/)、CVE-2017-2800(https://www.cvedetails.com/cve/CVE-2017-2800/)均为2017年被发现的内存越界读写漏洞。


MesaLink项目的诞生即在此背景下。MesaLink及其依赖均使用Rust语言实现,得益于Rust语言独特的所有权(ownership)、生命周期(lifetime)、和零开销抽象(zero cost abstraction)等机制,MesaLink能够在接近C++性能的前提下提供内存安全的保证。在此基础上,MesaLink遵循混合代码内存安全架构三原则,限制和最小化攻击面,方便审计。


2.兼容OpenSSL,方便已有应用快速移植无缝对接

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等更多能力方便开发者接入。


3.易于配置,杜绝错误配置造成的安全风险

TLS协议的复杂性导致其容易引入不安全配置造成的安全问题。例如启用了老旧的SSLv3、TLSv1.0协议,使用了受选择密文攻击影响的AES-CBC加密算法,没有使用支持前向加密(forward secrecy)的密钥交换算法,没有检查服务器名称(Server Name Indication, SNI)是否与服务器X.509证书中的DNS名称一致等。为了帮助开发者绕过这些使用TLS过程中的常见错误,MesaLink提供业界最佳实践的默认配置,且支持在线证书状态协议(Online Certificate StatusProtocol, OCSP)和证书签名时间戳(Signed Certificate Timestamp, SCT)等最新的TLS安全扩展。


4.为嵌入式设备而生,可灵活裁剪

MesaLink的一个主要应用场景是嵌入式智能设备,例如安卓手机平板、智能音箱、智能电视等。为了满足这个需求,MesaLink支持ARM/AArch64设备和跨平台交叉编译,也提供编译好的动态链接库和头文件方便厂商直接集成使用。MesaLink的加密算法和密钥交换算法均可裁剪,方便对文件大小有需求的用户。在性能方面,MesaLink提供不弱于竞品的表现。具体请参考下一节。

 


MesaLink的性能如何


以常用的AES-256-GCM和Chacha20-Poly1305加密算法为例,我们在RaspberryPi 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


1.使用MesaLink发布版

MesaLink支持的各个平台的发布版动态链接库和头文件可从https://github.com/mesalock-linux/mesalink/releases下载。


2.从源代码编译MesaLink

编译MesaLink需要GCC、Rust工具链和autotools支持,以Ubuntu为例,执行下列命令即可:






$ sudo apt-get install m4autoconf automake libtool make gcc curl

$ curl https://sh.rustup.rs -sSf | sh

$ git clone https://github.com/mesalock-linux/mesalink.git

$ ./autogen.sh
$ make








MesaLink0.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),关闭TLS1.3 (--disable-tls13),以及关闭暂时还不是很流行的X25519密钥交换 (--disable-x25519)。

更多交叉编译的介绍可参考

https://github.com/mesalock-linux/mesalink/blob/master/CROSS_COMPILE.md



如何获取MesaLink文档和样例代码


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 matter of heart bleed, Durumeric et al., (http://web.engr.illinois.edu/~mdbailey/publications/imc14-heartbleed.pdf)

[2] How to prevent the next heartbleed, DavidWheeler,(https://www.dwheeler.com/essays/heartbleed.html)