[关闭]
@ensis 2016-01-11T08:31:47.000000Z 字数 3186 阅读 1602

SpanDex: Secure Password Tracking for Android

Security'14


原文链接
作者单位:杜克大学

Abstract

本文提出的SpanDex,实现了一个Android DVM的扩展集,可以完整、准确、快速地处理Android程序中的隐式信息流,保证应用程序不泄露用户的密码。作者通过符号执行中的方法,量化隐式信息流揭露出的关于secret的信息。为了不影响性能,SpanDex将不受信任的代码运行在一个数据流敏感的沙箱里,以限制程序可以对敏感数据执行的操作。作者在SpanDex上运行了50个应用,其中42个没有出现异常,并且发现攻击者恢复出密码平均需要80次尝试,而在没有使用Spandex的情况下,只需要一次尝试。

Background

Android-app Study

为了证明传统处理隐式信息流的方法会带来overtainting,作者在TaintDroid和TaintDroid的修改版(TaintDroid++)这两个执行环境上运行4个应用程序。TaintDroid只做显式信息流跟踪,而TaintDroid++支持隐式信息流跟踪。在输入password后,检查tainted output。

SpanDex

设计原则

  1. 对于显式控制流和隐式控制流分开处理。
    触发显式控制流的操作将相对数量较大的信息量传递给几个对象,而隐式信息流会将相对较少的信息量传递给对象数目很多的enclosed set。
    SpanDex用传统的污点跟踪方式处理显式流。而在遇到带有污点的条件分支时,并不是把污点传播到enclosed set中的对象,而是计算到目前为止控制流已经揭露的信息量(上界)。若认为此信息量安全,则忽略污点在enclosed region中的传播。
    SpanDex会记录下从变量的当前状态到初始秘密信息的操作序列,在遇到带污点的条件分支时,利用这个序列解CSP(Constraint Satisfaction Problem)问题,更新上界。
  2. 如果常见的程序功能使解CSP问题开销过大,则强迫程序使用可信的实现。
    一些密码学或编码操作会有大量的bit-wise或array-indexing操作与条件分支交织在一起,使得解CSP问题需要很大的工作量。
    SpanDex对可信库中的代码只进行显式信息流跟踪,并对于用户自己实现的密码学操作,在加密tainted数据时,强迫使用可信密码库。
  3. 使用秘密信息的数据类型特性来设置release policy。
    对于password来说,只要保证控制流揭示出的每个字符的可能范围不小于可见字符集合,就可以release。

具体实现

SpanDex把每个秘密信息可能的取值范围叫做p-set(possibility set)。为了缩小p-set的范围,需要知道从原始秘密信息到一个tainted条件分支过程的数据流。op-dag就反映了这种依赖关系。
SpanDex的label是一个纸箱op-dag中节点的指针。
op-dag的root节点包含原始秘密信息,p-set和domain(表明秘密信息可以发往哪个domain)。
op-dag的普通节点node记录操作,操作数等信息。

Evaluation

密码保护

50个应用(8个不能在SpanDex上正确运行),选取一个长度为35的密码。下图是运行完42个应用程序后对密码中每个字符得到的p-set的大小分布情况

可以看到'A','a','0'的p-set大小不会小于26和10,而'*','-','.','_'对于75%的应用都有较大的p-set。

为了模拟实际攻击,作者选取了uniqpass-v11中的131M的密码表,计算其中某一个密码p在某一程序中暴露出的p-set。假设攻击者已知p的长度,和每个字符的情况(也就是每个字符是否是大写字母,小写字母,数字,特殊字符)。也就是说p可以由一个正规表达式表示,那么就可以计算match set和match count。match set的大小表明在攻击者无法缩小p-set的情况下,是不大可能猜到密码的。

但实际情况中密码的使用服从zipf分布,也就是说match set中的密码是用户密码的概率不同。
几个密码库的密码符合zipf分布,并且参数s的值分别是0.246,0.695,0.23和0.7878。
作者使用这些值,对math set中的密码进行建模,并计算出了尝试次数的CDF。

性能开销

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注