Sploitus

Exploit for cve-2026-11837-ansible-posix-authorized-key

kitploit Β· 2026-08-22

Exploit Code

MARKDOWN109 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-M8SEVEN-CVE-2026-11837-ANSIBLE-POSIX-AUTHORIZED-KEY
# CVE-2026-11837: ansible.posix `authorized_key` 둜컬 κΆŒν•œ μƒμŠΉ

μ‚¬μš©μžμ˜ `~/.ssh` 디렉터리 및 `authorized_keys` νŒŒμΌμ— λŒ€ν•œ 심볼릭 링크λ₯Ό λ”°λΌκ°€λŠ” `chown`(및 심볼릭 링크λ₯Ό λ”°λΌκ°€λŠ” 파일 생성)을 ν†΅ν•œ `ansible.posix.authorized_key` Ansible λͺ¨λ“ˆμ˜ 둜컬 κΆŒν•œ μƒμŠΉμž…λ‹ˆλ‹€.

μ΄λŠ” μ œκ°€ λ³΄κ³ ν•˜κ³  Red Hat Product Security(CNA)μ—μ„œ **CVE-2026-11837** 을 ν• λ‹Ήν•œ 취약점에 λŒ€ν•œ λΆ„μ„μž…λ‹ˆλ‹€. 기술 κΈ°λ‘μœΌλ‘œμ„œ 여기에 κ²Œμ‹œλ˜λ©°, μƒˆλ‘œμš΄ λ°œκ²¬μ„ μ£Όμž₯ν•˜λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€. 이 λ¬Έμ œλŠ” 이전 μˆ˜μ • 사항이 닀루지 μ•Šμ€ λͺ¨λ“ˆμ—μ„œμ˜ CVE-2024-9902의 **자맀** μž…λ‹ˆλ‹€.

## 곡식 μ°Έμ‘°

  * Red Hat CVE 기둝: https://access.redhat.com/security/cve/CVE-2026-11837
  * Red Hat Bugzilla 결함: https://bugzilla.redhat.com/show_bug.cgi?id=2487424
  * 영ν–₯을 λ°›λŠ” λͺ¨λ“ˆ μ†ŒμŠ€: https://github.com/ansible-collections/ansible.posix/blob/main/plugins/modules/authorized_key.py



> Red Hat의 κ²Œμ‹œλœ 인정: "Red Hat은 이 문제λ₯Ό 보고해 μ£Όμ‹  Valentino Paulonμ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€."

## μš”μ•½

루트둜 μ‹€ν–‰λ˜λŠ” ν”Œλ ˆμ΄λΆμ΄ `ansible.posix.authorized_key`λ₯Ό μ‚¬μš©ν•˜μ—¬ 둜컬 μ‚¬μš©μžμ˜ ν‚€λ₯Ό 관리할 λ•Œ, λͺ¨λ“ˆμ˜ `keyfile()` ν—¬νΌλŠ”:

  * μ‚¬μš©μžμ˜ `~/.ssh` 디렉터리 및 `~/.ssh/authorized_keys`의 μ†Œμœ κΆŒμ„ 일반 `os.chown`(`os.lchown` μ•„λ‹˜)으둜 λ³€κ²½ν•˜κ³ ,
  * 일반 `open(..., "w")`(`O_NOFOLLOW` μ—†μŒ)으둜 ν‚€ νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€.



κΈ°λ³Έ `follow=False`λ₯Ό μ‚¬μš©ν•˜λ©΄ λͺ¨λ“ˆμ€ 심볼릭 링크λ₯Ό λ”°λΌκ°€μ„œ κ΅μ²΄ν•˜κ±°λ‚˜ κ±°λΆ€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ²½λ‘œμ—μ„œ 직접 μž‘λ™ν•˜λ―€λ‘œ 컀널은 κΆŒν•œμ΄ μ—†λŠ” λŒ€μƒ μ‚¬μš©μžκ°€ μžμ‹ μ˜ `~/.ssh` 내에 미리 μ€€λΉ„ν•œ λͺ¨λ“  심볼릭 링크λ₯Ό λ”°λΌκ°‘λ‹ˆλ‹€. 이둜 인해 λ£¨νŠΈκ°€ μ œμ–΄ν•˜λŠ” 경둜의 μ†Œμœ κΆŒμ„ κΆŒν•œ μ—†λŠ” μ‚¬μš©μžμ—κ²Œ μ΄μ „ν•˜λŠ” 두 κ°€μ§€ ν”„λ¦¬λ―Έν‹°λΈŒκ°€ μƒμ„±λ˜λ©°, μ‚¬μš©μžλŠ” 이λ₯Ό 톡해 루트둜 κΆŒν•œ μƒμŠΉν•©λ‹ˆλ‹€. 두 κ°€μ§€ λͺ¨λ‘ HEADμ—μ„œ μ»¬λ ‰μ…˜μ— λŒ€ν•΄ 쒅단 κ°„ μž¬ν˜„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

