麻省理工学院的课程“计算机系统安全”。 第21课:数据跟踪,第1部分

麻省理工学院。 讲座课程#6.858。 “计算机系统的安全性。” Nikolai Zeldovich,James Mickens。 2014年


计算机系统安全是一门有关开发和实施安全计算机系统的课程。 讲座涵盖了威胁模型,危害安全性的攻击以及基于最新科学研究的安全技术。 主题包括操作系统(OS)安全性,功能,信息流管理,语言安全性,网络协议,硬件安全性和Web应用程序安全性。

第1课:“简介:威胁模型” 第1 部分 / 第2 部分 / 第3部分
第2课:“控制黑客攻击”, 第1 部分 / 第2 部分 / 第3部分
第3讲:“缓冲区溢出:漏洞利用和保护” 第1 部分 / 第2 部分 / 第3部分
讲座4:“特权分离”, 第1 部分 / 第2 部分 / 第3部分
讲座5:“安全系统从何而来?” 第1 部分 / 第2部分
讲座6:“机会” 第1 部分 / 第2 部分 / 第3部分
讲座7:“本地客户端沙箱” 第1 部分 / 第2 部分 / 第3部分
讲座8:“网络安全模型” 第1 部分 / 第2 部分 / 第3部分
讲座9:“ Web应用程序安全性” 第1 部分 / 第2 部分 / 第3部分
讲座10:“符号执行” 第1 部分 / 第2 部分 / 第3部分
第11课:“ Ur / Web编程语言” 第1 部分 / 第2 部分 / 第3部分
讲座12:网络安全性第1 部分 / 第2 部分 / 第3部分
讲座13:“网络协议” 第1 部分 / 第2 部分 / 第3部分
第14课:“ SSL和HTTPS” 第1 部分 / 第2 部分 / 第3部分
第15课:“医疗软件” 第1 部分 / 第2 部分 / 第3部分
第16课:“侧面通道攻击” 第1 部分 / 第2 部分 / 第3部分
讲座17:“用户身份验证” 第1 部分 / 第2 部分 / 第3部分
第18课:“私人浏览Internet” 第1 部分 / 第2 部分 / 第3部分
讲座19:“匿名网络” 第1 部分 / 第2 部分 / 第3部分
讲座20:“手机安全性” 第1 部分 / 第2 部分 / 第3部分
第21课:“跟踪数据” 第1 部分 / 第2 部分 / 第3部分

James Mickens:太好了,让我们开始吧。 感谢您在感恩节这一特殊的日子参加讲座。 伙计们,我很高兴您致力于计算机安全,并且我相信您会在劳动力市场中受到需求。 随时将我作为推荐来源。 今天,我们将讨论Taint-tracking感染跟踪,特别是有关一个名为TaintDroid的系统,该系统在Android智能手机的背景下提供这种类型的信息流分析。



讲座中提出的主要问题是应用程序可以检索数据的事实。 想法是您的电话包含许多机密信息-联系人列表,您的电话号码,电子邮件地址等等。 如果操作系统和电话本身不小心,则恶意应用程序可能能够提取其中一些信息并将其发送回其家庭服务器,并且服务器将能够将该信息用于所有不幸的事情,我们将在后面讨论。

在全球范围内,有关TaintDroid的文章提供了这样的解决方案:在机密数据通过系统时对其进行监视,并在将其通过网络传输之前将其停止。 换句话说,我们必须防止将数据作为参数传递给网络系统调用的可能性。 显然,如果我们能够做到这一点,那么我们基本上可以在泄漏开始发生时立即停止泄漏。

您可能想知道为什么传统的Android权限不足以阻止提取此类数据。 原因是这些权限没有正确的语法来描述我们试图阻止的攻击类型。 Android权限通常处理应用程序权限,以便从特定设备写入或读取内容。 但是现在我们正在讨论什么是不同的语义级别。 即使授予了应用程序读取信息或将数据写入网络等设备的权限,允许该应用程序将某些机密数据读取或写入其有权与之交互的设备也是危险的。

