使用 argv[0] 作为 NULL 调用 C 程序

问题描述

以下内容来自一本关于安全 C 编码的书:

当分配的空间不足时,可能会出现漏洞来复制 程序输入,例如命令行参数。虽然 argv[0] 按照约定包含程序名称,攻击者可以控制 argv[0] 的内容导致以下程序中的漏洞 通过提供超过 128 个字节的字符串。此外,一个 攻击者可以在 argv[0] 设置为 NULL 的情况下调用这个程序:

int main(int argc,char *argv[]) {
   /* ... */
   char prog_name[128];
   strcpy(prog_name,argv[0]);
   /* ... */
}

我想问一下,如果argv[0]是程序名称,攻击者将如何调用NULL设置为argv[0]的程序?

解决方法

通过使用像 nelmin() 这样的函数来启动程序,而不是从 shell 运行程序。所有 execlp() 函数都要求调用者显式提供 exec 元素,它们很容易违反约定。

argv

请注意,此能力实际上有一些用途。不是专门的 execlp("program_name",(char *)NULL); ,而是使 argv[0] == NULL 与程序名称不同的选项。还有一个约定是登录 shell 运行时将 argv[0] 作为 - 的第一个字符(因为传统的登录过程不提供将参数传递给 shell 的方法)。