C / asm程序在没有特权的用户运行时对Linux有什么害处?

时间:2012-02-29 21:05:35

标签: c linux security assembly benchmarking

我一直在考虑这样一个场景,即让用户(可能是任何人,可能有不良意图)提交在Linux PC上运行的代码(让我们将其称为基准节点)。目标是为单线程例程创建一种自动基准测试环境。假设一个网站将一些代码发布到代理。此代理将此代码交给基准节点,基准节点只有代理的以太网连接,而不是互联网本身。

如果允许在基准节点上运行任何用户发布的C / asm代码,那么面临哪些安全挑战?做出以下假设:

  • 该程序以非特权用户身份运行
  • 代理将有机会终止基准节点上的进程(例如,采用无限循环的方案)
  • 代理能够重新启动基准节点(如果它回复...)

那么,实际上这个用户空间程序是否可能导致操作系统崩溃,或者使机器对代理不可用?通过汇编,程序员基本上可以做任何他想做的事情(例如操纵堆栈指针),我想知道Linux在这方面有多么限制/强大。我也知道进程有可能请求共享内存区域与其他进程(shm),这可能也在这里发挥作用?

非常欢迎有关此主题的任何文献或文章。

Sandbox解决方案可能也很有趣,但重要的是CPU必须在基准测试期间执行100%的能力(至少在运行基准测试的核心上)。

5 个答案:

答案 0 :(得分:5)

只是快速列出我的头脑。从本质上讲,如果你至少不信任用户,那你就陷入了困境:

  • 文件系统操作:删除或覆盖属于该进程运行的用户的文件
  • 窥探在系统上找到的各种数据(文件,有时是同一用户的网络流量)
  • 杀死用户的其他流程
  • 消耗内存,直到OOM Killer开始杀死随机进程或(如果启用了交换),直到机器减速为爬行
  • 生成大量I / O以降低系统速度
  • 随意执行漏洞利用程序(您肯定会在某处获得一些未修补的特权升级漏洞)
  • 利用用户能够运行的任何软件中的漏洞
  • 在您的计算机上托管DDoS网络或儿童色情文件服务器
  • 将您的计算机用作启动对CIA和FBI服务器的攻击的代理
  • 天空是极限......

听起来不是一个好主意。

答案 1 :(得分:3)

  

那么,实际上这个用户空间程序是否可能导致操作系统崩溃,或使机器对代理不可用?

是的,诸如产生过多进程,分配过多内存(导致使用交换文件)或排队大量磁盘I / O等技术会使计算机无响应,因此您的主管进程将无法运行及时时尚。

如果您的管理员代码最终被换出到磁盘,那么即使它具有高优先级,它也不会在磁盘可用之前运行,由于寻道时间可能会延迟很长时间。

Linux确实有ulimit可以防止其中的一些,请参阅Limit the memory and cpu available for a user in Linux同样可以阻止恶意网络活动。您还可以禁用交换和chroot程序到tmpfs挂载。但是一些恶作剧仍然是可能的。

答案 2 :(得分:3)

  

那么,实际上这个用户空间程序是否可能导致操作系统崩溃,或使机器对代理不可用?

好吧,理论上你应该很难让操作系统崩溃。但是,有许多错误报告说它在实践中比我们想要的更有可能。

另一方面,如果没有特别的预防措施,实现拒绝服务将会相当容易。想象一下,用户程序除了使用数据包充斥代理外什么都没做;如果不能彻底拒绝服务,那么就可能使事情变得令人尴尬地缓慢。

  

使用程序集,程序员基本上可以做任何他想做的事情(例如操纵堆栈指针),我想知道Linux在这方面有多么限制/强大。

但是,我们要好得多。如果特权升级所需要的只是“混乱堆栈指针”安全性,因为字段将是一个完全的笑话。内核意图被写入,这样任何程序,无论如何,都可能导致内核崩溃。如上所述,这是不完美的。

故事的寓意是你真的不想在你关心的计算机上运行不受信任的代码。此处的库存答案将是一个检查点的VM:启动虚拟机,在虚拟机上运行不受信任的代码,然后在完成或超时后将虚拟机吹走。这样持久的伤害是不可能的。对于其他滥用行为,您的代理将阻止他们托管肮脏的互联网服务,这是好的。根据您的VM情况,可能有很好的工具来限制CPU消耗和网络使用,这将有助于消除其他拒绝服务的可能性。

您提到需要CPU以满负荷运行。硬件虚拟化 非常好,性能应该合理地反映它在真实系统中的含义。

顺便说一句,上面没有任何特定于Linux的内容;所有可靠的通用操作系统都应如此。

编辑: 如果您真的坚持直接在硬件上运行,那么:

  • 从只读设备(livecd或writeblocked硬盘驱动器)启动
  • 系统中没有可写媒体
  • 添加一个无人值守服务器,可以在代理请求时强制重置机器,以防止拒绝服务;这个
  • 存在商业解决方案

这实际上是为您提供VM解决方案的功能,但在硬件上。

答案 3 :(得分:1)

如果代码在正确配置的计算机上的受限帐户下运行,则它应该抵御许多基本类型的攻击(无论是意外还是恶意)。

程序员可以使用程序集这一事实无关紧要 - 攻击可以用许多不同的语言编写 - 编译或其他语言。

主要问题是未知的安全问题或0day漏洞。允许任何未经授权的程序运行是一种风险,如果有人设法利用允许权限提升的问题,那么你就搞砸了。

通常建议使用沙箱,因为它们都限制了应用程序可以执行的操作,并且(如果设计正确)可以最大限度地减少恶意行为造成的损害。

答案 4 :(得分:0)

程序组可能会施加内存压力,导致计算机无响应(尤其是在交换到磁盘时开始出现)。示例代码:perl -e '$_.="x"x1000000 while fork'