요즘 보안 스캐너들 보면 기능은 많은데 정작 왜 취약한지 설명이 빈약하다.
그래서 아예 처음부터 생각을 바꿨다.
“이 포트에서 이 서비스가 이 버전으로 돌아가고 있고,
이 코드 구조라서 이 취약점이 가능하다”
여기까지 한 번에 보여주면 어떨까 싶었다.
이 문서는 그 고민을 정리한 설계 문서다.
이 프로젝트의 방향성은 다음과 같다.
[Target]
|
v
[Port Scan]
|
v
[Service Fingerprinting]
|
v
[Static Analysis]
|
v
[CVE / Vulnerability DB Matching]
|
v
[Why 취약한지 + 방어 방법 리포트]
핵심은 각 단계가 느슨하게 결합된 플러그인 구조라는 점이다.
그래서 기능 추가가 부담이 없다.
동적 스캐닝만으로는 한계가 명확하다.
| 구분 | 한계 |
|---|---|
| 포트 스캔 | 열려 있다는 것만 알 수 있다 |
| 배너 그랩 | 정확한 내부 로직은 알 수 없다 |
| 동적 테스트 | 조건부 취약점 탐지가 어렵다 |
그래서 정적 분석을 붙이려는 거다.
정적 분석은 다음을 가능하게 한다.
즉, 왜 가능한지를 설명할 수 있다.
이 프로젝트는 GitHub 레포를 직접 분석 대상으로 삼는다.
/src
├── controllers
├── routes
├── services
└── config
이 구조라면 MVC 패턴 기반 웹 서비스라고 판단할 수 있다.
그 다음부터는 프레임워크별 룰을 적용한다.
기본 철학은 이거다.
기능 추가 = 플러그인 하나 추가
class PluginBase:
name = "base"
def match(self, context):
return False
def analyze(self, context):
return []
각 플러그인은
이 세 가지만 신경 쓰면 된다.
포트는 그냥 숫자가 아니다.
서비스 + 버전 정보가 진짜 핵심이다.
예시:
80/tcp -> nginx 1.18.0
3306/tcp -> MySQL 5.7
이 정보가 있으면 바로 다음 단계로 간다.
| 필드 | 설명 |
|---|---|
| cve_id | CVE-2023-xxxx |
| product | nginx |
| version | < 1.20 |
| severity | HIGH |
| description | 취약점 설명 |
| mitigation | 방어 방법 |
주기적으로 업데이트되도록 크론 잡으로 동기화한다.
이 프로젝트의 가장 중요한 부분이다.
단순 경고가 아니라 이해 가능한 설명을 목표로 한다.
| 항목 | 기존 스캐너 | 본 프로젝트 |
|---|---|---|
| 정적 분석 | 거의 없음 | 있음 |
| CVE 설명 | 링크만 제공 | 원인 설명 |
| 방어 가이드 | 단순 | 설정 단위 |
| 확장성 | 제한적 | 플러그인 기반 |
아직 완성된 도구는 아니다.
솔직히 말하면 기능도 부족하다.
하지만 방향성은 명확하다.
단순히 “취약하다”를 말하는 도구가 아니라
“왜 취약한지 이해시키는 도구”를 만들고 싶다.
앞으로는
이런 방향으로 계속 발전시킬 생각이다.
갈 길은 멀지만, 이 구조라면 충분히 확장 가능하다고 본다.