C / asm程序在由非特权用户运行时对Linux有什么危害?

我一直在想一个场景,让用户(可以是任何人,可能是坏的意图)提交在Linux PC上运行的代码(我们称之为基准节点)。 目标是为单线程例程创build一种自动化的基准testing环境。 假设一个网站向代理发布一些代码。 这个代理把这个代码交给基准节点,基准节点只有一个到代理的以太网连接,而不是互联网本身。

如果让一个用户在C / ASM代码上运行基准节点,会面临什么样的安全挑战? 做出以下假设:

  • 该程序作为非特权用户运行
  • 代理将有机会杀死基准节点上的进程(例如以无限循环为例)
  • 代理能够重新启动基准节点(如果它回复…)

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

任何有关这个问题的文献或文章都非常受欢迎。

沙盒解决scheme也可能是有趣的,但重要的是,CPU必须执行它在基准testing期间的100%的能力(至less在基准testing的核心上)。

Solutions Collecting From Web of "C / asm程序在由非特权用户运行时对Linux有什么危害?"

只是一个快速列表,我的头顶。 从本质上讲,如果你不相信用户至少有一点,你是在深陷困境:

  • 文件系统操作:删除或覆盖属于运行进程的用户的文件
  • 侦听系统上发现的各种数据(文件,有时是同一用户的网络流量)
  • 杀死用户的其他进程
  • 直到OOM杀手开始杀死随机进程或(如果您有交换启用),直到机器减速到爬行
  • 生成大量I / O以减慢系统速度
  • 随意执行攻击(你肯定会在某个地方有一些未经修补的特权升级漏洞)
  • 利用用户能够运行的任何软件的漏洞
  • 在您的机器上托管DDoS网络或儿童色情文件服务器
  • 将您的机器用作针对CIA和FBI服务器的攻击代理
  • 天空才是极限…

听起来不是一个好主意。

那么,这个用户空间程序实际上可能会使操作系统崩溃,还是使代理不可用?

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

如果你的主管代码最终被换出到磁盘上,那么即使它具有高优先级,它也不会运行,直到磁盘变得可用为止,由于寻道时间,这可能是非常长的延迟。

Linux确实有ulimit可以防止其中的一些,请参阅限制Linux中的用户可用的内存和CPU可以同样阻止恶意网络活动。 你也可以禁用swap并把程序chroottmpfs挂载。 但是一些恶作剧仍然是可能的。

那么,这个用户空间程序实际上可能会使操作系统崩溃,还是使代理不可用?

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

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

通过汇编,程序员可以基本上做任何他想做的事情(例如操作堆栈指针),我想知道Linux在这方面有多严格/强大。

但是,我们比这个好很多。 如果所有你需要的特权升级是“堆栈指针”安全作为一个字段将是一个总的笑话。 内核的目的是编写程序,不管程序如何,都可能导致内核崩溃。 如上所述,这是不完美的。

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

您提到需要CPU以满负荷运行。 硬件虚拟化相当不错的,性能应该合理地反映在真实的系统上。

顺便说一句,以上没有任何特定于Linux的东西; 所有可信的通用操作系统都应该是真实的。

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

  • 从只读设备启动(livecd或writeblocked硬盘驱动器)
  • 系统中没有可写介质
  • 添加一个熄灯服务器,可以根据代理的请求强制重置机器,以防拒绝服务; 为此存在商业解决方案

这本质上是给你虚拟机解决方案的功能,但在硬件上。

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

程序员可以使用汇编的事实是无关紧要的 – 攻击可以用许多不同的语言编译 – 编译或其他。

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

一般建议使用沙盒,因为它们都限制了应用程序的功能,并且(如果设计正确的话)将流氓行为的损害降至最低。

程序组可以施加内存压力,导致机器无响应(尤其是当交换磁盘开始发生时)。 示例代码: perl -e '$_.="x"x1000000 while fork'