2018-08-16 15:27:319250人阅读
MesaLink是百度安全实验室研发的一个内存安全并且兼容OpenSSL C API的传输层安全(Transport Layer Security, TLS)协议栈。近年来TLS漏洞频发,以2014年的OpenSSL"心血"为代表的内存安全漏洞对业界造成了巨大损失。MesaLink的主要目标是用Rust这样一个保证内存安全的语言,根除TLS协议栈中威胁通信安全性和完整性的内存安全漏洞,减小攻击面且保证攻击面收敛可审计。自2018年4月MesaLink第一个开源版本0.6.0发布以来,我们得到了社区很多支持和反馈,MesaLink项目在GitHub上已经收获727颗星,在Hacker News和Reddit Rust板块上也引发了热烈的讨论。这次发布的0.7.0版本开启了TLS 1.3 draft 28和Zero round trip time (0-RTT)。这些新特性在提供更强安全性的同时使TLS 握手时间减半甚至归零,从而为用户带来更快更安全的体验。
MesaLink是OASES智能终端安全生态联盟的核心开放技术之一,也是百度AIoT终端安全解决方案的重要组成部分。目前MesaLink已在百度电视助手中集成落地,自8月7日起正式上线各大电视应用市场;夏普、酷开智能电视中的铺量部署也在有条不紊地进行中。我们期待MesaLink技术能够赋能更多智能终端设备,也欢迎更多合作伙伴加入,共同建设安全生态。
自四年前TLS 1.3标准的第一个草案被提出,经过了数十个草案的修改,互联网工程任务组 (Internet Engineering Task Force, IETF) 在3月21日批准第28个草案作为TLS 1.3的最终修订版本 [1];8月10日,IETF发布TLS 1.3标准的正式版本,即RFC 8446 [2]。
相比TLS 1.2,TLS 1.3带来了更短的握手时间。一个TLS 1.2会话的握手需要客户端和服务器之间至少通信四次(2 round trips, 2-RTT)。以常见的Diffie–Hellman密钥交换为例,需要以下步骤:
1. 客户端发送密码套件列表;
2. 服务器回复选择的密码套件和服务器的DH参数 (Diffie-Hellman Parameters);
3. 客户端完成密钥交换并发送客户端的DH参数;
4. 服务器完成密钥交换并通知客户端可以开始发送数据。
而一个TLS 1.3会话握手只需要两次通信 (1 round- trip, 1-RTT):
1. 客户端发送密码套件列表,猜测服务器支持的几种密钥协商方式并发送对应的多个DH参数;
2. 服务器选择支持的密码套件,选择客户端发送的一个DH参数完成密钥交换,然后回复服务器的DH参数并通知客户端开始发送数据。客户端收到DH参数后完成密钥交换即可发送数据。
TLS 1.3带来的性能优化还不止于此。TLS 1.3复用会话可以利用新的Zero round trip (0-RTT) 特性,在客户端开始TLS握手时即发送加密数据。然而使用0-RTT特性在握手完成前发送的数据有被重放的安全风险,因此在服务器端需要特别的配置以防御重放攻击,所幸Cloudflare、HAProxy等厂商已经提供了解决方案[3, 4, 5]。
我们使用Firefox 61.0.2的开发者工具测量https://mesalink.io的TLS握手时间。下图分别为TLS 1.2、TLS 1.3和TLS 1.3 0-RTT的结果,三者均使用ECDHE_ECDSA_AES_128_GCM_SHA256密码套件,ECDHE椭圆曲线选用X25519,ECDSA椭圆曲线为P-256。
TLS 1.3还带来了更好的安全性。TLS 1.3去除了压缩、重协商、AES-CBC、RC4等在之前TLS版本中引发各种安全问题的功能;新安全特性方面,TLS 1.3使用支持前向安全的DHE和ECDHE密钥交换,使用AEAD对称加密算法,支持X25519椭圆曲线,加密ServerHello之后全部的握手报文,防止降级攻击,使用新的HKDF密钥导出算法。在MesaLink 0.7.0中我们实现了客户端和服务器TLS 1.3 Draft 28和客户端0-RTT的支持,并使用BoringSSL的测试集和Cloudflare验证了我们实现的正确性。我们期待在移动网络、智能AI音箱等延迟高或对延迟敏感的场景中更多地应用TLS 1.3以提升用户体验。
curl是一个广泛使用的文件传输工具,兼容HTTP、HTTPS、FTP等多种协议。curl及其衍生的libcurl项目是大量开源项目的依赖,其简洁的API方便开发者快速为项目添加HTTPS支持,git客户端的HTTPS支持即来源于curl。
得益于MesaLink兼容OpenSSL的C API,在curl于7月11日发布7.61.0稳定版后,我们第一时间为其添加了MesaLink支持并通过了curl和git 2.18. 0的测试。补丁文件在patches目录下随MesaLink 0.7.0以BSD协议一同发布。
编译安装MesaLink后,执行以下命令即可构建curl和libcurl:
$ curl -LO https://curl.haxx.se/download/curl-7.61.0.tar.gz
$ curl -LO https://raw.githubusercontent.com/mesalock-linux/mesalink/master/patches/curl/curl_7.61.0.patch
$ tar zxvf curl-7.61.0.tar.gz && cd curl-7.61.0
$ patch -p1 < ../curl_7.61.0.patch
$ autoreconf
$ ./configure --with-mesalink --without-ssl
$ make
• SSL_connect和SSL_do_handshake;
• 实验性的X509和STACK API,用于支持Android HostnameVerifier;
• 异步套接字支持,支持SSL_ERROR_WANT_READ, SSL_ERROR_WANT_WRITE, SSL_ERROR_WANT_CONNECT, SSL_ERROR_WANT_ACCEPT错误类型;
• 重构的线程本地错误队列,提供错误类型、错误号码和出错行号方便调试;
• 启用Logger用于调试TLS协议,可使用SSL_load_error_strings()开启;
• FFI边界强制catch_unwind防止未定义行为;
• Nightly Rust和1.28.0之后的stable Rust默认开启链接时优化缩减文件大小;
• 开启cargo-fmt和cargo-clippy代码检查;
• 新的TLS 1.3 0-RTT示例代码;
• 修复cargo tarpaulin代码覆盖测试,目前代码覆盖率91%;
• 修复上游compiler_builtins项目引起的多个__floatdisf符号的错误 [6]
TLS 1.3标准的发布是互联网安全基础设施建设的重要一步,相比十年前发布的TLS 1.2, TLS 1.3提供了更好的性能和更强的安全性。今天我们发布的MesaLink 0.7.0版本有幸见证了TLS 1.3时代的开启,MesaLink的curl支持能够让更多开发者用上内存安全的TLS库。我们期待MesaLink能够为更多的设备带来TLS 1.3,让每个人都享受更快更安全的互联网。
更多内容请移步:
MesaLink主页:https://mesalink.io/
MesaLink下载:https://github.com/mesalock-linux/mesalink
一把锁的传奇 – 从OpenSSL到MesaLink:https://mp.weixin.qq.com/s/7ED1flNTcdEFiS0wS_PiIw
MesaLink开源:OpenSSL的接班人,"心脏"不再"出血": https://mp.weixin.qq.com/s/_AHeStAzWx0xftYISTlk6g
参考文献:
[1] Protocol Action: 'The Transport Layer Security (TLS) Protocol Version 1.3' to Proposed Standard (draft-ietf-tls-tls13-28.txt), https://www.ietf.org/mail-archive/web/tls/current/msg25837.html
[2] The Transport Layer Security (TLS) Protocol Version 1.3, https://tools.ietf.org/html/rfc8446
[3] Introducing Zero Round Trip Time Resumption (0-RTT), https://blog.cloudflare.com/introducing-0-rtt/
[4] TLS 1.3 and 0-RTT in HAProxy, https://www.haproxy.com/blog/tls-1-3-0-rtt-haproxy/
[5] Using early data in HTTP, https://tools.ietf.org/html/draft-ietf-httpbis-replay-00
[6] Fix symbol collision caused by floatdisf, https://github.com/rust-lang-nursery/compiler-builtins/pull/252