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

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

学生:那么,架构支持是理想的解决方案?

教授:是的,也有一些方法。 但是,这有点复杂,因为如您所见,我们在变量本身旁边突出显示了异味状态。 因此,如果您考虑设备本身提供的支持,则更改硬件布局可能会非常困难,因为这里的所有东西都被烘焙成硅。 但是,如果可以在Dalvic虚拟机中实现较高级别,则可以想象,可以将变量及其感染并排放置在硬件级别。 因此,如果您更改硅片的布局,则可能可以完成此工作。



学生: TaintDroid对基于git分支权限,分支权限建立的信息有什么作用?

教授:我们将在一秒钟之内回到这个问题,所以只要坚持这个想法,直到我们理解它。

学生:我想知道缓冲区是否会在这里发生,因为这些东西(变量及其感染)会叠加在一起吗?

教授:这是一个很好的问题。 人们希望在Java之类的语言中不会出现缓冲区溢出。 但是在C语言的情况下,可能会发生灾难性的事情,因为如果您以某种方式使缓冲区溢出,然后为变量重写taint标签,则将在堆栈中设置其零值,并且数据将自由流入网络。

学生:我认为所有这些都可以预测吗?

教授:绝对正确。 缓冲区溢出的问题可以在“ canaries”(堆栈指示器)的帮助下解决,因为如果堆栈上有此数据,那么您就不希望其不被覆盖或者不希望以某种方式破解已经被覆盖的值。 因此,您绝对正确-您可以简单地防止缓冲区溢出。

简而言之,可以在较低的x86 / ARM级别上提供污点跟踪,尽管它可能有点贵,并且很难以正确的方式实现。 您可能会问为什么我们首先要解决感染跟踪问题,而不是仅通过扫描对我们机密的数据来监视程序如何尝试通过网络发送某些内容。 这似乎相当容易,因为这样我们就无需动态监视程序执行的所有操作。



问题在于,这仅在启发式级别上起作用。 实际上,如果攻击者知道您正在这样做,那么他就可以轻松地破解您。 如果您只是坐在那里并尝试使用grep作为社会保险号,则攻击者可能只是使用base 64编码或执行其他一些愚蠢的事情,例如压缩。 绕过这种类型的过滤器非常简单,因此在实践中,这完全不足以确保安全。

现在,让我们回到您的问题,关于如何跟踪分支分支中的流。 这将导致我们进入一个名为“隐式流”或“隐式流”的主题。 隐式流通常发生在具有感染值的情况下,该值将影响您分配另一个变量的方式,即使该隐式流变量未直接分配变量也是如此。 我将举一个具体的例子。
假设您有一个查看您的IMEI的if语句,说:“如果它大于42,则我将分配x = 0,否则我将分配x =1。”

有趣的是,我们首先查看机密IMEI数据并将其与某个数字进行比较,但是随后分配x,我们不分配直接从此机密数据中获取的任何内容。



这是隐式线程之一的示例。 x的值实际上取决于上面的比较,但是如果对手很聪明,则对手可以以这样的方式构建自己的代码,即无法在其中跟踪任何直接连接。

请注意,即使在这里,不只是分配x = 0,x = 1,您还可以通过命令在网络上发送消息,也就是说,您可以在网络上说x = 0或x = 1,或类似的东西。 这是像TaintDroid这样的系统无法控制的这些隐式线程之一的示例。 因此,与显式流(例如,赋值运算符)相反,这称为隐式流。 因此开发人员意识到了这个问题。
如果我理解正确,我被问到如果我们具有某种类似于上面示例的机器功能,那该怎么办,因此TaintDroid系统不需要知道这一点,因为TaintDroid将无法查看该机器代码并看到事物。这样的。 顺便说一句,开发人员声称他们将使用由虚拟机本身确定的面向机器的方法来控制该方法,并且他们将考虑该方法的实现方式。 例如,我们取这两个数字,然后返回它们的平均值。 在这种情况下,TaintDroid系统将信任机器功能,因此我们需要确定适当的异味感染策略。

但是,您是正确的,如果这样的事情隐藏在机器代码中,并且由于某种原因未进行公开修订,则TaintDroid的作者发明的手动策略可能无法捕获此隐式流。 实际上,这可能会使信息以某种方式泄漏。 而且,甚至可能有直接流,TaintDroid的作者没有注意到,因此,我们可能会有更直接的泄漏。



学生:也就是说,实际上看起来非常危险,对吧? 因为您只需看一下最后3行,就可以清除所有感染的值。

教授:我们有几节课研究了隐式流如何做这些事情。 有几种方法可以解决此问题。 防止这种情况发生的一种方法是为PC分配一个污点标签,从本质上说,它会受到Branch测试的感染。 这个想法是,从人类的角度来看,我们可以考虑这段代码并说此隐式流存在于此,因为要到达此处,我们必须挖掘机密数据。

那么这在实现级别意味着什么呢? 这意味着,要到达此处,PC必须装有已被机密数据感染的文件。 也就是说,我们可以说收到此数据是因为PC安装在此处-x = 0-或此处-x = 1。

通常,您可以想象该系统将进行一些分析,并发现在此位置没有隐式流量PC被感染,然后它从IMEI中获取感染,并且在x = 0时,该PC已被感染。 最后,如果x是最初显示时没有污点的变量,那么我们会说:“好的,此时x = 0,我们从IMEI感染了上面实际感染过的PC。” 这里有一些微妙之处,但是通常,您可以跟踪PC的安装方式,然后尝试将感染传播给目标操作员。

清楚吗? 如果您想了解更多,那么我们可以讨论这个话题,因为我已经做了很多此类研究。 但是,我刚刚描述的系统可能再次过于保守。 想象一下,如上所述,我们也有x = 0,而不是x =1。在这种情况下,用与IMEI相关的东西感染x是没有意义的,因此没有信息可以从这些分支泄漏。

但是,如果使用计算机化的PC感染方案,则可能会高估损坏的x个变量。 您可以采取一些技巧来解决这些问题,但这会有些困难。

学生:退出if语句时,也退出Branch,清除感染了吗?

教授:通常,是的,一旦变量集结束,便将清除PC中的感染。 仅在这些从x到x的分支内部建立感染。 原因是当您在这里时,无论IMEI是什么,您都可以这样做。



我们讨论了在非常低的级别进行感染跟踪是多么有用,尽管它非常昂贵,因为它确实使您可以看到数据的生命周期。 在几场讲座之前,我们谈到了一个事实,即关键数据在内存中的寿命通常比您想象的要长得多。

您可以想象,尽管跟踪x86或ARM感染非常昂贵,但是您可以使用它来审核系统。 例如,您可以感染用户输入的密钥,并查看它在整个系统中的移动位置和移动方式。 这是一项离线分析,不会影响用户,因此通常会很慢。 这样的分析将有助于找出,例如,该数据属于键盘缓冲区,外部服务器还是其他地方。 因此,即使这是一个缓慢的过程,它仍然会非常有用。

正如我所说,TaintDroid的一个有用功能是它限制了感染源和感染信息吸收者的“宇宙”。 但是作为开发人员,您可能希望对程序与之交互的感染标记进行更精确的控制。 因此,作为一名程序员,您将需要执行以下操作。
因此,您声明了一个此类int并将其命名为X,然后将标签绑定到它。 该标签的含义是,爱丽丝是她允许鲍勃查看的信息的所有者,或者该信息被标记为鲍勃查看。 TaintDroid不允许您执行此操作,因为它实际上控制了标签的整个范围,但是作为程序员,您可能想要执行此操作。

假设您的程序具有输入和输出通道,并且它们也被标记了。 这些是您作为程序员选择的标签,与系统本身不同,它们试图说这些事情是预先确定的。 对输入通道说,您可以设置获取通道标签的读取值。



这与TaintDroid的工作原理非常相似-如果读取了GPS传感器值,则将其标记有GPS通道的污点标签,但是现在,作为程序员,您可以自己选择这些标签。 在这种情况下,输出通道的标签应与我们记录的标签值匹配。



可以在此处引入其他策略,但是主要思想是有些程序管理员可以让开发人员选择标签的种类以及其语义可能是什么。 这将需要程序员进行大量工作,其结果将是进行静态检查的能力。 静态的是指在编译时执行的检查,并且可以“捕获”多种类型的信息流错误。

