让我们预先假定你有R运行root / admin权限。除了system()
和file.*()
?
这是一个特定于平台的问题,我正在运行Linux,因此我对特定于Linux的安全漏洞感兴趣。如果你阻止关于R的讨论,我会理解,因为这篇文章可以很容易地出现在“如何用R搞乱系统?”
答案 0 :(得分:11)
不要使用root privs运行R.没有有效的方法以这种方式保护R,因为语言包括eval和reflection,这意味着即使你不想要我也可以构建对系统的调用。
更好的方法是以不会影响系统或用户数据的方式运行R,无论它尝试做什么。
答案 1 :(得分:8)
调用外部代码的任何内容也可能会进行系统更改,因此您需要阻止某些包和诸如.Call()
,.C()
,.jcall()
等内容。
只需说它最终将成为一项几乎不可能完成的任务,如果您需要root访问权限,最好在虚拟化环境中运行它等。
答案 2 :(得分:5)
你做不到。您应该更改问题:“如何运行用户提供的R代码,以免损害用户或系统的其他用户?”这实际上是一个非常有趣的问题,可以用一点云计算,apparmor,chroot magic等解决。
答案 3 :(得分:3)
您可以使用大量命令来破坏系统。一些示例:Sys.chmod
,Sys.umask
,unlink
,任何命令,允许您读取/写入连接(有很多),{{ 1}},.Internal
等
如果你阻止那些命令的用户,没有什么能阻止他们在你不知道要阻止的包中实现某些东西。
答案 4 :(得分:3)
正如几乎每个对此线程的回复所述,删除R语言中的“可能有害”的调用会:
不需要修改/重写R语言的大部分内容的更安全的解决方案是使用BSD Jails,Jailkit或Solaris Zones之类的内容在监狱中运行R. / p>
其中许多解决方案允许被监禁的进程执行类似root的权限,但限制进程可以操作的计算机区域。
一次性虚拟机是另一种选择。如果特权用户使虚拟环境崩溃,只需删除它并引导另一个副本。
答案 5 :(得分:3)
我最喜欢的一个。你甚至不必是r00t。
library(multicore);
forkbomb <- function(){
repeat{
parallel(forkbomb());
}
}
forkbomb();
答案 6 :(得分:2)
为了适应枪支权利人的陈词滥调,“system()无害 - 系统()的人是有害的”。
没有功能调用本质上是有害的,但如果你允许人们自由使用它们,那么那些人可能会造成伤害。
此外,伤害的定义将取决于您认为有害的内容。
答案 7 :(得分:1)
通常,R是如此复杂,以至于您可以假设有一种方法可以在执行具有看似无害的函数的数据时欺骗它,例如通过缓冲区溢出。