두 번째로 공개하는 오픈소스 프로젝트예요. 인가된 네트워크, 서버, 엔드포인트만 대상으로 CVE/CWE 기반 취약점을 점검하는 Python CLI vulnscan이에요.

GitHub: kh20134/vuln-scanner (MIT 라이선스)

관련 프로젝트: USB 매체제어 도구 usb-access-control 소개

왜 만들었나

취약점 관리는 결국 자산별로 해야 해요. 어떤 장비에 어떤 버전이 깔려 있는지 모르면 권고문을 읽어도 대응할 수가 없어요.

CVE는 매일 쏟아지는데 다 막을 수는 없어요. 그래서 실제 악용 목록인 CISA KEV와 악용 가능성 점수인 FIRST EPSS로 우선순위를 정하고 싶었어요.

  • 익스플로잇, 무차별 대입, 인증 시도는 하지 않아요.
  • 제가 운영하는 시스템을 방어적으로 점검하는 용도예요.
  • 런타임 외부 라이브러리 없이 Python 3.11 이상이면 돌아가요.

데이터 수집

공식 API와 다운로드 피드만 써요. HTML 스크레이핑은 하지 않아요.

  • NVD CVE API 2.0: lastModified 구간으로 증분 반영
  • MITRE CWE XML: 약점 이름과 분류
  • CISA KEV JSON: 실제 악용 여부
  • FIRST EPSS: 악용 가능성 점수

NVD 키는 환경 변수 NVD_API_KEY로만 넘겨요. 키가 없으면 요청 간격 6초, 있으면 0.6초를 두고, 날짜 창은 119일씩 나눠요.

EPSS는 로컬 CVE가 2,000건 이하면 API로 그 CVE만 보강하고, 더 많으면 일일 CSV 피드를 받아요.

모은 데이터는 로컬 SQLite에 저장해요. CVE ID, CVSS v3.x/v4.0, CWE, CPE 구성, KEV, EPSS가 들어가요. DB 파일은 gitignore로 저장소에 넣지 않고, 시연용 표본만 data/sample에 있어요.

점검 방식

네트워크

  • 지정한 호스트에 TCP 연결만 하고 배너로 제품·버전을 추정해요.
  • HTTP 포트에는 HEAD 요청만 보내요. nmap XML 반입도 돼요.
  • --i-am-authorized가 없으면 종료 코드 2로 멈춰요.

서버

  • dpkg/rpm, pip 패키지 목록을 CPE와 대조해요.
  • sshd_config에서 root 로그인, 비밀번호 인증 같은 설정을 CWE로 표시해요.

엔드포인트

  • OS와 커널, 설치 소프트웨어 목록을 만들어 대조해요.
  • 윈도우는 제거(Uninstall) 레지스트리 키를 읽어요.

보고서 화면

결과는 KEV, CVSS, EPSS를 반영한 위험 점수 순으로 정렬돼요. 표, JSON, CSV(UTF-8 BOM), 단일 HTML로 뽑고, 127.0.0.1 전용 대시보드도 있어요.

조치 문장은 NVD CPE의 버전 상한으로 만들어요. 그 값이 곧 벤더 수정 버전이라고 단정하지는 않아요.

vulnscan 표본 HTML 보고서, 합계 22건과 KEV 8건

(표본 데이터 실행 결과, 출처: 본인 깃허브)

vulnscan report 터미널 출력

(표본 데이터 실행 결과, 출처: 본인 깃허브)

2026년 10월 10일 표본으로 돌린 결과, 발견 22건 중 KEV가 8건이었어요. 운영 환경 점검이 아니라 저장소 표본 데이터라는 점은 꼭 구분해 주세요.

사용법

설치와 버전 확인이에요.

python -m pip install \
  -e ".[dev]"
vulnscan --version

표본 적재, 또는 최근 7일 공식 피드 반영이에요.

vulnscan update --sample
vulnscan update --days 7

nmap 결과 반입이에요. 인가 선언이 필수예요.

vulnscan network \
  --nmap-xml \
  examples/nmap-sample.xml \
  --i-am-authorized

로컬 서버·엔드포인트 점검이에요.

vulnscan server
vulnscan endpoint

HTML 보고서 생성이에요.

vulnscan report \
  --scan-id all \
  --format html \
  --out report.html

한계와 법적 고지

  • CPE 대조는 오탐과 미탐이 있어요.
  • NVD의 AND 구성(특정 OS 위의 특정 SW)은 풀지 않아요.
  • 매핑 표에 없는 소프트웨어는 목록에만 남고 CVE와 잇지 않아요.
  • 배포판 백포트 패치는 업스트림 버전만으로 구분하지 못해요.
  • KEV와 EPSS는 수집 시점 값이에요.
  • 상용 스캐너를 대체하지 않아요. 결과는 제조사 권고와 함께 봐 주세요.

네트워크 점검은 소유하거나 명시적으로 허락받은 대상에만 하세요. 인가 없는 포트 스캔은 정보통신망법, 형법 등에 저촉될 수 있어요.

--i-am-authorized는 운영자 선언일 뿐, 도구가 권한을 확인해 주지는 않아요.

앞으로 할 일

아래는 계획이에요. 일정은 정해지지 않았어요.

  • 패키지-CPE 매핑 표 확대
  • 배포판 보안 권고 연동으로 백포트 판별 검토
  • NVD AND 구성 해석 검토
  • sshd_config Include 처리, 대시보드 인증 검토

FAQ

외부 IP도 점검해도 되나요?

소유하거나 서면으로 허락받은 대상만 하세요. 도구는 0.0.0.0/0 같은 과도한 범위는 거부해요.

NVD API 키가 꼭 필요한가요?

아니요. 없어도 동작하고, 요청 간격만 길어져요.

결과가 나오면 바로 패치 대상인가요?

후보로 보세요. 백포트나 오탐 가능성이 있어 제조사 권고로 확인해야 해요.

마무리

자산을 알고, KEV와 EPSS로 먼저 막을 것을 고르는 게 이 도구의 목적이에요.

인가된 대상에서만 써 주시고, 의견은 GitHub 이슈로 편하게 남겨 주세요.

GitHub: https://github.com/kh20134/vuln-scanner