问题描述
|
我想使用Java Java库来调用可执行文件。 ѭ1对象是否可以防止命令行注入?例如,如果我打电话:
String singleStringArgument = \"-whatever;rm -rf ~/*\"; // evil looking argument!
CommandLine cl = new CommandLine(new File(pathToExe,exeName));
cl.addArgument(singleStringArgument); // oh no!
Executor exe = new DefaultExecutor();
exe.execute(cl);
除预期的命令外,ѭ3还将运行吗?如果可以,防止这种情况的最佳方法是什么?
API说“ 4” \“句柄”,但我不确定在这种情况下这意味着什么。我可以整理一个测试用例,看看我的linux机器上发生了什么,但是我想确保它在其他平台上也是安全的。
解决方法
“ 5”是外壳的特征。如果您未在ѭ6或类似的地方创建命令行,则不会被注入。并不是说公用程序是安全的,而是您甚至没有运行带有漏洞的程序。
Commons CLI包装了Process类。没有记录Process类来启动外壳。它被证明可以对指定的参数进行ѭ7运算。
根据评论,开放源代码的奇迹之一就是您可以阅读源代码。如果commons-CLI的X版本满足您的要求,请依靠它,并且在不重新检查的情况下不要进行升级。
, 因此,您控制命令(pathToExe)并只担心参数吗?您对命令的了解程度如何?它有可能执行另一个程序吗?即使不调用辅助命令,它是否也可能会造成某些损坏?程序是否还有其他漏洞(缓冲区溢出等)?
作为一个普遍的答案,这种方法对我来说似乎很奇怪,尤其是如果您希望这种方法可以跨平台工作。如果您知道要执行的命令并且可以限制输入,那么您也许可以吱吱作响,但就我个人而言,除非有充分的理由这样做,否则我不会使用此方法。
, 我的建议是,如果可能的话,使程序在安全方面犯错,并且只发出命令本身,而不笨拙地执行命令片段或传递最终用户发出的参数。注射有很多变化。
;
已经讨论过了。您还可以使用反引号(反引号中的rm -rf ~/*
使外壳首先解释它)用户还可以意外或有意地调用别名。可能出错的事情列表无穷无尽。