Sploitus

Exploit for cve-2026-31431-mitigation

kitploit Β· 2026-08-27

Exploit Code

MARKDOWN204 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-LINUX-ZS-CVE-2026-31431-MITIGATION
# CVE-2026-31431 seccomp μ™„ν™”

CVE-2026-31431을 μœ„ν•œ 가볍고 되돌릴 수 μžˆλŠ” seccomp 기반 μ™„ν™” λ„κ΅¬μž…λ‹ˆλ‹€. 이 취약점은 Linux μ»€λ„μ˜ `algif_aead` / `authencesn` μ•”ν˜Έν™” μ„œλΈŒμ‹œμŠ€ν…œμ—μ„œ λ°œμƒν•˜λŠ” 둜컬 κΆŒν•œ μƒμŠΉ μ·¨μ•½μ μž…λ‹ˆλ‹€.

δΈ­ζ–‡ζ–‡ζ‘£

* * *

## 취약점 κ°œμš”

**μœ ν˜•:** 둜컬 κΆŒν•œ μƒμŠΉ(LPE)

**영ν–₯을 λ°›λŠ” ꡬ성 μš”μ†Œ:** Linux 컀널 `crypto/algif_aead.c` \- 제자리(in-place) AEAD μ—°μ‚°

**곡격 원리:** `authencesn` AEAD μ•Œκ³ λ¦¬μ¦˜μ˜ 슀크래치 μ“°κΈ° 경둜λ₯Ό 톡해 읽기 κ°€λŠ₯ν•œ λͺ¨λ“  파일의 νŽ˜μ΄μ§€ μΊμ‹œμ— 4λ°”μ΄νŠΈ μ œμ–΄ κ°€λŠ₯ν•œ μ“°κΈ°λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. `/etc/passwd`λ₯Ό λŒ€μƒμœΌλ‘œ κ³΅κ²©μžλŠ” μžμ‹ μ˜ UIDλ₯Ό 0(root)으둜 λ³€κ²½ν•˜κ³  `su`λ₯Ό 톡해 루트 셸을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

**영ν–₯을 λ°›λŠ” 컀널:** 컀널 6.12+, 6.17+, 6.18+μ—μ„œ ν™•μΈλ˜μ—ˆμœΌλ©°, RHEL/CentOS 4.18/5.14 μ»€λ„μ—μ„œλ„ μž¬ν˜„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

**κ²€μ¦λœ ν™˜κ²½:** Rocky Linux 8(컀널 4.18) 및 Rocky Linux 9(컀널 5.14) - μ•…μš©μ΄ μ™„μ „νžˆ μ°¨λ‹¨λ˜μ—ˆμœΌλ©°, μ•ˆμ „ν•œ μ œκ±°κ°€ ν™•μΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

**κ·Όλ³Έ 원인:** 컀밋 `72548b093ee3`이 제자리(in-place) AEAD 연산을 λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€. μŠ€ν”ŒλΌμ΄μŠ€λœ νŽ˜μ΄μ§€ μΊμ‹œ νŽ˜μ΄μ§€κ°€ λŒ€μƒ scatterlist둜 μ‚¬μš©λ  λ•Œ, AAD `seqno_lo` ν•„λ“œκ°€ AEAD λ³΅ν˜Έν™” 쀑 νŽ˜μ΄μ§€ μΊμ‹œμ— 잘λͺ» λ‹€μ‹œ μ“°μ—¬μ§‘λ‹ˆλ‹€.

**μ—…μŠ€νŠΈλ¦Ό μˆ˜μ •:** 제자리(out-of-place) AEAD μ—°μ‚°μœΌλ‘œ 되돌리기.

## 이 μ™„ν™” λ„κ΅¬μ˜ μž‘λ™ 방식

