
OSS-Fuzz를 사용한 tmux 향상 퍼징. 향상된 코드 커버리지를 위한 맞춤형 `cmd-fuzzer` 및 `argument-fuzzer` 하네스와 `CVE-2020-27347`에 대한 PoC를 포함합니다.
EPFL 소프트웨어 보안, 2025년 봄
이 랩에서는 Google OSS-Fuzz 인프라 내에서 tmux 터미널 멀티플렉서에 대한 퍼징 노력을 개선했습니다. 먼저 기존 input-fuzzer 하니스의 라인 커버리지를 제공된 시드 코퍼스(seed corpus)가 있는 경우와 없는 경우로 나누어 평가하여 기준선(baseline)을 설정했으며, 초기 커버리지가 비슷함을 확인했습니다. 그 다음 기준선 퍼저가 잘 실행하지 못하는 tmux의 두 가지 중요한 코드 영역을 식별했습니다. 이러한 커버리지 격차를 해소하기 위해 두 개의 새로운 대상 퍼징 하니스인 cmd-fuzzer와 argument-fuzzer를 개발하고 평가하여, 이전에 충분히 테스트되지 않았던 영역에서 커버리지를 개선할 수 있음을 입증했습니다. 이러한 퍼징 개선이 프로젝트 기간 내에 새로운 심각한 취약점을 발견하지 못했기 때문에, 크래시 분석은 알려진 과거 취약점에 초점을 맞추었습니다. CVE-2020-27347(스택 기반 버퍼 오버플로)에 대한 개념 증명(PoC)을 개발하고, 근본 원인을 분석했으며, 적용된 수정 사항을 논의하고 보안 영향을 평가했습니다.
이 프로젝트는 OSS-Fuzz 프레임워크를 활용하여 오픈소스 터미널 멀티플렉서인 tmux에 퍼징 기법을 적용하고 개선하는 것을 목표로 했습니다. 프로젝트는 다음과 같은 여러 주요 단계로 구성되었습니다:
기준선 평가 (1부):
tmux용 기존 input-fuzzer 하니스를 이해하고 평가합니다.커버리지 격차 분석 (2부):
input-fuzzer가 충분히 실행하지 못하는 tmux의 중요한 코드 영역을 식별합니다.arguments.c)과 명령 파싱/실행 로직(cmd-parse.c, cmd-*.c 모듈)을 개선의 핵심 영역으로 집중 분석합니다.퍼저 개선 (3부):
argument-fuzzer: arguments.c의 명령줄 인자 파싱 로직을 테스트하도록 특별히 설계되었습니다.cmd-fuzzer: cmd-parse.c 및 다양한 cmd-*.c 모듈을 대상으로 명령 파싱 및 실행 경로를 테스트하도록 설계되었습니다.크래시 분석 (4부):
tmux의 알려진 기존 취약점(CVE-2020-27347)을 심층 분석 대상으로 선택했습니다.최종 제출물은 다음과 같이 구성됩니다 (submission/ 디렉터리 내):
submission/
├── README.md # This file
├── part_1/ # Files for Part 1: Baseline Evaluation
│ ├── oss-fuzz.diff # Diff for removing seed corpus for input-fuzzer
│ ├── project.diff # (Likely empty or minor for Part 1)
│ ├── remove_seed_corpus.patch # The actual patch file used
│ ├── report/ # HTML Coverage reports for input-fuzzer
│ │ ├── w_corpus/
│ │ └── wo_corpus/
│ ├── run.w_corpus.sh # Script to run input-fuzzer with corpus
│ └── run.wo_corpus.sh # Script to run input-fuzzer without corpus
├── part_3/ # Files for Part 3: Fuzzer Improvements
│ ├── coverage_noimprove/ # Baseline coverage (e.g., from input-fuzzer without corpus)
│ │ └── ...
│ ├── improve1/ # Improvement 1: argument-fuzzer
│ │ ├── coverage_improve1/ # Coverage report for argument-fuzzer
│ │ ├── oss-fuzz.diff # OSS-Fuzz config changes for argument-fuzzer
│ │ ├── project.diff # Tmux changes for argument-fuzzer (e.g., new .cc, Makefile.am)
│ │ └── run.improve1.sh # Script to run argument-fuzzer
│ └── improve2/ # Improvement 2: cmd-fuzzer
│ ├── coverage_improve2/ # Coverage report for cmd-fuzzer
│ ├── oss-fuzz.diff # OSS-Fuzz config changes for cmd-fuzzer
│ ├── project.diff # Tmux changes for cmd-fuzzer
│ └── run.improve2.sh # Script to run cmd-fuzzer
├── part_4/ # Files for Part 4: Crash Analysis (CVE-2020-27347)
│ ├── environment/ # Docker environment for PoC
│ │ ├── Dockerfile
│ │ ├── run_tmux_cve_test.sh # Core PoC test logic
│ │ ├── test_fixed.sh
│ │ └── test_vulnerable.sh
│ └── run.poc.sh # Script to build Docker image and run PoC tests
└── report.pdf # The comprehensive project report
(참고: _run_fuzz_core.sh를 포함하는 scripts/ 디렉터리는 헬퍼이며, 이 README가 submission/과 함께 실제 프로젝트 루트에 있다면 루트에 포함될 것입니다)
모든 퍼징 캠페인과 CVE PoC 재현은 셸 스크립트로 오케스트레이션되는 Docker 환경에서 실행되도록 설계되었습니다.
모든 퍼징 캠페인과 CVE PoC 재현은 셸 스크립트로 오케스트레이션되는 Docker 환경에서 실행되도록 설계되었습니다.
사전 요구 사항:
bash 셸과 git 클라이언트.oss-fuzz를 클론해야 하는 경우 [email protected]용 SSH 키가 구성되어 있어야 합니다 (프로젝트 루트에 oss-fuzz/가 없으면 클론을 시도합니다). 또는 https://github.com/google/oss-fuzz.git을 프로젝트 루트에 미리 클론해 둘 수도 있습니다.일반 스크립팅 아키텍처:
프로젝트는 중앙 집중식 핵심 스크립트인 scripts/_run_fuzz_core.sh를 사용합니다 (submission/ 디렉터리에는 포함되지 않지만, 이 README가 가정하는 전체 프로젝트 구조의 일부입니다). submission/part_1/, submission/part_3/improve1/, submission/part_3/improve2/, submission/part_4/에 있는 개별 러너 스크립트는 다음을 담당합니다:
../../oss-fuzz에 있을 것으로 예상되는 oss-fuzz 저장소의 깨끗한 체크아웃에 실행별 oss-fuzz.diff 패치를 적용하여 특정 테스트 환경을 설정합니다.PROJECT, HARNESS, LABEL, 프로젝트별 패치 경로, 출력 디렉터리 등)를 내보냅니다._run_fuzz_core.sh 스크립트를 호출하며, 이 스크립트는 다음을 처리합니다:
tmux에 새 퍼저 소스를 추가).submission/ 디렉터리 구조 내의 지정된 위치로 내보냅니다.스크립트 실행:
일반적으로 oss-fuzz/ 및 출력 디렉터리에 대한 올바른 상대 경로 해석을 보장하기 위해 프로젝트 루트 디렉터리에서 러너 스크립트를 실행하는 것이 좋습니다.
1. 1부: 기준선 평가 (input-fuzzer)
이 스크립트들은 tmux용 기존 input-fuzzer를 평가합니다.
# From the project root directory:
./submission/part_1/run.w_corpus.sh # Run input-fuzzer with default seed corpus
./submission/part_1/run.wo_corpus.sh # Run input-fuzzer without seed corpus
run.w_corpus.sh는 시드와 관련하여 기본 tmux 빌드 동작을 사용합니다.
run.wo_corpus.sh는 oss-fuzz/projects/tmux/build.sh에 submission/part_1/remove_seed_corpus.patch를 적용하여(로컬 oss-fuzz.diff를 통해 이 패치를 호출하거나 변경 사항을 통합) 초기 시드 코퍼스가 사용되지 않도록 합니다. 커버리지 보고서는 각각 submission/part_1/report/w_corpus/ and submission/part_1/report/wo_corpus/ 및 submission/part_1/report/wo_corpus/로 내보내집니다.
2. 3부: 퍼저 개선 (input-fuzzer)
개선 1 (argument-fuzzer): arguments.c를 대상으로 합니다.
# From the project root directory:
./submission/part_3/improve1/run.improve1.sh
개선 2 (cmd-fuzzer): cmd-parse.c 및 명령 실행을 대상으로 합니다.
# From the project root directory:
./submission/part_3/improve2/run.improve2.sh
각 run.improveX.sh 스크립트는 로컬 oss-fuzz.diff를 적용하고 PROJECT_PATCH_FILE을 로컬 project.diff로 설정합니다 (project.diff는 tmux에 새 퍼저 코드를 추가하고 Makefile.am을 업데이트합니다). 커버리지 보고서는 각각 submission/part_3/improveX/coverage_improveX/ 디렉터리로 내보내집니다. submission/part_3/coverage_noimprove/ 디렉터리에는 비교를 위한 1부의 기준선 커버리지가 포함되어 있습니다.
# From the project root directory:
./submission/part_4/run.poc.sh
이 스크립트는 전용 Docker 이미지를 빌드하고(submission/part_4/environment/Dockerfile에서) 패치된 커밋 a868bac과 비교하여 tmux 3.1b(취약한 버전)를 테스트합니다.
(자세한 설명, 그림, 표는 전체 report.pdf에서 확인할 수 있습니다)
input-fuzzer에 미치는 영향은 크지 않았습니다.arguments.c), 명령 파싱/실행(cmd-parse.c, cmd-*.c), 클라이언트/서버 로직(client.c, server.c)은 대부분 실행되지 않았습니다 (예: arguments.c 라인 커버리지 약 5.8%).argument-fuzzer (arguments.c 대상): arguments.c에 대해 66.62%의 라인 커버리지를 달성하여, ~5.8% 기준선에서 크게 증가했습니다.cmd-fuzzer (명령 파싱 및 실행 대상): cmd-parse.c의 라인 커버리지를 ~27%에서 42.58%로, 함수 커버리지를 77.78%로 증가시켰습니다.arguments.c 커버리지도 45.54%로 상승했습니다.cmd.c는 39.14%의 라인 커버리지에 도달했습니다.cmd-*.c 모듈(예: cmd-bind-key.c, cmd-set-options.c의 함수 커버리지 50%) 및 키 처리 루틴(key-string.c 라인 커버리지 30%, key-bindings.c 라인 커버리지 6.05%)에서 새로운 또는 크게 개선된 커버리지를 달성했습니다.\033[::::::7::1:2:3::5:6:7:m를 사용하여 tmux 3.1b(커밋 6a33a12)에서 CVE-2020-27347(SGR 이스케이프 시퀀스 파싱의 스택 버퍼 오버플로)을 성공적으로 재현했습니다.a868bac은 해당 크래시에 취약하지 않음을 확인했습니다.argument-fuzzer, cmd-fuzzer)를 개발하려면 실행되지 않은 특정 코드 경로를 대상으로 삼기 위해 tmux 내부의 인자 및 명령 처리 로직에 대한 충분한 이해가 필요했습니다.cmd-fuzzer를 더욱 개선하여 더 넓은 범위의 cmd-*.c 모듈, 특히 창(window), 레이아웃(layout), 패인(pane) 조작과 같은 복잡한 상태 상호작용을 다루는 모듈을 대상으로 삼습니다.cmd-parse.y의 문법 정의를 활용하여 더 구문적으로 유효하고 복잡한 명령 시퀀스를 생성하는 등, tmux 명령 언어에 대한 구조 인식 퍼징(structured-aware fuzzing) 사용을 탐구합니다.