Share
## https://sploitus.com/exploit?id=2E9D7F26-C69D-5E2D-AE31-93049A40C9E1
# CVE-2023-4911 "Looney Tunables" ๋ถ์ ํ๊ฒฝ
> GNU C Library(glibc) ๋์ ๋ก๋์ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ ์ทจ์ฝ์ (Local Privilege Escalation) ๋ถ์ ๋ฐ ์ต์คํ๋ก์ ๊ฐ๋ฐ์ ์ํ Docker ๊ธฐ๋ฐ ์ค์ต ํ๊ฒฝ์
๋๋ค.
---
## CVE ์ ๋ณด
| ํญ๋ชฉ | ๋ด์ฉ |
|------|------|
| **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 ์คํ์ ๋์ด, **์ทจ์ฝ์ ์ ๋์ ์๋ฆฌ๋ฅผ ์ง์ ๋ถ์ํ๊ณ ์ต์คํ๋ก์์ ๊ฐ๋ฐํ๋ ๊ณผ์ **์ ๋ชฉํ๋ก ์ค๊ณ๋์์ต๋๋ค.
- ์ทจ์ฝํ glibc ๋ฒ์ (2.35-0ubuntu3.3)์ด ์ค์ ๋ก ๋์ํ๋ ํ๊ฒฝ ์ฌํ
- `ld.so` ์์ค์ฝ๋์ ์คํ ๋ฐ์ด๋๋ฆฌ๋ฅผ ํจ๊ป ๋ถ์ํ ์ ์๋ ํ๊ฒฝ ์ ๊ณต
- GDB / gef / gdbserver๋ฅผ ํตํ ๋์ ๋ถ์ ์ง์
- ์ผ๋ฐ ์ ์ (`researcher`) โ root ๊ถํ ์์น ์๋๋ฆฌ์ค ์ง์ ์ค์ต
- ํ์ ๋๊ตฌ๋ ๋์ผํ ํ๊ฒฝ์์ ๋ถ์์ ์์ํ ์ ์๋๋ก Docker๋ก ์์ ๊ฒฉ๋ฆฌ
---
## ํ๋ก์ ํธ ๊ตฌ์กฐ
```
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 # ํ ํ ๋น ํ
์คํธ ๋ฐ์ด๋๋ฆฌ ์์ค
```
---
## ํ๊ฒฝ ์๊ตฌ์ฌํญ
- Docker
- Linux ๋๋ WSL2 (Windows)
---
## ์ฌ์ฉ๋ฒ
### 1. ์ด๋ฏธ์ง ๋น๋ ๋ฐ ์ปจํ
์ด๋ ์คํ
```bash
./run.sh build && ./run.sh run
```
### 2. sudo ๋น๋ฐ๋ฒํธ ์
๋ ฅ
์ปจํ
์ด๋ ์์ ์ sudo ๋น๋ฐ๋ฒํธ๋ฅผ ์๊ตฌํฉ๋๋ค.
```
๋น๋ฐ๋ฒํธ: password
```
### 3. ์ทจ์ฝ์ ํ์ธ
```bash
# SIGSEGV ๋ฐ์ ์ฌ๋ถ ํ์ธ
python3 /workspace/poc/exploit.py --check-only
# ์ง์ ํธ๋ฆฌ๊ฑฐ
GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=AAAA \
/workspace/test_targets/test_suid
```
### 4. GDB ๋ถ์
```bash
# ์ปจํ
์ด๋ ๋ด๋ถ ์ง์ ๋ถ์
gdb -q /workspace/test_targets/test_suid
# ์๊ฒฉ ๋๋ฒ๊น
(gdbserver)
# ์ปจํ
์ด๋ ๋ด๋ถ
gdbserver :1234 /workspace/test_targets/test_suid
# ๋ก์ปฌ ํธ์คํธ
gdb
(gdb) target remote localhost:1234
```
### 5. LPE ์ต์คํ๋ก์ ์คํ
GDB๋ก `OVERFLOW_OFFSET`๊ณผ `TARGET_ADDR` ๋ถ์ ํ `exploit_lpe.py` ์๋จ ๊ฐ์ ์
๋ฐ์ดํธํ๊ณ ์คํํฉ๋๋ค.
```bash
python3 /workspace/poc/exploit_lpe.py
```
### run.sh ์ต์
| ๋ช
๋ น | ์ค๋ช
|
|------|------|
| `./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` |
---
## ๋ถ์ ํฌ์ธํธ
### ์ ์ ๋ถ์
```bash
# ์ทจ์ฝ ํจ์ ์์น
/workspace/glibc-source/elf/dl-tunables.c
# ์ฃผ์ ํจ์
__tunables_init() # ์ง์
์
parse_tunables() # ์ค๋ฒํ๋ก์ฐ ๋ฐ์ ์ง์
tunables_strdup() # ๋ฒํผ ํ ๋น
```
### ๋์ ๋ถ์
```bash
# 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` ๋ชจ๋๋ก ์คํ๋๋ฏ๋ก ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์์๋ง ์ฌ์ฉํ์ญ์์ค
- ๋ณธ ์ ์ฅ์์ ์ฝ๋๋ฅผ ์
์ฉํ์ฌ ๋ฐ์ํ๋ ๋ชจ๋ ๋ฒ์ ์ฑ
์์ ์ฌ์ฉ์ ๋ณธ์ธ์๊ฒ ์์ต๋๋ค
---
## ์ฐธ๊ณ ์๋ฃ
- [Qualys Security Advisory](https://www.qualys.com/2023/10/03/cve-2023-4911/)
- [glibc ๊ณต์ ์ ์ฅ์](https://sourceware.org/git/?p=glibc.git)
- [Ubuntu Security Notice USN-6404-1](https://ubuntu.com/security/notices/USN-6404-1)