Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
tmux-fuzzing — OSS-Fuzz를 사용한 tmux 향상 퍼징. 향상된 코드 커버리지를 위한 맞춤형 `cmd-fuzzer` 및 `argument-fuzzer` 하네스와 `CVE-2020-27347`에 대한 PoC를 포함합니다. | Kitploit
도구/GitHubGitHub/lucadibello/tmux-fuzzing
Vulnerability AnalysisCode AnalysisFuzzingBinary AnalysisLearning & EducationLabs & Practice
GitHublucadibello/tmux-fuzzing

tmux-fuzzing

OSS-Fuzz를 사용한 tmux 향상 퍼징. 향상된 코드 커버리지를 위한 맞춤형 `cmd-fuzzer` 및 `argument-fuzzer` 하네스와 `CVE-2020-27347`에 대한 PoC를 포함합니다.

저장소 보기
11년 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Fuzzing Lab: tmux 퍼징 개선

EPFL 소프트웨어 보안, 2025년 봄

요약

이 랩에서는 Google OSS-Fuzz 인프라 내에서 tmux 터미널 멀티플렉서에 대한 퍼징 노력을 개선했습니다. 먼저 기존 input-fuzzer 하니스의 라인 커버리지를 제공된 시드 코퍼스(seed corpus)가 있는 경우와 없는 경우로 나누어 평가하여 기준선(baseline)을 설정했으며, 초기 커버리지가 비슷함을 확인했습니다. 그 다음 기준선 퍼저가 잘 실행하지 못하는 tmux의 두 가지 중요한 코드 영역을 식별했습니다. 이러한 커버리지 격차를 해소하기 위해 두 개의 새로운 대상 퍼징 하니스인 cmd-fuzzer와 argument-fuzzer를 개발하고 평가하여, 이전에 충분히 테스트되지 않았던 영역에서 커버리지를 개선할 수 있음을 입증했습니다. 이러한 퍼징 개선이 프로젝트 기간 내에 새로운 심각한 취약점을 발견하지 못했기 때문에, 크래시 분석은 알려진 과거 취약점에 초점을 맞추었습니다. CVE-2020-27347(스택 기반 버퍼 오버플로)에 대한 개념 증명(PoC)을 개발하고, 근본 원인을 분석했으며, 적용된 수정 사항을 논의하고 보안 영향을 평가했습니다.

프로젝트 개요 및 목표

이 프로젝트는 OSS-Fuzz 프레임워크를 활용하여 오픈소스 터미널 멀티플렉서인 tmux에 퍼징 기법을 적용하고 개선하는 것을 목표로 했습니다. 프로젝트는 다음과 같은 여러 주요 단계로 구성되었습니다:

  1. 기준선 평가 (1부):

    • tmux용 기존 input-fuzzer 하니스를 이해하고 평가합니다.
    • 기본 시드 코퍼스를 사용한 경우와 빈 시드 코퍼스를 사용한 경우의 코드 커버리지 성능을 비교합니다.
  2. 커버리지 격차 분석 (2부):

    • 1부의 커버리지 보고서를 분석하여 input-fuzzer가 충분히 실행하지 못하는 tmux의 중요한 코드 영역을 식별합니다.
    • 인자 파싱(arguments.c)과 명령 파싱/실행 로직(cmd-parse.c, cmd-*.c 모듈)을 개선의 핵심 영역으로 집중 분석합니다.
  3. 퍼저 개선 (3부):

    • 두 개의 새로운 대상 퍼징 하니스를 개발합니다:
      • argument-fuzzer: arguments.c의 명령줄 인자 파싱 로직을 테스트하도록 특별히 설계되었습니다.
      • cmd-fuzzer: cmd-parse.c 및 다양한 cmd-*.c 모듈을 대상으로 명령 파싱 및 실행 경로를 테스트하도록 설계되었습니다.
    • 이러한 새 하니스의 효과를 측정하여 달성한 코드 커버리지를 기준선과 비교하여 평가합니다.
  4. 크래시 분석 (4부):

    • 프로젝트 기간 내에 개선된 퍼저로 새로운 심각한 취약점이 발견되지 않았으므로, tmux의 알려진 기존 취약점(CVE-2020-27347)을 심층 분석 대상으로 선택했습니다.
    • 여기에는 크래시를 재현하기 위한 개념 증명(PoC) 개발, 근본 원인 분석, 적용된 수정 사항 이해, 보안 영향 평가가 포함되었습니다.

저장소 구조

최종 제출물은 다음과 같이 구성됩니다 (submission/ 디렉터리 내):

root@kitploit:~
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 환경에서 실행되도록 설계되었습니다.

사전 요구 사항:

  • Unix 계열 시스템에 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/에 있는 개별 러너 스크립트는 다음을 담당합니다:

  1. 대부분의 러너 스크립트 기준으로 ../../oss-fuzz에 있을 것으로 예상되는 oss-fuzz 저장소의 깨끗한 체크아웃에 실행별 oss-fuzz.diff 패치를 적용하여 특정 테스트 환경을 설정합니다.
  2. 구성 변수(PROJECT, HARNESS, LABEL, 프로젝트별 패치 경로, 출력 디렉터리 등)를 내보냅니다.
  3. _run_fuzz_core.sh 스크립트를 호출하며, 이 스크립트는 다음을 처리합니다:
    • 선택적 프로젝트 수준 패치를 적용합니다 (예: tmux에 새 퍼저 소스를 추가).
    • OSS-Fuzz Docker 이미지를 빌드합니다 (플래그가 설정된 경우).
    • 선택된 샌타이저로 지정된 퍼저를 빌드합니다.
    • 구성된 시간(일반적으로 4시간) 동안 퍼저를 실행합니다.
    • 코퍼스와 HTML 커버리지 보고서를 생성하여 submission/ 디렉터리 구조 내의 지정된 위치로 내보냅니다.