换句话说,使用传统的Android安全策略,很难谈论特定的数据类型。 谈论应用程序是否正在访问设备要容易得多。 也许我们可以使用其他解决方案来解决此问题,我将使用星号来指定它。



此替代解决方案是永远不要安装可以读取敏感数据和/或访问网络的应用程序。 乍看起来,问题似乎已经解决。 因为如果应用程序无法同时完成这两项操作,则它将无法访问敏感数据,或者将能够读取敏感数据,但将无法通过网络发送数据。 你觉得有什么收获?

每个人都已经在考虑节日火鸡了,我在您的眼中看到了它。 好吧,这是一个不好的主意的主要原因是此措施可能破坏许多合法应用程序的工作。 毕竟,有许多程序,例如邮件客户端,实际上应该能够读取一些敏感数据并通过网络发送它们。

如果我们只是说要阻止这种活动,我们实际上将禁止用户可能不喜欢的电话上许多应用程序的工作。
这里还有另一个问题-即使我们实施了此解决方案,也无法防止通过一系列不同的第三方渠道机制造成的数据泄漏。 例如,在过去的讲座中,我们认为例如浏览器缓存可能会导致有关访问特定站点的用户的信息泄漏。 因此,即使实施了这样的安全策略,我们也将无法控制所有第三方渠道。 稍后,我们将讨论第三方渠道。

当两个应用程序可以一起工作以破坏安全系统时,提出的解决方案将不会阻止应用程序的合谋。 例如,如果一个应用程序没有网络访问权限,但可以与拥有该应用程序的第二个应用程序通信,该怎么办? 毕竟,第一个应用程序可以使用IPC Android机制将机密数据传输到具有网络权限的应用程序,而第二个应用程序可以将此信息上载到服务器。 但是即使这些应用程序没有共谋,当一个应用程序可以迫使其他应用程序不小心泄露敏感数据时,也可能会有一些窍门。



电子邮件程序中可能存在某种缺陷,原因是该缺陷会从系统的其他组件接收太多随机消息。 然后,我们可以为意图设计一个特殊的意图来欺骗电子邮件程序,这将迫使Gmail应用程序通过电话以外的电子邮件发送重要的东西。 因此,这种替代解决方案效果不佳。

因此,我们非常担心机密数据将离开电话。 考虑一下,实际上,Android的恶意应用程序会做什么。 在现实世界中,是否存在可以通过跟踪污染追踪感染来预防的攻击? 答案是肯定的。 恶意程序正成为手机日益严重的问题。 恶意应用程序可以做的第一件事是使用您的位置或IMEI来宣传或施加服务。

恶意软件可以确定您的实际位置。 例如,您距离MIT校园不远,所以您是一个饥饿的学生,那么为什么不访问我的轮式小餐馆呢?

IMEI是代表手机唯一标识符的整数。 它可用于在不同地方进行跟踪,尤其是在您不想“点亮”的地方。 因此,从本质上讲,存在可以执行此类操作的恶意程序。

恶意软件所做的第二件事是窃取您的个人数据。 他们可能会尝试窃取您的电话号码或联系人列表,然后尝试将这些内容上传到远程服务器。 例如,在随后将用于发送垃圾邮件的邮件中冒充您可能是必要的。

至少对于我来说,恶意软件可能做的最糟糕的事情就是将您的手机变成机器人。



当然,这是我们父母不必面对的问题。 现代电话功能强大,可以用来发送垃圾邮件。 有许多针对某些公司环境的恶意程序正是这样做的。 进入手机后,他们开始将其用作垃圾邮件网络的一部分。

学生:是专门针对入侵Android操作系统的恶意软件,还是仅仅是典型的应用程序? 如果这是典型的应用程序,那么也许我们可以通过权限保护它?

