3

是否可以在 linux 中阻止覆盖 argv[0] 变量的可能性,例如 strcpy(argv[0], "test", strlen(argv[0]))?我想阻止或至少记录此更改。

PS 我急于改变内核,只是帮助我在内核源代码中找到我可以“捕捉”这个变化的调用或函数。我注意到虽然 argv[0] 发生了变化,但 /proc/_pid_cmdline 的内容也发生了变化,我尝试在 fs/proc/base.c 中将一个简单的日志记录到 proc_pid_cmdline() 但它并没有起作用我想了。谢谢。

4

2 回答 2

3

通常,解决方案是将包含参数的内存页面设置为只读,这会在尝试更改内容时导致内存访问冲突。通过修改 C 运行时存根或 Linux 内核,人们可以抓住它并决定之后要做什么。

于 2013-02-04T16:18:00.290 回答
2

只“修复”内核不暴露argvvia会更容易/更好/proc/$pid/cmdline;可以说,这实际上是一个危险的安全漏洞,暴露了属于该进程的私有内存。例如,这是一个愚蠢的例子,但是一个符合标准的程序可以在使用完参数后将密码、加密密钥等存储在其参数字符串先前占用的空间中。

如果您确实想允许但将更改记录到cmdline,那将变得更加困难。您必须将数据安排在初始只读页面中,并捕获对其的写入,允许写入但在发生写入尝试时记录更改。我认为这将非常脆弱且难以维护。

于 2013-02-04T16:16:33.100 回答