我一直在考虑这样一个场景,即让用户(可能是任何人,可能有不良意图)提交在Linux PC上运行的代码(让我们将其称为基准节点)。目标是为单线程例程创建一种自动基准测试环境。假设一个网站将一些代码发布到代理。此代理将此代码交给基准节点,基准节点只有代理的以太网连接,而不是互联网本身。
如果允许在基准节点上运行任何用户发布的C / asm代码,那么面临哪些安全挑战?做出以下假设:
那么,实际上这个用户空间程序是否可能导致操作系统崩溃,或者使机器对代理不可用?通过汇编,程序员基本上可以做任何他想做的事情(例如操纵堆栈指针),我想知道Linux在这方面有多么限制/强大。我也知道进程有可能请求共享内存区域与其他进程(shm),这可能也在这里发挥作用?
非常欢迎有关此主题的任何文献或文章。
Sandbox解决方案可能也很有趣,但重要的是CPU必须在基准测试期间执行100%的能力(至少在运行基准测试的核心上)。
答案 0 :(得分:5)
只是快速列出我的头脑。从本质上讲,如果你至少不信任用户,那你就陷入了困境:
听起来不是一个好主意。
答案 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的内容;所有可靠的通用操作系统都应如此。
编辑: 如果您真的坚持直接在硬件上运行,那么:
这实际上是为您提供VM解决方案的功能,但在硬件上。
答案 3 :(得分:1)
如果代码在正确配置的计算机上的受限帐户下运行,则它应该抵御许多基本类型的攻击(无论是意外还是恶意)。
程序员可以使用程序集这一事实无关紧要 - 攻击可以用许多不同的语言编写 - 编译或其他语言。
主要问题是未知的安全问题或0day漏洞。允许任何未经授权的程序运行是一种风险,如果有人设法利用允许权限提升的问题,那么你就搞砸了。
通常建议使用沙箱,因为它们都限制了应用程序可以执行的操作,并且(如果设计正确)可以最大限度地减少恶意行为造成的损害。
答案 4 :(得分:0)
程序组可能会施加内存压力,导致计算机无响应(尤其是在交换到磁盘时开始出现)。示例代码:perl -e '$_.="x"x1000000 while fork'