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
```

![](์ด๋ฏธ์ง€1.png)

์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด docker image๋ฅผ ๋นŒ๋“œํ•œ๋‹ค

```bash
cd C* && docker compose run --rm cve-2023-4911-lab
```

![](์ด๋ฏธ์ง€2.png)

์ปจํ…Œ์ด๋„ˆ ์ง„์ž… ํ›„ expolit code๋ฅผ ์‹คํ–‰ํ•œ๋‹ค

```bash
cd /home/student/exploit && ./exp
```

์‹คํ–‰ ํ›„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์ผ๋ฐ˜ user์—์„œ sudo(0)์œผ๋กœ ๋ณ€ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

![](์ด๋ฏธ์ง€3.png)
![](์ด๋ฏธ์ง€4.png)

## 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)