2023-03-31,   Gun-ha, KANG

이번 포스팅에서는 CVE-bin-tool(PyPi)에 대해 공유해보려고 합니다.

CVE-bin-tool

자신이 사용하고 있는 라이브러리에 대한 취약점 정보를 쉽게 확인할 수 있는 도구입니다. Python, Java 등을 지원하며, 각 언어별로 사용하는 라이브러리 정보를 입력하여 취약점 정보를 확인할 수 있습니다. 또한, NVD(National Vulnerability Database) API를 사용하여 최신 취약점 정보를 가져올 수 있습니다.

CVE(Common Vulunerabilities and Exposure)

CVE는 공통 취약점 및 노출(CVE, Common Vulnerabilities and Exposures)의 약자로, 정보보안 취약점 표준 코드를 의미합니다. 이전에는 각 기관이나 업체마다 고유한 보안 취약점이 있었다면, CVE로 인해 다양한 취약점을 표준화하여 고유한 넘버링을 부여했습니다.

CVE 번호의 형식은 “CVE-년도-고유번호”입니다. 이러한 CVE 번호에 대해 CVSS(Common Vulnerability Scoring System) 점수를 매겨 취약점의 심각도를 평가합니다. CVSS 점수는 0.0~10.0까지의 범위를 가지며, 점수가 높을수록 취약점의 위험도가 높습니다.

  • 0.1~3.9점 : 저위험군
  • 4.0~6.9점: 중위험군
  • 7.0~8.9점: 고위험군
  • 9.0~10.0점: 치명적 위험군

참고) CVE는 취약점을 식별하기 위한 표준 코드이며, NVD는 CVE 정보를 관리하고 제공하는 공식 취약점 데이터베이스

장점

  • CLI 기반의 도구
    • 자동화된 스크립트나 CI/CD 파이프라인과 연동하여 쉽게 취약점 정보를 검색 가능
  • 로컬에 저장된 requirements.txt, pom.xml 파일에서 라이브러리 정보를 추출해 취약점 정보를 검색 가능

  • NVD 에서 제공하는 데이터를 이용하여 취약점 정보를 검색

  • 오픈소스(+Apache 2.0 license), Github에서 소스코드 확인 가능

0. 테스트에 사용된 requirements.txt

Flask==1.1.2
SQLAlchemy==1.4.22
pyjwt==2.2.0
pyyaml==5.4.1
pymongo==3.12.0
jinja2==2.11.3
werkzeug==2.0.2
requests==2.26.0
django==3.2.7
psycopg2-binary==2.9.1
tensorflow==2.6.0

1. 설치

pip install cve-bin-tool

2. 라이브러리 정보 추출 및 입력 형식 변환

import subprocess
import re

# requirements.txt 파일에서 라이브러리 정보 추출하는 함수
def extract_libraries_from_requirements(requirements_file_path):
    libraries = []
    with open(requirements_file_path, 'r') as file:
        for line in file:
            match = re.match(r'^([A-Za-z0-9_-]+)==([\d\.]+)', line.strip())
            if match:
                library_name = match.group(1)
                library_version = match.group(2)
                libraries.append((library_name, library_version))
    return libraries

# cve-bin-tool의 입력 형식으로 변환하는 함수
def convert_to_cve_bin_tool_input(libraries):
    input_lines = []
    for library in libraries:
        input_line = f'{library[0]}:{library[1]}'
        input_lines.append(input_line)
    return '\n'.join(input_lines)

3. cve-bin-tool 실행

result = subprocess.run(['cve-bin-tool', '-i', '-', '-f', 'json', '--nvd-api-key', '<own-NVD-API>'], input=input_str, capture_output=True, text=True)

추가) cmd 에서 cve-bin-tool 실행

CMD 에서는 입력형식에 상관없이 requirements.txt, pom.xml 을 바로 실행 시킬 수 있습니다.

cmd> cve-bin-tool -L requirements.txt -f pdf --nvd-api-key <own-NVD-API>

실행 결과 (CVE Details와 비교)

cmd에서 pdf로 출력한 결과, 해당 버전의 Werkzeug 에서 발견된 취약점이 나열된 것을 볼 수 있습니다.

cve-bin-tool에서 HIGH로 취약점 심각도(severity) 가 나오는 것과 CVE Details 에서 0점(CVSS)이 나온 결과의 차이는 각각의 계산 방식과 요소 고려에 차이가 있기 때문으로 자체적 계산 결과에 대해서는 조금 다른 것으로 생각할 수 있습니다.

  • cve-bin-tool 실행 결과 (pdf 출력)

Screenshot_2

  • CVE Details 에서 확인한 정보

Screenshot_1

정리

CVE Details에서 자바나 파이썬 라이브러리에 대해 직접 검색하여 취약점을 확인할 수 있으나, 라이브러리마다 검색해야 하며 결과에 대해서 페이지에 나오는 정보를 모두 해석하기는 어렵습니다.

반면에 CVE-bin-tool은 명령어를 이용해 한번에 여러 라이브러리 취약점 정보를 가져온다는 측면과 해당 결과에 대한 pdf 등의 다양한 출력 형태를 정리해서 제공한다는 점과 NVD API를 사용하여 최신 취약점 정보라는 점에서 충분히 활용할 부분이 보인다고 생각합니다.

참고 자료


Contact Author. KangGunha Email. zxcvbnm9931@epozen.com

업데이트: