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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-31431-Analysis-and-Fix — 리눅스 커널 CVE-2026-31431(Copy Fail)에 대한 심층 기술 분석: AF_ALG 인플레이스 scatterlist 버그를 통한 로컬 권한 상승, 근본 원인, 익스플로잇 경로 및 패치 제출 가이드를 포함합니다. | Kitploit
도구/GitHubGitHub/abdelkabirouadoukou/cve-2026-31431-analysis-and-fix
Vulnerability AnalysisExploitationBinary AnalysisPapers & ResearchLearning & EducationCurated Resources
GitHubabdelkabirouadoukou/cve-2026-31431-analysis-and-fix

CVE-2026-31431-Analysis-and-Fix

리눅스 커널 CVE-2026-31431(Copy Fail)에 대한 심층 기술 분석: AF_ALG 인플레이스 scatterlist 버그를 통한 로컬 권한 상승, 근본 원인, 익스플로잇 경로 및 패치 제출 가이드를 포함합니다.

저장소 보기
3개월 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-31431 "Copy Fail" — 기술 심층 분석

심각도: CVSS 7.8 (높음)

분류: 로컬 권한 상승

도입 시점: Linux 4.14 (2017)

수정 커밋: a664bf3d603d

1. 배경

CVE-2026-31431은 Linux 커널의 algif_aead 모듈(커널 사용자 공간 Crypto API(AF_ALG)의 AEAD 소켓 인터페이스)에 존재하는 로컬 권한 상승 취약점입니다.

이 취약점은 권한이 없는 사용자가 Linux 커널의 Crypto API에서 AF_ALG 주소 패밀리를 활용하여 파일의 메모리 내 복사본을 뒷받침하는 페이지 캐시에 통제된 4바이트 쓰기를 수행할 수 있게 합니다. 페이지 캐시에 저장된 읽기 가능한 실행 파일의 메모리 내 복사본에서 코드를 교체함으로써, 공격자는 이후 권한 있는 프로세스가 해당 손상된 파일 버전을 실행할 때 사용자 권한을 상승시킬 수 있습니다.

경쟁 조건을 이겨야 했던 Dirty Cow(CVE-2016-5195)와 달리, Copy Fail은 직선형 로직 결함입니다. 경쟁, 재시도, 또는 충돌 가능성이 있는 타이밍 창 없이 트리거됩니다.

2. 근본 원인 — 2017년 제자리 최적화

2.1 변경 사항

커밋 72548b093ee3("crypto: algif_aead - switch to in-place processing")은 내부에서 를 설정하여 별도의 출력 버퍼 할당을 제거하는 최적화를 도입했습니다.

aead_recvmsg()
req->src == req->dst

이 최적화로 인해 req->src와 req->dst가 결합된 scatterlist를 가리키게 되었습니다. 이 때문에 splice() 호출의 페이지 캐시 페이지가 쓰기 가능한 대상 scatterlist에 직접 잘못 연결되었습니다.

2.2 암묵적 불변 조건

커널의 AEAD API는 명확한 출력 계약을 정의합니다: 대상 버퍼는 정확히 assoclen + (cryptlen - authsize) 바이트의 AAD || 평문을 수신합니다. API의 어떤 것도 이 계약을 강제하지 않으며, 요구 사항으로 문서화하지도 않습니다. 설계는 모든 AEAD 알고리즘이 의도된 대상에만 쓰기를 제한할 것이라고 가정합니다. 한 알고리즘이 그렇게 하지 않았습니다.

3. 영향받는 파일

root@kitploit:~
crypto/
├── algif_aead.c      ← 제자리 scatterlist 버그 (주요)
└── authencesn.c      ← 경계 밖 스크래치 쓰기 (트리거)

4. 취약한 코드

4.1 crypto/algif_aead.c — 제자리 할당

