Skip to content

yuslee80/cve-patch-auditor

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

46 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cve-patch-auditor (cpa)

시스템별 CVE 영향도 / 패치 상태 / 조치 진행 / 조치결과 검증을 단일 Go 바이너리 로 자동화하는 CLI 감사 도구.

Audit CVE impact, remediation, and verification across systems with a single static Go binary.

본 도구는 임시 조치(모듈 차단) 경로에 집중한다. 영구 조치(커널 패키지 업데이트)는 사용자가 배포판 패키지 매니저로 별도 적용해야 한다 (재부팅 필요).

지원하는 CVE (현재)

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).

설치

옵션 A — GitHub Release 바이너리

# linux/amd64 예시
curl -L -o cpa https://github.com/barmi/cve-patch-auditor/releases/latest/download/cpa-linux-amd64
chmod +x cpa
./cpa --version

SHA256SUMS 도 같이 첨부되니 무결성 검증을 권장:

curl -L -O https://github.com/barmi/cve-patch-auditor/releases/latest/download/SHA256SUMS
shasum -a 256 -c SHA256SUMS --ignore-missing

옵션 B — 소스 빌드

git 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

동작:

  1. GitHub /releases/latest에서 최신 메타데이터 조회 (인증 불필요).
  2. 현재 OS/ARCH에 해당하는 자산 선택 — 현재 배포 자산은 cpa-linux-amd64 / cpa-linux-arm64만 제공. macOS/Windows에서는 "unsupported platform" 안내.
  3. 자산과 SHA256SUMS를 함께 다운로드 → 자산의 실측 SHA256과 기대 해시 일치 검증. 불일치 시 즉시 실패하고 임시 파일을 삭제, 실행 중인 바이너리는 그대로 보존.
  4. os.Rename으로 원자적 교체. 실행 중이던 프로세스는 그대로 종료 후 다음 실행부터 새 바이너리 사용.

--apply 사용 시 binary가 위치한 디렉토리에 쓰기 권한이 없으면 자동으로 sudo 재실행. --no-elevate 지정 시에는 명시적 에러로 종료(자동 sudo 비활성).

언어 (i18n)

  • 환경 자동 감지: 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 clean

CI는 push/PR마다 vet + test -race + 크로스 빌드를 수행 (.github/workflows/ci.yml).

호환성 / 제약

  • Linux 전용 실 동작 (kernel modules, /proc/modules, /etc/modprobe.d 의존).
  • macOS/Windows에서는 빌드·단위 테스트만 가능; 실 phase 메서드는 ErrUnsupported.
  • 패키지 매니저를 통한 영구 커널 패치 자동 적용은 본 도구 범위 외 (사용자 안내만).
  • 자체 PoC 비포함.

라이선스

미정 (TBD). 운영 도입 전 라이선스 결정 필요.

참고

About

Audit CVE impact, patch status, remediation progress, and verification results across systems.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Go 99.0%
  • Makefile 1.0%