繁体   English   中英

来自 Process.Start 的 OS 命令注入

[英]OS Command Injection from Process.Start

我的应用程序正在使用 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类只是一个 Managed 包装类,Native Create Process及其变体,如Create Process As User

我认为除此之外没有其他方法可以启动进程,因为其他所有解决方案也会调用 WinAPI 函数。 (因为此函数(或其重载和变体)是在 Windows 中启动进程的唯一方法)。

就我个人而言,我还没有听说过Process.Start任何问题,请澄清问题

问候

这是一个命令注入漏洞,因为您没有过滤掉函数中的用户输入并直接附加到 process.start() 中,因此该工具将其标记为漏洞。

为避免此问题,您应该使用正则表达式方法过滤掉坏字符,并取决于该函数在运行时将执行的操作。

例如。 创建您的函数只是为了从此路径 c:/users/docs.txt 进行检查,那么不应为 c:/admin/docs.txt 执行该函数。

这是您在将用户数据直接发送到流程之前需要验证的方式。

有关更多信息,请参阅这个很棒的链接: https : //dotnet-security-guard.github.io/SG0001.htm

https://www.veracode.com/security/dotnet/cwe-78

我也遇到了这个。 您需要将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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM