从Process.Start注入操作系统命令
本文关键字:操作 系统命令 注入 Start Process | 更新日期: 2023-09-27 18:27:47
我的应用程序正在使用Process.Start
打开另一个要运行的应用程序。VeraCode[一个安全软件扫描工具]报告此命令为操作系统命令注入漏洞。我想得到一些评论。我在网上找到了很多关于过滤输入或约束程序名称的信息;然而,我很好奇是否还有其他使用Process.Start
的替代方案?
编辑:感谢您的评论,这是其中一个示例,是的,它正在从用户那里获得输入:
public static void Run(string fileName, string arguments, bool waitForExit)
{
Process p = Process.Start(fileName, arguments);
if (waitForExit)
p.WaitForExit();
}
谢谢!
这是一个命令注入漏洞,因为您没有过滤掉函数中的用户输入并直接附加到process.start()因此,该工具已将其标记为漏洞。
为了避免这个问题,您应该使用regex方法过滤掉坏字符,这取决于该函数在运行时要做什么。
例如,创建函数只是为了从此路径c:''users/docs.txt进行检查则该函数不应该为c:''admin/docs.txt.执行
这就是在将用户数据直接发送到流程之前需要验证的方式。
有关更多信息,请参阅这个很棒的链接:https://dotnet-security-guard.github.io/SG0001.htm
或https://www.veracode.com/security/dotnet/cwe-78
Process类不过是一个托管包装类——Native Create Process及其变体,如Create Process As User。
- 处理MSDN
- 流程源代码
我认为没有其他方法可以启动进程,因为其他所有解决方案都会调用WinAPI函数。(因为此函数(或其重载和变体)是在Windows中启动进程的唯一方法)。
就我个人而言,我没有听说任何关于Process.Start
的问题,请澄清的问题
关于
我也遇到了这个问题。您需要将UseShellExecute属性设置为false。那么Veracode不会认为这是一个漏洞。
using (WinProcess myProcess = new WinProcess())
{
myProcess.StartInfo.FileName = "notepad.exe";
myProcess.StartInfo.Arguments = Path.GetFileName(fullPath);
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.WorkingDirectory = Path.GetDirectoryName(fullPath);
myProcess.StartInfo.RedirectStandardOutput = false;
myProcess.Start();
}