龙空技术网

为什么共享数据分区是一个安全漏洞

漫漫开发路 102

前言:

此时咱们对“共享内存用起来有非常多的问题”大致比较珍视,大家都需要分析一些“共享内存用起来有非常多的问题”的相关文章。那么小编同时在网摘上汇集了一些有关“共享内存用起来有非常多的问题””的相关资讯,希望我们能喜欢,咱们快快来了解一下吧!

很多人都推荐使用共享数据分区(shared data sections)来在一个应用程序的多个实例中共享数据。这听起来是一个不错的主意,但是实际上,它会带来一个安全漏洞。

使用CreateFileMapping函数创建的共享内存对象可以是很安全的。它使用了安全描述符用来指定使用者被允许的访问级别。而作为对比,任何人都可以加载你的EXE或者DLL文件来访问你定义在文件中的共享内存分区。

下面,我们来看一个例子,这个例子展示了一种不安全的程序代码。

试着运行这个这个程序看看。它会一直从0到9,周而复始地开始计数。因为TimerProc这个函数永远不会使得g_iShared超过9,所以wsprintf不会产生缓冲区溢出的问题。

真的是这样吗?

如果我们运行这个程序,并使用runas工具以另外一个用户身份启动。如果想要结果显得更加有趣,你可以使用一个管理员来运行此程序,使用另外一个非管理员来运行第二个实例。我们可以看到,计数的速度加快了一倍,这是一个正常现象,因为这里的计数变量被设置成了一个共享变量。

接下来,我们关掉其中一个实例,并再次在调试器下加载它。然后我们在这两个实例同时运行的时候,在调试器中下断点,并将共享变量g_iShared的值修改为一个很大的数值,例如1000000。

这个时候,你可能会观察到程序的崩溃,当然,也可能不会发生,这取决于你的调试环境。有一些调试器非常聪明,当它知道用户在调试环境中修改共享内存分区的变量时,它就不会继续和程序的其他实例进行数据共享。这对于调试器来说,的确是好事,但是对于我这个演示就没那么好了。

下面是我如何使用系统内建的ntsd调试器来做这个实验的。

首先我打开命令提示符,然后使用我自己的账号(一个非管理员身份)来执行程序。接着,我使用了runas工具来以管理员身份启动了我们的scratch测试程序。即使我只是一个普通用户,我也会触发以管理员身份运行的测试程序出现崩溃。

在普通用户的命令行中,我输入了”ntsd scratch”来在调试器下运行scratch程序。在调试命令行下,我输入了”u TimerProc”来对TimerProc这个函数进行反汇编:

然后我输入了”g 1001143″来指示调试器下一个断点。当断点被触发时,我输入了”r eax=12341234; t”来修改寄存器eax的值为0x12341234,然后我们继续执行下一条指令。这个指令会写入一个超过缓冲区边界的数据到共享内存,然后过了一秒钟,管理员身份运行的实例就发生了缓冲区溢出并崩溃。

发生了什么呢?

因为内存区是共享的,所有scratch程序的实例都可以访问它。我所做的就是在一个调试器中运行我们的测试程序,并在调试器中修改这个共享内存变量的值。因为这个值是在多个实例之间共享的,所所以在管理员身份运行的实例中,这个值也会跟着发生变化,而这个变化就触发了wsprintf的缓冲区溢出,并导致实例的崩溃。

如果一个程序保存了数据到共享内存,则它可能会成为一个拒绝服务的攻击点,甚至你可以做更多有趣的事情。如果这个数据是一个指针,你可以破坏掉这个指针。如果它是一个字符串,你可以删除掉字符串结尾的零字符并导致字符串长度计算错误,如果使用者在拷贝字符串的时候,没有检查这个字符串的长度,则会发生缓冲区溢出。

如果这里共享的是一个带有虚表(vtable)的C++对象,则事情变得更有意思了。

你可以通过修改共享数据,将这个虚表指针指向你在共享内存分区中构造的另一个虚表,而这个虚表会包含你生成的代码,从而可能夺取系统的控制权。(如果开启了NX,则此类攻击可能变得更加困难,但是理论上还是可能的。)

即使你不能通过修改共享内存里的数据来触发程序实例的缓冲区溢出漏洞,你仍然可以破坏程序的正常运行流程。只需要将共享内存里的变量值修改为一个随机数据,就能让程序出现不太正常的行为。

这个故事告诉我们:请尽量避免使用共享内存分区。因为你不能在分区中指定访问控制列表(ACL)到共享分区,所以任何人都可能加载你的EXE或者DLL来修改分区中的数据,从而对运行在一个高安全级别的程序实例产生影响,很有可能是不好的影响。

总结

从今天起,请使用一种安全的共享数据方式,例如CreateFileMapping。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。

本文来自:《Why .shared sections are a security hole》

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。

我想:你值得拥有。

标签: #共享内存用起来有非常多的问题