폐쇄망 CVE 미러 설계 — 11일 지난 미러가 만든 조용한 거짓 안전감
인터넷이 없는 환경에서 SCA·의존성 스캔이 의미가 있으려면 CVE / OSV / 벤더 advisory 를 *내부에서* 유지해야 한다. 4 종류의 데이터 소스, 4가지 동기화 함정, 한 가지 검증.
작년 12월, 한 고객사 보안 검토 회의에서 한 줄을 듣는 데 2분 이 걸렸다.
"우리 SCA 가 clean 이라는데, 그 데이터가 얼마나 오래된 건가요?"
답이 11일 이었다. 우리 폐쇄망 CVE 미러가 11일 전에 마지막으로 동기화 됐다. 그 11일 동안 높은 심각도 CVE 가 7개 발표됐고, 그중 2개가 우리 의존성 트리에 영향 을 주는 것이었다. SCA 가 clean 이라고 보고한 건 사실이었다 — 11일 전 데이터로는.
그날 이후 우리 폐쇄망 CVE 미러 설계 전체를 다시 짰다. 이 글은 그 결과다.
왜 CVE 미러가 폐쇄망의 결정적 인프라인가
폐쇄망에서 SCA / 컨테이너 스캐너 / IaC 검사 도구는 내부 미러로부터 CVE 데이터를 받는다. 미러가 오래되면 도구는 오래된 데이터로 clean 보고 를 한다. 도구가 거짓말을 하는 게 아니라 — 미러가 거짓말을 시키는 것이다.
폐쇄망 보안 도구의 신뢰도는 도구 자체 가 아니라 그 도구에 들어가는 데이터의 신선도 가 결정한다.
4 종류의 데이터 소스
CVE 미러는 하나의 DB 가 아니라 4 개의 흐름 이다.
1. NVD / CVE.org — 공식 CVE 식별자 + CPE 매핑
2. OSV (Google) — open source 패키지별 advisory + 영향 범위
3. 벤더 advisories — RedHat / Debian / Ubuntu / Alpine / 사내 패키지 backport
4. 사내 패치 트래커 — *우리만* 의 fix / mitigation / 리스크 수용 기록이 넷이 정렬되지 않으면 같은 취약점이 다른 곳에서 다른 status 로 보고된다.
4가지 동기화 함정
함정 1 — sync 지연이 조용히 누적된다
NVD 의 매시간 업데이트를 매시간 받지 못하면, 지연이 조용히 누적 된다. 일주일 지나면 경고 가 떠야 하는데, 보통 알람이 안 울려서 11일이 된다.
해결: 미러의 마지막 sync 시간 을 자체 메트릭 으로 노출하고, 24시간 이상 지연되면 page 한다. 이 단순한 알람이 11일짜리 사고를 24시간짜리로 줄인다.
함정 2 — 단방향 sync 의 broken pipe
전송 영역(transit zone) 의 단방향 게이트웨이가 파일을 못 보내고 있는데도 오류는 안 나는 패턴. 게이트웨이 입장에서는 조용한 success, 우리 입장에서는 데이터가 안 들어옴.
해결: 미러가 마지막으로 받은 sync 의 hash 를 검증. 매 sync 마다 checksum 매칭 안 되면 alert. 이건 sync 실패 가 아니라 sync 위장 실패 를 잡는 것.
함정 3 — 벤더 advisory 가 언어가 다르다
RedHat 의 advisory 는 RHSA-XXXX, Ubuntu 는 USN-XXXX, Debian 은 DSA-XXXX. 같은 CVE 가 여러 벤더에서 다른 ID 로 다른 시점에 등장. 우리 미러가 한 벤더만 추적하면 다른 벤더 OS 를 쓰는 컨테이너가 내부 검사 통과 후 외부 인증 실패.
해결: 사내에서 쓰는 모든 base 이미지의 OS 의 advisory 를 명시적으로 추적. 4~6 종 보통.
함정 4 — 수용된 리스크 가 미러에 안 들어 있다
사내 정책으로 어떤 CVE 는 수용 한다는 결정이 있다. 그게 미러에 없으면 SCA 가 매번 수용된 CVE 를 경고 로 띄우고, 운영자는 경보 피로 로 진짜 경보 까지 무시.
해결: 내부 risk-accepted 트래커를 미러에 5번째 흐름 으로 박음. SCA 가 그것을 인식해 수용된 항목은 informational 로 강등.
한 가지 검증 — 알려진 좋은 CVE 가 알려진 시간 안에 보이는가
미러의 건강 을 어떻게 검증하나? 수동 검사는 안 된다. 우리는 다음 검증을 분기 1회 자동 으로 돌린다.
1. NVD 에 *지난 24시간 동안 발표된 CVE* 중 random 5개 선택
2. 우리 내부 미러에 *그 5개가 모두 있는지* 확인
3. 없으면 alert + 인시던트
4. 있으면 *한 단계 더* — 그 CVE 가 우리 의존성 트리와 매칭되는지이 검증을 하기 전에는 미러가 잘 작동한다 라는 게 느낌 에 가까웠다. 검증 도입 후 3분기 동안 4번 의 sync 지연을 자동으로 잡았다.
왜 이 글이 별로 없나
폐쇄망 CVE 미러는 돈도 안 되고, 화려하지도 않은 분야다. 글로벌 SaaS 회사들은 이 문제를 겪지 않는다. 한국·일본·EU 의 공공·금융·방산만 매일 마주한다. 그래서 영문 자료 가 빈약하고, 한국어 자료 는 거의 없다. 그래서 이 글을 쓴다. 같은 문제를 매일 마주하는 팀에게 참고가 됐으면 한다.
지금 확인할 것 하나
폐쇄망에서 SCA / 컨테이너 스캐너 / IaC 검사 도구를 돌리는 보안 엔지니어가 지금 확인할 것은 하나다 — 마지막 미러 sync 시간. 답이 즉시 나오지 않으면, 위 4가지 함정 중 한 개 이상에 이미 빠져 있다.
비슷한 글
기획자가 코드를 배포하면, 장애는 누가 책임질까
AI로 제품 담당자가 직접 코드를 만들고 여러 에이전트가 동시에 작업하는 조직에서, 운영에 나가는 변경을 누가 무엇으로 확인해야 하는지. NIST SSDF, SLSA provenance, Google SRE 포스트모템 문화를 근거로 작성자와 분리된 검증·승인·복구의 역할 설계를 정리했다.
백재민
에이전트 시대의 Eclipse 플러그인 — 작업 컨텍스트는 20년 전에도 문제였다
Mylyn 이 2000년대에 풀려던 문제와 지금 에이전트 컨텍스트 문제는 같습니다. 달라진 건 그 컨텍스트를 읽는 쪽에 사람만 있는 게 아니라는 점입니다.
김영상
에이전트 시대의 VS Code 확장 — 개발자는 에디터에서 무엇을 보는가
코드 작성 비용이 무너진 뒤 개발자의 시간은 판단과 승인으로 옮겨갔습니다. 그 일들이 왜 에디터 밖에 있으면 안 되는지, VS Code 확장을 만들며 내린 선택들.
이승백