无标题.png

MesaLink是百度安全实验室研发的一个内存安全并且兼容OpenSSL C API的传输层安全(TransportLayer Security,TLS)协议栈。近年来TLS漏洞频发,以2014年的OpenSSL“心血”为代表的内存安全漏洞对业界造成了巨大损失.MesaLink的主要目标是用铁锈这样一个保证内存安全的语言,根除TLS协议栈中威胁通信安全性和完整性的内存安全漏洞,减小攻击面且保证攻击面收敛可审计。自2018年4月MesaLink第一个开源版本0.6.0发布以来,我们得到了社区很多支持和反馈,MesaLink项目在GitHub上已经收获727颗星,在黑客新闻和Reddit Rust板块上也引发了热烈的讨论。这次发布的0.7.0版本开启了TLS 1.3草案28和零往返时间(0-RTT)。这些新特性在提供更强安全性的同时使TLS握手时间减半甚至归零,从而为用户带来更快更安全的体验。



1.png

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



什么是新的


TLS1.3草案28和0-RTT支持


3.png


自四年前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次往返,2-RTT)。以常见的Diffie-Hellman密钥交换为例,需要以下步骤:

1.客户端发送密码套件列表;

2.服务器回复选择的密码套件和服务器的DH参数(Diffie-Hellman参数);

3.客户端完成密钥交换并发送客户端的DH参数;

4.服务器完成密钥交换并通知客户端可以开始发送数据。

而一个TLS1.3会话握手只需要两次通信(1次往返,1-RTT):

1.客户端发送密码套件列表,猜测服务器支持的几种密钥协商方式并发送对应的多个DH参数;

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

TLS 1.3带来的性能优化还不止于此.TLS 1.3复用会话可以利用新的零往返(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的结果椭圆曲线选用X25519,ECDSA椭圆曲线为P-256。

250e2279035ba8101a5237856.png

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草案28和客户端0-RTT的支持,并使用BoringSSL的测试集和Cloudflare验证了我们实现的正确性。我们期待在移动网络,智能AI音箱等延迟高或对延迟敏感的场景中更多地应用TLS 1.3以提升用户体验。

 

卷曲支持



11.png

卷曲是一个广泛使用的文件传输工具,兼容HTTP,HTTPS,FTP等多种协议.curl及其衍生的libcurl的项目是大量开源项目的依赖,其简洁的API方便开发者快速为项目添加HTTPS支持,GIT中客户端的HTTPS支持即来源于卷曲。


得益于MesaLink兼容OpenSSL的C API,在curl于7月11日发布7.61.0稳定版后,我们第一时间为其添加了MesaLink支持并通过了curl和git 2.18.0的测试。补丁文件在补丁目录下随MesaLink 0.7.0以及BSD协议一同发布。

编译安装MesaLink后,执行以下命令即可构建卷发和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之后的稳定Rust默认开启链接时优化缩减文件大小;

  • 开启cargo-fmt和cargo-clippy代码检查;

  • 新的TLS1.3 0-RTT示例代码;

  • 修复cargo tarpaulin代码覆盖测试,目前代码覆盖率91%;

  • 修复上游compiler_builtins项目引起的多个__floatdisf符号的错误[6]

 

结语


TLS 1.3标准的发布是互联网安全基础设施建设的重要一步,相比十年前发布的TLS1.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]协议行动:'传输层安全(TLS)协议版本1.3'到标准(draft-ietf-tls-tls13-28.txt),https://www.ietf.org/mail-archive/web/ TLS /电流/ msg25837.html

[2]传输层安全性(TLS)协议版本1.3,https://tools.ietf.org/html/rfc8446

[3]引入零往返时间恢复(0-RTT),https://blog.cloudflare.com/introducing-0-rtt/

[4] HAProxy中的TLS 1.3和0-RTT,https://www.haproxy.com/blog/tls-1-3-0-rtt-haproxy/

[5]在HTTP中使用早期数据,https://tools.ietf.org/html/draft-ietf-httpbis-replay-00

[6]修复由floatdisf引起的符号冲突,https://github.com/rust-lang-nursery/compiler-builtins/pull/252