이 μ†”λ£¨μ…˜μ€ **두 κ°€μ§€ ꡬ성 μš”μ†Œ** 둜 이루어져 μžˆμŠ΅λ‹ˆλ‹€:

  1. **PAM λͺ¨λ“ˆ(`pam_block_afalg.so`)** \- κΈ°λ³Έ λ°©μ–΄ μˆ˜λ‹¨μž…λ‹ˆλ‹€. PAM이 μ„Έμ…˜ μ‹œμž‘ μ‹œ(`pam_sm_open_session`) λ‘œλ“œν•˜λ©°, μ‚¬μš©μž μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° 전에 `socket(AF_ALG, ...)`을 μ°¨λ‹¨ν•˜λŠ” seccomp BPF ν•„ν„°λ₯Ό μ μš©ν•©λ‹ˆλ‹€. μ΄λŠ” λͺ¨λ“  PAM 인증 μ„Έμ…˜μ„ ν¬κ΄„ν•©λ‹ˆλ‹€: `su -c`, `su -`, SSH, TTY 둜그인 λ“±.

  2. **독립 μ‹€ν–‰ λ°”μ΄λ„ˆλ¦¬(`block_afalg`)** \- 선택 μ‚¬ν•­μž…λ‹ˆλ‹€. λΉ„-PAM μ‹œλ‚˜λ¦¬μ˜€(예: cron μž‘μ—…, systemd μ„œλΉ„μŠ€, μˆ˜λ™ 호좜)μ—μ„œ νŠΉμ • ν”„λ‘œκ·Έλž¨μ„ κ°μŒ€ 수 μžˆμŠ΅λ‹ˆλ‹€.




seccomp ν•„ν„°:

  * `socket(AF_ALG, ...)`만 μ°¨λ‹¨ν•©λ‹ˆλ‹€(EACCES λ°˜ν™˜)
  * λ‹€λ₯Έ λͺ¨λ“  μ‹œμŠ€ν…œ 콜( `setuid`, `su`, `sudo` 포함)μ—λŠ” 영ν–₯이 μ—†μŠ΅λ‹ˆλ‹€
  * λͺ¨λ“  μžμ‹ ν”„λ‘œμ„ΈμŠ€μ— μƒμ†λ©λ‹ˆλ‹€(fork + exec)
  * 패치된 컀널을 μžλ™ κ°μ§€ν•˜μ—¬ no-op이 λ©λ‹ˆλ‹€



## μ•„ν‚€ν…μ²˜

root@kitploit:~
    
    
    PAM μ„Έμ…˜ μ‹œμž‘ (su, ssh, login λ“±)
      |
      v
    pam_block_afalg.so (pam_sm_open_session)
      |
      +-- 확인: 컀널이 μ·¨μ•½ν•œκ°€? (socket(AF_ALG) μ‹œλ„)
      |     |
      |     +-- μ•„λ‹ˆμ˜€ --> PAM_SUCCESS λ°˜ν™˜ (no-op)
      |     |
      |     +-- 예 --> prctl(PR_SET_SECCOMP, BPF ν•„ν„°)
      |                   |
      |                   +-- seccomp ν•„ν„°κ°€ sshd μžμ‹ ν”„λ‘œμ„ΈμŠ€μ— 적용됨
      |                   +-- μ‚¬μš©μž μ…Έκ³Ό λͺ¨λ“  μžμ‹ ν”„λ‘œμ„ΈμŠ€μ— 상속됨
      |                   +-- socket(AF_ALG, ...)이 EACCES λ°˜ν™˜
      v
    μ‚¬μš©μž μ…Έ / λͺ…령이 seccomp λ³΄ν˜Έμ™€ ν•¨κ»˜ 싀행됨
      |
      +-- su, sudo 및 기타 λͺ¨λ“  μ‹œμŠ€ν…œ μ½œμ€ 정상 μž‘λ™
      +-- AF_ALG μ†ŒμΌ“λ§Œ 차단됨
    

## 파일

