
복구 노트: Proxmox 권고 ID PSA-2026-00043-1 (CVE-2023-54391)
랜섬웨어로 위장한 와이퍼(Wiper) 공격 이후 복구 — 인터넷에 노출된 Proxmox 인프라에 대한 공격(PSA-2026-00043-1 / CVE-2023-54391) 사례.
공격자는 게스트를 삭제하고 파일시스템을 손상시켰습니다. 게스트 유형에 따라 두 가지 복구 경로가 있습니다:
이것은 동일한 상황에 처한 누구에게나 유용하도록 일반화된 도구와 방법론입니다. 소스에 대해 읽기 전용이며, CC0입니다. 실제 복구된 데이터는 포함되어 있지 않으며, 예제 출력은 플레이스홀더를 사용합니다.
손상된 디스크는 이제 남은 데이터의 유일한 사본입니다. 복구하지 마세요. 이미징하세요.
blockdev --setro /dev/<source> # 1. 즉시 읽기 전용으로 설정
dd if=/dev/<source> of=/safe/disk.img bs=4M conv=noerror,sync # 2. 안전한 저장소에 이미징
# 3. fsck, rw 마운트 또는 "복구"를 실행하지 마세요. 캐러버가 필요로 하는 블록을 덮어씁니다.
# 4. 모든 소스 패스를 scripts/source_guard.sh로 감싸세요.
# 5. 원본이 아닌 이미지에서만 복구하세요.
공유 규율, 분할 캐러버. -h로 실행하세요. Python 3.8+ / bash, 서드파티 패키지 없음. source_guard.sh는 Linux /proc/diskstats가 필요합니다.
python3 scripts/make_demo.py
python3 scripts/bson_frame.py --total demo/*.bson
python3 scripts/sensitivity_scan.py demo/*.bson
python3 scripts/integrity_verify.py --compare demo/source demo/copy
다음 순서로 실행했습니다. 캐러빙 단계는 게스트 유형에 따라 분기되며, setro/이미지 양끝단과 콘텐츠 키 기반 검증은 두 경우 모두 동일합니다.
손상된 디스크 ──setro+이미지──► 읽기 전용 이미지
│
데이터베이스 ────────►│◄────────── 파일시스템
WT 페이지 캐러빙 │ 파일 캐러빙
문서 개수 계산 │ 콘텐츠 분류 + 매니페스트
│
노출 계층화 (RED/AMBER/GREEN)
복사본 검증 (콘텐츠 키 기반)
│
복구
find | sort | xargs sha256sum | sha256sum은 경로와 로케일도 해시합니다. LC_ALL=C 또는 파일별 매니페스트를 사용하세요.sha256sum -c는 FAILED를 출력하면서도 0으로 종료합니다. $?가 아닌 열을 읽으세요.시작점이지 완성된 솔루션이 아닙니다. 프로덕션 WiredTiger는 일반 캐러버가 스텁 처리하는 페이지 압축(snappy/zstd)과 셀 인코딩을 사용합니다. 압축 페이지용 자체 강력한 디코더를 구현하세요. 모든 숫자를 양성 대조군과 두 번째, 다른 도구로 교차 검증하세요: 동일한 가정을 공유하는 두 도구는 그 가정 때문에 일치하지, 올바르기 때문에 일치하지 않습니다. 바이트를 읽는 것이 이를 잡아내는 방법입니다.
데이터가 동일하지 않더라도(다른 데이터베이스, 앱 또는 파일시스템) 방법론은 여전히 유효합니다: 소스를 읽기 전용으로 설정하고, 이미징하고, 복사본에서 캐러빙하고, 0을 믿기 전에 양성 대조군을 확인하고, 전체를 계산하고, 콘텐츠로 검증하세요. 캐러버를 교체하고 규율을 유지하세요.
근본 원인을 강화하세요: :8006의 Proxmox 웹 UI는 인터넷에서 접근 가능해서는 안 됩니다. 공식 Proxmox 보안 권고를 따르세요:
https://forum.proxmox.com/threads/proxmox-virtual-environment-security-advisories.149331/
복구 및 강화에 대한 저자의 일반적인 조언이 포함된 더 사용자 친화적인 문서: https://claude.ai/code/artifact/621495ce-4972-405a-ad90-f7703f7dc2f1
CC0 / 퍼블릭 도메인. LICENSE 참조.
| 스크립트 | 경로 | 기능 |
|---|
scripts/source_guard.sh | 공유 | 복구 명령을 감싸고, 쓰기 카운터 차이를 통해 소스가 읽기 전용으로 유지되었음을 증명합니다. 어떤 소스 쓰기에도 실패합니다. |
scripts/wt_leaf_carve.py | 데이터베이스 | 원시 WiredTiger 리프 페이지에서 BSON을 캐러빙합니다. 페이지 크기는 피트(fit)가 아닌 디코드로 결정하며, 양성 대조군이 필수입니다. |
scripts/bson_frame.py | 데이터베이스 | 온디스크 프레이밍으로 BSON 문서를 계산/검증합니다. 기본적으로 전체 파일을 대상으로 하며, 샘플은 하한(FLOOR) 으로 표시됩니다. |
scripts/fs_carve_classify.py | 파일시스템 | 캐러빙된 파일 조각을 파일명이 아닌 콘텐츠로 분류하고, 파일별 매니페스트를 작성하며, 철저한 비밀 스캔을 수행합니다. |
scripts/sensitivity_scan.py | 공유 | 복구된 데이터를 자격 증명/PII 노출에 따라 RED/AMBER/GREEN으로 계층화합니다. 개수만 출력하며 값은 절대 출력하지 않습니다. |
scripts/integrity_verify.py | 공유 | 재구성된 복사본이 소스에 충실함을 증명합니다. 콘텐츠 키 기반(이름 변경에도 유효), 종료 코드가 아닌 OK/FAILED 열을 읽습니다. |
scripts/make_demo.py | — | 도구 키트를 테스트하기 위한 합성 BSON 픽스처(실제 데이터 없음)를 생성합니다. |