我正在为孩子,程序员制作互动学习系统。系统将自动编译并运行孩子们将提交的代码(c ++)。它将被广泛访问,所以我担心更大的“孩子”会尝试使用system
,signal
,exec
,fork
等命令来破坏系统等等。即使硬盘驱动器被格式化也不会那么可怕,因为我将自动备份,但我想限制最常见的有害命令。
是否有一些列表,或者更有经验的程序员可以命名这些有害命令?
答案 0 :(得分:3)
您无法通过检测这些命令来保护您的系统,这是因为在C ++中您可以使用直接内存访问(即通过reinterpret_cast
)或自修改代码来调用这些命令或与系统交互。相反,在编译之后,在一个没有足够访问权限的单独进程中运行该程序。
答案 1 :(得分:0)
某些命令是合法的,但可以有害地使用(例如cp
或rm
)。
也许您可以将restricted shell设置为用户的登录shell。然后,您可以拥有一个包含可接受命令集的目录。
但这不是万无一失的:一个有动力的黑客可能会破坏你的系统。
如果您的意思是system calls而不是命令,那么有动力的黑客总是可以调用它们(可能使用asm
,dlsym
,函数指针,......或跳到一些记忆......)。
答案 2 :(得分:0)
通过编写等效的汇编代码,动态复制禁止的函数和执行复制等,可以轻易地破坏您所建议的内容。
请考虑使用白名单,以系统调用粒度。考虑一个程序纯粹通过系统调用与外部世界交互。因此,任何不包含系统调用的代码都可以被“信任”。鉴于此,您可以使用动态或静态绕行技术来检测所有系统调用并将您想要允许的系统列入白名单。