Java ProcessBuilder安全威胁?

时间:2017-05-24 07:39:11

标签: java security processbuilder

我们的服务器应用程序正在使用通过Java <properties> <hudson.security.AuthorizationMatrixProperty> <blocksInheritance>true</blocksInheritance> </hudson.security.AuthorizationMatrixProperty> </properties> 方法启动的WKHTMLTOPDF进程生成PDF文件。

此过程的命令行是根据HTTP请求的参数生成的。

由于无法确保请求有效,我们应该通过这种方法了解任何与安全相关的问题吗?

3 个答案:

答案 0 :(得分:2)

您应该查看沙盒生成的过程。例如,使用jail或容器,如Docker。这样,如果攻击者找到了进行某种参数注入的方法,那么至少损坏包含在您允许沙箱执行的操作中。通常,请阅读running untrusted processes

  

例如,可以在服务器上执行任何命令吗?

是的,您应该在假设下工作,这是可能的。因此,沙盒的过程。

答案 1 :(得分:1)

为确保没有安全问题,请考虑以下几点:

  1. 确保该进程在某些目录之外没有权限 例如,如果进程依赖于jar,则权限应为640,如果要在某个目录中生成PDF,权限可以为750,依此类推。
  2. 确保所有请求都经过正确审核,并且PDF生成过程不会在目录控制器中生成日志
  3. 确保已接收的输入参数已清理,以避免使用特殊字符和其他问题,如XSS,SQL注入(如果您正在联系数据库)。这些参数在到达PDF生成过程之前已经过消毒
  4. 为了避免随机客户端或网页发送的请求,您可以在生成的表单中包含nonce(如果您正在使用),然后在请求返回时验证nonce并将其删除。
  5. 确保您的应用程序位于SSL / TLS终止端点而不是直接访问
  6. 同样,安全性是一个主观问题,取决于管理员/架构师在设计和部署应用程序时的谨慎程度。此外,如果可能的话,可能会在Docker或类似的容器中容纳您的应用程序

答案 2 :(得分:0)

所有输入都应被视为潜在恶意,建议进行输入验证。

ProcessBuilder相对安全,但如果用户可以控制所有参数,如

ProcessBuilder pb = new ProcessBuilder(userInput[0], userInput[1], userInput[2]);

然后用户可以注入任何命令,这显然很危险。

如果你控制第一个参数,比如

ProcessBuilder pb = new ProcessBuilder("hardCodedCommand", userInput[0], userInput[1]);
这将是安全的。但是我仍然强烈建议验证用户输入。如果参数应为数字或仅包含字母数字字符的字符串,请检查此项并在不是这种情况时失败。