组件版本漏洞检测工具的简单开发

0x01 前言


在Java代码审计中,需要对引用的第三方组件进行审计,采用的审计方式经过了三个阶段:

  • 前期:一个个收集引用的第三方组件和版本号,继而一个个询问度娘
  • 中期:了解并收集使用范围较广、影响危害较大的组件漏洞,有争对性的进行排查
  • 后期:利用第三方插件或者自己编写工具利用第三方接口来获取组件漏洞信息

需求分析,实现包括但不局限于以下功能:

  • 根据pom.xml或者第三方组件所在目录,自动解析获取引用的第三方组件和版本号
  • 生成的结果可以导出为excel表格,内容包括漏洞名称、目标组件版本、漏洞影响范围、漏洞等级、漏洞CVE编号、漏洞披露时间、是否容易利用、参考链接等信息
  • 会检查完整的依赖关系

在使用了几款插件后发现都不太能满足个人需求后,遂决定自己编写工具来实现。

0x02 概念了解


  • Maven

maven是一个用于构建和管理Java项目的工具。Maven多以运行插件的方式来达成执行目标。 常用的插件有maven-compiler-plugin、maven-clean-plugin、maven-dependency-plugin等等。

Maven在版本管理时候可以使用几个特殊的字符串 SNAPSHOT,LATEST,RELEASE。比如"1.0-SNAPSHOT"。各个部分的含义和处理逻辑如下说明:

  • SNAPSHOT:这个版本一般用于开发过程中,表示不稳定的版本。
  • LATEST:指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个snapshot版,具体看哪个时间最后。
  • RELEASE:指最后一个发布版
  • POM

项目对象模型。作为Maven工程配置文件,它是一个Maven项目的XML表示,默认保存在pom.xml文件中。在maven工程中,我们依靠在pom.xml文件进行配置完成jar包管理工作。

  • Dependency

依赖项声明了当前项目所依赖的其他项目。

Maven 通过 groupId、 artifactId 与 version 三个向量来定位Maven仓库其jar包所在的位置,并把对应的jar包引入到工程中来。

jar包下载流程如下:

0x03 工具编写


  • 1. 利用beautifulsoup4模块解析pom.xml文件,简单示例代码:
def get_third_party_components_information(xmlfile):
    with open(xmlfile, 'r', encoding='utf-8') as rfile:
        data = rfile.read()
    if str(xmlfile).endswith('xml'):
        third_party_list, target_third_party_list = [], []
        soup = Bp(data, 'xml')
        datas = soup.find_all("dependency")
        for single_data in datas:
            groupId = str(single_data.groupId).replace('<groupId>', '').replace('</groupId>', '')
            artifactId = str(single_data.artifactId).replace('<artifactId>', '').replace('</artifactId>', '')
            third_party_list.append(f'{groupId}:{artifactId}')
            version = str(single_data.version).replace('<version>', '').replace('</version>', '')
            if re.search(r'[0-9\.]{3,}', version):
                target_third_party_list.append(f'{groupId}:{artifactId}:{version}')
            elif version.startswith('${'):
                version = version.lstrip('${').rstrip('}')
                version = str(soup.find_all(version)[0]).replace(version, '').replace('</', '').replace('<', '').replace('>', '')
                target_third_party_list.append(f'{groupId}:{artifactId}:{version}')
            else:
                target_third_party_list.append(f'{groupId}:{artifactId}:[]')

利用xpath定位获取想要的数据,如漏洞名称、影响的组件及版本号、披露时间、漏洞编号、漏洞等级等相关信息

  • 3. 利用 retrying 模块,重试访问第三方漏洞库过程中一些可能运行失败的程序段,最大次数为3
from retrying import retry

@retry(stop_max_attempt_number=3)
def get_data(target_url, target_third_party):
    ......
  • 4. 设置自适应宽度,标题行背景颜色和字体格式,将结果写入excel表格
  • 5. 利用 PySimpleGUI 模块编写简单图形界面
def generate_gui():
    global page_num, results, third_party_list, target_third_party_list
    sg.theme('DarkAmber')
    layout = [
        [sg.Text('选项①:请指定pom.xml或者.classpath文件:')],
        [sg.In(size=(50, 1), enable_events=False, key='file'), sg.FileBrowse('Choose File')],
        [sg.Text('选项②:请选择第三方组件所在目录 (/WEB-INF/lib)')],
        [sg.In(size=(50, 1), enable_events=False, key='file_path'), sg.FolderBrowse(button_text='Choose Folder')],
        [sg.Text('请选择输出路径:(默认输出路径为桌面)')],
        [sg.InputText(os.getcwd(), key='folder', size=(50, 1)), sg.FolderBrowse(button_text='Choose Folder',target='folder')],
        [sg.Frame(layout=[
    [sg.Radio('选项一', "RADIO1", key='one', default=True, size=(17, 1)), sg.Radio('选项二', "RADIO1", key='two', size=(17, 1))],
        [sg.Checkbox('检查完整的依赖关系 (仅限pom.xml)', key='all', default=False)]], title='Options', title_color='red', relief=sg.RELIEF_SUNKEN, tooltip='需在对应选项上选择文件或目录')],
        [sg.Button('Run', border_width=2, size=(10, 1), auto_size_button=True, pad=((190, 0), (20, 0)))]
    ]
    window = sg.Window('Third_party_components_scanner          By:book4yi', layout)
    window.DisableClose = False

工具演示使用:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容