用于用户控制的方法和设备与流程

文档序号:17796598发布日期:2019-05-31 20:48阅读:163来源:国知局
用于用户控制的方法和设备与流程

本发明概括地涉及程序代码的分析,更具体地涉及访问具有用户私密数据的敏感系统资源的程序代码的分析。



背景技术:

近几年来,技术正被强力引向移动设备和移动/云计算架构。用户享受随时随地运行应用并执行计算的能力,并且还持续访问他们的数据和资源。同时,对隐私的威胁正在上升。用户例如在像智能手机或平板电脑这样的移动设备上安装的应用(通常称为“app”)可能导致私密信息的不希望的使用。这可能存在于支持广告内容、分析、社交计算等等之中。

作为示例,有一种在谷歌播放(Google Play)上可用的flashlight应用,该应用需要访问互联网、移动设备的状态等。这些不但是误进入这个应用清单的声称的许可,而且实际上被该应用所使用。正如已知的,清单文件向操作系统给出关于应用的基本信息,在系统可以运行该应用的任何代码之前系统必须具有的信息。尤其来说,清单声明了该应用为了访问API(应用编程接口)的受保护部分而必须具有的许可。在flashlight应用的示例中,该应用可能不需要访问诸如因特网或移动设备的状态之类的敏感系统资源。

这于用户而言产生了挑战。一方面,用户希望将应用对敏感系统资源的访问减到最小以便缩小私密数据泄漏的可能性(例如,如果该应用将用户的位置发送给某些第三方广告网站)。另一方面,在一些情况下,应用实际上使用敏感信息来优化它们的核心行为,例如,在社交计算的情况下或者在免费增值应用的情况下。对于免费增值应用,该应用可能最初是免费的,但附加的功能花钱。这些应用可以在用户还没有对附加功能付费时向用户显示广告。信息的关键部分不是应用要求哪些许可,而是应用正在如何使用应用已被授予的许可。



技术实现要素:

如下概要仅仅意指示例性的。该概要不意欲限制权利要求的范围。

一种示例性方法包括:访问针对应用将被撤销的许可,其中,所述许可涉及经由操作系统的应用编程接口对用户私密数据的访问。所述方法包括:在所述应用中确定涉及经由所述应用编程接口对用户私密数据进行访问的一个或多个程序点。所述方法进一步包括:针对所述一个或多个程序点中的每个选定程序点,重写所述应用中的代码以利用另一语句替换在所选择的程序点处的访问所述私有数据的源语句,所述另一语句基于由所述源语句返回的实际值的类型分配模拟对象或值,其中所述模拟对象或值没有暴露所述用户私密数据。所述方法还包括:将具有被重写代码的所述应用封装为能够由用户随后执行的输出应用;和输出具有所述被重写代码的应用以供用户使用。

附加的示例性实施例包括计算机程序,包括用于当该计算机程序在处理器上运行时执行前面段落的方法的代码。根据本段的计算机程序,其中所述计算机程序是包括一种计算机程序产品,所述计算机程序产品包括承载了包含在其中以用于与计算机一起使用的计算机程序代码的计算机可读介质。

一种示例性设备,包括一个或多个处理器和包含计算机可读代码的一个或多个存储器。利用所述一个或多个处理器,所述一个或多个存储器和所述计算机可读代码被配置来使得所述设备至少执行以下操作:访问针对应用将被撤销的许可,其中,所述许可涉及经由操作系统的应用编程接口对用户私密数据的访问;在所述应用中确定涉及经由所述应用编程接口对用户私密数据进行访问的一个或多个程序点;针对所述一个或多个程序点中的每个选定程序点,重写所述应用中的代码以利用另一语句替换在所选择的程序点处的访问所述私有数据的源语句,所述另一语句基于由所述源语句返回的实际值的类型分配模拟对象或值,其中所述模拟对象或值没有暴露所述用户私密数据;将具有被重写代码的所述应用封装为能够被用户随后执行的输出应用;和输出具有所述被重写代码的应用以供用户使用。

一种计算机程序产品,所述计算机程序产品包括承载了包含在其中以用于与计算机一起使用的计算机程序代码的计算机可读介质。所述计算机程序代码,响应于由所述计算机执行,使得所述计算机执行以下操作:访问针对应用将被撤销的许可,其中所述许可涉及经由操作系统的应用编程接口对用户私密数据的访问;在所述应用中确定涉及经由所述应用编程接口对用户私密数据进行访问的一个或多个程序点;针对所述一个或多个程序点中的每个选定程序点,重写所述应用中的代码以利用另一语句替换在所选择的程序点处的访问所述私有数据的源语句,所述另一语句基于由所述源语句返回的实际值的类型分配模拟对象或值,其中所述模拟对象或值没有暴露所述用户私密数据;将具有被重写代码的所述应用封装为能够被用户随后执行的输出应用;和输出具有所述被重写代码的应用以供用户使用。

一种示例性设备包括:用于访问针对应用要被撤销的许可的装置,其中所述许可涉及经由操作系统的应用编程接口对用户私密数据的访问;用于在所述应用中确定涉及经由所述应用编程接口对所述用户的所述私密数据进行访问的一个或多个程序点的装置;用于响应于所述一个或多个程序点中的每个选定程序点,重写所述应用中的代码以利用另一语句替换在所选择的程序点处的访问所述私有数据的源语句的装置,所述另一语句基于由所述源语句返回的实际值的类型分配模拟对象或值,其中所述模拟对象或值没有暴露所述用户的所述私密数据;用于将具有被重写代码的所述应用封装为能够由所述用户随后执行的输出应用的装置;以及用于输出具有所述被重写代码的所述应用以供由所述用户使用的装置。

附图说明

图1是适于执行本文中的示例性实施例的系统示例的框图;以及