因此,如果您使用适当权限的标签仔细标记所有网络通道和屏幕通道,然后小心地将数据放置在板上,作为示例,那么在编译过程中,编译器将告诉您:“嘿,如果您运行此程序,那么您可能会遇到信息泄漏,因为部分数据将通过不可信的通道。”

在较高的级别上,静态检查可以捕获许多此类错误,因为此类int {AliceBob} x注释有点像类型。 正如编译器可以用一种类型的语言捕获与类型相关的错误一样,它们也可以与用上述语言编写的代码一起工作,也就是说,如果您运行此程序,可能会遇到问题。 因此,您需要修复标签的工作方式,可能需要对某些内容进行解密等等。

因此,根据语言,这些标签可以与人员,I / O端口等相关联。 TaintDroid使您有机会熟悉信息流和信息泄漏的操作原理,但是,有更复杂的系统具有更明显的语义来管理这些过程。



请记住,当我们谈论静态验证时,最好是借助统计验证而不是动态验证来捕获尽可能多的故障和错误。 这有一个非常微妙的原因。 假设我们在程序运行期间推迟了所有静态检查,我们肯定可以这样做。
问题是这些检查的失败或成功是一个隐式通道。 因此,攻击者可以为程序提供一些信息,然后检查是否导致程序崩溃。 如果发生故障,黑客可能会说:“是的,我们对信息流进行了一些动态验证,因此这里存在一些影响计算过程的值。” 因此,您将要尝试使这些检查尽可能地静态。

如果您想了解有关这些事情的更多信息,请查看Jif。 这是一个非常强大的系统,它创建了标签计算方法标签。 您可以从它开始,然后朝那个方向进一步移动。 我的同事Zeldovich教授在这方面做得很好,因此您可以和他谈谈这个话题。

有趣的是,TaintDroid在查看和描述标签的能力上非常有限。 有些系统可以让您执行更强大的功能。

最后,我想谈一谈如果我们想使用传统程序或使用用C或C ++编写的,不支持代码执行过程中所有功能的程序来跟踪信息流,该怎么办。 有一个非常合理的TightLip系统,同一篇文章的一些作者正在考虑如何跟踪系统中的信息泄漏,在该系统中我们不想更改应用程序本身中的任何内容。

基本思想是在这里使用doppelganger过程或“过程对应项”的概念。 TightLip默认使用双流程。 她要做的第一件事是定期扫描用户的文件系统,查找机密文件类型。 可能是电子邮件文件,文本文档等。 对于这些文件中的每一个,系统都会创建其“已清理”版本。 也就是说,在电子邮件文件中,它将“ to”或“ from”信息替换为包含虚拟数据(例如空格)的相同长度的字符串。 这作为后台进程运行。

进程启动时,TightLip要做的第二件事是确定进程是否正在尝试访问机密文件。 如果发生这种访问,TightLip将创建此过程的两倍。 这种相似的外观与尝试影响敏感数据的原始过程完全一样,但是根本的区别在于,相似的外观(我将其指定为DG)读取已清除的数据。



假设您正在尝试访问电子邮件文件。 系统产生与原来的过程完全相同的新过程doppelganger,但是现在它读取的是干净数据,而不是真实的敏感数据。 本质上,TightLip并行运行这两个过程,并观察它们以查看它们在做什么。 , , , . , , - , , – , , , -, .



, , TightLip , . , . , , , , . , TaintDroid, , : «, , , , - ».

, , , - . TaintDroid, , - , . — , — . , , , , , .

: , - Word, , - .

: , . , . . Word. - , - , . .

: , , ? - .

: , . , , , - , . , . «» , , , .

, , , , , , , .



– , TightLip TCB, , -, . , . . , , . TightLip.
, . taint .

: , ? , ?

: ! - DG , , . , , , -, , .

, .


.

感谢您与我们在一起。 你喜欢我们的文章吗? 想看更多有趣的资料吗? 通过下订单或将其推荐给您的朋友来支持我们,为我们为您开发的入门级​​服务器的独特模拟,为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-CN433380/


All Articles