파일| μš©λ„  
---|---  
`pam_block_afalg.c`| PAM λͺ¨λ“ˆ μ†ŒμŠ€. μ„Έμ…˜ μ‹œμž‘ μ‹œ seccomp ν•„ν„°λ₯Ό μ μš©ν•©λ‹ˆλ‹€.  
`pam_minimal.h`| μ΅œμ†Œ PAM νƒ€μž… μ •μ˜(pam-devel 없이 컴파일 κ°€λŠ₯).  
  
## μš”κ΅¬ 사항

  * seccompλ₯Ό μ§€μ›ν•˜λŠ” Linux 컀널(λŒ€λΆ€λΆ„μ˜ μ΅œμ‹  컀널)
  * `gcc`(컴파일용)
  * `libpam`(λŸ°νƒ€μž„, 일반적으둜 사전 μ„€μΉ˜λ¨)
  * 루트/sudo μ ‘κ·Ό κΆŒν•œ(μ„€μΉ˜μš©)
  * x86_64 μ•„ν‚€ν…μ²˜(BPF ν•„ν„°κ°€ x86_64 μ‹œμŠ€ν…œ 콜 번호λ₯Ό μ‚¬μš©)



## λΉ λ₯Έ μ‹œμž‘

root@kitploit:~
    
    
    # 1. PAM λͺ¨λ“ˆ 컴파일
    gcc -Wall -O2 -fPIC -shared -o pam_block_afalg.so pam_block_afalg.c \
        /usr/lib64/libpam.so.0
    
    # 2. μ„€μΉ˜ (su, sshd, login에 PAM ꡬ성 μžλ™ μΆ”κ°€)
    sudo ./deploy.sh install
    
    # 3. 확인 (μƒˆ μ„Έμ…˜μ΄μ–΄μ•Ό 함)
    cat /proc/self/status | grep Seccomp
    # ν‘œμ‹œλ˜μ–΄μ•Ό 함: Seccomp: 2
    
    python3 -c "
    import socket
    try:
        s = socket.socket(38,2,0); s.close()
        print('VULNERABLE')
    except OSError:
        print('BLOCKED')
    "
    # ν‘œμ‹œλ˜μ–΄μ•Ό 함: BLOCKED
    
    # 4. 제거
    sudo ./deploy.sh remove
    

## λͺ…λ Ή μ°Έμ‘°

λͺ…λ Ή| μ„€λͺ…  
---|---  
`deploy.sh install`| PAM λͺ¨λ“ˆ 컴파일, `/lib64/security/`에 μ„€μΉ˜, PAM ꡬ성 μžλ™ μΆ”κ°€  
`deploy.sh remove`| 전체 제거: λͺ¨λ“ˆ 제거, PAM ꡬ성 정리, 파일 μ‚­μ œ  
`deploy.sh status`| μ„€μΉ˜ μƒνƒœ, PAM ꡬ성, 컀널 μƒνƒœ ν‘œμ‹œ  
  
## 독립 μ‹€ν–‰ μ‚¬μš©λ²•

λΉ„-PAM μ‹œλ‚˜λ¦¬μ˜€μ˜ 경우 `block_afalg`λ₯Ό 직접 μ‚¬μš©ν•˜μ„Έμš”:

root@kitploit:~
    
    
    # 컴파일
    gcc -Wall -O2 -o block_afalg block_afalg.c
    
    # AF_ALGκ°€ μ°¨λ‹¨λœ μƒνƒœλ‘œ λͺ…λ Ή μ‹€ν–‰
    ./block_afalg python3 your_script.py
    ./block_afalg bash
    

## 검증

### 컀널이 μ·¨μ•½ν•œμ§€ 확인

root@kitploit:~
    
    
    python3 -c "
    import socket
    try:
        s = socket.socket(38, socket.SOCK_SEQPACKET, 0)
        s.close()
        print('VULNERABLE: AF_ALG socket available')
    except:
        print('SAFE: AF_ALG socket blocked or unavailable')
    "
    

### PAM λͺ¨λ“ˆμ΄ ν™œμ„± μƒνƒœμΈμ§€ 확인

