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

麻省理工学院。 讲座课程#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部分

学生:为什么根本无法扫描代码而不手动检查代码?

教授:实际上是这样。 开发人员知道,每当解释器执行此类工作时,在返回返回值时,都会使用特殊代码将受感染的值自动分配给应与之关联的system.arraycopy()操作。

学生:对,但是手册的手工部分又是什么?

教授:手册部分主要是找出审计执行政策应该是什么。 换句话说,如果您只看标准的TaintDroid或标准的Android,它们将为您做些事情,但是他们将无法以正确的方式自动分配Taint。 因此,必须手动分配跟踪策略。



实际上,这似乎不是一个大问题。 但是,如果使用面向机器的方法的应用程序的数量稳步增加,那么我们可能会遇到小问题。

IPC消息是在分配感染方面要担心的另一种数据。 IPC消息本质上被视为数组。 因此,这些消息中的每一个都将与一个单一的异味相关联,这是其所有组成部分的感染的并集。

这有助于提高系统性能,因为我们仅需要为每个消息存储一个污点标签。 在极端情况下,仅会重新评估感染的程度,但绝不会导致安全性下降。 同时可能发生的最糟糕的事情是,网络将无法获得可以到达那里的数据,而不会对隐私造成任何危险的后果。

因此,当您创建IPC消息时,它会收到合并的污点。 当您阅读此消息中收到的内容时,提取的数据将从消息本身中被感染,这很有意义。 这就是处理IPC消息的方式。

还值得担心文件的处理方式。 因此,每个文件接收一个污点标签,并且该标签与文件一起以其元数据存储在稳定的存储介质(例如SD存储卡)上。 在这里,与以前的病例一样,发生了相同的保守感染方法。 主要思想是该应用程序可以访问某些敏感数据(例如GPS位置),并且可能会将这些数据写入文件,因此TaintDroid使用GPS标志更新该文件的taint标签,然后应用程序关闭。 以后,可能会包含其他一些读取此文件的应用程序。



当他进入虚拟机并进入应用程序时,TaintDroid会看到他具有此标志,因此在读取此文件时提取的所有数据也将具有此GPS标志。 我认为这很简单。

那么,从Java角度来看,我们可以感染什么? 基本上,有五种需要污点标志的Java对象。 首先,这些是局部变量方法中使用的局部变量。 回到前面的示例,我们可以假定char c是这样的变量。

因此,我们必须为这些元素分配标志。 第二种类型是Method arguments方法的参数;它们还必须具有感染标志。 这两件事都存在于堆栈中,因此TaintDroid必须跟踪标志的用途,并且还要跟踪这些类型的对象的用途。
我们还需要为对象实例字段的实例字段分配标志。 想象有一个特定的物体C,它是一个圆,我想知道它的半径。 因此,我们具有c.radius字段,并且必须将以下每个字段的感染信息关联:和和radius。
Java对象的第四种类型是静态类字段的静态类字段,它也需要污点信息。 它可以是circle.property之类的东西,即对圆的属性的描述,为此我们将一些信息分配给污点。

第五个类型是Arrays数组,我们前面已经谈到过,我们为整个数组分配了一条公共的感染信息。

为这些类型的Java对象实现污点标志的基本思想是尝试在变量本身旁边存储变量的污点标志。



假设我们有一些整数变量,并且我们想用它来放置某种异味污染。 我们希望尝试将此状态保持在尽可能接近变量的位置,这可能是出于确保在处理器级别进行高效缓存操作的原因。 如果我们将taint远离此变量,则可能会导致问题,因为在解释器查看此实际Java变量的内存值之后,它将希望尽快了解有关其感染的信息。

如果我们看一下移动操作,则会发现在代码dst和src中的这些位置,当解释器考虑这些值时,它还会考虑相应的异味感染。

因此,将这些内容尽可能地靠近放置,您将尝试确保更有效地使用缓存。 这很简单。 如果查看开发人员为堆栈上存在的方法和局部变量的参数所做的工作,则可以看到它们本质上突出显示了变量所在位置旁边的污点标志。