root@kitploit:~
/* 취약 — 2017년 이후 제자리 경로 */
static int aead_recvmsg(struct socket *sock, struct msghdr *msg,
                        size_t ignored, int flags)
{
    /* ... */

    /*
     * 사용자 공간이 파일에 splice(2)를 호출하면, areq->tsgl에는
     * 해당 파일의 페이지 캐시 페이지가 포함됩니다. dst = src로 설정하면
     * 이러한 페이지 캐시 페이지가 쓰기 가능한 출력 버퍼로
     * 암호화 엔진에 전달됩니다.
     */
    aead_request_set_crypt(req,
        areq->tsgl,   /* src */
        areq->tsgl,   /* dst — 동일한 포인터; 근본 원인 */
        areq->cryptlen, iv);
}

4.2 crypto/authencesn.c — 경계 밖 스크래치 쓰기

authencesn 템플릿은 IPsec의 확장 시퀀스 번호(ESN) 지원에 사용되는 AEAD 래퍼입니다. IPsec은 높은 절반(seqno_hi, AAD의 바이트 0–3)과 낮은 절반(seqno_lo, 바이트 4–7)으로 분할된 64비트 시퀀스 번호를 사용합니다. 와이어 형식은 seqno_lo만 전달하며, seqno_hi는 암시적입니다.

root@kitploit:~
/* crypto/authencesn.c — 출력 경계를 넘는 스크래치 쓰기 */
static int crypto_authenc_esn_decrypt(struct aead_request *req)
{
    /* ... */

    /*
     * authencesn은 req->dst의 (assoclen + cryptlen) 오프셋에
     * seqno_hi를 임시로 저장합니다 — 합법적인 출력 영역을
     * 한 단어 넘어선 위치입니다.
     *
     * 정상 작동 시: 커널 소유 메모리에 도달.
     * 제자리 scatterlist 사용 시: 페이지 캐시 페이지에 도달.
     */
    scatterwalk_map_and_copy(&seqno_hi,
        req->dst,
        req->assoclen + req->cryptlen,   /* 경계 밖 오프셋 */
        sizeof(seqno_hi),                /* 4바이트 */
        1 /* 쓰기 */);

    /* authencesn은 실패 경로에서 이 바이트들을 복원하지 않습니다 */
}

5. 수정 사항

업스트림 수정: 커밋 a664bf3d603d — 2017년 최적화를 되돌립니다.

5.1 crypto/algif_aead.c — 분리된 Scatterlist

root@kitploit:~
/* 수정됨 — 별도의 src 및 dst */
aead_request_set_crypt(req,
    areq->tsgl,   /* src — 페이지 캐시 페이지 포함 가능; 읽기 전용 */
    areq->rsgl,   /* dst — 새로 할당된 커널 버퍼; 쓰기 가능 */
    areq->cryptlen, iv);

효과: 페이지 캐시 페이지는 암호화 엔진이 읽기만 하는 src에 남아 있습니다. assoclen + cryptlen의 authencesn 스크래치 쓰기는 이제 프로세스가 소유한 커널 할당 버퍼에 위치합니다. 어떤 페이지 캐시 페이지도 쓰기 경로에서 도달할 수 없습니다.

6. 악용 경로

다음은 4바이트 쓰기가 완전한 권한 상승을 달성하는 방법을 설명합니다.

단계동작
1authencesn(hmac(sha256),cbc(aes))용으로 구성된 AF_ALG 소켓 열기
2읽기 가능한 setuid 바이너리(예: /usr/bin/sudo)를 소켓에 splice() — 이렇게 하면 해당 파일의 페이지 캐시 페이지가 areq->tsgl에 배치됩니다
3스크래치 쓰기 오프셋이 바이너리의 캐시된 이미지 내부의 대상 바이트와 정렬되도록 assoclen + cryptlen을 조작
4recvmsg() 호출 — 복호화 경로를 트리거하고, authencesn이 공격자가 통제한 4바이트를 페이지 캐시에 씁니다
5디스크의 파일은 변경되지 않습니다; 무결성 검사기, inotify, inode 타임스탬프는 영향을 받지 않습니다
6이후 바이너리를 실행하면 이미 수정된 페이지 캐시 페이지가 매핑됩니다 — 패치된 코드가 euid=0으로 실행됩니다

