为什么在linux编程中使用system()很糟糕?

时间:2012-07-09 13:05:06

标签: c linux security

  

可能重复:
  Issuing system commands in Linux from C, C++

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

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

3 个答案:

答案 0 :(得分:6)

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

当您以编程方式构建字符串然后将其与system()一起使用时,会出现风险。然后你有Shell Command Injection的风险,你认为你在构建一个命令,但是恶意用户通过给你精心设计的输入来破坏你的程序,这些输入会导致你的命令做你没想到的事情。

答案 1 :(得分:4)

问题在于您信任传入系统的字符串,以确保从受信任的来源安全。假设你有类似的东西:

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

你能相信命令是安全的,而不是做一些像“rm -fr~ / *”那样讨厌的事情吗?使用fopen并不会让你变得必要安全,因为黑客再次传入一个文件名如/ etc / passwd并读取你不想要的东西。编程与外界联系的底线。这是你对外部用户可以做什么进行一些验证和限制的地方

答案 2 :(得分:1)

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