## 영ν–₯을 λ°›λŠ” μ½”λ“œ 및 κ·Όλ³Έ 원인

`keyfile()` (`plugins/modules/authorized_key.py`), κΈ°λ³Έ `manage_dir=True`, `follow=False`:

root@kitploit:~
    
    
    if manage_dir:
        if not os.path.exists(sshdir):          # os.path.exists FOLLOWS symlinks
            try:
                os.mkdir(sshdir, int('0700', 8))
            ...
        os.chown(sshdir, uid, gid)              # UNCONDITIONAL, plain chown, follows symlink
        os.chmod(sshdir, int('0700', 8))        # follows symlink
    
    if not os.path.exists(keysfile):           # follows symlink
        ...
        f = open(keysfile, "w")                # plain open(), no O_NOFOLLOW, follows symlink
        ...
    try:
        os.chown(keysfile, uid, gid)           # UNCONDITIONAL, plain chown, follows symlink
        os.chmod(keysfile, int('0600', 8))     # follows symlink
    except OSError:
        pass
    

`sshdir` 및 `keysfile`은 λŒ€μƒ μ‚¬μš©μžμ˜ passwd ν™ˆ(`pwd.getpwnam(user).pw_dir`)μ—μ„œ νŒŒμƒλ˜λ©°, μ΄λŠ” κΆŒν•œ μ—†λŠ” λŒ€μƒ μ‚¬μš©μžκ°€ μ†Œμœ ν•˜κ³  μ œμ–΄ν•˜λŠ” λ””λ ‰ν„°λ¦¬μž…λ‹ˆλ‹€. `follow` λ§€κ°œλ³€μˆ˜(κΈ°λ³Έκ°’ `False`)λŠ” κ²½λ‘œμ— λŒ€ν•΄ `os.path.realpath()`λ₯Ό μˆ˜ν–‰ν• μ§€ μ—¬λΆ€λ§Œ μ„ νƒν•©λ‹ˆλ‹€. 두 경우 λͺ¨λ‘ `os.path.islink` 검사, `O_NOFOLLOW` μ—΄κΈ°, `os.lchown` λ˜λŠ” κΈ°μ‘΄ 심볼릭 링크의 μ—°κ²° ν•΄μ œ 및 ꡐ체가 μ—†μŠ΅λ‹ˆλ‹€. κΆŒν•œ λ“œλ‘­(`seteuid`/`setfsuid`)이 μˆ˜ν–‰λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λͺ¨λ“  것이 루트둜 μ‹€ν–‰λ©λ‹ˆλ‹€.

두 `os.chown` ν˜ΈμΆœμ€ **무쑰건적으둜** μ‹€ν–‰λ˜λ©°, `if not os.path.exists(...)` κ°€λ“œ 외뢀에 μžˆμœΌλ―€λ‘œ 디렉터리/파일이 이미 μ‘΄μž¬ν•˜λŠ”μ§€ 여뢀에 관계없이 μ‹€ν–‰λ©λ‹ˆλ‹€. 이것이 두 ν”„λ¦¬λ―Έν‹°λΈŒλ₯Ό μ‹ λ’°ν•  수 있게 λ§Œλ“­λ‹ˆλ‹€.

## 두 κ°€μ§€ ν”„λ¦¬λ―Έν‹°λΈŒ

λ‘˜ λ‹€ 일회용 Linux VMμ—μ„œ `ansible.posix` HEAD둜 쒅단 κ°„ ν™•μΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€. `victim`은 κΆŒν•œμ΄ μ—†λŠ” 둜컬 μ‚¬μš©μž(uid 1000)μž…λ‹ˆλ‹€. λͺ¨λ“ˆμ€ 운영자의 ν”Œλ ˆμ΄λΆκ³Ό μ •ν™•νžˆ λ™μΌν•˜κ²Œ 루트둜 μ‹€ν–‰λ©λ‹ˆλ‹€. μΉ΄λ‚˜λ¦¬(Canaries)λŠ” λ―Όκ°ν•œ 루트 λŒ€μƒμ„ λŒ€μ‹ ν•©λ‹ˆλ‹€.