root@kitploit:~
    
    
    # seccomp μƒνƒœ 확인
    cat /proc/self/status | grep Seccomp
    # Seccomp: 0 = λ³΄ν˜Έλ˜μ§€ μ•ŠμŒ
    # Seccomp: 2 = 보호됨
    
    # AF_ALG μ†ŒμΌ“ ν…ŒμŠ€νŠΈ
    python3 -c "
    import socket
    try:
        s = socket.socket(38,2,0)
        s.close()
        print('AF_ALG available - NOT protected')
    except OSError:
        print('AF_ALG blocked - PROTECTED')
    "
    
    # PAM 둜그 확인
    grep pam_block_afalg /var/log/secure
    # ν‘œμ‹œλ˜μ–΄μ•Ό 함: seccomp filter applied, AF_ALG blocked
    

## μ œν•œ 사항

  * **x86_64 μ „μš©:** BPF ν•„ν„°κ°€ μ‹œμŠ€ν…œ 콜 번호 41(`x86_64의 __NR_socket`)을 ν•˜λ“œμ½”λ”©ν•©λ‹ˆλ‹€. λ‹€λ₯Έ μ•„ν‚€ν…μ²˜λŠ” μ‹œμŠ€ν…œ 콜 번호λ₯Ό μ—…λ°μ΄νŠΈν•΄μ•Ό ν•©λ‹ˆλ‹€.
  * **PAM 의쑴적:** PAM을 ν†΅κ³Όν•˜λŠ” μ„Έμ…˜λ§Œ λ³΄ν˜Έν•©λ‹ˆλ‹€. PAM 없이 직접 `exec()` ν˜ΈμΆœν•˜λŠ” κ²½μš°λŠ” ν¬ν•¨λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(이 경우 `block_afalg` μ‚¬μš©).
  * **λŸ°νƒ€μž„ λΉ„ν™œμ„±ν™” λΆˆκ°€:** seccomp ν•„ν„°κ°€ ν”„λ‘œμ„ΈμŠ€μ— 적용되면 μ œκ±°ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 컀널 확인을 톡해 ν•„μš”ν•œ κ²½μš°μ—λ§Œ μ μš©λ˜λ„λ‘ 보μž₯ν•©λ‹ˆλ‹€.
  * **μƒˆ μ„Έμ…˜λ§Œ ν•΄λ‹Ή:** λͺ¨λ“ˆ μ„€μΉ˜ 전에 μ‹œμž‘λœ κΈ°μ‘΄ μ„Έμ…˜μ€ μ†ŒκΈ‰ λ³΄ν˜Έλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.



## 제거 μ‹œμ 

  1. **곡식 컀널 νŒ¨μΉ˜κ°€ 적용된 경우** \- PAM λͺ¨λ“ˆμ΄ 이λ₯Ό μžλ™ κ°μ§€ν•˜μ§€λ§Œ, `remove`둜 정리할 수 μžˆμŠ΅λ‹ˆλ‹€.
  2. **RHEL/CentOSκ°€ 패치된 컀널을 μΆœμ‹œν•œ 경우** \- `yum update kernel` ν›„ λͺ¨λ“ˆμ„ μ œκ±°ν•˜μ„Έμš”.



## λΌμ΄μ„ μŠ€

이 λ„κ΅¬λŠ” 곡인된 λ³΄μ•ˆ ν…ŒμŠ€νŠΈ 및 λ°©μ–΄ λͺ©μ μœΌλ‘œλ§Œ μ œκ³΅λ©λ‹ˆλ‹€. μ†Œμœ ν•œ μ‹œμŠ€ν…œ λ˜λŠ” λͺ…μ‹œμ μœΌλ‘œ 평가 κΆŒν•œμ΄ λΆ€μ—¬λœ μ‹œμŠ€ν…œμ—μ„œλ§Œ μ‚¬μš©ν•˜μ„Έμš”.