文章目录

  • 方案调研
  • 方案一(放弃)
  • 方案二(成功)
  • 脚本流程
  • 增量检测
  • GitLab 配置
  • 项目地址


去年 log4j 漏洞爆发时候就已经很痛苦了,当时把所有的线上服务排查了一遍。没想到这都已经过去3个月了,上周又遇到了一个服务仍在使用低版本,被外部攻击,有点受伤。

这件事后,老板让我全量扫一遍我们的代码库,看还有哪些服务还在用老版本的 log4j,统一推一波修复,防止后续在发生此类事件。

方案调研

方案一(放弃)

当时我第一反应是写个脚本,遍历所有项目,再拉取项目到本地,通过正则匹配的方式识别代码中是否使用了 log4j,并提取版本,并根据版本号判断是否有漏洞。但后面想了下,这个漏洞检测方式不具备通用性。一是组件判断很麻烦,我们通常说的组件名和配置文件中的组件名根本不是一回事,不是很好对应,二是如果后边再有其他漏洞,还要重新写正则,着实麻烦。

方案二(成功)

在 GitHub 上搜了下开源项目,看看有没有能对项目做组件扫描的工具,找了半天找到了一个叫 MurphySec 的开源项目,比较满足我的需求。思路是写个脚本,先通过 GitLab 接口获取项目列表,然后 clone 代码到本地,然后通过 MurphySec 提供的客户端扫描,处理扫描结果获取目标漏洞组件。

脚本流程

为寻求便捷、高效,使用 python3 编写脚本,具体流程如下:

  • 通过 python-gitlab 包,调用 gitlabapi,获取项目列表及clone链接。
  • clone 代码到本地
  • 调用 Murphyscan 客户端,扫描项目
  • 处理扫描结果(扫描结果为 json 类型),遍历漏洞,发现目标漏洞打印项目名及项目提交者。
  • 删除 clone代码

增量检测

全量检测搞定,老板交代的任务算是搞完,心情愉悦,但有一个问题,如果哪个程序员手抖,引用组件时候,又引入一个低版本的,那老板岂不是要杀我祭天。怀着忐忑的心情调研了下怎么扫描增量服务。

经过调研发现,GitLab 有一个叫 webhook 功能。他的功能是,管理员可以指定push、merge等动作触发时,向某个指定接口通知该事件,这样我就可以知道有代码更新或者创建。拿到通知后我就去拉取最新代码,再扫描一次,发现有漏洞后通过机器人提醒我,这样增量检测就搞定了。

GitLab 配置

进入 GitLab 平台,点击顶部【菜单】-【管理员】进入管理中心

gitlab代码审计功能 gitlab代码检查_安全


1.选择系统钩子进入Webhook设置页面 2.URL处填写python起的webapi接口地址 3.下方触发器中确保【仓库更新事件】处于勾选状态 4.去掉【启用SSL验证】的默认勾选 5.点击【添加系统钩子】完成设置

gitlab代码审计功能 gitlab代码检查_python_02

项目地址

项目地址:https://github.com/murphysecurity/murphysec-gitlab-scanner