**벑터 1: 디렉터리 심볼릭 링크 (κΈ°μ‘΄ 루트 μ†Œμœ  λ””λ ‰ν„°λ¦¬μ˜ chown)**

  1. `victim`으둜: `ln -s /root/AD_CANARY ~/.ssh` (`/root/AD_CANARY`λŠ” κΈ°μ‘΄ 루트 μ†Œμœ  디렉터리).
  2. μš΄μ˜μžκ°€ `victim`에 λŒ€ν•΄ `authorized_key` μž‘μ—…μ„ μ‹€ν–‰ν•©λ‹ˆλ‹€.
  3. κ΄€μ°°: `/root/AD_CANARY`의 μ†Œμœ κΆŒμ΄ `root:root`μ—μ„œ `victim:victim`으둜 λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€. `os.chown(sshdir, ...)` 호좜이 `~/.ssh` 심볼릭 링크λ₯Ό 따라가 루트 μ†Œμœ  디렉터리λ₯Ό κΆŒν•œ μ—†λŠ” μ‚¬μš©μžμ—κ²Œ λ„˜κ²ΌμŠ΅λ‹ˆλ‹€.



**벑터 2: 데생 파일 심볼릭 링크 (μƒˆ 루트 경둜 파일의 생성 + chown)**

  1. `victim`으둜 (`~/.ssh`κ°€ 일반 디렉터리인 경우): `ln -s /root/AF_CANARY ~/.ssh/authorized_keys` (λŒ€μƒμ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ).
  2. μš΄μ˜μžκ°€ `victim`에 λŒ€ν•΄ `authorized_key` μž‘μ—…μ„ μ‹€ν–‰ν•©λ‹ˆλ‹€.
  3. κ΄€μ°°: `/root/AF_CANARY`κ°€ μƒμ„±λ˜μ—ˆκ³ , μ†Œμœ μžλŠ” `victim:victim`, λͺ¨λ“œ 0600μž…λ‹ˆλ‹€. `open(keysfile, "w")`κ°€ 심볼릭 링크λ₯Ό 톡해 λŒ€μƒμ„ μƒμ„±ν–ˆκ³  `os.chown(keysfile, ...)`이 λ„˜κ²ΌμŠ΅λ‹ˆλ‹€.



두 경우 λͺ¨λ‘ κΆŒν•œ μ—†λŠ” μ‚¬μš©μžλŠ” λ£¨νŠΈκ°€ μ œμ–΄ν•˜λŠ” 경둜의 μ†Œμœ μžκ°€ λ©λ‹ˆλ‹€. 링크λ₯Ό `/etc` μ•„λž˜μ˜ 디렉터리(벑터 1) λ˜λŠ” `/etc/cron.d/`λ‚˜ `/etc/sudoers.d/` μ•„λž˜μ˜ μƒˆ 파일(벑터 2)둜 μ§€μ •ν•˜λ©΄ ν‘œμ€€ 후속 μ‘°μΉ˜μ— μ˜ν•΄ 루트λ₯Ό νšλ“ν•˜κ²Œ 되며, 이제 μ†Œμœ μžμΈ μ‚¬μš©μžκ°€ λŒ€μƒμ„ λ‹€μ‹œ μ”λ‹ˆλ‹€.

## CVE-2024-9902μ™€μ˜ 관계

μ΄λŠ” λ™μΌν•œ 심볼릭 링크 따라가기 클래슀λ₯Ό 닀룬 CVE-2024-9902(ansible-core의 `user` λͺ¨λ“ˆ `generate_ssh_key`)의 μžλ§€μž…λ‹ˆλ‹€. `authorized_key`λŠ” λ³„λ„μ˜ `ansible.posix` μ»¬λ ‰μ…˜μ— 있으며 ν•΄λ‹Ή μˆ˜μ • 사항에 μ˜ν•΄ λ³€κ²½λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 심볼릭 링크λ₯Ό λ”°λΌκ°€λŠ” `chown`/create νŒ¨ν„΄μ΄ μ—¬μ „νžˆ μ‘΄μž¬ν•˜κ³  λ³΄ν˜Έλ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. μ΄λŠ” μƒˆλ‘œλ°œκ²¬λœ κ·Όλ³Έ 원인이 μ•„λ‹ˆλΌ 이전 μˆ˜μ • 사항이 λ„λ‹¬ν•˜μ§€ λͺ»ν•œ λͺ¨λ“ˆμ—μ„œ λ™μΌν•œ ν—ˆμš©λœ 클래슀둜 λ³΄κ³ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

