MesaLink v0.7.0发布

迎接TLS 1.3时代 更快更安全

logo_0.7.0

MesaLink是百度安全实验室研发的一个内存安全并且兼容OpenSSL C API的传输层安全(Transport Layer Security, TLS)协议栈。近年来TLS漏洞频发,以2014年的OpenSSL”心血”为代表的内存安全漏洞对业界造成了巨大损失。MesaLink的主要目标是用Rust这样一个保证内存安全的语言,根除TLS协议栈中威胁通信安全性和完整性的内存安全漏洞,减小攻击面且保证攻击面收敛可审计。自2018年4月MesaLink第一个开源版本0.6.0发布以来,我们得到了社区很多支持和反馈,MesaLink项目在Github上已经收获727颗星,在HackerNews和Reddit Rust板块上也引发了热烈的讨论。

heatmap

MesaLink是OASES智能终端安全生态联盟的核心开放技术之一,也是百度AIoT终端安全解决方案的重要组成部分。目前MesaLink已在百度电视助手中集成落地,自8月7日起正式上线各大电视应用市场;夏普、酷开智能电视中的铺量部署也在有条不紊地进行中。MesaLink等安全技术即将集体亮相9月4日在上海新国际博览中心举办的2018百度云智峰会,我们期待MesaLink技术能够赋能更多智能终端设备,也欢迎更多合作伙伴加入,共同建设安全生态。

What’s New

TLS 1.3 Draft 28 和 0-RTT 支持

MesaLink 0.7.0版本中,我们首次启用了TLS 1.3 Draft 28的支持。自四年前TLS 1.3标准的第一个草案被提出,经过了数十个草案的修改,互联网工程任务组 (Internet Engineering Task Force, IETF) 终于在3月21日批准第28个草案作为TLS 1.3的最终修订版本 [1]。

相比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参数;

  1. 服务器选择支持的密码套件,选择客户端发送的一个DH参数完成密钥交换,然后回复服务器的DH参数并通知客户端开始发送数据。客户端收到DH参数后完成密钥交换即可发送数据。

可见在客户端提前发送Diffie-Hellman参数的情况下,TLS 1.3会话在不损失安全性的同时节省了两次通信。

TLS 1.3带来的性能优化还不止于此。TLS 1.3复用会话可以利用新的Zero round trip (0-RTT) 特性,在客户端开始握手连接服务器时即发送加密数据,。然而使用0-RTT特性在握手过程中发送的数据有被重放的安全风险,因此在服务器端需要特别的配置以防范重放攻击,所幸Cloudflare、HAProxy等厂商已经提供了解决方案[2, 3]。在MesaLink 0.7.0中我们实现了客户端对TLS 1.3 0-RTT的支持,并使用BoringSSL和Cloudflare验证了我们实现的正确性。

TLS 1.3还带来了更好的安全性。TLS 1.3不再支持压缩、重协商、AES-CBC、RC4等在之前TLS版本中引发各种安全问题的功能;新安全特性方面,TLS 1.3使用支持前向安全的DHE和ECDHE密钥交换,加密ServerHello之后全部的握手报文,引入抗降级攻击,使用新的HKDF密钥导出算法。我们期待在移动网络、智能AI音箱等延迟高或对延迟敏感的场景中更多地应用TLS 1.3以提升用户体验。

Curl支持

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_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
$ sh curl-config --ssl-backends # 显示MesaLink

其他新功能

  • SSL_connect和SSL_do_handshake;
  • 实验性的X509和STACK API,用于提供Android支持;
  • 异步套接字支持,支持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-fmtcargo-clippy代码检查;
  • 使用safe Rust重写若干unsafe Rust代码块;
  • 新的TLS 1.3 0-RTT示例代码;
  • 修复cargo tarpaulin代码覆盖测试,目前代码覆盖率91%;
  • 修复上游compiler_builtins项目引起的多个__floatdisf符号的错误 [5]

更多细节请移步:

MesaLink主页:https://mesalink.io/ MesaLink代码:https://github.com/mesalock-linux/mesalink

参考文献:

[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] Introducing Zero Round Trip Time Resumption (0-RTT), https://blog.cloudflare.com/introducing-0-rtt/

[3] TLS 1.3 and 0-RTT in HAProxy, https://www.haproxy.com/blog/tls-1-3-0-rtt-haproxy/

[4] Using early data in HTTP, https://tools.ietf.org/html/draft-ietf-httpbis-replay-00

[5] Fix symbol collision caused by floatdisf, https://github.com/rust-lang-nursery/compiler-builtins/pull/252

bottom_qr

Published by in general and tagged mesalink using 189 words.

comments powered by Disqus