Share
## https://sploitus.com/exploit?id=7F82534B-9F08-5088-B2DE-D6801111C233
# glibc ํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ ์ทจ์ฝ์ (CVE-2023-4911)
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| CVE ID | CVE-2023-4911 |
| ๊ณต๊ฒฉ ์ ํ | ํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ โ ๋ก์ปฌ ๊ถํ์์น(Local Privilege Escalation) |
| CVSS 3.1 | 7.8 (High) |
| ๊ณต๊ฐ์ผ | 2023-10-03 |
| ์ทจ์ฝ ํฌ์ธํธ | glibc ๋์ ๋ก๋(`ld.so`)์ `GLIBC_TUNABLES` ํ์ |
| ์ทจ์ฝ ๋ฒ์ | glibc 2.34~2.38 |
## 1. ๊ฐ์
CVE-2023-4911์ GNU C Library(glibc)์ ๋์ ๋ก๋๊ฐ `GLIBC_TUNABLES` ํ๊ฒฝ๋ณ์๋ฅผ
ํ์ฑํ๋ ๊ณผ์ ์์ ๋ฐ์ํ๋ ํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ ์ทจ์ฝ์ ์ด๋ค. ๊ณต๊ฒฉ์๋ ์ด ์ค๋ฒํ๋ก์ฐ๋ฅผ
์ด์ฉํด ๋์ ๋ก๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒ์ ๊ฒฝ๋ก(`RPATH`)๋ฅผ ์กฐ์ํจ์ผ๋ก์จ, SUID root
๋ฐ์ด๋๋ฆฌ(`su`, `sudo` ๋ฑ)๊ฐ ์คํ๋ ๋ ๊ณต๊ฒฉ์๊ฐ ์ค๋นํ ์
์ฑ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์
๋ก๋์์ผ ์์ ์ฝ๋๋ฅผ root ๊ถํ์ผ๋ก ์คํํ ์ ์๋ค. glibc๋ ์ฌ์ค์ ๋ชจ๋ ์ฃผ์
๋ฆฌ๋
์ค ๋ฐฐํฌํ์ ํต์ฌ ๊ตฌ์ฑ์์์ด๋ฏ๋ก, ์ด ์ทจ์ฝ์ ์ 2021๋
4์ ์ดํ ์ถ์๋ ๋๋ถ๋ถ์
glibc ๊ธฐ๋ฐ ๋ฐฐํฌํ์ ์ํฅ์ ๋ฏธ์ณค๋ค.
## 2. ์ทจ์ฝ ์ฝ๋ ์ผ๋ถ
```c
while (true)
{
char *name = p;
size_t len = 0;
/* ์ด๋ฆ(name) ๊ธธ์ด ์ฐพ๊ธฐ */
while (p[len] != '=' && p[len] != ':' && p[len] != '\0')
len++;
/* '=' ์์ด ๋๋๋ฉด ์ข
๋ฃ */
if (p[len] == '\0')
{
if (__libc_enable_secure)
tunestr[off] = '\0';
return;
}
/* ':'๋ฅผ ๋จผ์ ๋ง๋๋ฉด ์๋ชป๋ ํญ๋ชฉ */
if (p[len] == ':')
{
p += len + 1;
continue;
}
/* '='๋ฅผ ๋ง๋ฌ์ผ๋ฏ๋ก value ์์์ผ๋ก ์ด๋ */
p += len + 1;
/* ์๋ณธ ๋ฌธ์์ด์์ value ๊ณ์ฐ */
char *value = &valstring[p - tunestr];
len = 0;
/* value ๊ธธ์ด ์ฐพ๊ธฐ */
while (p[len] != ':' && p[len] != '\0')
len++;
...
/* tunestr์ ๋ณต์ฌ */
...
if (p[len] != '\0')
p += len + 1;
}
```
## 3. ์์ธ ๋ถ์
### 3.1 ์ ์ ์ฒ๋ฆฌ ํ๋ฆ
1. `__tunables_init()`์ด ํ๊ฒฝ๋ณ์ ๋ชฉ๋ก์์ `GLIBC_TUNABLES`๋ฅผ ์ฐพ๋๋ค.
2. `tunables_strdup()`๊ฐ `__minimal_malloc()`์ผ๋ก ๋ฒํผ๋ฅผ ํ ๋นํ๊ณ ์๋ณธ ๋ฌธ์์ด์
๋ณต์ฌํ๋ค (์ด ์์ ์ malloc์ ์์ง ์์ ํ ์ด๊ธฐํ๋์ง ์์ ๋งค์ฐ ์ด๋ฅธ malloc
๊ตฌํ์ฒด๋ค).
3. `parse_tunables()`๊ฐ ์ด ๋ฒํผ๋ฅผ `:`(์ฝ๋ก ) ๊ธฐ์ค์ผ๋ก ์ํํ๋ฉฐ ๊ฐ
`key=value` ์์ ๋ถ๋ฆฌํด ํด๋น ํ๋๋ธ์ ๊ฐ์ ๋์
ํ๋ค.
### 3.2 ๊ฒฐํจ ์ง์
`parse_tunables()`๋ ํ๋์ ํ๋๋ธ์ **name ํ์ฑ โ `p` ์ด๋ โ value ํ์ฑ โ `p` ์ด๋** ์์๋ก ์ฒ๋ฆฌํ๋ค. ์ ์์ ์ธ ์
๋ ฅ์์๋ value๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ ๋ค ๋ค์ ํ๋๋ธ์ ์์ ์์น๋ก `p`๊ฐ ์ด๋ํ์ฌ ๋ค์ ํญ๋ชฉ์ ํ์ฑํ๋ค.
๊ทธ๋ฌ๋ ๋ค์๊ณผ ๊ฐ์ด `name=name=value` ํํ์ ์
๋ ฅ์ด ์ฃผ์ด์ง๋ฉด,
```text
GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=AAAA...(๊ธด ๋ฌธ์์ด)
```
์ฒซ ๋ฒ์งธ ํ์ฑ ๊ณผ์ ์์ `glibc.malloc.mxfast=AAAA...` ์ ์ฒด๊ฐ ํ๋์ value๋ก ์ธ์๋์ด `tunestr` ๋ฒํผ์ ๋ณต์ฌ๋๋ค. ์ดํ value ๋ค์ ๋ค์ ํ๋๋ธ์ ๊ตฌ๋ถํ๋ ์ฝ๋ก (`:`)์ด ์กด์ฌํ์ง ์์ ํ์ฑ ํฌ์ธํฐ(`p`)๊ฐ ๋ค์ ํญ๋ชฉ์ผ๋ก ์ด๋ํ์ง ๋ชปํ๊ณ , ์ด๋ฏธ ๋ณต์ฌํ value์ ์์ ์์น๋ฅผ ๋ค์ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
๋ฌธ์ ๋ ์ด value ์์ฒด๊ฐ `name=value` ํํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ์ ์ด๋ค. ๋ค์ ๋ฐ๋ณต์์ ํ์๋ ์ด๋ฅผ ์๋ก์ด ํ๋๋ธ๋ก ์๋ชป ์ธ์ํ์ฌ ์ค๋ณต๋ ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ์ ๊ธฐ๋กํ๋ค. `tunestr`์ ์๋ณธ ๋ฌธ์์ด ํฌ๊ธฐ๋งํผ๋ง ํ ๋น๋์ด ์์ผ๋ฏ๋ก, ์ค๋ณต๋์ด ๊ธฐ๋ก๋๋ ๋ถ๋ถ์ด ์๊ฒจ ํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ๋ค.
### 3.3 ์ค๋ฒํ๋ก์ฐ๋ก ์ธํ ํจ๊ณผ
๋ฐ์ํ ํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ `__minimal_malloc()`์ผ๋ก ์ฐ์ ํ ๋น๋ ์ธ์ ํ ์์ญ๊น์ง ๋ฎ์ด์ด๋ค. ๊ณต๊ฒฉ์๋ ์ด๋ฅผ ์ด์ฉํ์ฌ ๋์ ๋ก๋(ld.so)์ ๋ด๋ถ ๊ตฌ์กฐ์ฒด์ธ `link_map`์ `l_info[DT_RPATH]` ํฌ์ธํฐ๋ฅผ ๊ณต๊ฒฉ์๊ฐ ์ ์ดํ๋ ์คํ ์ฃผ์๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
ํด๋น ์คํ ์์ญ์๋ ๋ฏธ๋ฆฌ ์กฐ์ํ `Elf64_Dyn` ๊ตฌ์กฐ์ฒด๊ฐ ๋ฐฐ์น๋์ด ์์ผ๋ฉฐ, ์ด ๊ตฌ์กฐ์ฒด๋ ๊ณต๊ฒฉ์๊ฐ ์ํ๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ์๋ก์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒ์ ๊ฒฝ๋ก(RPATH)๋ก ์ง์ ํ๋ค. ๊ทธ ๊ฒฐ๊ณผ ld.so๋ ์ ์ ์์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ ๊ณต๊ฒฉ์๊ฐ ์ค๋นํ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ์ ์ ์ผ๋ก ๋ก๋ํ๊ฒ ๋๋ค.
## 4. ๊ณต๊ฒฉ ์ฒด์ธ
1. ๊ณต๊ฒฉ์๋ `name=name=value` ํํ์ `GLIBC_TUNABLES` ํ๊ฒฝ๋ณ์๋ฅผ ๊ตฌ์ฑํ๋ค.
2. ์ผ๋ฐ ์ฌ์ฉ์ ๊ถํ์ผ๋ก SUID ํ๋ก๊ทธ๋จ(`su` ๋ฑ)์ ์คํํ๋ค.
3. ์ปค๋์ SUID ๋นํธ์ ์ํด ํด๋น ํ๋ก์ธ์ค์ **effective UID**๋ฅผ root๋ก ๋ณ๊ฒฝํ ๋ค ๋์ ๋ก๋(ld.so)๋ฅผ ์คํํ๋ค.
4. ld.so์ `parse_tunables()`์์ ํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ๋ค.
5. ์ค๋ฒํ๋ก์ฐ๋ฅผ ์ด์ฉํ์ฌ `link_map`์ `l_info[DT_RPATH]` ํฌ์ธํฐ๋ฅผ ๊ณต๊ฒฉ์๊ฐ ์ค๋นํ ๊ฐ์ง `Elf64_Dyn` ๊ตฌ์กฐ์ฒด๊ฐ ์์นํ ์คํ ์ฃผ์๋ก ์กฐ์ํ๋ค.
6. ld.so๋ ์กฐ์๋ RPATH ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ๊ณต๊ฒฉ์๊ฐ ์ค๋นํ ์
์ฑ `libc.so.6`์ ๋ก๋ํ๋ค.
7. ์
์ฑ `libc.so.6`์ ์ด๊ธฐํ ์ฝ๋(๋๋ ๋ณ์กฐ๋ ์์ ๋ฃจํด)๊ฐ root ๊ถํ์ผ๋ก ์คํ๋์ด `setuid(0)`, `setgid(0)` ๋ฐ `/bin/sh` ์คํ์ ์ํํ๋ค.
8. ์ด ๊ณผ์ ์ `su`์ ์ธ์ฆ ๋ก์ง์ด ์คํ๋๊ธฐ ์ ์ ์ด๋ฃจ์ด์ง๋ฏ๋ก, ๋น๋ฐ๋ฒํธ ๊ฒ์ฆ ์์ด root ์์ ํ๋ํ๊ฒ ๋๋ค.
PoC๋ ๋์ํ(ASLR)์ ์ํฅ์ผ๋ก ์ํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ด ํ์ฑ๋ ๋๊น์ง `execve()`๋ฅผ ๋ฐ๋ณต ์ํํ๋ ๋ธ๋ฃจํธํฌ์ค ๋ฐฉ์์ ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ ๊ณต๊ฒฉ ์ฑ๊ณต ์ฌ๋ถ ๋ฐ ์์ ์๊ฐ์ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ผ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์๋ฐฑ~์์ฒ ํ์ ๋ฐ๋ณต ์๋๊ฐ ํ์ํ๋ค.
## 5. ์ฌํ ์กฐ๊ฑด
- SUID, SGID ๋ฑ์ ์์ ๊ถํ ์์น์ด ๊ฐ๋ฅํ ๋ฐ์ด๋๋ฆฌ๊ฐ ์กด์ฌํ ๊ฒ
- ๊ณต๊ฒฉ์๊ฐ ํด๋น ๋ฐ์ด๋๋ฆฌ๋ฅผ ์์ ํ๊ฒฝ๋ณ์์ ํจ๊ป ์คํํ ์ ์์ ๊ฒ
- glibc์ด ํจ์น ์ด์ ๋ฒ์ ์ผ ๊ฒ
## 6. ์ค์ต ํ๊ฒฝ ์ฌํ (PoC)
์ฐ์ git์ ์๋ ๋ด์ฉ์ ๋๋ ํ ๋ฆฌ์ clone ํ๋ค
```bash
git clone https://github.com/baeseungwon1010/CVE-2023-4911
```