教授:这是一个很好的问题。 两种类型的恶意软件。 事实证明,让用户单击不同的按钮非常容易。 我将举一个例子,它关注的不是恶意软件,而是人们的粗心行为。
有一个流行的游戏《愤怒的小鸟》,您可以在App Store上的应用程序搜索栏中查找它。 在搜索结果的第一行中,您将获得原始的《愤怒的小鸟》游戏,第二行可能包含《愤怒的小鸟》应用程序,最后有两个s。 许多人会更喜欢下载第二个应用程序,因为它的价格可能低于原始版本。 此外,在安装过程中,该应用程序会写到,安装后您将允许它这样做,并且您会说:“当然,没问题!”因为您只得到了几分钱就收到了“愤怒的小鸟”。 在“繁荣”之后-您陷入了黑客的陷阱!

但是,如果您假设Android安全模型正确无误,那么您绝对是对的,那么恶意软件的安装将完全取决于提供其访问网络权限的用户的愚蠢或天真,例如,当您的游戏“井字游戏”不应该访问网络。

因此,您可以将手机变成机器人。 这有很多原因,这很糟糕,不仅因为您的手机发送垃圾邮件,而且还因为您可能要为从手机发送的所有这些信件的数据付费。 此外,由于您的电话一直在忙于发送垃圾邮件,因此电池很快就会用完。

有些应用程序会使用您的个人信息造成伤害。 这个漫游器特别糟糕的是,它实际上可以查看您的联系人列表,并以您的名义将垃圾邮件发送给认识您的人。 而且,他们点击该信件中恶意内容的可能性增加了很多倍。



因此,阻止提取信息是一件好事,但并不能阻止黑客入侵的可能性。 首先,我们应该注意一些机制,因为它们会阻止教育攻击者通过向用户宣传他们可以单击和不应以任何方式单击的内容来捕获您的智能手机。

因此,仅凭污点追踪还不足以防止威胁您使用手机的情况。

让我们看看TaintDroid的工作原理。 正如我提到的,TaintDroid将跟踪您在系统中传播的所有敏感信息。 因此,TaintDroid区分了所谓的“信息源”信息源和“信息库”信息池。 信息来源会生成敏感数据。 通常这些是传感器-GPS,加速度计等。 它可以是您的联系人列表,IMEI,可以将您(特定用户)与您的真实电话联系起来的所有内容。 这些设备会生成感染信息,称为感染数据源-污染源。

在这种情况下,信息接收器是受感染的数据不应泄漏的地方。 对于TaintDroid,主要吸收器是网络。 稍后我们将讨论一个事实,您可以想象更多的地方发生信息泄漏,但是网络在TaintDroid中占有特殊的位置。 在比电话更通用的系统中可能还存在其他信息接收器,但TaintDroid旨在防止网络泄漏。

TaintDroid使用32位位向量表示Taint感染。 这意味着您最多只能有32个单独的感染源。



因此,如果每个机密信息被任何特定的感染源感染,则其单位将位于特定位置。 例如,它是从GPS数据,联系人列表中的某物等等获得的。

有趣的是,实际上32种感染源并不多。 问题是此数字对于该特定系统是否足够大,对于遭受信息泄漏的一般系统是否足够大。 在TaintDroid的特殊情况下,32种感染源是合理的数量,因为此问题涉及有限的信息流。

考虑到手机中存在的所有传感器,机密数据库等,在存储这些感染标志方面,32似乎是正确的数量。 正如我们从该系统的实现中看到的那样,32实际上是一个非常方便的数字,因为它对应于32位,您可以使用它有效地构造这些标志的整数。

但是,正如我们稍后讨论的那样,如果要使程序员能够控制信息泄漏,即指定他们自己的感染源和他们自己的泄漏类型,则32位可能还不够。 在这种情况下,请考虑添加更复杂的运行时支持以指示更多空间。

粗略地说,当您查看感染如何在系统中传播时,通常从右到左发生。 我将举一个简单的例子。 例如,如果您有某种运算符,则声明一个等于您所在位置的纬度值的整数变量:Int lat = gps.getLat(),那么本质上位于等号右边的东西会生成一个具有某种边界的值她的感染。



