
CVE-2026-74469(DiagSpill) 연구 저장소로, Linux 커널 SCTP 피어 전송 카운터 오버플로로 인한 범위 초과 쓰기 취약점을 다루며 PoC, 근본 원인 분석, 패치 세부 정보를 포함합니다.
DiagSpill
16비트 피어 전송 카운터 오버플로로 인해 발생하는 Linux 커널 SCTP 취약점으로, 카운터가 65535에서 0으로 래핑될 수 있습니다. SCTP 진단 덤프 중에 래핑된 값으로 인해 skb 페이로드 예약이 불충분해지고, 이어서 피어 주소 데이터의 범위를 벗어난 쓰기가 발생할 수 있습니다.
이 저장소는 승인된 보안 연구, 커널 취약점 분석, CTF 환경, 커널 디버깅 및 방어적 테스트 용도로만 사용하도록 의도되었습니다.
명시적인 승인 없이 시스템에 대해 개념 증명 코드를 사용하지 마십시오.
| 필드 | 세부 정보 |
|---|---|
| CVE | CVE-2026-74469 |
| 코드명 | DiagSpill |
| 구성 요소 | Linux 커널 |
| 하위 시스템 | SCTP / sock_diag |
| 영향받는 파일 | net/sctp/associola.c |
| 주요 함수 | sctp_assoc_add_peer() |
| 버그 분류 | 정수 오버플로 / 범위를 벗어난 쓰기 |
| 영향 | 커널 메모리 손상 |
| 잠재적 영향 | 로컬 권한 상승 |
| CVSS v3.1 | 7.0 — 높음 |
| 공격 벡터 | 로컬 |
| 공격 복잡도 | 높음 |
| 필요 권한 | 낮음 |
| 사용자 상호작용 | 없음 |
| 상태 | 패치됨 |
Linux 커널 CVE 권고는 이 문제를 SCTP의 16비트 transport_count 오버플로로 설명하며, 이어서 크기가 부족한 INET_DIAG_PEERS 할당과 진단 덤프 중 범위를 벗어난 쓰기가 발생합니다.
취약한 코드는 고유한 피어 전송의 개수를 16비트 카운터로 유지합니다:
transport_count
새로 추가된 고유 피어마다 카운터가 증가합니다.
핵심 경계는 다음과 같습니다:
65535
다른 고유한 전송 수단을 추가하면 다음과 같은 결과가 발생합니다:
65535 + 1
↓
0
결과적으로 생성된 래핑은 다음과 같은 불일치를 초래합니다:
transport_count
및:
transport_addr_list
The diagnostic subsystem later trusts the wrapped counter when calculating the size of the response buffer, while still iterating through the complete list of peer addresses.
취약점은 다음과 같이 나타낼 수 있습니다:
SCTP Association
│
▼
Add unique peers
│
▼
transport_count
uint16_t
│
▼
65,535 peers
│
▼
+ 1 unique peer
│
▼
Integer wrap
│
▼
transport_count = 0
│
▼
SCTP sock_diag
│
▼
Reserve incorrect payload
│
▼
Iterate complete peer list
│
▼
Out-of-bounds skb write
업스트림 권고문은 65,536번째 전송이 카운터를 0으로 감싼다고 명시적으로 밝히고 있습니다.
진단 코드는 사실상 동일한 상태에 대한 두 가지 서로 다른 관점에 의존합니다.
transport_count
│
▼
payload size
transport_addr_list
│
▼
copy every peer address
정수가 래핑된 후:
transport_count = 0
transport_addr_list =
[peer 1]
[peer 2]
[peer 3]
...
[peer 65536]
할당자는 따라서 다음을 기준으로 공간을 예약한다:
0 peers
복사 작업이 여전히 처리할 수 있는 동안:
65536 peer addresses
이 불일치가 메모리 안전성 위반을 발생시킨다.
Linux Kernel 권고문은 그 결과로 생성되는 진단 덤프를, 빈 페이로드를 예약한 뒤 skb tail을 넘어 약 8 MiB의 피어 주소를 기록하는 것으로 설명한다.
개념적으로:
Expected skb:
┌───────────────────────────────┐
│ INET_DIAG header │
├───────────────────────────────┤
│ Peer addresses │
└───────────────────────────────┘
▲
│
valid end
Actual vulnerable state:
┌───────────────────────────────┐
│ INET_DIAG header │
└───────────────────────────────┘
▲
│
skb tail
↓
Peer address writes
↓
Peer address writes
↓
Peer address writes
↓
OUT-OF-BOUNDS WRITE
Red Hat은 이 결함을 CWE-787: 범위를 벗어난 쓰기(Out-of-bounds Write) 로 분류합니다.
관련 경로는 다음과 같이 요약할 수 있습니다:
SCTP association
│
▼
sctp_assoc_add_peer()
│
▼
transport_count++
│
▼
16-bit overflow
│
▼
SCTP sock_diag
│
▼
INET_DIAG_PEERS
│
▼
skb payload reservation
│
▼
transport_addr_list iteration
│
▼
Out-of-bounds write
영향을 받는 소스 파일은 다음과 같습니다:
net/sctp/associola.c
Linux 커널 CVE 공지에서 이 파일을 명시적으로 지목하고 있습니다.
업스트림 수정은 다음과 같습니다:
bd0e9289e2642f6a5c54faad304ce0f41e926d22
커밋:
sctp: prevent peer transport count overflow
수정 사항은 다음과 같은 경우 새로운 고유 피어를 거부합니다:
transport_count >= U16_MAX
중요한 점은, 이 검사가 기존 피어 조회 이후에 수행된다는 것입니다.
이는 연관이 한도에 도달한 경우에도 이미 존재하는 전송을 검색하는 기능을 보존합니다.
New peer
│
▼
transport_count++
│
▼
Possible 16-bit wrap
│
▼
Diagnostic size mismatch
│
▼
OOB write
New peer
│
▼
Existing peer?
│
┌─┴──────────┐
│ │
YES NO
│ │
▼ ▼
Reuse Check U16_MAX
transport │
▼
Reject at limit
카운터가 절대 래핑되지 않도록 방지하면서 기존 피어에 대한 정상적인 조회 의미 체계를 보존하는 것이 중요한 보안 속성입니다.
| 보안 속성 | 취약 버전 | 패치 버전 |
|---|---|---|
| 16비트 전송 제한 적용 | ❌ | ✅ |
| 카운터 래핑 방지 | ❌ | ✅ |
| 기존 피어 사용 가능 유지 | ✅ | ✅ |
| 진단 페이로드 크기 신뢰성 | ❌ | ✅ |
| OOB skb 쓰기 방지 | ❌ | ✅ |
| 커널 메모리 손상 완화 | ❌ | ✅ |
메모리 손상은 잠재적으로 다음을 초래할 수 있습니다:
공개 후 발표된 공개 연구에 따르면 특정 조건에서 로컬 루트 익스플로잇이 보고되었으며, 원래 Linux Kernel CNA 점수는 AV:L/AC:H/PR:L/UI:N을 사용합니다.
이 취약점은 또한 매우 특정한 SCTP/주소 구성 상황에서 잠재적으로 원격으로 도달 가능한 것으로 설명되지만, 이는 일반적으로 원격 익스플로잇 가능한 취약점과 동등하게 취급되어서는 안 됩니다.
권장 격리 토폴로지: