시스템별 CVE 영향도 / 패치 상태 / 조치 진행 / 조치결과 검증을 단일 Go 바이너리 로 자동화하는 CLI 감사 도구.
Audit CVE impact, remediation, and verification across systems with a single static Go binary.
본 도구는 임시 조치(모듈 차단) 경로에 집중한다. 영구 조치(커널 패키지 업데이트)는 사용자가 배포판 패키지 매니저로 별도 적용해야 한다 (재부팅 필요).
| CVE | 별칭 | 영향 컴포넌트 | 임시 조치 |
|---|---|---|---|
| CVE-2026-31431 | Copy Fail | Linux 커널 algif_aead (AF_ALG + splice) |
algif_aead 모듈 차단·언로드 |
| CVE-2026-43284 | Dirty Frag #1 | Linux 커널 esp4/esp6 (IPsec) |
두 모듈 차단·언로드 (IPsec 사용 환경 주의) |
| CVE-2026-43500 | Dirty Frag #2 | Linux 커널 rxrpc/afs |
두 모듈 차단·언로드 |
| CVE-2026-46300 | Fragnesia | Linux 커널 XFRM ESP-in-TCP (esp4/esp6/rxrpc) |
세 모듈 차단·언로드 (43284/43500과 모듈 일부 공유) |
네 CVE 모두 Linux 커널 LPE (Local Privilege Escalation). 영구 해결은 벤더 커널 패치.
각 CVE 플러그인은 자체 conf 파일을 /etc/modprobe.d/에 별도로 작성하므로(cpa-cve-<id>.conf), 모듈이 겹쳐도 한 CVE의 rollback이 다른 CVE의 차단을 의도치 않게 해제하지 않는다. 차단 라인은 install X /bin/false (modprobe 호출 시 명시적 exit 1) + blacklist X (udev/aliases 자동 로드 차단)를 동시 기록 (defense-in-depth).
# linux/amd64 예시
curl -L -o cpa https://github.com/barmi/cve-patch-auditor/releases/latest/download/cpa-linux-amd64
chmod +x cpa
./cpa --versionSHA256SUMS 도 같이 첨부되니 무결성 검증을 권장:
curl -L -O https://github.com/barmi/cve-patch-auditor/releases/latest/download/SHA256SUMS
shasum -a 256 -c SHA256SUMS --ignore-missinggit clone https://github.com/barmi/cve-patch-auditor.git
cd cve-patch-auditor
make build # 호스트용
make dist # linux amd64+arm64 정적 바이너리 (bin/)요구사항: Go 1.23 이상 (현재 개발은 1.26). 외부 모듈 의존 0.
$ cpa --help
USAGE
cpa [flags]
FLAGS
-h, --help 이 도움말 표시
-v, --version 버전 정보 표시
--list 내장된 CVE 플러그인 목록 표시
--cve=ID 처리할 CVE 지정 (반복 가능; 미지정 시 전체)
--phase=NAMES 처리할 phase 쉼표 구분
(assess,remediate,verify,rollback;
기본 assess,remediate,verify)
--rollback 기본 phase 대신 rollback만 수행
(--apply 또는 --dry-run 명시 필수: 파괴적 작업)
--apply 실제 변경 적용 (없으면 dry-run으로 강제)
--dry-run dry-run 모드 (--apply가 있어도 우선 적용)
--no-elevate sudo 자동 권한 상승 비활성
--json 결과를 stdout에 한 줄당 JSON으로 출력
--report=FILE 마크다운 리포트 파일 경로
--log-file=FILE 로그 파일 경로 (기본: 실행파일 옆 cpa.log)
--verbose DEBUG 레벨 로그
--no-log 파일 로그 비활성 (stderr만)
--lang=LANG 언어 강제 지정 (en|ko; 기본 환경에서 자동 감지)
--upgrade 최신 릴리즈 확인 (--apply 없으면 정보만 출력)
(--upgrade --apply: GitHub Release 자산 다운로드 + SHA256 검증 + 원자적 교체)
cpa --upgrade로 최신 GitHub Release를 확인하고 (--apply와 함께 쓰면) 자기 자신을 안전하게 교체할 수 있다.
# 1) 새 버전 확인만 (root 불필요)
cpa --upgrade
# 출력 예:
# GitHub에서 최신 릴리즈 확인 중...
# 업그레이드 가능: v0.2.0 → v0.2.1 (자산 cpa-linux-amd64, 6342144 bytes)
# sha256: 1a2b3c4d...
# 2) 실제 교체 (필요 시 sudo 자동 재실행)
sudo cpa --upgrade --apply
# 또는 사용자 디렉토리(~/bin 등)에 설치돼 있으면 sudo 없이도 동작
cpa --upgrade --apply동작:
- GitHub
/releases/latest에서 최신 메타데이터 조회 (인증 불필요). - 현재 OS/ARCH에 해당하는 자산 선택 — 현재 배포 자산은
cpa-linux-amd64/cpa-linux-arm64만 제공. macOS/Windows에서는 "unsupported platform" 안내. - 자산과
SHA256SUMS를 함께 다운로드 → 자산의 실측 SHA256과 기대 해시 일치 검증. 불일치 시 즉시 실패하고 임시 파일을 삭제, 실행 중인 바이너리는 그대로 보존. os.Rename으로 원자적 교체. 실행 중이던 프로세스는 그대로 종료 후 다음 실행부터 새 바이너리 사용.
--apply 사용 시 binary가 위치한 디렉토리에 쓰기 권한이 없으면 자동으로 sudo 재실행. --no-elevate 지정 시에는 명시적 에러로 종료(자동 sudo 비활성).
- 환경 자동 감지:
LC_ALL>LC_MESSAGES>LANG.ko또는ko_*이면 한국어, 그 외(또는 미설정)면 영어. --lang=ko/--lang=en으로 강제 가능. 그 외 값은 거부 (exit 2).- 사용자-보이는 모든 메시지(usage, CLI 안내·에러, plugin Summary, 마크다운 리포트 헤더·배지)가 두 언어를 모두 지원.
- 단, JSON 로그(
cpa.log)의msg필드는 기계 가독 키로 의도되어 다국어화하지 않음.
참고 — 한글 설명이 필요한 분들은
--lang=ko를 추가하세요.$LANG을 자동으로 읽어서 처리하지만, 대부분의 서버 환경은LANG=en_US.UTF-8또는C.UTF-8로 설정돼 있어 기본은 영어로 보입니다. (실제로 본 저장소 운영자의 환경도LANG=en.) 예시:cpa --lang=ko --help
# 1) 영향 평가만 (root 불필요, 변경 없음)
cpa --phase assess
# 2) 전부 한 번에 (dry-run; 무엇이 일어날지 미리 확인)
cpa
# 3) 실제 적용 — sudo로 재실행되며 모듈 차단·언로드 수행
cpa --apply
# 4) 특정 CVE만
cpa --cve CVE-2026-31431 --apply
# 5) 롤백 (적용한 차단 파일 제거) — --apply 또는 --dry-run 명시 필수
cpa --rollback --dry-run --cve CVE-2026-31431 # 미리보기
cpa --rollback --apply --cve CVE-2026-31431 # 실제 롤백 (sudo)
# 6) 마크다운 리포트 생성
cpa --report /tmp/cpa-report.md
# 7) JSON 라인 출력 (다른 도구·SIEM 연동)
cpa --json각 CVE는 4 단계 라이프사이클을 갖는다:
assess → 호스트가 취약한지 판단 (비-root 가능)
remediate → 조치 적용 (root 필요. 미지정 시 자동 sudo 재실행)
verify → 조치 후 재평가
rollback → (선택) 적용한 변경의 역연산
옵션이 없으면 내장된 모든 CVE에 대해 assess → remediate → verify를 순차 실행한다 (단, --apply가 없으면 dry-run으로 강제).
- 셸 인터폴레이션 금지. 외부 명령은 항상 인자 배열로만 호출.
--apply없이는 어떤 변경도 발생하지 않음 (기본 dry-run).- 외부 사용자 작성 파일 보호:
/etc/modprobe.d/에 cpa 표식이 없는 파일은 절대 덮어쓰거나 삭제하지 않음. - 모듈 자동 재로드 안 함: rollback 시 파일만 제거. modprobe는 시스템 관리자 결정.
- 자체 PoC 미동봉. 외부 PoC 코드 인용·실행 안 함.
- 민감정보 마스킹 인터페이스 마련 (로깅 계층에서 일괄).
- 한 줄당 1 JSON, 키:
ts(RFC3339Nano),level,msg,host,pid,uid, 그리고 phase별cve/phase/action/result/details. - 위치 결정:
--log-file> 실행파일 옆cpa.log>$XDG_STATE_HOME/cve-patch-auditor/cpa.log> stderr 폴백.
cve-patch-auditor/
├── cmd/cpa/ ← CLI 엔트리
├── internal/
│ ├── cve/ ← Plugin 인터페이스, 레지스트리, 오케스트레이터
│ ├── plugins/
│ │ ├── cve_2026_31431/ ← Copy Fail
│ │ ├── cve_2026_43284/ ← Dirty Frag #1
│ │ ├── cve_2026_43500/ ← Dirty Frag #2
│ │ └── cve_2026_46300/ ← Fragnesia (Stage 9)
│ ├── privilege/ ← root 확인 + sudo 재실행
│ ├── exec/ ← 외부 명령 안전 래퍼 (인자 배열, 타임아웃, dry-run)
│ ├── system/ ← uname / /proc/modules / /etc/os-release / 패키지 매니저 / built-in 감지
│ ├── upgrade/ ← 자체 업그레이드 (GitHub Release + SHA256 + atomic rename, Stage 10)
│ ├── i18n/ ← KO/EN 메시지 (--lang, env 자동 감지)
│ └── audit/
│ ├── log/ ← slog 기반 JSON 라인 로깅
│ └── report/ ← 마크다운 리포터
├── doc/
│ ├── PLAN.md ← 마스터 계획 (Stage 1~10)
│ ├── TODO-CVE.md ← 차기 CVE 우선순위 로드맵
│ ├── references.md ← 외부 인용 자료 인덱스
│ ├── cve/ ← CVE 별 사실 정리 + 자동화 계약
│ └── stages/ ← Phase 별 결정·검증 기록 (stage-1 ~ stage-10)
└── .github/workflows/ ← ci / release
make build # 빌드
make test # 단위 테스트
make vet # go vet
make cover # 커버리지
make dist # 배포용 (linux amd64/arm64 + SHA256SUMS)
make cleanCI는 push/PR마다 vet + test -race + 크로스 빌드를 수행 (.github/workflows/ci.yml).
- Linux 전용 실 동작 (kernel modules, /proc/modules, /etc/modprobe.d 의존).
- macOS/Windows에서는 빌드·단위 테스트만 가능; 실 phase 메서드는
ErrUnsupported. - 패키지 매니저를 통한 영구 커널 패치 자동 적용은 본 도구 범위 외 (사용자 안내만).
- 자체 PoC 비포함.
미정 (TBD). 운영 도입 전 라이선스 결정 필요.
- 외부 인용 자료 전체:
doc/references.md - 상세 계획·결정 이력:
doc/PLAN.md,doc/stages/ - 다음에 추가할 CVE 후보(우선순위):
doc/TODO-CVE.md