因此,将设置一个特定的标志,该标志表示:“嘿,我返回的该值来自机密来源”! 因此,感染将从右侧的这里来,再到左侧的这里,来感染这部分经血。 这就是编写源代码的开发人员眼中的样子。 但是,Dalvik虚拟机使用这种小写的寄存器格式来创建程序,这实际上是在现实中实现污点语义的方式。

在其中一篇讲座文章的表中,有大量命令,其中描述了感染如何影响这些类型的命令。 例如,您可以想象您有一个指向目标dst和源srs的移动操作。 在Dalvik虚拟机中的抽象计算引擎上,可以将其视为寄存器。 就像我说的,感染从右侧传播到左侧,因此在这种情况下,当Dalvik解释器从右侧执行指令时,它会考虑aurse参数的污点标签并将其分配给dst参数。

假设我们还有另一条二进制二进制操作形式的指令,它执行类似加法的操作。 我们有一个目标dst和两个源:srs0和srs1。 在这种情况下,当Dalvik解释器处理此指令时,它会从两个来源获取污点,将它们合并,然后将此联合指定给目标dst。



这很简单。 该表显示了您将看到的各种类型的指令,但大致来说,这些是在系统中传播感染的最常见方法。 让我们看一下本文中提到的一些特别有趣的情况。 这样的一种特殊情况是数组。

假设您有一个char c命令,它为C分配了一个值。同时,程序声明了一些char upper []数组,其中将包含大写字母“ A”,“ B”,“ C”:char upper [] = [“ A “,” B“,” C“]

代码中很常见的一件事就是直接使用C索引到这样的数组中,因为众所周知,Kernigan和Ritchie知道大多数字符是整数。 因此,您可以想象有一些char upperC代码表示这些字符“ A”,“ B”,“ C”的大写版本对应于此表中的特定索引:char upperC = upper [C]



这就提出了一个问题,在这种情况下,什么感染应该感染上皮。 在以前的情况下,似乎一切对我们来说都很简单,但在这种情况下,我们有很多事情要做。 我们有一个数组[“ A”,“ B”,“ C”],它可以具有某种感染类型,而我们的符号C也可以具有自己的感染类型。 Dalvik , binary-op. upperC [C] .

, upperC - upper [ ]. - [C]. , , upperC , .

: , taint move op binary op?

: move op. , srs… -, . , , , , , taint. , , .
, srs , , . srs : « , 2 , srs». .

– , taint. , srs0 srs1, taint, :

\

dst :

\

, , 32- , , . , . taints, , .
, , , binary-op. upperC [C] [«», «», «»]. TaintDroid , taint . , . , 32- , «» , .

, taint. — , , ? , taint , , . , , , , . - , .

, . , , - , , . , , – , , . .

, – , , Native methods, - . Native- . , Dalvik , system.arraycopy(), - , C C++. Native method, .

- JNI. JNI, Java Native Interface — C C++ Java. , Java , Java. x86, ARM , .

- taint , Dalvik. Java-, C C++ . , Native-, TaintDroid , Java.

\

, « », , taint. , – . - , . , Dalvik , system.arraycopy(), , taint. arraycopy() : « , , , , ».

? , , . , , Dalvik , , , .

- JNI , . , , , C C++, .

, , . , - , , , . .

26:25

麻省理工学院的课程“计算机系统安全”。 21: « », 2


.

感谢您与我们在一起。 你喜欢我们的文章吗? 想看更多有趣的资料吗? 通过下订单或将其推荐给您的朋友来支持我们,为我们为您开发的入门级​​服务器的独特模拟,为Habr用户提供30%的折扣: 关于VPS(KVM)E5-2650 v4(6核)的全部真相10GB DDR4 240GB SSD 1Gbps从$ 20还是如何划分服务器? (RAID1和RAID10提供选件,最多24个内核和最大40GB DDR4)。

VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps , .

戴尔R730xd便宜2倍?在荷兰和美国,我们有2台Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100电视(249美元起) 阅读有关如何构建基础架构大厦的信息。 使用价格为9000欧元的Dell R730xd E5-2650 v4服务器的上等课程?

Source: https://habr.com/ru/post/zh-CN433376/


All Articles