【问题标题】:Invoke C program with argv[0] as NULL以 argv[0] 为 NULL 调用 C 程序
【发布时间】:2021-03-11 23:58:27
【问题描述】:

以下内容来自一本关于安全 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]是程序名,攻击者将如何调用argv[0]设置为NULL的程序?

【问题讨论】:

  • 再读一遍:“argv[0]包含按惯例的程序名称”。攻击者不必遵循该约定。
  • 这实际上只是 suid 程序的问题。如果攻击者可以通过使用argv[0]==NULL 调用您的程序来欺骗您的程序进行恶作剧,那么他直接拥有相同恶作剧的所有必要权限。

标签: c argv


【解决方案1】:

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

execlp("program_name", (char *)NULL);

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

【讨论】:

    猜你喜欢
    • 2013-09-11
    • 2011-01-02
    • 1970-01-01
    • 2016-02-17
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2020-07-08
    相关资源
    最近更新 更多