
Volatility 3를 Rust로 포팅했습니다. 동일한 출력, 훨씬 더 빠른 속도.
Volatility 3 메모리 포렌식 프레임워크를 Python에서 Rust로 포팅한 것입니다. 동일한 메모리 이미지를 읽고, 동일한 옵션으로 동일한 플러그인을 실행하며, 동일한 출력을 바이트 단위로 훨씬 더 빠르게 출력합니다.
이 프로젝트는 Volatility 3의 포팅이므로 Volatility Software License 1.0에 따른 "Addition"에 해당하며, 동일한 라이선스로 배포됩니다. 전문은 LICENSE에 있으며 온라인 https://www.volatilityfoundation.org/license/vsl-v1.0 에서도 확인할 수 있습니다. 모든 소스 파일에는 파생 출처를 기록하는 고지가 포함되어 있습니다.
이 프로젝트는 Volatility Foundation과 제휴하거나 보증하지 않습니다. Volatility라는 이름은 이것이 무엇의 포팅인지 설명하는 데만 사용됩니다.
Rust 1.85 이상이 필요하며, 그 후:
cargo build --release
바이너리는 target/release/vol-rs에 생성됩니다. 추가로 필요한 것은 없습니다. 심볼 압축 해제, RC4, DES, AES, YARA 매칭, x86 디스어셈블리, PNG 작성 및 tar 아카이브는 모두 내장되어 있으며, Python 버전이 pycryptodomex, yara-python, capstone 및 pillow에 의존하는 부분을 대체합니다.
./target/release/vol-rs -f memory.raw windows.pslist.PsList
./target/release/vol-rs -f memory.lime linux.bash.Bash
./target/release/vol-rs -f memory.raw -r csv windows.netscan.NetScan
./target/release/vol-rs windows.malfind.Malfind --help
./target/release/vol-rs --list-plugins
Python 버전이 받는 모든 옵션은 동일한 이름과 동일한 기본값으로 여기서도 지원됩니다. 여기에는 -o, -r, -s, -c, -e, --filters, --hide-columns, --save-config, --stackers 및 --single-swap-locations가 포함됩니다. 각 플러그인의 자체 옵션도 동일하게 일치하며, 도움말 페이지에서 확인할 수 있습니다. 총 197개 모두 Python 버전과 문자 단위로 동일합니다.
심볼 팩은 $XDG_DATA_HOME/vol-rs/symbols에 들어가며, 해당 변수가 설정되지 않은 경우 ~/.local/share/vol-rs/symbols에 들어갑니다. 다른 위치의 팩은 --symbol-dirs 또는 VOLRS_SYMBOL_PATH 환경 변수로 지정합니다. Windows 심볼은 Microsoft 심볼 서버에서 요청 시 가져와 ~/.cache/vol-rs에 캐시됩니다.
양쪽 모두 동일한 캡처에 대해 실행되고 diff되었으며, 헤더 프레이밍과 끝의 줄바꿈까지 포함합니다:
| 검사 항목 | 결과 |
|---|---|
| 인수 없는 Windows 플러그인 | 100개 중 99개 동일 |
| 인수 없는 Linux 플러그인 | 57개 중 56개 동일 |
| 인수를 받는 실행 | 43개 중 43개 동일 |
동일하게 비교되지 않은 8개 파일은 아래 알려진 차이점에 나열된 두 가지 경우입니다. 7개는 Python 버전이 덤프할 수 없다고 보고한 후 디스크에 남기는 부분 파일로, 이 포팅에서는 생성되지 않으며, 1개는 내용은 일치하지만 타임스탬프가 각 실행 시점을 기록하는 tarball입니다.
이러한 수치에서 누락된 두 플러그인은 Python 버전이 테스트 머신에서 완료할 수 없는 것들입니다. windows.memmap.Memmap은 780만 줄 이후 OOM(메모리 부족) 킬러에 의해 종료되고, linux.pscallstack.PsCallStack은 끝나기 전에 종료됩니다. 두 경우 모두 Python 버전이 먼저 작성한 모든 줄은 정확히 재현됩니다.
인수 없이 실행되는 모든 플러그인에서 Windows 스윕은 여기서 273초가 걸리는 반면 Python은 5723초, Linux 스윕은 68초가 걸리는 반면 Python은 3130초가 걸립니다.
인수 없이 실행되는 모든 플러그인 중 각 캡처에서 가장 큰 격차를 보이는 10개:
BENCHMARKS.md에는 나머지가 있습니다: 두 캡처의 모든 플러그인, 인수를 받는 실행, 그리고 수치를 측정한 머신에 대한 정보입니다.
일치할 수 없는 몇 가지 사항이 있으며, 각각은 의도적인 것입니다:
linux.pagecache.RecoverFs는 작성하는 tarball의 모든 파일에 플러그인이 실행된 시점의 타임스탬프를 기록하므로, 두 번의 실행이 일치하지 않습니다. Python 실행 두 번도 마찬가지입니다. 테이블은 일치하며 압축 해제된 트리도 일치합니다.--save-config 및 timeliner --record-config는 이미지를 설명하는 모든 설정을 기록하지만, Python 버전이 가져온 구성 요소가 충분히 새로운지 확인하는 검사는 기록하지 않습니다. 이 포팅에는 기록할 그러한 검사가 없기 때문입니다.linux.mountinfo --mount-format은 Python set을 결합하므로 두 Python 실행 간에 열 순서가 변경됩니다. 이 포팅은 마운트 옵션을 먼저 나열하고 파일시스템 옵션을 그 다음에 커널이 보유한 순서로 나열합니다.frameworkinfo 및 isfinfo는 이미지가 아닌 도구를 설명하므로 이 포팅 자체의 레이어, 플러그인 및 심볼 파일을 보고합니다.windows.dumpfiles는 Python 버전이 읽을 수 없다는 것을 발견하기 전에 생성하는 부분 파일을 남기지 않습니다. 테이블은 일치하지만 디렉터리는 해당 파일만큼 다릅니다.--help에서 캐시 디렉터리 이름을 지정하는 줄은 이 포팅 자체의 캐시를 지정합니다.아래의 모든 것은 포팅되어 빌드되지만 아직 실제 증거에 대해 실행되지 않았습니다:
Volatility 3는 Volatility Foundation과 그 기여자들의 작업입니다. 이것은 그들의 설계, 플러그인 세트 및 출력 형식을 포팅한 것이며, 그 작업이 공개되어 있기 때문에 존재할 수 있습니다.
| 추출 플러그인이 작성한 파일 |
| 1,747개 비교, 두 도구가 작성한 모든 파일이 동일 |
| 플러그인 도움말 페이지 | 197개 중 197개 동일 |
| 플러그인 | Rust | Python | 배속 |
|---|
windows.malware.suspicious_threads.SuspiciousThreads | 0.47 s | 281.6 s | x599 |
windows.suspicious_threads.SuspiciousThreads | 0.50 s | 259.1 s | x518 |
windows.malware.hollowprocesses.HollowProcesses | 0.52 s | 257.9 s | x496 |
windows.suspended_threads.SuspendedThreads | 0.090 s | 42.0 s | x467 |
windows.malware.malfind.Malfind | 0.52 s | 236.5 s | x455 |
windows.hollowprocesses.HollowProcesses | 0.59 s | 263.0 s | x446 |
windows.debugregisters.DebugRegisters | 0.090 s | 37.0 s | x411 |
windows.malfind.Malfind | 0.65 s | 239.7 s | x369 |
windows.vadinfo.VadInfo | 0.99 s | 329.7 s | x333 |
windows.verinfo.VerInfo | 0.99 s | 150.7 s | x152 |
| 플러그인 | Rust | Python | 배속 |
|---|
linux.library_list.LibraryList | 1.99 s | 788.7 s | x396 |
linux.kallsyms.Kallsyms | 2.41 s | 161.6 s | x67 |
linux.netfilter.Netfilter | 0.89 s | 56.3 s | x63 |
linux.lsof.Lsof | 0.89 s | 55.6 s | x62 |
linux.sockstat.Sockstat | 1.60 s | 97.2 s | x61 |
linux.check_idt.Check_idt | 0.82 s | 49.7 s | x61 |
linux.malware.netfilter.Netfilter | 1.07 s | 62.0 s | x58 |
linux.pagecache.Files | 1.67 s | 93.4 s | x56 |
linux.kthreads.Kthreads | 0.87 s | 47.2 s | x54 |
linux.proc.Maps | 2.53 s | 135.4 s | x54 |