我想在我的C程序中使用linux命令。我知道,我们可以使用system()调用通过生成命令来执行命令。 system()调用是否安全?当我反汇编我的C程序的exe时,我可以看到我在程序中使用的命令:(
下面的[编辑]是我的程序示例,图像有一个" echo hello"命令。
arul@OA2:~/work/images/samples$ cat a.c
#include <stdio.h>
int main()
{
printf("hai\n");
system("echo hello\n");
return 0;
}
arul@OA2:~/work/images/samples$ gcc a.c -o a
arul@OA2:~/work/images/samples$ ./a
hai
hello
答案 0 :(得分:4)
使用system()函数可能会导致 可剥削的漏洞,在最坏的情况下允许执行 任意系统命令。调用system()的情况 高风险包括以下内容:
传递未经过清理或未正确清理的命令字符串时 来源于受污染的来源
如果指定的命令没有路径名和命令 攻击者可以访问处理器路径名称解析机制
如果指定了可执行文件的相对路径并控制 攻击者可以访问当前工作目录
如果攻击者可以欺骗指定的可执行程序
答案 1 :(得分:1)
这取决于你的安全意味着什么。它会在您的计算机上神奇地传播病毒吗?不是。这是否意味着您必须采取特殊预防措施来防止恶意行为?是。这通常是个好主意吗?并不是的。它是否会混淆您使用的命令,因此在解压缩exe时您无法看到它们?否。
答案 2 :(得分:0)
在某些情况下,它可能并不危险,但我认为最佳做法是使用满足您需要的库或函数,例如execve()
。
(齿顶)
如果您的意思是安全,因为不会在数据中显示字符串,那么这不是您想要的方式。
但是如果你的应用程序需要以这种方式保证安全,那么你真的应该使用正确的函数,system()
似乎是最后的办法,只是让事情变得快而脏。
答案 3 :(得分:0)
System()易受攻击,因为可以替换使用的命令。为避免这种情况,我们可以使用fork execl, execv, execle, execve, execlp, execvp
等库函数。