起因

最近一台服务器出现服务器资源 cpu、内存过高的情况,通过对进程的分析,发现是 gitlab 容器进程,怀疑是 gitlab 被入侵运行了挖矿病毒,通过对 gitlab 日志的分析,可以得出入侵者是利用了 gitlab 的 CVE-2021-22205 的漏洞,对 gitlab 进行了攻击。

CVE-2021-22205 介绍

CVE-2021-22205是一个严重的严重性漏洞(CVSS 10.0),它是由第三方文件解析器Exif-Tool对图像文件进行不当验证的结果,导致远程命令执行漏洞,可能导致您的GitLab实例被攻击。

以下版本受到漏洞影响:

  • 11.9.x - 13.8.7
  • 13.9.0 - 13.9.5
  • 13.10.0 - 13.10.2

解决

gitlab 发布了 GitLab 13.10.3、13.9.6 和 13.8.8 版本来解决这个漏洞。请尽快升级。

如果无法即使更新和使用热更新补丁解决,可以通过将exiftool脚本替换为cat -。这个解决方案将防止从上传的图像中剥离所有的exif数据。

将 /opt/gitlab/embedded/bin/exiftool 脚本内容替换为

1
2
3
#!/bin/bash

cat -

这种方法不是长久之计,每次重启容器时都要手动修改文件,还是尽快更新版本。

原因

根据gitlab的官方漏洞issues来看,当访问接口/uploads/user上传图像文件时,GitLab Workhorse会将扩展名为jpg、jpeg、tiff文件传递给ExifTool。用于删除其中不合法的标签。具体的标签在workhorse/internal/upload/exif/exif.go中的startProcessing方法中有定义,为白名单处理。

而ExifTool在解析文件的时候会忽略文件的扩展名,尝试根据文件的内容来确定文件类型,其中支持的类型有DjVu。

关键在于ExifTool在解析DjVu注释的ParseAnt函数中存在漏洞,所以我们就可以通过构造DjVu文件并插入恶意注释内容将其改为jpg后缀上传,因为gitlab并未在这个过程中验证文件内容是否是允许的格式,最后让ExifTool以DjVu形式来解析文件,造成了ExifTool代码执行漏洞。

该漏洞存在于ExifTool的7.44版本以上,在12.4版本中修复。Gitlab v13.10.2使用的ExifTool版本为11.70。并且接口/uploads/user可通过获取的X-CSRF-Token和未登录Session后来进行未授权访问。最终造成了GitLab未授权的远程代码执行漏洞。

其它

gitlab 提供了对 gitlab 安全的一些最佳实践: https://about.gitlab.com/blog/2020/05/20/gitlab-instance-security-best-practices/

参考