3

可能重复:
在 Linux 中从 C、C++ 发出系统命令

我在一些文字上看到在 linux 编程中使用 system() 调用不好,我想知道它的真正原因是什么?它应该消耗更多的内存,也许更多的 CPU。除了这些可能是什么原因?

例如,如果我键入system("echo 1 > file");而不是使用fopen(), fwrite()黑客在我的程序/linux 系统中可以做什么?我看到由于安全问题,不建议 system() 。但是一个人怎么能仅仅因为使用 system() 调用就破解了一个 linux 系统呢?如果有人能明确地解释使用 system() 可能会出现什么问题,我会很高兴。

4

3 回答 3

7

从字面上使用system("echo 1 > file");不是安全风险,只是不必要地执行另一个您不需要的流程。

当您以编程方式构建字符串然后将其与system(). 然后你就有了Shell Command Injection的风险,你认为你正在构建一个命令,但是恶意用户通过给你精心设计的输入来破坏你的程序,导致你的命令执行你没有预料到的事情。

于 2012-07-09T13:12:09.840 回答
4

问题是您相信传递给系统的字符串不会受到可信来源的影响。假设你有这样的事情:

char *command = null;
//Read command from external source;
system(command);

你能相信命令是安全的,而不是做一些像“rm -fr ~/*”这样讨厌的事情吗?使用 fopen 也不能保证您的安全,因为黑客可以再次传入文件名,例如 /etc/passwd 并读取您不想要的文件。编程与外部世界接口的底线。这是您对外部用户可以执行的操作进行一些验证和限制的地方

于 2012-07-09T13:18:54.403 回答
1

System(3)启动另一个进程并运行命令解释器(“/bin/sh -c”)来执行您的命令。如果您的程序使用 SUID 或 SGID 位运行,这可能是一个问题。shell 的行为由许多环境变量控制,其中一些可用于控制命令解释器。这种情况类似于执行 SUID 或 SGID shell 脚本。

于 2012-07-09T13:22:25.663 回答