0

缺陷在于 Runtime.getRuntime().exec(cmd, env) 方法。我们已经使用 OWASP ESAPI 验证了输入。

但是 Veracode 仍然报告 OS 命令注入漏洞。

旧代码:

公共进程 exec(String[] cmd, String[] env) 抛出 IOException {

  return Runtime.getRuntime().exec(cmd, env);

}

新代码:

公共进程 exec(String[] cmd, String[] env) 抛出 IOException {

  String[] newCmdArr = new String[cmd.length];

  String[] newEnvArr = new String[env.length];

  for(int i=0;i<env.length;i++)

  {

  newEnvArr[i] = CSSecurity.getValidInput(ESAPIContext.OSCommand, env[i], ESAPIType.OSCommand);               

  }       

  for ( int i = 0; i < cmd.length; i++ ) 

  {

   newCmdArr[i] = CSSecurity.getValidInput(ESAPIContext.OSCommand, cmd[i], ESAPIType.OSCommand);

  }

  return Runtime.getRuntime().exec(newCmdArr, newEnvArr);   

 }
4

1 回答 1

1

这个答案可能为时已晚,但对其他人可能有用。尝试改用 encodeForOS ESAPI 方法:

    import org.owasp.esapi.ESAPI;
    import org.owasp.esapi.codecs.WindowsCodec;
    
    public Process exec(String[] cmd, String[] env) throws IOException {

       String[] newCmdArr = new String[cmd.length];
       String[] newEnvArr = new String[env.length];

       for(int i=0; i<env.length; i++){
          newEnvArr[i] = ESAPI.encoder().encodeForOS(new WindowsCodec(),env[i]);
       }

       for (int i=0; i<cmd.length; i++){
          newCmdArr[i] = ESAPI.encoder().encodeForOS(new WindowsCodec(),cmd[i]);
       }
     
     return Runtime.getRuntime().exec(newCmdArr, newEnvArr);
    }
于 2020-09-12T05:47:17.883 回答