在Linux shell的Java代码中安全地执行tar命令



我正在解决一个问题,我必须从Java代码中执行tar命令

tar -xcv output_file_name source_directory

代码

String cmd = "tar -cvzf /tmp/logs.tar.Z /home/test/log/status.*"
try {
Process p1 = Runtime.getRuntime().exec(cmd);
p1.waitFor();
} catch (IOException e) {
e.printStackTrace();
} 

上面的代码是工作的,但它是失败的第三方安全测试与命令注入的可能性。

我已经尝试通过添加regex来消毒我的输入命令,但漏洞仍然相同。

有谁能帮忙处理这个场景吗?在这方面的任何帮助都是非常感谢的。

首先,我认为这根本行不通。exec(cmd)调用将不能正确处理/home/test/log/status.*命令行参数…假设您希望status.*匹配所有以"status."开头的文件。在那个目录里。exec方法不理解shell语法,如globbing。

接下来,-v选项将tar文件中包含的文件名输出到标准输出。但是您不是在消费标准输出。你应该删除

选项我猜是安全工具在抱怨你没有使用tar的绝对路径。有可能$PATH将包括(比如说)"…然后在当前目录下执行一个伪tar命令。

所以命令应该是这样的:

Process p1 = Runtime.getRuntime().exec(
"/bin/sh", "-c", 
"/bin/tar -czf /tmp/logs.tar.Z /home/test/log/status.*");

如果这不能解决问题,请告诉我们您使用的是哪种安全工具,并向我们展示完整的消息,包括任何错误编号。如果我们有更多的细节,我们也许能弄清楚它在抱怨什么。

最新更新