## 영ν–₯ 및 μ •μ§ν•œ μ „μ œ 쑰건

  * Ansible이 κ΄€λ¦¬ν•˜λŠ” ν˜ΈμŠ€νŠΈμ—μ„œ κΆŒν•œ μ—†λŠ” 둜컬 μ‚¬μš©μžμ—μ„œ 루트둜의 κΆŒν•œ μƒμŠΉ.
  * μš΄μ˜μžκ°€ ν”Όν•΄μžμ˜ 계정을 λŒ€μƒμœΌλ‘œ ν•˜λŠ” `ansible.posix.authorized_key` μž‘μ—…μ„ μ‹€ν–‰ν•˜λŠ” 쑰건(이 λͺ¨λ“ˆμ˜ 일반적인 μ‚¬μš©). 둜컬 μ‚¬μš©μžλŠ” μžμ‹ μ˜ `~/.ssh`에 심볼릭 링크λ₯Ό 미리 μ€€λΉ„ν•©λ‹ˆλ‹€. ν”Œλ ˆμ΄λΆμ„ μ‹€ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŠ” μš΄μ˜μžκ°€ νŠΈλ¦¬κ±°ν•©λ‹ˆλ‹€: Red Hat이 "μ‹ λ’°ν•  수 μ—†λŠ” 계정에 λŒ€ν•΄ μ‹€ν–‰ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€"λΌλŠ” μ™„ν™” μ‘°μΉ˜μ™€ ν•¨κ»˜ μŠΉμΈν•œ CVE-2024-9902와 λ™μΌν•œ 트리거 λͺ¨λΈμž…λ‹ˆλ‹€. μ „μ œ 쑰건은 자체 트리거둜 ν‰κ°€λ˜μ§€ μ•Šκ³  λͺ…μ‹œμ μœΌλ‘œ λͺ…μ‹œλ©λ‹ˆλ‹€.



## μ œμ•ˆλœ μˆ˜μ •

  * 심볼릭 링크λ₯Ό 따라가지 μ•Šκ³  ν‚€ νŒŒμΌμ„ λ…μ μ μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€: `os.open(keysfile, os.O_WRONLY | os.O_CREAT | os.O_EXCL | os.O_NOFOLLOW, 0o600)` 및 λ””μŠ€ν¬λ¦½ν„°μ—μ„œ μž‘λ™; `sshdir` λ˜λŠ” `keysfile`이 심볼릭 링크인 경우 κ±°λΆ€(λ˜λŠ” `follow=False` λ¬Έμ„œ λ¬Έμžμ—΄ 계약에 따라 μ—°κ²° ν•΄μ œ 및 ꡐ체).
  * `os.chown(...)`을 `os.lchown`으둜 λ˜λŠ” μ•ˆμ „ν•˜κ²Œ μ—΄λ¦° λ””μŠ€ν¬λ¦½ν„°μ—μ„œ `os.fchown`으둜 λŒ€μ²΄ν•˜κ³ , λ§ˆμ°¬κ°€μ§€λ‘œ `os.chmod` λŒ€μ‹  `os.fchmod`λ₯Ό μ‚¬μš©ν•˜μ—¬ 링크λ₯Ό 톡해 μ†Œμœ κΆŒκ³Ό κΆŒν•œμ΄ λ¦¬λ””λ ‰μ…˜λ˜μ§€ μ•Šλ„λ‘ ν•©λ‹ˆλ‹€.
  * 무쑰건적인 `chown`/`chmod`λ₯Ό κ²Œμ΄νŠΈν•˜μ—¬ λͺ¨λ“ˆ μžμ²΄κ°€ μ•ˆμ „ν•˜κ²Œ μƒμ„±ν•œ κ²½λ‘œμ—λ§Œ μ μš©λ˜λ„λ‘ ν•˜κ³ , κΈ°μ‘΄(심볼릭 링크 κ°€λŠ₯) κ²½λ‘œμ—λŠ” μ μš©λ˜μ§€ μ•Šλ„λ‘ ν•©λ‹ˆλ‹€.



## 곡개 νƒ€μž„λΌμΈ

λ‚ μ§œ| 이벀트  
---|---  
2026-06-08| `some-email@example.com`에 보고됨 (Red Hat Product Security CCκ°€ CNA둜), CVE-2024-9902의 자맀둜 ꡬ성됨  
2026-06-10| CVE-2026-11837 ν• λ‹Ή 및 κ²Œμ‹œλ¨; ν¬λ ˆλ”§ 수락됨  
  
## λΌμ΄μ„ μŠ€

MIT. LICENSE μ°Έμ‘°.