图2是来自类com.tapjoy.TapjoyConnectCore的方法init()的代码片段;

图3是来自DataManager(数据管理器)的代码片段;

图4是运行示例;

图5是示例性实施例的高级概述;

图6是约束聚类算法;

图7是用来说明一个可能系统的示例性实现细节的框图;和

图8是在隐私实施中利用应用对具有私密数据的敏感系统资源的使用来进行细粒度用户控制的过程,并且说明了示例性方法的操作,包含在计算机可读存储器上的计算机程序指令的执行的结果,由硬件和/或用于根据示例性实施例执行功能的互连装置实现的逻辑所执行的功能,。

具体实施方式

为便于参考,本公开内容被分为若干部分。首先提供了概述,随后是更详细的讨论。

预备部分:概述和示例性系统

在本部分中提供了概述。存在用来切换应用许可的现有工具(内置的以及外部的)。对于外部工具,请参阅XPrivacy。然而,这些工具不提供有关许可被如何使用的任何信息。它由用户来确定对许可进行撤销是否“安全”以及对应用的运行时行为及其输出的质量将有什么影响。事实上,利用XPrivacy和其他工具的实验证实:单纯撤消许可有时总是会导致应用崩溃。

本公开内容的一个示例性想法是使得用户能够选择性地禁用应用的要求许可的方面,同时仍然保留应用的核心功能和行为。这样的方面例如包括分析、广告、社交计算、基于位置的服务、增强认证、与社交网络的集成等等。在示例性实施例中,(例如,动态的)分析的全新且新颖的形式被使用来表征应用正在如何利用敏感系统资源。在示例性实施例中,该分析通过“模拟”(mocking)对象及它们的值来选择性地禁用应用的要求许可的方面,这保留了应用的功能,但限制了对用户隐私的侵犯。

现在结合图1提供对用于允许用户控制敏感资源的使用的技术的介绍。转向图1,示出了适于执行本文中的示例性实施例的系统示例的框图。计算系统100包括一个或多个存储器145,一个或多个处理器110,电路115,一个或多个网络接口(N/W I/F)180,以及一个或多个输入/输出接口(I/O IF)120。计算系统100还可连接到外部设备190,其可以允许管理员经由鼠标、触摸屏、显示屏、或其他输出或输入(作为外部设备)来访问计算系统100。存储器145可以包括非易失性和/或易失性RAM(随机存取存储器),高速缓存存储器,基于NAND的闪存,长期存储(例如,硬盘驱动器),和/或只读存储器。计算系统100还可以是服务器,并且可以例如通过因特网176被远程访问,因特网176可以是无线网络或者包括无线网络。用户(未示出)使用客户端设备195连接到因特网/无线网络176,客户端设备195典型地是移动设备。移动设备是无线的并且便携的,并且通常能够被用户拿起——虽然这不是必要的。客户端设备195具有OS(操作系统)197,它包括API(应用程序接口)198,并且具有重写应用175。

计算系统100的一个或多个存储器145包括用户隐私实施过程125、规范155、应用135、API(应用编程接口)198和重写应用175。在一个示例性实施例中,用户隐私实施过程125包括三个主要过程:约束推断过程510,约束求解过程520,和代码重写过程530。应用135包括使用访问用户私密数据的许可的多个对象140-1到140-N(例如,对象的方法)。该访问通过API 198来执行。

规范155在本示例中包括多个要被撤销的许可150-1到许可150-N。要被撤销的许可150由用户例如经由图形用户接口(未示出)(例如,诸如web浏览器接口)或者经由任何其它机制来指示。用户希望从应用135中撤销许可150,以使得当该应用在客户端设备195 上执行时,该应用不再能够访问与该许可相应的私密用户数据。

用户隐私实施过程125确定:针对应用135,许可150要被撤销。如上所述,许可150涉及经由API 198访问用户私密数据。API 198用于操作系统(OS)197,如在客户端设备195中所示。用户隐私实施过程125重写应用135中的代码例如以便代替源语句,在涉及经由API访问用户私密数据的程序点处,其用分配模拟对象的另一语句来访问私密数据。分配是基于由源语句返回的实际值的类型,并且模拟对象未暴露用户私密数据。即,对使用访问用户私密数据的许可的对象140(或对象的方法)的调用可以被返回如下数据的模拟调用所替换:所述数据不暴露用户私密数据。用户私密数据可以是客户端设备195的IMEI(国际移动设备标识),用户的位置,与客户端设备195相关联的电话号码等等,并且相应的模拟对象满足针对私密数据的要求,但不暴露私密数据。例如,位置可能是地球上的有效位置(或者甚至大概是在用户的附近),但是将不会是用户的位置。重写应用175(也称为模拟后的应用175)基于应用135和应用135的重写部分而形成。因此,当用户通过使用客户端设备195执行重写应用175时,重写应用175不访问与许可150对应的私密数据。

每个许可150守卫用户的一些私密数据,如客户端设备195的IMEI(国际移动设备标识),用户的位置,与客户端设备195相关联的电话号码等等。每个许可150还被期望对应于访问敏感系统资源的许可。因此,这样的许可150可以对应于由操作系统197(如安卓Android)定义的许可。下面的示例使用安卓操作系统197作为例子,但是这仅是示例性的,目前的示例性实施例并不限于安卓。在安卓编程中,许可是一种限制,其限制了对设备上的一部分数据的访问。强加该限制以保护关键数据,这些关键数据会被滥用从而破坏用户体验。许可可以在应用135的应用清单中被声明。

