我正在查看 Quake II 源代码,发现它们阻止用户运行游戏root:
/* Prevent running Quake II as root. Only very mad
minded or stupid people even think about it. :) */
if (getuid() == 0)
{
printf("Quake II shouldn't be run as root! Backing out to save your ass. If\n");
printf("you really know what you're doing, edit src/unix/main.c and remove\n");
printf("this check. But don't complain if Quake II eats your dog afterwards!\n");
return 1;
}
Run Code Online (Sandbox Code Playgroud)
在 Quake II 中这样做的具体原因是什么?
我怀疑他们是否想到了任何非常具体的代码。很可能只是所有软件都有错误,以 root 权限运行软件会使错误更加危险。
但是引起问题的一个很好的候选者是用于创建 mod 的 QuakeC 语言。特别是因为这些模组是由用户制作的,不受 Id Software 控制。此外,它是一个具有服务器和客户端的网络应用程序。就其本身而言,这绝对是足够的理由。
所以原因很可能很简单,99% 的人以 root 身份启动它是错误的,通常没有任何理由以 root 身份运行游戏。
我真的很喜欢这个。我非常喜欢它,以至于我正在考虑在几乎所有未来的代码中使用这个简单的检查。
编辑:
我认为举个例子是个好主意。在很多情况下,以 root 身份执行内容可能会出错,但是想象一下程序或游戏/tmp/mygame在退出时存储了一些临时文件,程序会执行类似于rm -rf /tmp/mygame. 现在想象一下,'t'无论出于何种原因(缓冲区溢出、位翻转、某些程序员“测试某事物”并且没有恢复或出于任何原因)该字符被损坏并获得了 value '\0'。请记住,C 字符串以 NUL 结尾。
现在,rm -rf /tmp/mygame它不会执行,而是执行rm -rf /. 如果发生这种情况,您会希望它不是以 root 权限执行的。
是的,我确实知道您需要添加--no-preserve-root才能使此特定示例造成任何损坏,但这不是重点。关键是,如果使用 root 访问权限执行程序可能会导致程序损坏,并且该程序不需要以 root 访问权限执行来执行它应该执行的操作,那么防止它以 root 身份执行是明智的根本。它只是增加了额外的安全层。
另一个例子是程序可能感染了病毒。如果是这种情况,您绝对不想以 root 身份执行它。