์๋ ๋ช
๋ น์ด๋ฅผ ํตํด docker image๋ฅผ ๋น๋ํ๋ค
```bash
cd C* && docker compose run --rm cve-2023-4911-lab
```

์ปจํ
์ด๋ ์ง์
ํ expolit code๋ฅผ ์คํํ๋ค
```bash
cd /home/student/exploit && ./exp
```
์คํ ํ ๊ธฐ๋ค๋ฆฌ๋ฉด ์ผ๋ฐ user์์ sudo(0)์ผ๋ก ๋ณํ ๊ฒ์ ๋ณผ ์ ์๋ค


## 7. ๋์ ๋ฐฉ์
glibc์ ๋ฒ์ ์ ์ทจ์ฝ ๋ฒ์ ์์ ์ด์ ๋ฒ์ ์ผ๋ก ํจ์นํ๋ค.
ํจ์น ํ, ๊ฐ๋ฅํ๋ฉด ์ฌ๋ถํ
/์ฌ์์์ผ๋ก ์ด์ ๋ฒ์ ์ glibc์ด ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์์ง ์๊ฒ ํ๋ค
์ฆ์ ํจ์น๊ฐ ์ด๋ ค์ด ๊ฒฝ์ฐ ๋ถํ์ํ SUID, SGID ๋ฑ์ ํ๋ก์ธ์ค๋ฅผ ์ญ์ ํ๋ ์์๋ฐฉํธ์ด ์กด์ฌํ๋ค.
## 8. ์ฐธ๊ณ ์๋ฃ
- [NVD: CVE-2023-4911](https://nvd.nist.gov/vuln/detail/cve-2023-4911)
- [Ubuntu Security Notice: CVE-2023-4911](https://ubuntu.com/security/CVE-2023-4911)
- [leesh3288/CVE-2023-4911 PoC](https://github.com/leesh3288/CVE-2023-4911)
- [Debian Sources - glibc 2.28-10 `dl-tunables.c`](https://sources.debian.org/src/glibc/2.28-10/elf/dl-tunables.c)