最近st2 框架又出漏洞了 一大堆java被执行命令了
这里我提一个解决方案 可以适当缓解服务端被漏洞进行rce漏洞的问题
LD_PRELOAD替换进程底层函数 首先请看这篇文章 如果是某位c++的大佬 您老就不用看了:)
我们来看看我们替换的函数
#include
#include
#include
#include
#include
int system(const char *command){
printf("system!阻止执行!\n");
return 0;
}
FILE * popen( const char * command,const char * type){
printf("popen!阻止执行!\n");
return 0;
}
int execl(const char *path, const char *arg, ...){
printf("execl!阻止执行!\n");
return 0;
}
int execlp(const char *file, const char *arg, ...){
printf("execlp!阻止执行!\n");
return 0;
}
int execle(const char *path, const char *arg, ...){
printf("execle!阻止执行!\n");
return 0;
}
int execv(const char *path, char *const argv[]){
printf("execv!阻止执行!\n");
return 0;
}
int execvp(const char *file, char *const argv[]){
printf("execvp!阻止执行!\n");
return 0;
}
正因为这些函数都是linux内核导出的函数 如果我们能阻止jvm执行这些底层的c族函数 就能达到本文的目的
下面我们开始实战
我们先用java写接口list2 执行 whoami 命令 list3 它执行了pwd命令
两个接口分别用了ProcessBuilder 和 Runtime.getRuntime().exec() 两种不同的方法
我们跑起来看看(为了看起来更为清爽 我直接用浏览器访问接口)
正常访问list2接口
正常访问list3接口
java运行我们的jar包的后 访问 list3接口 能看到正确获取了当前的 /root/ctest 目录
我们现在使用LD_PRELOAD再观察对比一下
list2 阻止了命令执行
这是输出的阻止信息
list3我们也来试试看
java不再可以执行系统命令了
以这种方法部署的java实例 可以有效地缓解命令执行漏洞 不过对于内存或文件读写还是没有什么好的办法
这种方法建议部署在类似于springboot这类的独立jar包部署的docker场景下
谢谢!