提问者:小点点

Java安全漏洞操作系统注入代码


运行静态扫描时,我收到一个Veracode错误:操作系统命令(“操作系统命令注入”)中使用的特殊元素的中和不当(CWE ID 78)

应用程序调用一个进程,其中包含我从前端收到的参数(应用程序在内部使用,这是一个userId)。

  ProcessBuilder pb = new ProcessBuilder(PROCESS, "-A", argument);
  Process p = pb.start();     // Veracode is mentioning this line

我如何解决这个Veracode问题?有没有“安全”的方式来运行流程?


共2个答案

匿名用户

假设您的userId有一个定义良好的格式(数字、十六进制数字、字母数字、...),也许它总是相同的长度。

您必须通过正则表达式将userId匹配到适当的字符类来验证它,并拒绝任何不符合要求的内容,否则,您会受到以下攻击:

输入用户名:diginoise;rm-射频/

匿名用户

听起来这是您应用程序中的架构问题。我很确定您不想执行用户作为请求参数作为OS命令传递的假定userid。这将是设计上的OS命令注入。

理想的解决方案是避免创建新的操作系统进程,并使用内置的Java功能来实现您的目标。

如果您必须运行外部进程,请不要将用户输入包含在您正在运行的内容中。例如,如果您要运行静态字符串ps aux并且在Java中执行“grep”位,Veracode查找将消失,并且它将更加安全。

如果您必须包含用户输入,请确保它经过严格验证。请注意,对于操作系统命令注入,有时只需要字母就足够了,尽管已经进行了验证,但Veracode会正确地将其标记为易受攻击。在这种情况下,如果您确信通过验证不可能运行任何恶意的东西,那么可以在Veracode中将发现标记为“通过设计缓解”。