CVE-2021-3156 — Baron Samedit
sudo의 힙 기반 버퍼 오버플로우 → 로컬 권한 상승
ITSOLERA 사이버 보안 부서 | 레드팀 인턴십 2026
██████╗ █████╗ ██████╗ ██████╗ ███╗ ██╗ ███████╗ █████╗ ███╗ ███╗███████╗██████╗ ██╗████████╗
██╔══██╗██╔══██╗██╔══██╗██╔═══██╗████╗ ██║ ██╔════╝██╔══██╗████╗ ████║██╔════╝██╔══██╗██║╚══██╔══╝
██████╔╝███████║██████╔╝██║ ██║██╔██╗ ██║ ███████╗███████║██╔████╔██║█████╗ ██║ ██║██║ ██║
██╔══██╗██╔══██║██╔══██╗██║ ██║██║╚██╗██║ ╚════██║██╔══██║██║╚██╔╝██║██╔══╝ ██║ ██║██║ ██║
██████╔╝██║ ██║██║ ██║╚██████╔╝██║ ╚████║ ███████║██║ ██║██║ ╚═╝ ██║███████╗██████╔╝██║ ██║
╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═════╝ ╚═╝ ╚═╝
⚠️ 교육용 / 격리된 실습 환경 전용
모든 테스트는 반드시 Docker 실습 컨테이너 내부에서만 수행해야 합니다.
실제, 프로덕션 또는 공유 시스템에서 실행하지 마십시오.
목차
- CVE 개요
- 이 CVE가 특별한 이유
- 프로젝트 구조
- 팀 산출물
- 빠른 시작
- 익스플로잇 작동 방식
- 취약점 카나리 테스트
- exploit.py 사용법
- 실습 환경 초기화 및 스냅샷
- 패치 전후 비교
- 참고 자료
CVE 개요
| 속성 | 값 |
|---|
| CVE ID | CVE-2021-3156 |
| 별칭 | Baron Samedit |
| 유형 | 힙 기반 버퍼 오버플로우 → 로컬 권한 상승 |
| 구성 요소 | sudo — Linux 권한 유틸리티 (src/sudo.c의 set_cmnd()) |
| CVSS v3 점수 | 7.8 높음 |
| 벡터 | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 취약한 버전 | sudo 1.8.2 – 1.8.31p2 및 1.9.0 – 1.9.5p1 |
| 패치된 버전 | sudo 1.9.5p2 (1.9 브랜치) / sudo 1.8.32 (1.8 브랜치) |
| 실습 대상 버전 | Ubuntu 20.04의 sudo 1.8.31 |
| 패치 KB / 권고 | SA: https://www.sudo.ws/security/advisories/unescape_overflow/ |
| 발견자 | Qualys Research Team |
| 공개일 | 2021-01-26 |
| 실제 환경 노출 기간 (코드 기준) | ~2011-07-09 (sudo 1.8.2)부터 — 약 10년간 탐지되지 않음 |
| 인증 요구사항 | 로컬 사용자만 — sudo 권한 불필요 |
이 CVE가 특별한 이유
| 속성 | CVE-2021-3156 | 일반적인 sudo LPE |
|---|
| sudoers 항목 필요 | ❌ 아니요 | ✅ 예 |
| sudo 그룹 가입 필요 | ❌ 아니요 | ✅ 예 |
| 기존 sudo 접근 권한 필요 | ❌ 아니요 | ✅ 예 |
| 새로 만든 사용자 계정에서 작동 | ✅ 예 | ❌ 아니요 |
| 권한 시스템을 악용 | ❌ 완전히 우회 | ✅ 남용 |
| 공격 표면 | 인수 파서 (인증 전) | 권한 검사 |
핵심 인사이트: 오버플로우는 인수를 파싱하는 함수인 set_cmnd()에서 발생하며,
이는 sudo가 /etc/sudoers를 참조하기 전에 실행됩니다.
10초 전에 생성된 권한이 전혀 없는 계정으로도 이 취약점을 악용할 수 있습니다.
프로젝트 구조
CVE-2021-3156-Project/
│
├── README.md ← you are here
│
├── lab/ ← Member 1: Lab Environment
│ ├── Dockerfile ← Ubuntu 20.04 + sudo 1.8.31 (pinned)
│ ├── docker-compose.yml ← vulnerable target + patched reference
│ ├── evidence_helper.sh ← pre/post-exploit state capture
│ ├── SETUP.md ← step-by-step VM/Docker guide
│ └── config_notes.md ← CVE conditions & container details
│
├── exploit/ ← Member 2: Exploit Development
│ ├── exploit.py ← Python LPE framework + canary test
│ └── payloads.txt ← heap overflow research notes
│
├── docs/ ← Member 3: Research & Documentation
│ ├── root_cause_analysis.md ← set_cmnd() deep dive + off-by-one
│ ├── references.md ← all sources, PoCs, CWE mapping
│ └── mitigation.md ← sudo upgrade + hardening checklist
│
├── proof/ ← Member 4: Evidence Collection
│ ├── screenshots/ ← exploitation screenshots
│ └── terminal_logs.txt ← command output template + logs
│
└── report/
└── CVE-2021-3156_Report.docx ← Member 4: Final professional report
팀 산출물
구성원 1 — 실습 환경 및 CVE 검증
| 파일 | 설명 |
|---|
lab/Dockerfile | sudo 1.8.31이 고정된 Ubuntu 20.04 (취약); Python 3 설치; sudo 접근 권한이 없는 labuser 계정 |
lab/docker-compose.yml | 취약한 대상 + 패치된 Ubuntu 22.04 참조 컨테이너 오케스트레이션 |
lab/evidence_helper.sh | 익스플로잇 전/후 시스템 상태(사용자, sudo 버전, 카나리) 캡처용 Bash 스크립트 |
lab/SETUP.md | 단계별 안내: 빌드 → 시작 → 진입 → sudo 버전 확인 → 카나리 실행 → 스냅샷 |
lab/config_notes.md | 잘못된 설정이 필요 없는 이유, Docker 보안 설정, 자격 증명 참조 설명 |
구성원 2 — 익스플로잇 개발 (PoC 스크립트)
| 파일 | 설명 |
|---|
exploit/exploit.py | 전체 Python 프레임워크: check_platform(), check_sudo_version(), run_canary_test(), get_system_info() + 세 가지 익스플로잇 TODO 스텁(select_heap_strategy, build_overflow_argument, trigger_overflow_and_escalate) 및 blasty/worawit PoC 상세 참조 포함 |
exploit/payloads.txt | 힙 오버플로우 개념, COMPRESSION_TRANSFORM 등가물(인수 구조), 세 가지 힙 전략, 실패 시도 기록 템플릿, 탐지 시그니처 |
참고: 실제 커널/힙 익스플로잇 코드는 윤리 지침에 따라 포함되지 않습니다.
exploit.py의 TODO 스텁은 공식 공개 PoC인
https://github.com/blasty/CVE-2021-3156 및
https://github.com/worawit/CVE-2021-3156를 참조하므로
팀에서 이를 연구하고 통합하시기 바랍니다.
구성원 3 — 근본 원인 분석 및 연구
| 파일 | 설명 |
|---|
docs/root_cause_analysis.md | 상세 분석: set_cmnd() 크기 vs 복사 불일치, 코드 예시가 포함된 off-by-one, 패치 diff, 익스플로잇 체인, CVSS 7.8 지표별 분석, 10년 타임라인, 배포판 영향 표 |
docs/references.md | Qualys 권고, MITRE, NVD, sudo 프로젝트, blasty PoC, worawit PoC, ExploitDB, GTFOBins, CWE 매핑 |
docs/mitigation.md | apt-get install --only-upgrade sudo, 검증 카나리, AppArmor 강화, auditd 모니터링, 강화 표 |
구성원 4 — 증거 수집, 보고 및 통합
| 파일 | 설명 |
|---|
proof/terminal_logs.txt | 증거 수집 템플릿 (실제 실습 출력으로 채우기) |
proof/screenshots/ | 필수 스크린샷 7개용 디렉토리 |
report/CVE-2021-3156_Report.docx | 12개 섹션 전문 보고서: 표지, 경영진 요약, CVE 설명, 근본 원인 분석, CVSS 분석, 익스플로잇 단계, 코드 설명, 증거 체크리스트, 완화 조치, 타임라인, 참고 문헌, 고지 사항 |
빠른 시작
1. 실습 환경 빌드 및 시작
cd CVE-2021-3156-Project/lab/
# Build the vulnerable image (downloads Ubuntu 20.04, pins sudo 1.8.31)
docker compose build
# Start both containers
docker compose up -d
# Confirm containers are running
docker compose ps
예상 출력:
NAME STATUS
baron_samedit_target running
baron_samedit_patched running
2. 취약한 컨테이너 진입
docker exec -it baron_samedit_target bash
3. 취약점 조건 확인
# Inside the container as labuser
whoami # Expected: labuser
id # Expected: uid=1000(labuser)...
sudo --version # Expected: Sudo version 1.8.31
sudo -l # Expected: Sorry, user labuser may not run sudo...
sudoedit -s '\' 2>&1 # Expected: NOT "usage:" → VULNERABLE
4. 익스플로잇 복사 및 실행
# From host machine
docker cp exploit/exploit.py baron_samedit_target:/home/labuser/
# Inside container
python3 exploit.py --check-only # verify all prerequisites pass
python3 exploit.py --safe-mode # canary only, no exploitation
python3 exploit.py --cmd "id" # LPE → show root identity
python3 exploit.py --cmd "whoami /all" --output /tmp/proof.txt
5. 증거 캡처
# Inside container — before exploit
~/evidence_helper.sh > /tmp/before.txt
# After exploit
~/evidence_helper.sh > /tmp/after.txt
# Copy to host
docker cp baron_samedit_target:/tmp/before.txt proof/terminal_logs_before.txt
docker cp baron_samedit_target:/tmp/after.txt proof/terminal_logs_after.txt
익스플로잇 작동 방식