用户隐私实施过程125可以被实现为计算机可读程序代码,其可由一个或多个处理器110执行以使得计算系统100执行本文所描述的操作中的一个或多个。处理器110可以是任何处理单元,例如数字信号处理器和/或单核或多核通用处理器。在另一示例中,操作还可以部分地或者完全地由实现执行这些操作的逻辑的电路115来执行。电路115可以被实现为一个或多个处理器110的一部分,或者可以与所述一个或多个处理器110相分离。处理器110可以是任何处理单元,例如数字信号处理器和/或单核或多核通用处理器。电路115可以是任何电子电路,例如专用集成电路或可编程逻辑。

第1节:诱发示例

在本节中,利用从安卓市场上可用的真实生活应用中取得的代码片段介绍了若干诱发示例。安卓是由谷歌开发的移动操作系统。

第1.1节:Tapjoy(丰富媒体)广告库

图2中的代码片段是Tapjoy库的一部分,Tapjoy库是一个广泛使用的移动应用广告和出版平台。当这个库对它的核心连接组件进行初始化时,该库读取设备标识符,并且为了发现设备标识符是否被模拟而执行一些检查。在这种情况下,该库创建特设随机标识符,并且通过使用该标识符而对设备进行跟踪。一旦被创建,这个特殊标识符被永久地存储在设备中,并且该标识符在该应用的下一次执行中被再次使用。以这种方式,即使Tapjoy库使用标准模拟标识符,该库也可以通过各种执行来对设备进行跟踪。

设备标识符对于Tapjoy来说尤其重要,因为标识符允许应用精确地跟踪用户做了什么。出于这个原因,该库将一些特殊标识符(即,空值,空字符串,“0”,和“0000000000000000”)认为是模拟的,这些标识符通常被诸如XPrivacy之类的系统所采用。为了调用方法getDeviceId(),应用必须要求READ_PHONE_STATE许可。当我们利用本文所使用的技术撤消这个许可时,我们需要用一个常数值来替代该方法调用,但我们还想要避免执行第11行中的代码,这是因为这行代码无论如何都将允许程序跟踪用户。在这个分支中的错误日志(TapjoyLog.e)指示:这段代码处理我们想要避免的异常情况。

该示例表明,我们需要针对给定程序的特定模拟策略。在本公开内容中,术语“模拟”意思是“接近地模仿或近似”。模拟的对象或值不应该允许程序识别和跟踪用户,并且因此不暴露用户私密数据。在这种具体情况中,对于这个程序,我们想要避免第一个“if”语句的“then”分支(第3行)。给定一个程序,自动策略建立特定模拟值,该自动策略阻止了这种特定程序跟踪用户。此外,如果将来的版本(其可以考虑一个常数值,该常数值被设立以避免程序的这个当前版本)发现了模拟值并将该模拟值添加到黑名单中,则当被应用到该程序的这个新版本时该新的常数值将使用本文所描述的技术而被设立。

第1.2节:当前呼入方ID和屏蔽

现在考虑图3中的代码,其是来自当前呼入方ID和屏蔽应用的DataManager(数据管理器)——美国最流行的免费应用之一——中的代码片段。该代码旨在对类com.whitepages.scid.dataDataManager的字段进行初始化。注意,这个应用的代码是重度混淆的,因此这些方法名称不具有任何语义。

该应用的主要功能是阻止来自不在联系人列表中的号码的呼叫,但该应用要求访问IMEI(国际移动设备标识)和设备的电话号码的许可READ_PHONE_STATE。特别地,在图3中的代码通过TelephonyManager.getLine1Number()访问电话号码,而且如果这个电话号码是由10个字符构成,则该代码提取区号并以适当的方式对DataManager类的所有字段进行初始化。该代码是鲁棒性的,并且不引发任何异常,这是因为在访问该方法之前该代码检查该方法返回的值是否为空,但是为了激活该应用的全部功能,该代码需要接收10位数的电话号码。虽然XPrivacy总是返回由6个字符组成的常数字符串,但是本文的技术被用来模拟启用DataManager的所有主要功能的10位数字串。即,串str1被设置为10位数字(但不是该用户的电话号码)。因为模拟的资源在“then”分支里面被使用以提取电话号码的区号,所以这种情况发生,并且这导致产生要求电话号码不为空并且正好由十位数字组成的良好约束。

第1.3节:白页

考虑图4中的从White Page(白页)应用的类com.whitepages.geoservices.LocationHelper中取得的代码片段。这个类包含一些私密字段:类型LocationManager的mLocationManager存储被用来检索位置提供者的位置管理器,而类型HashMap<字符串,位置>的mLocationResponses被用来存储由每个位置提供者所检索到的最后位置(由字符串识别)。方法requestLatestLocation遍历所有位置提供者,并且如果所述方法发现非被动提供者,则该方法将提供者的标识符添加到mLocationResponses。在提供者的列表为空或者仅包含一个被动提供者的情况下,那么requestLatestLocation发信号通知:它未能找到位置提供者。一旦提供者的标识符流入mLocationResponses中,则该标识符稍后(通过一些听众)被用来将新鲜位置添加到该地图中,并且这些位置被应用进一步使用。

方法getProviders需要LOCATION许可。如果一个人想要撤消此许可,则他需要以某种方式模拟由getProviders返回的提供者名单。理想情况下,我们想要模拟保留应用的其余功能的列表。对于这个具体的方法,这需要生成包含至少一个非被动提供者的提供者列表,从而我们填充mLocationResponses,并且这将激活处理位置的应用的主要功能。

第2节:一些示例性实施例的技术概述

在本节中,我们总结了示例性方法的主要步骤,我们在图4中将其高亮突出显示。示例性实施例开始于许可要被撤销(例如,对IMEI或位置的访问)和安卓应用要求该许可(例如,通过getDeviceId()访问IMEI)。

