Files

82 lines
7.4 KiB
Markdown

# 검증 범위
이 문서는 자동 테스트의 범위와 실제 이미지 검증 절차를 설명합니다.
공개 Linux 이미지 2개에 대한 실행 결과는 [실제 RAM 검증 기록](real-memory-validation.md)에
별도로 기록했습니다. MCP 활동 샘플은 누락된 VMware 메타데이터를 대신해 추정한 물리 메모리
배치를 적용했습니다. [Windows 11 실제 이미지 검증](windows-memory-validation.md)도 수행했으나,
그 이미지에서는 MCP 후보가 나오지 않았습니다. 이후
[Windows Server 2022의 실제 MCP 통신·RAM 양성 검증](windows-positive-memory-validation.md)에서
정답이 있는 메시지 복원을 확인했습니다. 일반적인 복원 성능 평가는 아직 수행하지 않았습니다.
## 자동 검증
로컬 검증 환경: Linux, Python 3.12, Volatility 3 패키지 2.28.2.
CI는 Ubuntu/Windows 분석 호스트와 Python 3.10/3.12 조합을 구성합니다.
각 CI 조합에서 Windows와 Linux **양쪽 분석 어댑터**를 검사하며, 테스트 데이터는 합성 버퍼입니다.
분석 호스트가 Ubuntu라는 사실 자체가 Linux 메모리 이미지 호환성 검증을 의미하지는 않습니다.
| 영역 | 검증 내용 |
| --- | --- |
| 원문 보존 | UTF-8/UTF-16LE, 한글·이모지, 실제 주소·원문·SHA-256 일치 |
| 파싱 | 문자열 내부 중괄호·이스케이프·중첩, 뒤에 배치된 jsonrpc 멤버, 모든 청크 분할 위치 |
| 손상 | 중복 키, 잘못된 인코딩, 비정상 JSON-RPC ID, 비유한 숫자 거부; 조각에서 필드 추정 금지 |
| 메모리 경계 | 실제 BufferDataLayer 위의 누락 페이지 시뮬레이션, 인접 VAD/VMA 비결합, Linux vm_end 배제 |
| Intel 페이지 변환 | 실제 Intel32e와 구성한 페이지 테이블로 2 TiB 누락 영역 건너뛰기, 예산 경계, 일부만 수집된 큰 페이지 보존 |
| 후보 연결 | PID와 숫자/문자열 ID 분리, 복사본 보존, ID 충돌, 부동소수점 반올림으로 인한 오병합 방지 |
| 정책 | Windows/POSIX 경로 경계·대소문자·구분자, URL 사용자 정보·가짜 접미사, JSON Pointer, 미지원 입력·잘못된 규칙 |
| 어댑터 | 실제 TreeGrid, 프로세스별 제한·요약, 뒤쪽 VAD/VMA 읽기 오류 이후 기존 증거 보존 |
| Linux 태스크 | 실제 PID 필터, 프로세스 간 ID 비연결, 사용자 주소 공간 없음, 레이어 생성 실패, active_mm 대체 사용 금지 |
| 출력 | 실제 Volatility CLI 파일 핸들러, JSONL 원문 왕복·해시, 기존 파일 비덮어쓰기 |
| 검증 하네스 | 논리 메시지/복사본/비전송 대조군 분리, PID/typed ID별 후보 연결 대조, Windows 파일 핸들 정리 |
| 로딩 | 새 CLI 프로세스에서 -p 경로로 Windows/Linux 플러그인 검색 및 도움말 생성 |
`tests/test_plugin.py`의 EPROCESS/VAD, `tests/test_linux_plugin.py`의 task_struct/mm/VMA 열거 객체와
커널 모듈은 테스트용 대역입니다.
Volatility의 Context, BufferDataLayer, TreeGrid, CLI 파일 핸들러는 실제 구현을 사용합니다.
따라서 CLI 검색·어댑터 출력까지는 검증하지만 커널 심볼 해석, 실제 페이지 테이블 변환, OS 빌드 호환성은
이 테스트만으로 입증할 수 없습니다.
Windows의 기존 `VADStart`/`vad_start` 출력은 회귀 검사하며 Linux 출력은 `VMAStart`/`vma_start`를
사용하는지 확인합니다. JSONL 메타데이터·아티팩트·요약에는 분석 대상 OS를 기록합니다.
## 실제 Windows 11 x64 이미지 확인 절차
1. 격리된 테스트 VM에서 OS 빌드, MCP 클라이언트·서버 버전, 전송 방식, 프로세스 PID를 기록합니다.
2. 정확한 요청·응답 JSON과 ID를 별도 기준 자료로 저장합니다. 정상 호출, 정책에 해당하는 호출,
같은 ID의 반복 사용, 문자열 ID, 긴 응답을 각각 포함합니다.
3. 메모리를 수집하고 수집 도구·버전·시각·이미지 SHA-256, 호출부터 수집까지의 경과 시간을 기록합니다.
4. 같은 이미지에서 `windows.info.Info`와 `windows.pslist.PsList`가 정상 동작하는지 확인합니다.
5. 해당 PID에 대해 MCPTrace를 실행합니다. 처음에는 `--suspicious-only` 없이 전체 후보와 요약을 저장합니다.
6. 내보낸 `raw_base64`를 디코딩하고 SHA-256을 확인합니다. 해당 프로세스 레이어의 가상 주소와 길이로
다시 읽은 원문과 일치하는지 확인합니다. 가상 주소를 이미지 파일 오프셋으로 사용하지 않습니다.
7. 기준 자료와 비교해 누락·잘못된 추출·복사본·연결 모호함을 구분합니다. 예제/로그에 의도적으로 남긴
JSON과 일반 JSON-RPC 트래픽도 넣어 실제 통신 증거와 혼동되는 범위를 확인합니다.
8. 기본 제한과 조정한 제한을 비교하고, 도달한 제한·누락 페이지·오류가 요약에 남는지 확인합니다.
재현 자료에는 명령 전체, MCPTrace 커밋, Python/Volatility 버전, OS 빌드, 정책 파일 및 그 해시,
입력 이미지 해시, 표준 오류 로그, JSONL을 포함합니다. 실제 증거·메모리 덤프는 저장소에 커밋하지 않습니다.
기준 메시지와 수집 조건이 확보되기 전에는 특정 클라이언트 지원, 정밀도·재현율, 세션 복원 성공률을 표시하지 않습니다.
## 실제 Linux x86-64 이미지 확인 절차
1. 격리된 VM의 배포판, `uname -a`, 커널 빌드 정보와 MCP 클라이언트·서버 버전, 프로세스 PID를 기록합니다.
정상 호출·정책에 해당하는 호출·반복 ID·문자열 ID·긴 응답을 실행하고 기준 JSON을 별도 보존합니다.
2. 메모리를 수집하고 수집 도구·버전·시각·이미지 SHA-256과 수집 지연 시간을 기록합니다.
3. `banners.Banners`로 커널 배너를 확인하고 해당 빌드에 맞는 ISF 심볼을 준비합니다. 같은 커널 버전명만
같고 빌드가 다른 심볼을 호환된다고 가정하지 않습니다. `linux.pslist.PsList`와 `linux.proc.Maps`가
이미지에서 정상 동작하는지 확인합니다.
4. 같은 이미지와 심볼을 사용해 `linux.mcptrace.MCPTrace --pid <PID> --dump`를 실행합니다.
필요하면 `examples/policy-linux.json`을 실제 도구·인자·프로세스 경로에 맞게 수정합니다.
5. `VMAStart`, `VirtualAddress`, 바이트 길이를 해당 프로세스의 VMA/레이어와 대조합니다.
`vm_end`는 포함하지 않으며 아티팩트가 VMA 경계를 넘어 생성되지 않았는지 확인합니다.
6. 원문 바이트·해시·요청 ID·복사본·모호한 연결을 기준 자료와 비교합니다. 로그/캐시에 들어간 JSON도
후보가 될 수 있으므로 실제 통신과 별도로 분류합니다.
7. 대표 태스크만 분석되는지, 사용자 주소 공간이 없는 태스크의 `skipped_reason`, 누락된 페이지,
크기·후보 제한과 검사 오류가 요약에 표시되는지 확인합니다.
기존 mmap 기반 커널과 Maple Tree 기반 커널은 각각 별도의 실제 이미지 검증이 필요합니다.
Volatility 2.28.2의 `get_vma_iter()` API 구현·합성 어댑터 테스트와 함께, 실제 6.5.0-41 및
물리 배치를 추정한 6.14.0-37 이미지에서 Maple Tree 경로를 실행했습니다. 기존 mmap 기반 커널의
실제 이미지는 아직 검증하지 않았습니다.
컨테이너 PID 네임스페이스 매핑, ARM/32비트, swap 복원, 힙 객체 재조립은 이번 검증 범위 밖입니다.