Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

ShadowCrypt: Encrypted Web Applications for Everyone

论文下载:http://www.cs.berkeley.edu/~dawnsong/papers/shadowcrypt-ccs14.pdf

摘要

本文提出了一个叫做ShadowCrypt的方案,可以在不信任网络应用其他部分的前提下,将用户的输入加密后在网络上传输。

背景

目前,用户都面临隐私扩散问题。网络应用程序处理用户的数据,但是用户对其数据却没有太大的控制权,在提交给应用程序后,便无法控制谁能够访问、修改那些数据。

一种可行的解决方法是用户将提交给网络应用的数据加密,解密密钥只提供给用户信任的实体。但这类方案很少被广泛采用,主要是需要应用的重写,在部署和可用性上都存在困难。此外,应用重写也就意味着控制权仍在开发者手上。

因此,需要一种安全、可用、控制权在用户手上的加密网络应用数据的方案。Virtu公司就做了这样的事情,他们提供了一个浏览器插件,用于电子邮件加密,像Gmail等服务提供商便无法看到明文信息。但是这只算是一种针对于单一应用解决方案,无法用于其他网络应用。

本文作者提出ShadowCrypt,一个通用的加密网络应用数据的解决方案。

问题和方法概述

Fig

一般来说,对于一个典型的web应用,服务器端包括数据库和前端,客户端是一个web浏览器,将HTML转换成DOM(应用UI的树形表示),用户通过DOM与应用进行交互,HTML中还包括JS,用户通过DOM与JS进行交互。

所有加密web应用数据的方案,都是试图减少可以访问明文数据的代码量,在一些检查点上保证不该访问到明文的代码的确不能访问到。图1中的a,b,c三点就是检查点,在检查点左边的代码只能访问到加密数据,右边的代码就是应用的信任计算基(Trusted Computing Base,TCB)。

  1. 在前端和数据库之间:之前的工作像CryptDB就是这种设计,通过一个代理将用户的数据库查询透明地转换为对加密数据的查询,这种方案的TCB是全部客户端和服务器端的代码,虽然也可以根据用户需求缩小TCB,但是这需要代理熟知整个应用的访问控制逻辑。
  2. 在客户端和网络之间:这种设计是目前最常使用的解决方案,像密码管理软件(LastPass),文件存储管理(Mega)、聊天应用(CryptoCat)和安全笔记(LastPass)等。还有人提出将客户端的UI和网络代码分开,在之间插入一个密码层,但是这个方案需要浏览器和应用重写。另外像Meteor JS框架的扩展Mylar,用来将发送给服务器的所有数据加密,但是这个方案需要应用是用Meteor写的,并且要告诉Mylar哪些数据需要加密。这类方案的TCB是客户端代码,上面提到的方案都有相应的措施保证代码不被篡改,但是却无法保证程序没有bug。
  3. 文章提出的ShadowCrypt就工作在用户和客户端之间。应用只能看到加密的数据,这就需要将input/output field隔离开来。方案的TCB不包含任何应用程序的代码,因此关键问题就在于提供用户安全的UI和可以存储密钥和执行加密操作的隔离环境。方案依赖浏览器扩展提供安全的隔离环境,但是与用户交互的DOM是应用和浏览器扩展共享的,因此还需要依赖Shadow DOM来将明文和应用代码隔离开来。

ShadowCrypt

Fig

如图2所示,用户与页面正常交互,ShadowCrypt无缝地将Shadow DOM中的明文数据替换为页面中的加密数据,令ShadowCrypt JS运行在浏览器扩展提供的隔离环境中,并将可跨越Shadow DOM和DOM的JS对象列表设为空之间,此外,键盘敲击事件可以穿过DOM和Shadow DOM之间的边界,因此ShadowCrypt JS还要保证给Shadow DOM的输入不会触发应用程序的listener。

Example

Fig

  • 输入:载入图3的页面后,ShadowCrypt JS代码注意到文本输入框的存在,便创建一个针对这个输入框的包含shadow输入框的shadow tree,浏览器将shadow输入框放在”Enter your name:“旁边。用户点击shadow输入框开始输入,每输入一个字符,ShadowCrypt将其读入,加密,用密文更新原来输入框的值。加密后的文本还包含加密密钥的指纹和一个标识字符串(=?shadowcrypt),以便在页面中很容易地定位到密文。
  • 应用处理:用户输入完成后,应用接受到change事件,读取原本输入框的值(密文),拼接上前后字符串后设置为p元素的textcontent属性。
  • 输出:页面中有一个text node包含了密文,ShadowCrypt JS检测到标识字符串,使用密钥指纹识别出密钥后解密,得到明文后需要展示给用户。因此ShadowCrypt JS将密文用一个span元素包裹,并为span建立shadow tree,将明文写到shadow tree中。

Fig

性能评估

Fig

测试对象 Fig

表2是使用了ShadowCrypt后,主要功能还完好保留的应用。主要影响的功能包括目标营销(广告)、富文本输出、应用实现的数据共享(相反只有与用户共享了密钥的用户才能共享数据)

总结

本文提出了一个叫做ShadowCrypt的系统能够,透明地将web应用的文本转为加密文本,与之前的工作相比,它不需要信任web应用的任何部分,相反,它将用户数据的控制权交还给用户,只有共享了密钥的实体才能看到明文数据。