공격자가 귀사에 대해 볼 수 있는 모든 것 매핑하기: CVEngine 실습 가이드
요약
CVEngine은 공격 표면을 평가하는 무료 오픈 소스 플랫폼입니다. 이 도구는 자산 발견, 서비스 버전 식별(fingerprinting), CVE 매칭 및 AI 분류를 하나의 연속적인 루프로 통합합니다. 본 가이드는 사용자가 자체 호스팅 환경에 CVEngine을 설치하고, 실제 타겟에 대한 검증 과정을 따라 할 수 있도록 안내하는 실습 가이드입니다.
핵심 포인트
- CVEngine은 자산 목록, 취약점 목록, CVE 피드를 통합하여 공격 표면을 평가합니다.
- 발견부터 핑거프린팅, 매칭, AI 분류까지의 과정을 단일 루프로 제공합니다.
- 자체 호스팅이 가능하며, GPL-3.0 라이선스의 오픈 소스 플랫폼입니다.
- 사용을 위해서는 Docker와 Linux 서버 환경(최소 4GB RAM)이 요구됩니다.
AI Frontier Post에 최초 게시됨: [https://aifrontierpost.com/articles/cvengine-attack-surface-assessment-hands-on-tutorial/]
대부분의 보안 도구는 자산(assets), 결함(flaws), 또는 CVE 피드 중 하나를 제공합니다. CVEngine은 이 세 가지 요소를 하나의 루프에서 모두 실행합니다. 즉, 인터넷에 노출되는 것을 발견하고, 모든 서비스와 버전을 핑거프린팅(fingerprinting)하며, 오늘날 악용되는 CVE들을 해당 인벤토리와 대조하고, AI가 결과를 분류하여 최종 판정(verdict)을 내리도록 합니다. 이 가이드는 CVEngine 설치 방법과 사용법을 안내하며, 사용자가 소유한 타겟에 이를 연결하고 발견부터 검증까지의 과정을 한 가지 사례를 통해 따라갑니다.
요약: CVEngine은 무료로 자체 호스팅할 수 있는 공격 표면 플랫폼입니다. 하나의 Docker Compose 스택이 인터넷에 노출된 자산을 발견하고, 실제로 운영 중인 것과 악용되는 CVE들을 대조하며, 각 발견 사항을 최종 판정으로 분류합니다. 이 가이드를 통해 단 하나의 명령어로 설치를 완료하고, 첫 번째 승인된 타겟을 추가한 후, API와 에이전트가 사용하는 읽기 전용 검증 결과를 확인하는 과정까지 안내합니다.
- 제작 주체: CVEngine (GitHub의 hevnsnt/CVEngine).
- 내용: 발견(discovery), 핑거프린팅(fingerprinting), CVE 매칭, AI 분류(triage), 그리고 읽기 전용 검증을 하나의 루프로 제공하는 무료 자체 호스팅 외부 공격 표면 플랫폼입니다.
- 시기: 2026년 10월 24일 생성; 작성 시점(2026년 10월 27일) 기준 GitHub 스타 404개, 포크 61개.
- 요구 사항: 최소 4GB RAM (편안하게는 8GB), 20GB의 여유 디스크 공간을 가진 Linux 서버(Debian 또는 Ubuntu가 가장 쉽습니다); Docker가 설치되어 있어야 합니다.
- 라이선스: GPL-3.0.
- 핵심 루프: bbot 발견, nmap/naabu 인벤토리, nuclei 검사, fire, smoke, 또는 ice 등급의 CVE 매칭, AI 분류(triage), 그리고 호스트당 0–100점 점수를 부여하는 읽기 전용 검증.
매핑된 공격 표면. 이미지: AI Frontier Post.
보안 팀에 인터넷상에서 어떤 자산을 보유하고 있는지 물어보면 보통 세 가지 다른 답변을 받게 됩니다. 한 도구의 자산 목록, 또 다른 도구의 취약점 목록, 그리고 어느 쪽에도 매칭되지 않은 CVE 피드입니다. 이 목록들 사이의 간극이야말로 보안 침해가 발생하는 지점입니다. 잊힌 서브도메인, 열려 있는 데이터베이스 포트, 오늘날 악용되고 있는 CVE와 조용히 일치하는 서비스 버전 등이 그 예시입니다. CVEngine은 바로 이 간극을 메우기 위해 존재합니다. 이는 무료로 사용할 수 있고 오픈 소스이며 자체 호스팅(self-hosted) 플랫폼으로, 발견(discovery), 핑거프린팅(fingerprinting), CVE 매칭, AI 트리아지(triage), 검증(validation)을 하나의 연속적인 루프로 실행하며, 단순히 경고 목록 더미를 제공하는 대신 각 발견 건에 대한 판결(verdict)을 제시합니다.
이 프로젝트는 빠르게 등장했습니다. 2026년 10월 24일에 생성되었음에도 불구하고 사흘 만에 깃허브 스타(GitHub stars) 404개와 포크(forks) 61개를 기록했으며, GPL-3.0 라이선스로 배포되었습니다. 이러한 속도는 증거라기보다는 신호입니다. 따라서 본 가이드는 프로젝트 문서와 명령어의 기능에만 초점을 맞춥니다. 아래 모든 내용에는 하나의 규칙이 적용되는데, 바로 이 프로젝트 자체의 규칙입니다. 즉, 자신이 소유하거나 테스트할 권한을 부여받은 시스템만을 스캔해야 합니다. CVEngine은 4단계에서 볼 수 있듯이 그 일부를 자체적으로 강제하지만, 책임은 사용자에게 있습니다.
준비물
- Linux 서버: Debian 또는 Ubuntu가 가장 쉽습니다. 설치 프로그램이 나머지를 처리합니다. 최소 4GB의 RAM(여유 있게는 8GB)과 20GB의 여유 디스크 공간이 필요합니다.
- 소유하거나 테스트할 권한을 부여받은 도메인, IP 범위 또는 URL: 타겟을 추가하는 순간 발견 작업이 시작되므로, 설치하기 전에 미리 결정해 두십시오.
- 첫 빌드에 약 30분이 소요되며, 대부분의 시간이 Docker 이미지 빌드에 할애됩니다. 그 이후에는 스택이 몇 초 만에 작동합니다.
- 선택 사항: AI 키(Anthropic, OpenAI 또는 OpenRouter) 또는 Ollama나 vLLM을 통한 로컬 모델. 이것들이 없어도 발견, 스캔, 매칭 및 검증은 여전히 작동하지만, AI를 사용하면 트리아지, 타겟팅된 스캔, 템플릿 초안 작성 기능이 추가됩니다.
1단계: 하나의 명령어로 설치하기
서버에서 저장소를 클론하고 설치 프로그램을 실행합니다. 아무것도 묻지 않습니다:
git clone https://github.com/hevnsnt/CVEngine.git
cd CVEngine
sudo ./install.sh
설치 프로그램은 시스템을 확인하고 누락된 항목(Debian 및 Ubuntu의 경우: curl, make, python3, git, openssl, Docker, 그리고 Compose 플러그인; 다른 Linux의 경우 Docker를 설치하고 나머지는 이름만 지정)을 설치합니다. 모든 비밀 정보를 생성하고, 사용할 주소를 감지하며, HTTPS 인증서를 생성하고, CVEngine을 빌드 및 시작한 후, 응답할 때까지 기다렸다가 주소, 사용자 이름, 그리고 생성된 암호를 출력합니다. 터미널에서 해당 암호를 복사하세요. 이 암호는 한 번만 표시되며, 첫 로그인 시 직접 설정하게 됩니다. 만약 분실했다면, make admin-password를 사용하여 관리자 계정의 새 암호를 출력할 수 있습니다 (설치 프로그램이 root로 실행된 경우 sudo 사용). 감지된 주소 대신 실제 도메인으로 서비스를 제공하려면 sudo ./install.sh --domain scanner.example.com을 실행하세요. 설치 프로그램을 다시 실행하는 것은 안전합니다. 설정, 인증서 및 데이터가 유지되며 이미 체크아웃한 코드를 기반으로 재빌드됩니다. 새로운 코드를 가져오지 않으므로 업데이트는 scripts/update.sh를 사용하세요.
만약 직접 단계를 실행하고 싶다면, Docker Engine, Compose 플러그인, git, make, python3이 설치된 모든 Linux 환경에서 (릴리스 아카이브가 아닌) git clone을 통해 다음 명령어를 사용할 수 있습니다:
./scripts/init-env.sh # .env 파일을 생성: 암호를 생성하고 DOMAIN_NAME을 이 시스템의 주소로 설정합니다
make certs # 내장 프록시용 HTTPS 인증서
make up # 빌드 및 시작
...
대신 직접 비밀번호를 선택하려면, make up 전에 .env 파일의 DJANGO_SUPERUSER_PASSWORD에 입력하거나 make username을 실행하세요.
단계 2: 로그인 및 설정 마법사 실행
발급된 주소(printed address)를 엽니다. 브라우저는 사용자가 secrets/certs/ca.crt를 신뢰할 때까지 개인 인증 기관에 대해 경고 메시지를 표시하므로, 이 파일을 서버에서 사용하는 컴퓨터의 브라우저로 복사해야 합니다. 자체 비밀번호를 설정한 후, 설정 마법사(superusers 전용)가 조직과 프로젝트를 생성하고, 선택적 AI 모델을 제공합니다 (Anthropic, OpenAI 또는 OpenRouter 키 붙여넣기; Ollama나 vLLM은 나중에 설정(Settings)에서 구성). 테스트 권한이 있음을 확인하면 첫 번째 타겟을 추가하며, 선택적으로 Shodan, VirusTotal, SecurityTrails 키도 제공됩니다. CVE 피드는 작업자(workers)가 올라온 후 약 1분 뒤에 로딩되기 시작하므로, 대시보드가 비어 있다고 판단하기 전에 첫 매치에 몇 분 정도의 시간을 주는 것이 좋습니다.
3단계: 첫 번째 타겟 추가하기 — 소유한 것만
타겟은 도메인, IP, CIDR 범위 또는 URL로 추가하며, 조직 및 프로젝트별로 그룹화됩니다. 일괄 입력은 간단한 형식을 따릅니다 (조직 관리자는 타겟을 붙여넣기만 하면 CVEngine이 프로젝트를 자동으로 생성할 수 있습니다):
##Acme Corp
#Website
example.com
...
타겟을 추가하는 순간 발견(Discovery) 과정이 시작됩니다. 이러한 즉각성 때문에 마법사 내의 권한 확인 절차가 중요합니다. 이것은 스캐너이며, 이를 다른 사람의 인프라에 겨누는 것은 튜토리얼 단계가 아니라 사고입니다. 안전장치는 실제이지만 좁습니다. 루프백(loopback), 링크 로컬(link-local), 클라우드 메타데이터 주소는 절대 스캔되지 않으며, 사설 범위(private ranges)는 허용할 때까지 비활성화 상태로 유지되고, CDN과 같은 공유 플랫폼에 있는 주소는 포트 스캔이 되지 않습니다. 인증서 투명성 감시(certificate transparency watch) 기능은 새로운 호스트 이름을 즉시 평가 과정으로 가져오며, 모든 에이펙스 도메인(apex domain)은 매주 심층 검색을 받기 때문에 인벤토리가 첫 스캔 후 정체되는 대신 스스로 최신 상태를 유지합니다.
4단계: 발견부터 판결까지 파이프라인 읽기
모든 타겟은 네 단계로 구성된 하나의 파이프라인을 실행합니다. FIND는 서브도메인 및 자산 검색(discovery)을 위해 bbot을 사용하고, 인벤토리 구축(inventory)을 위해 nmap과 naabu를 사용하여 포트, 서비스, 제품, 버전, OS, 배너, TLS 및 기술 정보를 호스트당 하나의 레코드로 수집합니다. PROBE는 노로그인으로 응답하는 노출 점검(Redis, Memcached, PostgreSQL, Elasticsearch, 그리고 CouchDB), nuclei 기술 패스, 각 경로를 'open', 'login', 'session required', 'SSO', 또는 'redirect'로 레이블링하는 웹 경로 검사, 그리고 선택적 WPScan 및 node2shell 검사를 추가합니다. MATCH는 실시간 cve.now 피드와 주요 익스플로잇 소스를 제품 및 버전에 따라 해당 인벤토리와 상관관계 분석하며, 배포 백포트(distribution backports)까지 이해합니다. DECIDE는 AI가 그 자리를 확보하는 곳입니다. 모든 발견 사항은 'confirmed', 'likely', 'needs validation', 'likely false positive', 또는 'not applicable'로 분류(triage)되며, 3시간마다 검토를 통해 프로젝트별 다음 분류, 검증 또는 재스캔이 예약됩니다.
Find, probe, match, decide. Image: AI Frontier Post.
출력을 사용 가능하게 만드는 두 가지 아이디어가 있습니다. 첫째, 모든 CVE는 CISA KEV, ENISA EUVD, Metasploit, Exploit-DB, EPSS, 그리고 CVSS(선택적 VulnCheck KEV)로부터 'fire', 'smoke', 또는 'ice' 등급을 받기 때문에, 활발하게 악용되는 취약점과 배경 노이즈를 한눈에 구분할 수 있습니다. 둘째, 모든 호스트는 이유와 함께 0~100점 점수를 받으며, 새로운 호스트, 열린 포트, 버전 증가(version bumps), 새 인증서, 나타나는 로그인 페이지, 변경되는 프론트 페이지 등 모든 변화가 타임라인에 기록되며, 'Changes' 페이지에서는 나란히 비교하는 스크린샷 차이점(diffs)을 확인할 수 있습니다. 이메일 및 도메인 위생(SPF, DKIM, DMARC, CAA, MTA-STS, DANE, DNSSEC, 그리고 TLS)은 동일한 레코드에 포함되므로, 메일 설정 오류를 확인하기 위해 별도의 도구가 필요하지 않습니다.
5단계: Shodan처럼 인벤토리를 검색하세요
대시보드는 워크플로우의 시작점이 아니라 출발점입니다. 검색창은 Shodan 스타일 구문을 사용하여 모든 호스트, 포트, 배너 및 발견 사항을 쿼리하며, 바로 이 지점에서 플랫폼이 보고서라기보다는 도구처럼 느껴지기 시작합니다. 프로젝트 자체 예제는 사용자의 인벤토리에서 시도해 볼 수 있는 좋은 첫 세 가지 쿼리입니다:
port:3389 -host:vpn
tech:"apache tomcat" sev:high
ip:203.0.113.0/24 product:nginx
첫 번째는 VPN 호스트 외부에서 노출된 원격 데스크톱(remote-desktop) 포트를 찾고, 두 번째는 기술을 높은 심각도 발견 사항으로 좁히며, 세 번째는 서브넷을 특정 제품에 한정합니다. 여기서 모든 호스트를 재검사(Rescan), 고정(pin), 제외(exclude)하거나 아카이브할 수 있으며, 소유자와 중요도를 기록해야 합니다. 인벤토리는 또한 자산 등록부이기도 하며, 소유자가 없는 호스트는 그 자체로 하나의 발견 사항입니다.
먼저 검색하고, 나중에 결정합니다. 이미지: AI Frontier Post.
단계 6: 조치하기 전에 일치 여부를 검증합니다
CVE 일치는 판결이 아니라 가설이며, 이것이 CVEngine을 피드 리더와 구분하는 단계입니다. 모든 CVE 일치 항목에 대해 Validate Now를 사용하세요. 자동 읽기 전용(automatic read-only validation) 검증은 검증된 nuclei 템플릿, 단일 포트 nmap 체크, 배너 프로브 또는 데이터베이스 검사를 실행하며, 각각이 정확히 무엇을 실행했는지 기록합니다. Nuclei는 읽기 전용 및 목적지 검사를 통과한 템플릿만 실행하며, 비밀번호 목록은 절대 시도되지 않습니다(각 데이터베이스는 비밀번호가 없거나 아예 없는 상태로 한 번의 시도를 합니다). 그리고 고정된 규칙 덕분에 모델이 결코 명확한 증거를 무시할 수 없습니다. 템플릿이 존재하지 않을 경우 AI가 초안을 작성하며, 이는 사람이 승인하기 전까지는 절대 사용자의 호스트에서 실행되지 않습니다. 옵션인 자동 발사(auto-fire) 기능은 피드가 새로운 CVE를 전달함에 따라 일치하는 호스트에서 테스트하므로 기본적으로 비활성화되어 있습니다. 이 기능을 켜기 전에 검증 추적을 일주일 동안 관찰하고 그 기록을 신뢰할 때까지는 꺼두는 것이 좋습니다.
단계 7: 코딩 에이전트에게 동일한 인벤토리를 제공합니다
마지막 단계는 대시보드를 에이전트가 사용할 수 있는 인프라로 만듭니다. API tokens 및 MCP에서 토큰을 생성하고, /api/v1/에 Authorization: Bearer <token>을 전송하거나, /mcp/에 MCP 클라이언트를 연결합니다. 토큰은 사용자 역할을 사용하며 읽기 전용(read-only) 토큰도 지원하므로, 발견된 정보만 읽어야 하는 에이전트가 호스트를 재스캔하거나 아카이브할 권한을 갖지 못하게 합니다. 조직(Organizations), 프로젝트(Projects), 역할(Roles)(admin, user, audit), 2단계 로그인(two-step sign-in), IP 허용 목록(IP allowlist), 감사 로그(audit log)가 나머지 부분을 보호하며, Slack, Discord, Telegram, Lark 알림을 통해 무언가 변경되었음을 알기 위해 대시보드를 계속 지켜볼 필요가 없습니다. 스위치 하나로 모든 스캐닝을 일시 중지할 수 있습니다. 이를 유지보수 기간 동안 사용하고, 인프라에 대한 대규모 변경 전에 염두에 두어 계획된 마이그레이션이 공격으로 인식되지 않도록 합니다.
구축한 것 (What you built)
서버를 벗어나지 않는 자체 호스팅(self-hosted) 공격 표면 루프: 인벤토리는 사용자의 장치에 유지되고, 비밀 정보는 암호화되어 저장되며, 아무것도 개발자에게 전송되지 않습니다. 그 위에 자체 자산에 대한 Shodan 스타일 검색 기능, 사유가 포함된 호스트별 점수(per-host score), 모든 변경 사항의 타임라인, 그리고 코딩 에이전트들이 동일한 권한으로 동일한 발견된 정보를 처리할 수 있게 해주는 에이전트 API 및 MCP 서버를 갖추게 됩니다. AI는 의도적으로 주니어 파트너 역할을 합니다: 분류(triage)하고, 초안을 작성하며, 제안하지만, 검증된 템플릿, 기록된 명령어, 그리고 인간의 승인이 최종 결정을 내립니다.
이 가이드가 확인하지 않은 것 (What this guide did not verify)
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기