git-vuln-finder/git_vuln_finder/pattern.py

74 lines
1.7 KiB
Python
Raw Normal View History

2020-01-06 06:44:35 +00:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Finding potential software vulnerabilities from git commit messages
#
# Software is free software released under the "GNU Affero General Public License v3.0"
#
# This software is part of cve-search.org
#
# Copyright (c) 2019-2020 Alexandre Dulaunoy - a@foo.be
import os
import re
2020-01-06 07:08:08 +00:00
from collections import defaultdict
def tree():
"""Autovivification.
Call it a tree or call it 'patterns'.
"""
return defaultdict(tree)
2020-01-06 06:44:35 +00:00
2020-01-06 06:50:21 +00:00
PATTERNS_PATH = "./git_vuln_finder/patterns"
2020-01-06 06:44:35 +00:00
def build_pattern(pattern_file):
fp = open(pattern_file, "r")
rex = ""
try:
prefix_fp = open(pattern_file + ".prefix", "r")
rex += prefix_fp.read()
prefix_fp.close()
except:
pass
for line in fp.readlines():
rex += line.rstrip() + "|"
2020-01-06 06:50:21 +00:00
rex = rex[:-1] # We remove the extra '|
2020-01-06 06:44:35 +00:00
fp.close()
try:
suffix_fp = open(pattern_file + ".suffix", "r")
rex += suffix_fp.read()
suffix_fp.close()
except:
pass
return rex
def get_patterns(patterns_path=PATTERNS_PATH):
2020-01-06 07:08:08 +00:00
patterns = tree()
2020-01-06 06:44:35 +00:00
for root, dirs, files in os.walk(patterns_path):
path = root.split(os.sep)
for f in files:
if f.endswith(".prefix") or f.endswith(".suffix"):
continue
2020-01-06 06:50:21 +00:00
npath = root[len(patterns_path) :].split(os.sep)
2020-01-06 06:44:35 +00:00
try:
2020-01-06 06:50:21 +00:00
npath.remove("")
2020-01-06 06:44:35 +00:00
except ValueError:
pass
lang = npath[0]
severity = npath[1]
pattern_category = f
2020-01-06 07:08:08 +00:00
rex = build_pattern(root + os.sep + f)
patterns[lang][severity][pattern_category] = re.compile(rex)
2020-01-06 06:44:35 +00:00
return patterns