쓰기는 splice된 파일의 메모리 내 캐시된 데이터에 끝나며, 파일의 권한을 완전히 우회합니다.

7. LKML에 패치 제출

7.1 유지 관리자 식별

root@kitploit:~
./scripts/get_maintainer.pl crypto/algif_aead.c
# Herbert Xu <[email protected]>
# [email protected]

7.2 패치 검증

root@kitploit:~
./scripts/checkpatch.pl 0001-crypto-algif_aead-revert-inplace.patch

7.3 커밋 메시지 형식

root@kitploit:~
crypto: algif_aead - recvmsg에서 별도의 src/dst scatterlist 복원

커밋 72548b093ee3 ("crypto: algif_aead - switch to in-place
processing")은 aead_recvmsg() 내부에서 req->src == req->dst를
설정했습니다. 호출자가 splice(2)를 사용하면 소스 scatterlist에는
splice된 파일의 페이지 캐시 페이지가 포함됩니다. 제자리 최적화로
인해 동일한 페이지가 AEAD 변환에 전달되는 쓰기 가능한 대상이
됩니다.

authencesn은 확장 시퀀스 번호 재배열을 위한 스크래치 공간으로
req->dst의 (assoclen + cryptlen) 오프셋에 4바이트를 쓰고
오류 경로에서 이를 복원하지 않습니다. dst에 페이지 캐시 페이지가
있으면 이 쓰기는 VFS 권한 계층을 우회하고 디스크의 inode를
수정하지 않고 splice된 파일의 메모리 내 이미지를 손상시킵니다.

권한이 없는 로컬 사용자는 이를 악용하여 읽기 가능한 모든 setuid
바이너리의 페이지 캐시에서 임의의 바이트를 덮어쓰고 root로
권한을 상승시킬 수 있습니다.

페이지 캐시 페이지가 읽기 전용 소스 경로에만 국한되도록 별도의
src 및 dst scatterlist를 복원합니다.

Fixes: 72548b093ee3 ("crypto: algif_aead - switch to in-place processing")
Cc: [email protected]  # 4.14+
Reported-by: Taeyang Lee <[email protected]>
Signed-off-by: Your Name <[email protected]>

7.4 git send-email로 전송

root@kitploit:~
git send-email \
  [email protected] \
  [email protected] \
  [email protected] \
  0001-crypto-algif_aead-revert-inplace.patch

7.5 커밋 메시지 규칙

요소목적
subsystem: file - verb phrase 제목필수 형식; 72자 미만
Fixes: <sha> ("원래 제목")자동 안정 버전 백포트 도구 트리거
Cc: [email protected]LTS 브랜치 백포트용 패치 플래그
Reported-by:발견자 귀속
Signed-off-by:Developer Certificate of Origin — 필수

8. 영향받는 버전 및 완화 조치

취약한 커널은 Linux 4.14부터 7.0-rc, 6.18.22 이전의 모든 6.18.x, 6.19.12 이전의 6.19.x에 걸쳐 있습니다.

임시 완화 조치 (대부분의 시스템에서 재부팅 불필요):

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

이 해결 방법은 dm-crypt/LUKS, kTLS, IPsec/XFRM, OpenSSL, GnuTLS, NSS 또는 SSH에는 영향을 미치지 않습니다.

9. 참고 자료

  • Theori/Xint 권고: xint.io/blog/copy-fail-linux-distributions
  • NVD 항목: nvd.nist.gov/vuln/detail/CVE-2026-31431
  • 업스트림 수정: 커밋 a664bf3d603d (메인라인)
  • 도입 커밋: 72548b093ee3 (Linux 4.14, 2017)
도구 다운로드