在我将解决方案作为 OWAPS 和 Roslyn 安全卫士的建议应用后,Veracode 仍然报告操作系统命令注入问题

Posted

技术标签:

【中文标题】在我将解决方案作为 OWAPS 和 Roslyn 安全卫士的建议应用后,Veracode 仍然报告操作系统命令注入问题【英文标题】:Veracode still reports OS command injection issue after I have applied the solution as recommendations from OWAPS and Roslyn Security Guard 【发布时间】:2018-12-31 13:51:00 【问题描述】:

我项目中的当前代码如下所示,Veracode 报告存在操作系统命令注入

filename = Regex.Replace(filename, "[^a-zA-Z0-9_]", "_") & ".svg"

ProcessStartInfo startInfo = default(ProcessStartInfo);
Process pStart = new Process();
startInfo = new ProcessStartInfo(myExecutedFilePath, "\"" + filename + "\" --export-pdf=\"" + filename + "\""); **//OS command injection raises at this line**
pStart.StartInfo = startInfo;
pStart.Start();
pStart.WaitForExit();

所以,我从 OWASP 和 Roslyn Security Guard 研究了解决此问题的解决方案。

OWASP 帖子:https://www.owasp.org/index.php/OS_Command_Injection_Defense_Cheat_Sheet Roslyn 保安员发帖:https://dotnet-security-guard.github.io/SG0001.htm

这是我根据这些帖子修改后的代码。

filename = Regex.Replace(filename, "[^a-zA-Z0-9_]", "_") & ".svg"

ProcessStartInfo startInfo = default(ProcessStartInfo);
Process pStart = new Process();
startInfo = new ProcessStartInfo();
startInfo.FileName = myExecutedFilePath;
startInfo.Arguments = "\"" + filename + "\" --export-pdf=\"" + filename + "\""; **//Veracode still reports the issue at this line**
pStart.StartInfo = startInfo;
pStart.Start();
pStart.WaitForExit();

但是,Veracode 仍然报告操作系统命令注入。

所以我担心的是:

    在这种情况下,我是否应用了正确的解决方案来解决操作系统命令注入问题?

    或者,我应该建议缓解吗?

【问题讨论】:

【参考方案1】:

我想filename 是用户输入。

这在技术上是操作系统命令注入,但您可以说它是 Veracode 术语中的“设计缓解”,因为文件名经过严格验证(T:M1,S:只有字母和数字是文件名的有效字符,其他人会被替换)。

但是,这引发了另一个漏洞的问题,即文件名或路径的外部控制(又名路径注入)。虽然您的代码中的验证会减轻大部分问题,但请考虑一些极端情况,例如已经存在的文件、由空字节 (\0) 或空文件名组成的文件名。

例如,您的应用程序可以调用此 pdf 导出可执行文件来提供生成的 pdf 供用户下载。如果使用已经存在的文件名调用,则可能不会创建新的 pdf,但可以在没有授权的情况下提供现有的 pdf 下载。这只是一个示例,现在可能会出现类似的问题,或者随着代码的发展在未来出现。

【讨论】:

我收到了 Veracode 的答复。他们还建议我为这种情况提出缓解措施。【参考方案2】:

我已收到 Veracode 的答复。

“您说得对,将 ProcessStartInfo 对象中的文件路径和参数分开是一个好的开始,并且验证文件名仅包含字母数字字符也应该有所帮助。

静态引擎仍将其报告为缺陷的可能原因是 Veracode 无法识别用于 CWE 78 的 .NET 的任何清理函数。因此,每当我们看到用户输入被传递给表示我们将标记为 CWE 78 的命令“sink”。我们也不评估正则表达式字符串的准确性/有效性,因此即使正则表达式完全准确,我们仍然会标记该缺陷。

两个建议:

    如果您需要我们的一项服务,请考虑安排一次咨询 应用程序安全顾问帮助验证您的更改在上下文中是否正确。 一旦您 100% 满意您的修复 解决了该缺陷,我建议在缓解措施中记录这一点。 "

【讨论】:

以上是关于在我将解决方案作为 OWAPS 和 Roslyn 安全卫士的建议应用后,Veracode 仍然报告操作系统命令注入问题的主要内容,如果未能解决你的问题,请参考以下文章

Roslyn - 如何用多个节点替换多个节点?

如何获取 Roslyn 中 NamedTypeSymbol 的所有适用方法,包括扩展方法?

roslyn能生成枚举吗?

使用 Roslyn 编译 C# 项目时,如何避免完全重新编译?

未能找到路径“\bin\roslyn\csc.exe”的一部分 的解决办法

找不到文件“..\bin\roslyn\csc.exe”。发布到服务器后