在我将解决方案作为 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 中 NamedTypeSymbol 的所有适用方法,包括扩展方法?
使用 Roslyn 编译 C# 项目时,如何避免完全重新编译?