第一步(用户隐私实施过程125的约束推断过程510)是分析安卓应用,并由此推断在由给定的许可守卫的API(应用编程接口)调用所产生的值上的约束。在图5中,这些对应于带框的语句540-1至540-3)。这些约束旨在避免转移到坏程序位置(例如,“引发”语句),并且优选地在不存在实际私密值的情形下还将功能最大化。在第二步(用户隐私实施过程125的约束求解过程520)期间,推断的约束被求解以获得具体的模拟值(例如,语句550,设备ID→“1”)。最后,由给定许可守卫的API调用被模拟值替换(例如,语句560,DEVICEID=getDeviceId()被语句570,DEVICEID=“1”所替换)。在本节中,我们还将参考图2和图4中的代码片段以说明技术讨论。

第2.1节:约束推断510

第一步是表征应用如何访问资源。虽然理论上该应用可以执行该应用所获得的值的全面验证,由此将模拟实际值的尝试复杂化,因此在实践中检查常常限于如上面第1节中用真实世界示例所说明的某些特定的试验。同时,验证试验常常因应用而有所不同。举个例子,一个应用可以检查IMEI以验证应用没有运行在模拟的环境上(其中IMEI是‘0’的字符串,如上面的Tapjoy的示例中那样),而另一个应用可能会验证制造商信息(被编码到IMEI前缀中)。鉴于此观察,需要针对模拟合成的专门(即每个应用的)策略。

业务的第一级是收集足够的约束以避免“坏执行”,其中应用崩溃或错误处理代码(例如写入错误日志中)取代核心功能而被执行。具体来说,如果路径导向如下坏位置则认为代码路径是坏的:如下程序点,在其中(i)引发异常或(ii)众所周知的错误处理方法被调用。在图2中,TapjoyLog.e()被调用,其继而调用内置android.util.Log.e()error-logging方法,从而呈送必要的——合成模拟值(非空的,不为空,而不是1或15零序列)的——上面列出的约束。

除了避免在示例性实施例中必需的坏约束,我们的方法还试图合成将核心功能“最大化”的模拟对象或值。也就是说,尽管存在引导执行远离错误处理或崩溃的不同可能值,但是在实践中这些值不是同样良好。一些值比其他值导致更完整地执行应用的业务逻辑。

作为示例,我们参照图4,其中经由getProviders()调用获得位置提供者的列表。第一步,如Tapjoy,是为了避免坏约束。虽然这些在这里都没有明显呈现(fireLocationFailedCallback()既不引发异常,也没有调用内置的错误处理方法),但是存在隐含的约束:列表对象1的值不能为空。否则,该对象上的size()调用会导致空取消引用异常(Java中的NullPointerException)。Java是用于开发应用——尤其是可以在不同平台上操作的应用(特别是用于互联网的应用)——的编程语言。约束推断过程510虑及了这些隐含的约束。

虽然简单地返回非空但空列表对象足以避免了坏执行,但是“else”分支还是得不到执行。该分支明显优于“if”分支,如第1.3节中所诱发的那样。约束推断过程510所采用的捕捉这的具体方式是考虑沿着不同代码路径的私密数据值的使用。直观地说,假定两条路径均良好,如果其中一条路径使得所获得的值使用更多,则它更可能执行依赖于那个值的实际逻辑。在图4中,变量l在“else”分支内的循环结构中被使用,并且因此执行该循环优于跳过该循环,这意味着变量l不应该是空的。

第2.2节:约束求解过程520

约束求解的示例性目标是满足尽可能多的良好约束(其捕获沿着良好路径实施的条件),同时避免触犯任何坏约束(其确保坏执行路径被避免)。反映这个目标的两种类型约束的统一表示通过向约束指派权重来实现:在示例性实施例中,良好的约束具有1(一)的单位权重,而坏约束具有∞权重。接下来,约束求解过程520根据冲突关系启发式地将约束划分成聚类。假定两个约束c1和c2,冲突关系检测两个约束是否肯定有冲突,即,c1AND c2为假。依赖于这种关系,我们建立不是肯定有冲突的约束聚类。给定的聚类理想地包含互相一致的约束。在实践中,约束求解过程520故意向下逼近冲突关系,从而给定的聚类有可能包含相互矛盾的约束。

向下逼近冲突关系的理由是潜在地获得最佳的解。支持的理由是:对于向下逼近的冲突关系,该群集包含相互一致的约束的最大集合的超集。因此,如果在聚类中的约束一致,那么相互一致的约束的最大集合就已被发现。在这种情况下,由约束求解器计算出的模拟解同时还避免了所有的坏约束,同时将每良好约束的功能最大化。我们的实验结果表明,在超过80%的情况中,本文所使用的技术的确能够收敛于完全优化的模拟实现。

在少数其他情况中,第二大聚类被尝试并且依此类推,直到我们获得次优的模拟数据。需要注意的是,未能获得任何解表明不管程序读取了私密资源的值如何,程序的执行都是不正常的(到达异常状态或者某种形式的错误处理)。我们在实践中还没有发现任何这样的情况。

作为约束系统的解所获得的具体值被确保至少避免了坏位置(即,异常出现和错误处理代码)。回到我们的示例,针对Tapjoy避免坏约束的解是将“1”作为设备识别符,而对于图4中的示例,我们将获取包含一个其名称为空字符串的位置提供者的列表。

第2.3节:代码重写处理530

已经收集约束并发现至少与必要约束相一致以避免坏位置的解的第三步和最后一步用于代码重写过程530以在原代码上强加模拟实现。这通过在字节代码重写级的应用级代码重写来实现。

代码重写处理530用另一语句替换源语句(即访问私密数据的语句),其中基于所述语句返回的实际值的类型分配模拟对象。例如,在Tapjoy示例的第3行处的telephonyManager.getDeviceId()调用(图2)被替换为“1”,而在图4的第2行处的LocationManager.getProviders(true)被包含字符串“”的(类型List<String>的)单列表代替。

第3部分:抽象语义