스크립트 실행: 일반적으로 oss-fuzz/ 및 출력 디렉터리에 대한 올바른 상대 경로 해석을 보장하기 위해 프로젝트 루트 디렉터리에서 러너 스크립트를 실행하는 것이 좋습니다.

1. 1부: 기준선 평가 (input-fuzzer) 이 스크립트들은 tmux용 기존 input-fuzzer를 평가합니다.

root@kitploit:~
# 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를 대상으로 합니다.

    root@kitploit:~
    # From the project root directory:
    ./submission/part_3/improve1/run.improve1.sh
    
  • 개선 2 (cmd-fuzzer): cmd-parse.c 및 명령 실행을 대상으로 합니다.

    root@kitploit:~
    # 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부의 기준선 커버리지가 포함되어 있습니다.

3. 4부: CVE-2020-27347 PoC 재현

root@kitploit:~
# From the project root directory:
./submission/part_4/run.poc.sh

이 스크립트는 전용 Docker 이미지를 빌드하고(submission/part_4/environment/Dockerfile에서) 패치된 커밋 a868bac과 비교하여 tmux 3.1b(취약한 버전)를 테스트합니다.

주요 발견 사항 및 결과

(자세한 설명, 그림, 표는 전체 report.pdf에서 확인할 수 있습니다)

1부 (기준선 - input-fuzzer)

  • 기본 시드 코퍼스 사용 시: 라인 커버리지 14.00%(7281/51997줄), 함수 커버리지 24.44%.
  • 시드 코퍼스 없이: 라인 커버리지 13.94%(7248/51997줄), 함수 커버리지 24.31%.
  • 초기 시드 코퍼스가 기존 input-fuzzer에 미치는 영향은 크지 않았습니다.
  • tmux의 상당 부분, 특히 인자 파싱(arguments.c), 명령 파싱/실행(cmd-parse.c, cmd-*.c), 클라이언트/서버 로직(client.c, server.c)은 대부분 실행되지 않았습니다 (예: arguments.c 라인 커버리지 약 5.8%).

3부 (퍼저 개선)

  • 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%)에서 새로운 또는 크게 개선된 커버리지를 달성했습니다.

4부 (CVE-2020-27347 분석)

  • 페이로드 \033[::::::7::1:2:3::5:6:7:m를 사용하여 tmux 3.1b(커밋 6a33a12)에서 CVE-2020-27347(SGR 이스케이프 시퀀스 파싱의 스택 버퍼 오버플로)을 성공적으로 재현했습니다.
  • 수정 사항이 포함되어 버전 3.1c로 이어지는 tmux 커밋 a868bac은 해당 크래시에 취약하지 않음을 확인했습니다.
  • 조작된 시퀀스를 패인 TTY에 기록하여 악용할 수 있는 이 취약점은 서비스 거부(Denial of Service)를 유발하며 임의 코드 실행(Arbitrary Code Execution) 가능성이 있습니다. 심각도는 높음(CVSS 7.8)으로 평가됩니다.

직면한 과제

  • 스크립트 기반 Docker 환경에서 tmux가 올바르게 시작되도록 보장하는 것, 특히 "not a terminal" 오류를 피하기 위해 CVE PoC에서 분리 세션(detached session)을 사용해야 했습니다.
  • 서로 다른 테스트 시나리오에서 git 상태를 관리하는 것(전체 클론 보장, 패치 적용 전 깨끗한 리셋)은 특정 tmux 버전의 재현 가능한 빌드에 중요했습니다.
  • 효과적인 새 퍼징 하니스(argument-fuzzer, cmd-fuzzer)를 개발하려면 실행되지 않은 특정 코드 경로를 대상으로 삼기 위해 tmux 내부의 인자 및 명령 처리 로직에 대한 충분한 이해가 필요했습니다.

향후 작업

  • cmd-fuzzer를 더욱 개선하여 더 넓은 범위의 cmd-*.c 모듈, 특히 창(window), 레이아웃(layout), 패인(pane) 조작과 같은 복잡한 상태 상호작용을 다루는 모듈을 대상으로 삼습니다.
  • 보다 복잡한 환경 모킹을 포함할 수 있는 tmux 클라이언트-서버 통신 프로토콜에 대한 퍼징 전략을 조사합니다.
  • cmd-parse.y의 문법 정의를 활용하여 더 구문적으로 유효하고 복잡한 명령 시퀀스를 생성하는 등, tmux 명령 언어에 대한 구조 인식 퍼징(structured-aware fuzzing) 사용을 탐구합니다.

유용한 링크

  • tmux 프로젝트
  • OSS-Fuzz
  • CVE-2020-27347
  • 프로젝트 보고서 PDF (프로젝트 루트 기준 상대 경로)
도구 다운로드