假设我们对我们的讲座有最喜欢的东西,一个堆栈图,您可能很快就会讨厌它经常被提及。 让本地变量0位于我们的堆栈中,然后TaintDroid将在内存中存储一​​个有关此变量感染的标签。 如果接下来有另一个变量,则其标签也将直接位于其下方,依此类推。 这很简单。 所有这些东西都将位于同一高速缓存行中,这将使访问内存的成本降低。



学生:我想知道如何为整个数组设置一个标志,为对象的每个属性设置不同的标志。 如果对象的一种方法可以访问存储在其属性中的数据怎么办? 那就是...你知道我的意思吗?

教授:您是否在问实行这种政策的原因?

学生:是的,关于使用这种政策的原因。

教授:我认为这样做是为了确保实施的有效性。 可能还有其他规则-例如,它们不报告数据数组的长度,因为可能发生信息泄漏,因此它们不会将感染扩展到该指标。 因此,我认为某些决定仅仅是出于效率的考虑。 原则上,在访问数组的每个元素以指示左侧的事物仅从任何特定元素接收污点时,没有什么会阻碍。

但是,尚不清楚这是否正确,因为,显然,如果将某些东西放入数组中,则该东西应该对该数组有所了解。 因此,我认为开发人员会同时使用这两种策略。 过于保守,您不应该允许您要保护的数据泄漏,但是同时,为了访问该阵列,您必须了解一些信息。 当您需要学习某些东西时,通常意味着您会使用异味。

因此,这是他们用来将所有这些信息彼此相邻存储的基本方案。 可以想象,对于类字段和对象字段也是如此。 在声明一个类时,您有一个用于特定变量的插槽存储器,该插槽旁边就是该变量的污点信息。 因此,我认为所有这些都非常合理。

这就是TaintDroid的原理。 在系统初始化或在系统运行期间的其他时间,TaintDroid会查看所有可能感染信息的来源,并为所有这些事物分配一个标志-GPS传感器,照相机等。 在程序运行时,它将从这些来源中提取机密信息,然后解释器将根据文章中提供的表格考虑所有类型的功能,以了解如何在整个系统中传播异味感染。

当数据试图渗透到系统中时,最有趣的事情发生了。 TaintDroid可以控制网络接口并查看尝试通过它们的所有内容。 他在寻找污点标签,如果试图渗透到网络中的数据具有这些标记中的一个或多个,则将禁止它们使用网络。 此刻实际发生的情况实际上取决于应用程序。



例如,TaintDroid可以向用户显示警告,指出有人试图将有关其位置的数据发送到侧面。 TaintDroid可能包含允许应用程序访问网络的内置策略,但同时重置了它将尝试传输的所有敏感数据,依此类推。 在本文中,由于作者主要关注的是数据“泄漏”到网络中的问题,因此未对这种机制进行足够详细的描述。

文章的标题为“评估”的一节讨论了在研究系统运行过程中发现的一些问题。 因此,本文的作者发现Android应用程序将尝试以用户不可见的方式提取数据。 假设他们将尝试使用您的位置做广告,将您的电话号码发送到远程服务器,依此类推。 重要的是要注意,这些应用程序通常不会从用户必须允许他们访问网络或允许他们使用联系人列表的意义上“破坏” Android安全模型。 但是,这些应用程序在EULA许可协议中未提供它们打算向某个Silk Road 8服务器或类似服务器发送电话号码的信息。 实际上,这是对应用程序真实意图的一种欺诈和误导性用户,因为如果他们看到了这些EULA要求并且知道自己所苦的是什么,他们可能会考虑是否在智能手机上安装这样的应用程序。

学生:可以假设即使将这些要求放入许可协议中也不会起作用,因为人们通常不阅读EULA。

教授:这是一个非常合理的假设,因为即使计算机科学家也并不总是检查许可协议。 但是,在EULA中这种诚实仍将是有益的,因为确实有人真正阅读了许可协议。 但是,假设用户不会阅读一堆以小字体写的页面是绝对正确的,他们只是单击“同意”并安装该应用程序。

因此,我认为,通过系统传递信息的规则非常简单,正如我们已经说过的,异味只是从右侧移动到左侧。 但是,有时这些信息流移动规则可能会产生一些矛盾的结果。
想象一个应用程序实现了自己的链表类。 我们有一个名为ListNode的简单类,它将有一个用于Object数据的object字段和一个ListNode下一个代表下一个列表的对象。