我们的系统的一个示例性目标是计算输入值:(1)不暴露任何依赖于输入的坏执行,以及(2)暴露尽可能多的良好程序点。要注意的是,本节详细描述了一个特定示例性实施例,但本文中的技术不限于这个特定实施例。

第3.1节:输入的抽象

在具体领域中,我们通过输入的标识符(Inp)和表示在执行期间可以变化的输入的时间戳(时间)来识别输入。虽然我们假设Inp是有限的,但是时间不是有限的,并且我们需要抽象时间戳,以便建立可计算的静态分析。特别地,对于变量输入(例如,Loc中的位置)我们的分析通过同一符号标识符抽象在相同程序点处生成的所有输入。因此,我们象征性地通过Inp×Lab对来表示输入。Lab代表程序点(或程序标签)的集合。通过这种方式,我们可以通过这些象征性标识符推断出约束的集合。如果我们发现解,那么我们用对应于解的具体值来替代输入值。

注意,在某些情况下,对应于给定程序点的输入值可以随时间变化(例如,onLocationChanged()回调)。另一方面,我们的系统计算出的模拟值在给定程序点的所有评估上保持相同。通过确保我们生产的值导致沿着良好路径的执行并且特别是远离任何坏路径,从而被保守地解决这个潜在的矛盾。我们指定的约束是全球性的——跨越在其中执行给定程序点的所有可能的程序状态——以实现这个保证。

在第1.3节中的运行示例中,考虑来自图4的运行示例,我们用R象征性地表示在第2行处读取的提供者的列表。

第3.2节:约束推断

