c - 以 argv[0] 为 NULL 调用 C 程序
问题描述
以下内容来自一本关于安全 C 编码的书:
当为复制程序输入(例如命令行参数)分配的空间不足时,可能会出现漏洞。虽然 argv[0] 按照约定包含程序名称,但攻击者可以通过提供超过 128 字节的字符串来控制 argv[0] 的内容,从而在以下程序中造成漏洞。此外,攻击者可以在 argv[0] 设置为 NULL 的情况下调用此程序:
int main(int argc, char *argv[]) {
/* ... */
char prog_name[128];
strcpy(prog_name, argv[0]);
/* ... */
}
我想问如果是程序名称,攻击者将如何调用argv[0]
设置为的程序?NULL
argv[0]
解决方案
通过使用类似execlp()
启动程序的函数,而不是从 shell 运行程序。所有exec
函数都要求调用者argv
显式提供元素,它们很容易违反约定。
execlp("program_name", (char *)NULL);
请注意,这种能力实际上有一些用途。不是具体 argv[0] == NULL
的,而是使选项argv[0]
与程序名称不同。还有另一种约定,登录 shell-
作为第一个字符运行argv[0]
(因为传统的登录过程不提供将参数传递给 shell 的方法)。
推荐阅读
- express - Passport-twitter 策略需要刷新才能提供令牌
- c - 将随机生成的值从子进程发送到父进程
- mysql - MySQL JOIN 使用任一 NON-NULL 列来引用另一个表
- python - 如何从 Python 中的列表中隔离值?
- html - 如何在带有烧瓶的表单中的输入类型收音机中插入“已检查”
- python - 如何从 Azure Key Vault 中的证书获取私钥?
- javascript - 如何将 Kaggle 数据集添加到弹性搜索中?
- apache-spark - 有没有办法列出数据湖中所有文件夹和子文件夹中的所有文件?
- node.js - 无法在 Angular 应用程序上正确获取 GridFS 图像
- docker - GitLab CI 中的灯塔