假设应用程序将受感染的数据分配给“对象数据”字段-从GPS传感器或其他设备接收到的机密信息。 问题是,当我们计算此列表的长度时,是否应将其感染? 您会惊讶于该问题答案的答案是“否”,这可以通过TaintDroid和其中一些系统如何确定信息流来解释。 让我们看看将节点添加到链表的含义。

添加节点包括3个步骤。 因此,您要做的第一件事是选择一个包含要添加数据的新列表节点-Alloc ListNode。 第二步是将数据字段分配给该新节点。 第三件事是对ListNode使用某种补丁,然后将节点合并到列表中-这是“下一个” ptr指针。



有趣的是,第三步根本与数据字段无关,它仅考虑下一个值。 一旦对象数据被感染,我们就开始计算列表的长度,从某个头节点开始,遍历所有“下一个” ptr指针,然后仅计算已通过的指针数。 因此,计数算法不会接触受感染的数据。

有趣的是,如果您有一个链接列表,其中填充了受感染的数据,然后计算其长度,则不会导致产生受感染的值。 这似乎有点不合逻辑,尽管在考虑数组时,我们已经说过数组的长度也不包含污点。 有同样的原因。 在讲座结束之前,我们将讨论如何使用一种语言,该语言可以让您作为程序员来确定自己的感染类型,然后针对这种情况制定自己的策略。
TaintDroid的一个优点是,作为开发人员,您不必标记任何东西,TaintDroid会为您完成。 他指出了所有可能成为信息源的机密事物,以及所有可能成为信息“漏水”的事物,因此,作为开发人员,您准备工作。 但是,如果要控制节点的添加,则可能必须自己创建一些策略。
TaintDroid如何影响系统性能? 现有的开销实际上似乎很合理。 内存开销是存储所有感染标签。 处理器负载将主要包括这些感染的目的地,分布和验证,并且应该注意,使用Dalvik虚拟机是一项附加工作。 因此,查看源代码并查看此32位感染信息,我们将执行已经考虑过的操作。 这是计算开销。

这些开销看起来相当适中。 根据文章的作者,存储异味标签需要3%到5%的额外内存,因此这还不错。 处理器负载略高,可以达到计算能力的3%到29%。 这是由于以下事实:每次执行循环时,解释器都需要查看这些标记并执行相应的操作。 尽管这些只是按位操作,但它们需要始终执行。 即使负载为29%,这也不错,因为硅谷的开发人员一直在谈论现代手机需要四核处理器的事实。 唯一的问题可能出在电池上,因为即使您有附加的处理器核心,也不太可能希望口袋里有一个热手机,当尝试计算这些东西时,它会开始“爆炸”。 但是,如果您的电池不受此类计算的影响特别大,那么一切都还不错。



因此,这是TaintDroid的工作概述。 有问题吗?

学生:您是否只标记所有时间? 还是每个变量都被标记了?

教授:一切都已标记,因此从理论上讲,没有什么可以阻止您为根本没有感染的事物提供有关感染的任何信息。 我认为,一旦某事物至少受到一点污染,就需要构建诸如动态变更布局之类的东西。 - , , . taint, , , - , , . , , - . TaintDroid . Dalvik.

– taint x86 ARM? , , , , , , Java . ?

, , , . , , , , , Java- - . x86, , , , , , .
, taint , , , . .



, x86 — . . , - x86, . , , , P, , , !

, taint x86. , , , AD, , .
-, , . -, , . , , , .

, . , . , , , . , « » Taint Explosion.
, , . , Dungeons and Dragons, .

, , - - . , , , .
, - esp esb. , .



, x86, , esp. , , . , , , ebp, , , . , , , taint .

, Linux . , . , - .

: ? , .

: . x86, , . , . Bochs – IBM PC, 86. TaintBochs, x86 . x86, , . , . , , , , , , - .

54:10

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


该课程的完整版本可在此处获得

感谢您与我们在一起。 你喜欢我们的文章吗? 想看更多有趣的资料吗? 通过下订单或将其推荐给您的朋友来支持我们,为我们为您开发的入门级​​服务器的独特模拟,为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核)10GB DDR4 240GB SSD 1Gbps至1月,直到 6个月的付款期免费,您可以在此处订购

戴尔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-CN433378/


All Articles