示例性分析的目的在于推断出为了避免坏程序点或者执行良好程序点而足够强的约束。因此,假定程序p和程序点l,我们应用标准最弱前提演算以推断必须通过p的输入到达l从而被满足的约束c。由于最弱前提演算(参见在www.xprivacy.eu上的XPrivacy;P Coussot的“Constructive design of a hierarchy of semantics of a transition system by abstract interpretation”(由抽象解释的过渡系统的语义层次的建设性设计),理论计算机科学,277(1):47-103;和POPL'77会议记录,ACM,1977中P.Coussot与R.Cousot的“Abstract interpretation:a unified lattice model for static analysis of programs by construction or approximation of fix-points”(抽象解释:对于固定点的架构或逼近的程序静态分析的统一点阵模型))推断出为了达到l而足够的最弱约束,我们有:

其中,evalC是一个函数,假定在输入上的约束和输入评估,当且仅当给定的输入评估满足给定约束时返回“true”(真)。变量c是输入值上的布尔条件。InpEnv是包含程序的输入的所有可能评估的集合(例如,所有可能存在的IMEI)。S是具体的语义,给定程序和输入评估,则S返回执行跟踪。变量τ是这个执行跟踪。语句l∈τ意味着执行跟踪τ包含程序标签1,即,程序标签被执行。语句evalC(c,in)意味着当用in评估时布尔条件c为真。

我们的约束可以包含资源的字段和方法。在这里,我们强加了资源的方法返回常量、固定值的假设,而忽略了参数的值。需要注意的是,这不是不合理的假设,因为在我们的约束中的资源表示我们想要找到的模拟对象,而不是原始程序中的实际资源。然而,通过推断出不可满足的约束,我们的技术可能会在解存在的地方失败,也就是说,不能以避免坏行为的方式模拟的资源。

指向资源但是其值不是完全(当该值是API函数的参数时主要是)由模拟资源确定的表达式被普遍量化变量所替换。表达式不包含的资源并且它的值不被已知为常数值,表达式被存在性量化变量所替换。

不幸的是,最弱前提演算可能无法在循环和递归的存在下收敛,因为项数是潜在无限的。因此,我们界定了循环和递归调用的迭代次数。以这种方式,我们得到比c弱的约束c’。这意味着

通过结合等式1和2,我们得到:

对于良好程序点,我们对证明如下内容感兴趣:假定一个约束,我们揭露包含该良好程序点的执行。相反,对于坏程序点,我们对确保(如果被满足)坏程序点永远不被执行的约束感兴趣。

因此,假定程序p和程序点l,通过我们的最弱前提演算,我们得到满足避免坏位置的稳健要求的约束c,如下所述。

论点1。假定程序p与通过本文所呈现的技术计算出的用于到达坏位置l的约束c,则该约束的否定确保将永远不会到达l。

简述。如果我们否定来自等式3的c,获得那么我们得出以下涵义关系:

直观地说,此结果是由于这样的事实:由于条件的结合而到达坏程序点。如果这些条件的至少一个被否定,那么则避免了坏程序点。这令人愉快地意味着即使不是所有的用于到达坏程序点的条件都可以被精确地模拟(或甚至收集),如在等式2中的理想的情况下那样,我们也仍然可以保证坏程序点被避免。

除了上面断言的稳健性要求,我们在下面陈述了更强大的结果,在通往良好位置的路径免于循环和递归调用的假设下保证良好位置被访问。

论点2。假定程序p,输入访问语句和良好位置l,假设a和l的交叉(chop)(即来自a的前向切片和来自l的后向切片之间的相交)是免于循环和递归的。然后,如果本文中的技术能够生成模拟值,则该值保证在访问a的每一次运行上通过l来驱动执行。

简述。关于免于循环和免于递归的交叉(chop)的牢固保证遵循如下事实:沿着切片收集精确的约束直至被收集的约束数量的边界。这是为了保证终止,否则约束的数目可以无限制地生长。由于不存在循环和递归调用保证了将只收集有限数量的约束,所以没有精度损失。因此,通过本文中所呈现的技术的解是模仿所有必要约束以达到良好位置的模拟值。

返回到图4的运行示例,如果l==null或者如果l.get(0)==null,则第3行和第4行处隐含引发NullPointerException的坏位置可达。因为我们将在第2行处生成的提供者的列表表达为R,所以这些约束分别采用形式R≡null和l.get(0)==null。它们的否定分别导致R≠null和R.get(0)≠null。

关于良好位置,在第3行处的使用是不受约束的。下一个访问,l.size()==1由R.size()≠0来守卫(即,第一间断的否定评估)。类似地,l.get(0).equals(“被动”)由R.size()≠0∧R.size()≡1来守卫。最后,在第8行处的使用在else分支下被执行,并且因此,它由来守卫。

第3.3节:迭代约束求解

一个目的是将总是利用给定输入值来执行的良好程序点的数量最大化。因此,对于表示依赖于输入的程序点的每一标签l∈IDgood(p,id),我们推断出约束(通过针对依赖于输入的坏程序点而采用的相同的最弱前提演算)

正如在具体语义中所指出的,结合可能是未满足的,因为它潜在地包含矛盾的条款。我们的目标是到达尽可能多的位置,跟随着这一目标,我们试图找到对我们的约束系统中的变量的指派,以使得被满足,并且尽可能多的约束被满足。这对MAXSMT问题是可还原的,其中具有权重∞并且每个具有权重1。关于MAXSMT问题,参见Robert Nieuwenhuis和Albert Oliveras的“On SAT Modulo Theories and Optimization Problems”(SAT模理论和优化问题),A.biere和C.P.Gomes(主编):SAT 2006,LNCS 4121,第156–169页,2006,由Springer-Verlag Berlin Heidelberg印刷。

这个形式的问题可以通过尽管昂贵但简单的迭代算法来解决,它--在最坏的情况下—连同cb一起测试的每一个可能子集的满足性,并返回最大的可满足子集。然而,即使以有效的方式实现,该算法也极其昂贵。

我们的约束的特定结构允许我们导出一个——虽然近似——但快得多的算法。指导直觉是:往往良好约束之间的矛盾可以在句法层面被直截了当地检测。例如,假设程序

i

和良好位置g1,g2,我们得到约束c和这明显是矛盾的。

利用这个属性的示例性算法基于计算约束的冲突关系的句法向下逼近的想法:

我们在这里不给出的详细定义,因为它在能够很容易地被扩展或替换的约束的多个句法属性上被定义。使用我们定义了相应地聚类约束集合的算法,如在图6中所规定的那样。

论点3。让{ci}i∈I成为约束的整个集合上的按照图6中的算法的聚类。然后,如果求解器对于给定的聚类ci找到解,则该解是最佳的。

简述。是(句法)真实冲突关系的向下逼近。因此,每个聚类ci被保证包含相互一致的约束的最大集合。如果求解器发现对于给定聚类ci的解,那么我们保证在ci中的所有约束都彼此一致。因此,这意味着ci本身是相互一致的约束的最大集合,其中针对约束的最大集合的解是最佳解。

返回到运行示例,如第3.2节所述,我们将R≠null∧R.get(0)≠null推断为以及cg中的如下良好约束:

R.size()≠0;

R.size()≠0∧R.size()=1;

R.size()≠0∧R.size()≠1;和

第4节:示例性实施细节

图7总结了一个可能系统700的示例性实现细节。来自图5的约束推断过程510的处理步骤,约束求解过程520和代码重写处理530在图7上示出。这个示例包括预处理705和后处理790。系统700接收如下作为输入:(i)安卓应用710,例如,作为Dalvik字节码以及(ii)要被撤销的许可715。安卓应用710是来自图1的应用135的一个可能示例。许可例如可以是在规范155中的许可150中的一个(参照图1)。输出795是输入应用710的不需要输入许可的转换后版本。示例性系统700包括四块(例如,主要的)功能,我们接下来在下面描述。

第4.1节:预处理

假定编译的安卓应用710,我们借助dex2jar工具720将Dalvik字节码重新定向至JVM字节码。众所周知,Dalvik是谷歌安卓操作系统中的处理虚拟机,它执行针对安卓所编写的应用。程序通常用Java编写,并被编译成用于Java虚拟机的字节码,然后将其翻译成Dalvik字节码,并存储在“.dex”(Dalvik可执行文件)和“.odex”(优化的Dalvik可执行文件)文件中。在本示例中,经由dex2jar工具720 将Dalvik字节码转换成压缩的Java档案(JAR)。然后将所得的JAR文件725与安卓API 730的未实施版本(其是一种可能的API 198)一起装载到WALA中(参见图1)。用于分析(WALA)的T.J·Watson库提供用于Java字节码和相关语言的静态分析功能。安卓API 730包含应用开发人员可公开访问的但没有实施的所有方法。该JAR在安卓开发过程中被标准地使用。

从两个JAR文件725,730中,我们生成过程内控制流图,并且在这些流图上的全球调用图。然后,我们使用内置的WALA设备来计算指针分析并且生成过程间程序依赖图(参见S.Horwitz,T.Reps,和D Binkley的“Interprocedural slicing using dependence graphs”(使用依赖图过程间切片),在PLDI’88会议记录中的第35-46页,ACM(1988)),其用于切片。

许可715被用于PScout过程732,其产生许可/API映射733。图标716指示许可715对应于位置。在第19次有关计算机与通信安全的ACM会议的会议记录中(CCS2012)(2012年10月)的Kathy Wain Yee Au等人的“PScout:Analyzing the Android Permission Specification(PScout:分析安卓许可规范)”中描述了PScout。PScout是使用静态分析从安卓OS(操作系统)源代码中提取许可规范的工具。在这个示例中,PScout处理产生“App.getloc()要求位置”的许可/API映射733。

第4.2节:约束推断

本节涉及约束推断过程510的示例。依赖于PScout 732提供的许可/API映射733,我们识别要求给定许可的程序点的集合S(即,调用与PScout映射中的给定许可相关的方法的程序点)。

我们利用从S中的每个程序点开始的WALA来计算上下文敏感的前向薄切片(参见E.W.Dijkstra的“Guarded commands,nondeterminacy and formal derivation of programs”通信,ACM,18(8):453-457(1975))。从所得到的切片中,我们收集被标记为坏或良好的所有程序位置。

在这个示例性实施中,我们把下列所有情况认为是坏位置:(i)使用抛出指令直接地引发异常;或者(ii)对在某些情况下可能会抛出异常的安卓方法进行调用。另一方面,良好位置是那些利用资源的位置。虽然存在其他可以想到的启发式方法来量化依赖于资源的功能(例如,根据可达方法/语句的总数或者通过将指定的API标记为良好位置),但是来自“野生”的示例的人工审查已经显示出在实践中对资源的使用进行计数高效地工作。

每一个良好的和坏的位置用作后向分析的种子,所述后向分析计算必须由要求许可以达到的方法所返回的值来满足的约束的集合E。这主要是最弱前提演算的指派规则的有界应用,如上面在第3节中所描述的那样。后向分析是路径敏感的,并且被实现为IFDS(过程间有限分配子集)问题(参见第22届ACM SIGPLAN-SIGACT编程语言原理研讨会的会议记录中T.Reps等人的“Precise interprocedural dataflow analysis via graph reachability(通过图形可达性的精确过程间数据流分析)”),我们将其放至WALA IFDS求解器。

在本示例中,约束推断过程510操作在(“x=getLoc();println(x.getLat())”的)应用段740上,以确定“X!=null”的推断741。

第4.3节:约束求解

本节涉及约束求解过程520。然后,我们尝试迭代地求解约束系统。特别地,在示例性实施例中的解必须满足与坏位置对应的约束的否定(例如,我们必须确保没有由于模拟值而引发异常),并且进一步被偏置以将约束的满足度最大化从而到达良好位置(以便在不存在实际资源的情况下启用尽可能多的核心功能)。这个过程在第3.3节解释。

这些约束都被编码成SMT-LIB(满足性模理论库)形式,并被馈送至约束求解器中。具体来说,约束求解过程520使用Z3弦理论。参见CCS’12ACM会议(2012年)的会议记录中K.E.Y.Au等人的“PScout:Analyzing the android permission specification(PScout:分析安卓许可规范)”以及CCS’11,ACM(2011年)的会议记录中A.P.Felt 等人的“Android permissions demystified(安卓许可揭秘)”。Z3弦理论可以处理(i)数值约束,(ii)弦约束(弦相等,在弦长度以及谓词StartsWith和endsWith上的数值约束),和(iii)子类型约束(并且特别地,检查给定的对象是否是给定类型)。在本示例中,约束求解确定“X=MockLoc()”,这是提供模拟位置的方法。

第4.4节:后处理

本节描述了后处理790,其包括代码重写过程530。所描述的示例性解为我们提供了可以被用来替换要求许可的方法调用的值。因此,我们通过重写530(由WALA执行)来修改字节码,并且因此获得了新的JAR文件795。如图标796所指示的那样,确定位置的许可已被撤销。

为了简化模拟值的合成,重写过程530具有可用的工厂方法(由模拟对象工厂770示出)用于不同类型的私密值,所述私密值例如包括位置(例如,代表地理位置的数据类)和WifiInfo(例如,描述任何活动的或者处于正在建立的过程中的Wifi连接状态的类)。这些被封装为Java库,重写过程530将其注入到目标应用的类路径(classpath)中以从应用代码内启用工厂方法的使用。工厂方法针对求解器可以计算出的每个约束而暴露参数(例如,针对位置对象的经度或纬度字段设置特定值)。如果可能的话,工厂方法将相同类型的新实例作为源方法返回的原始对象输出。否则,如果原始类型不是可充分定制的,则子类型被用来确保类型约束被保留。

最后,插装的Java字节码被转换回Dalvik(再次使用jar2dex),然后被注入到原始APK(其可可以包括清单文件和其他文件)中。安卓应用包(APK)是用于分发和安装应用软件和中间件至谷歌安卓操作系统以及某些其他操作系统上的封装文件格式。然后,我们覆写APK清单文件,从被请求的许可列表中移除被撤销的许可。众所周知,清单文件向安卓系统给出了关于应用的基本信息。清单文件声明了为了访问API的受保护部分并与其他应用进行交互,应用必须具有哪些许可。最后,系统签署所得的APK以启用其安装和部署。输出是模拟应用780,它由图标796表示为对用户位置具有被撤销的许可。

转向图8,这个图表是在隐私实施中利用应用对具有私密数据的敏感系统资源的使用进行细粒度用户控制的过程。图8进一步说明了示例性方法的操作,包含在计算机可读存储器上的计算机程序指令的执行的结果,由硬件实现的逻辑所执行的功能、和/或用于根据示例性实施例执行功能的互连装置。图8被假定是例如在至少部分地由用户隐私实施过程125的控制下通过计算系统100执行。

在框810中,计算系统100执行访问针对应用要被撤销许可的操作。许可涉及经由操作系统的应用编程接口访问用户私密数据。在框820中,计算系统100执行在应用中确定涉及经由应用编程接口访问用户私密数据的一个或多个程序点的操作。在框830中,针对一个或多个程序点中的每个选定程序点,计算系统100执行应用中的代码重写以利用另一语句替换在所选定的程序点处的访问所述私密数据的源语句,该另一语句基于所述源语句返回的实际值的类型分配模拟对象或值。所述模拟对象或值没有暴露用户的私密数据。即,使用访问用户私密数据的许可的对象140(或对象的方法)的调用可以用模拟调用或相应的值(其返回不暴露用户私密数据的数据)来替换。在框840中,计算系统100执行:将具有重写代码的应用封装为能够被用户随后执行的输出应用。在块850,计算系统100执行输出具有所述重写代码的应用以供用户使用的操作。

在另一个示例性实施例中,公开了一种设备,其包括用于访问针对应用将被撤销的许可的装置,其中,所述许可涉及经由操作系统的应用编程接口对用户私密数据的访问。此装置可以由控制计算系统100以执行该装置的电路115和/或一个或多个处理器110来执行。该装置可以是如上所述的算法,例如,参考第2-4节。用于访问的装置还可以包括存储器控制器,其读取存储器/多个存储器145,经由有线和/或无线接口、GUI等接收许可的NW I/F 180。该设备包括用于在所述应用中确定涉及经由所述应用编程接口对用户私密数据进行访问的一个或多个程序点的装置。此装置的功能可以由控制计算系统100以执行该装置的电路115和/或一个或多个处理器110来执行。该装置可以涉及如上所述的算法,例如,参考第2-4节。

该设备包括用于执行如下的装置:响应于所述一个或多个程序点的每个选定程序点,重写所述应用中的代码以便利用另一语句来替换在所选择的程序点处访问所述私密数据的源语句,该另一语句基于所述源语句返回的实际值的类型分配模拟对象或值,其中所述模拟对象或值没有暴露所述用户私密数据。此装置的功能可以由一个或多个处理器110和/或电路115控制计算系统100来执行的装置来执行。该装置可以涉及如上所述的算法,例如,参考第2-4节。该设备包括用于将具有重写代码的所述应用封装为能够被用户随后执行的输出应用的装置。此装置的功能可以由控制计算系统100以执行该装置的电路115和/或一个或多个处理器110来执行。该装置可以涉及如上所述的算法,例如,参考第2-4节。该设备可以包括用于输出具有所述重写代码的应用以供用户使用的装置,例如由存储器控制器输出至一个或多个存储器145中,由NW I/F 180输出等等。

正如本领域技术人员将理解的那样,本发明的各个方面可以实现为系统、方法或计算机程序产品。因此,本发明的各个方面可以采取以下形式,即:完全的硬件实施方式、完全的软件实施方式(包括固件、驻留软件、微代码等),或硬件和软件方面结合的实施方式,这里可以全都统称为“电路”、“模块”或“系统”。此外,本发明的各个方面还可以采用在一个或多个计算机可读介质中的计算机程序产品的形式,该计算机可读介质中包含计算机可读程序代码。

可以使用一个或多个计算机可读介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或设备,或者任意以上的组合。计算机可读存储介质的更具体示例(非穷举的列表)包括以下:具有一个或多个导线的电连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储设备、磁存储设备、或者上述的任意合适的组合。在本文档的上下文中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。

计算机可读信号介质可以包括其中承载了计算机可读程序代码的在基带中或者作为载波一部分传播的数据信号。这种传播的信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者设备使用或者与其结合使用的程序。

计算机可读介质上包含的程序代码可以用任何适当的介质来传输,包括但不限于无线、有线、光缆、射频(RF)等等,或者上述的任意合适的组合。

可以以一个或多个编程语言的任意组合来编写用于执行本公开内容各个方面的操作的计算机程序代码,所述编程语言包括诸如Java、Smalltalk、C++等等之类的面向对象编程语言,以及诸如“C”编程语言或类似的编程语言之类的传统过程式编程语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全地在远程计算机或服务器上执行。在后一种情形中,远程计算机可以通过任意种类的网络(包括局域网(LAN)或广域网(WAN))连接到用户计算机,或者,可以连接到外部计算机(例如利用互联网服务提供商来通过互联网连接)。

将参照根据本公开内容实施例的方法、装置(系统)和计算机程序产品的流程图图示和/或框图描述本发明的各个方面。应当理解,流程图图示和/或框图的每个方框以及流程图图示和/或框图中各方框的组合,都可以由计算机程序指令实现。这些计算机程序指令可以被提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些计算机程序指令在经由计算机或其它可编程数据处理装置的处理器执行时,产生用于实现流程图和/或框图的一个或多个方框中规定的功能/动作的装置。

也可以把这些计算机程序指令存储在计算机可读介质中,这些指令能够引导计算机、其它可编程数据处理装置、或其他设备以特定方式工作,从而存储在计算机可读介质中的指令产生出包括实现流程图和/或框图的一个或多个方框中规定的功能/动作的指令的制品。

计算机程序指令还可以被加载到计算机、其它可编程数据处理装置或者其它设备上,以使得一系列操作步骤在计算机、其它可编程装置或者其它设备上被执行,从而产生一种计算机实现的过程,使得在所述计算机或者其它可编程装置上执行的指令提供用于实现在流程图和/或框图的一个或多个方框中规定的功能/动作的过程。

在此使用的术语仅仅是为了描述特定实施例的目的而不意欲限制本发明。正如在此所使用的,除非上下文明确指出,否则单数形式“一”、“一个”意指也包括复数形式。还应当理解,术语“包括”和/或“包含”,在本说明书中使用时,规定了所叙述的特征、整数、步骤、操作、元件、组件和/或群组的存在,但是不排除一个或多个其他特征、整数、步骤、操作、元件、组件和/或其群组的存在或附加。

以下权利要求中所有装置或步骤加功能元素的对应结构、材料、动作及等价物都意欲包括用于结合具体所述的其它所述元素执行所述功能的任何结构、材料或动作。已经为了说明和描述的目的呈现了本发明的描述,但其不意欲详尽本发明或者将本发明限定到所公开的形式。在不背离本发明的范围与精神的情况下,许多修改和变型对本领域普通技术人员而言都将是显而易见的。选择并且描述这些实施例,以便最好地解释本发明的原理和实际应用,并且使得本领域的其它普通技术人员能够理解本发明的各种实施例带有适合于构想的特定用途的各种修改。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1