JumpServer是一个开源的堡垒机,server端使用python编写开发,开源地址在https://github.com/jumpserver/jumpserver
。
在上周五被爆出一个远程命令执行漏洞,这个远程命令执行主要由一个log日志跨目录读取引发。
漏洞影响版本:
< v2.6.2
< v2.5.4
< v2.4.5
= v1.5.9
>= v.15.3
漏洞主要由两部分组成:
跨目录读取log日志来获取token
利用获取的token构造ws通信payload,在jumpserver所管理的服务器进行命令执行。
本文主要对1部分进行分析,也是漏洞利用的前提关键条件。
log日志读取漏洞触发主要在apps/ops/ws.py
文件,关键代码为task_log_f = open(log_path, 'rb')
,位于wait_util_log_path_exist函数。
def wait_util_log_path_exist(self, task_id): log_path = get_celery_task_log_path(task_id) while not self.disconnected: if not os.path.exists(log_path): self.send_json({'message': '.', 'task': task_id}) time.sleep(0.5) continue self.send_json({'message': '\r\n'}) try: logger.debug('Task log path: {}'.format(log_path)) task_log_f = open(log_path, 'rb') return task_log_f except OSError: return None
apps/ops/ws.py
的receive函数引入污点污点由websocket通信进来。查阅相关文档,函数receive中的text_data为用户可控的参数。
JsonWebsocketConsumer
污点引入
handle_task
read_log_file
日志读取返回也是在此处,循环读取4096btypes,然后sleep(0.2)
。
get_celery_task_log_path
xcheck检查结果如下,仅耗时2s:
xcheck检查结果
结果详情
这是我们适配channels.generic.websocket
之后的检查结果,这个适配添加过程仅仅是将receive
方法的参数设置成污点,剩下的这长长的调用链都可由xcheck自动化完成。
传递链
漏洞复现:
搭建成功
读取/tmp下log文件验证
实际利用可读取默认log目录/opt/jumpserver/core/logs
下的日志文件获取token等敏感信息。
漏洞利用进行命令执行的部分本文不进行赘述,可参考《Jumpserver 任意命令执行漏洞分析报告》这篇文章。
修复建议:《JumpServer 远程命令执行漏洞风险通告,腾讯安全全面检测》 https://mp.weixin.qq.com/s/yB7pSlG2ZFz65JDf5A-1Mg
《Jumpserver 任意命令执行漏洞分析报告》https://mp.weixin.qq.com/s/mJ7nY1r2QWeNzaRK6aZViA
想了解Xcheck更多信息或者代码安全审计相关技术欢迎关注xcheck公众号~