【发布时间】: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调用您的程序来欺骗您的程序进行恶作剧,那么他直接拥有相同恶作剧的所有必要权限。