当前位置: 首页 > 后端技术 > Java

10分钟对公司gitlab代码仓库进行一次安全检查

时间:2023-04-01 17:12:06 Java

本文由用户Pumpkin投稿。去年log4j漏洞爆发的时候就已经很痛苦了。当时检查了所有在线服务。没想到,3个月了。上周,我遇到了一个还在使用低版本的服务。被外面的人袭击了,我受了一点伤。这件事之后,老大让我扫一扫我们的代码库,看看还有哪些服务还在使用老版本的log4j,统一推送一波修复,防止以后再发生此类事件。计划研究计划一(已弃)当时我的第一反应是写一个脚本,遍历所有项目,然后把项目拉到本地,通过正则匹配识别代码中是否使用了log4j,提取版本,然后根据版本号判断是否存在漏洞。但是后来想想,这种漏洞检测方式并不具有普适性。一是组件判断很麻烦。我们平时说的组件名和配置文件中的组件名不一样,并不是很好的对应。第二,如果后面还有其他漏洞,重写regex确实很麻烦。方案二(成功)我在github上搜索开源项目,看有没有可以扫描项目组件的工具。找了半天,找到了一个开源项目Murphyscan,比较符合我的需求。思路是写一个脚本,先通过gitlab接口获取项目列表,然后将代码clone到本地,然后通过Murphyscan提供的客户端进行扫描,对扫描结果进行处理,获取目标漏洞组件。脚本过程为了寻求方便和效率,使用python3来编写脚本。具体过程如下:使用python-gitlab包调用gitlabapi获取项目列表和clone链接。克隆代码在本地调用Murphyscan客户端,扫描项目,处理扫描结果(扫描结果为json类型),遍历漏洞,找到目标漏洞并打印项目名称和项目提交者。删除clone代码再进一步,增量检测和全量检测都搞定了。老大交代的任务算是完成了,心情还算愉快,但是有个问题。如果哪位程序员在引用组件的时候握手,引入低版本,那老板就不会杀我祭天了。怀着忐忑的心情,我研究了如何扫描增量服务。经过排查,发现gitlab有一个叫webhook的功能。它的作用是管理员可以指定在触发push、merge等动作时,将事件通知到指定的接口,让我知道有代码更新或创建。收到通知后,我会拉取最新的代码,再次扫描,如果有漏洞,通过机器人提醒我,这样增量检测就完成了。gitlab配置进入Gitlab平台,点击顶部【菜单】-【管理员】进入管理中心,选择系统钩子,进入Webhook设置页面的URL,填写来自python的webapi接口地址,在下面触发器,确保【仓库更新事件】勾选,去掉【启用SSL验证】默认勾选,点击【添加系统钩子】完成设置。Webapi通过fastapi启动一个web服务。它的作用主要是接收gitlab的webhook事件推送。收到事件后,拉取项目代码,扫一扫,扫描结果也会通过飞书机器人推送给我,检测有问题的物品。目前代码还存在一些问题待优化。主要原因是当前进程还是单线程的。我们公司的项目量和代码更新量都比较小。如果代码更新频繁,可能会导致使用过多的webapi线程,导致服务崩溃。.以后会通过任务队列的形式将webhook接口和漏洞检测分开,通过任务队列来管理检测任务。项目地址本项目已贡献给MurphySecurity,项目地址:https://github.com/murphysecurity/murphysec-gitlab-scanner.git