🇰🇷 한글 설명
Linux 커널 SCTP 구현에서 자동 바인딩(autobind) 실패 시 소켓 상태를 CLOSED로 복원하지 않는 결함입니다. 이로 인해 SCTP_REUSE_PORT 옵션이 설정된 상태에서 재차 listen을 호출할 때 NULL 포인터 역참조가 발생하여 커널 크래시가 유발됩니다.
💡 쉬운 설명
Linux 서버의 네트워크 통신(SCTP) 부분에서 포트 할당 실패 시 상태를 제대로 정리하지 않아 나중에 같은 포트를 재사용할 때 시스템이 다운될 수 있습니다. 로컬 공격자가 악의적으로 이 상황을 유발할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
sctp: set sk_state back to CLOSED if autobind fails in sctp_listen_start
In sctp_listen_start() invoked by sctp_inet_listen(), it should set the
sk_state back to CLOSED if sctp_autobind() fails due to whatever reason.
Otherwise, next time when calling sctp_inet_listen(), if sctp_sk(sk)->reuse
is already set via setsockopt(SCTP_REUSE_PORT), sctp_sk(sk)->bind_hash will
be dereferenced as sk_state is LISTENING, which causes a crash as bind_hash
is NULL.
KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007]
RIP: 0010:sctp_inet_listen+0x7f0/0xa20 net/sctp/socket.c:8617
Call Trace:
<TASK>
__sys_listen_socket net/socket.c:1883 [inline]
__sys_listen+0x1b7/0x230 net/socket.c:1894
__do_sys_listen net/socket.c:1902 [inline]
📍 영향받는 시스템
Linux kernel의 모든 버전 (fix 이전까지), 특히 SCTP 프로토콜을 활성화한 커널
⚔️ 공격 벡터
로컬 공격자가 SCTP 소켓을 통해 자동 바인딩을 실패하게 한 후 SCTP_REUSE_PORT 옵션을 설정하고 재차 listen()을 호출하여 NULL 포인터 역참조 유발
🛡️ 대응 방법
Linux 커널을 2024년 11월 이후 패치 버전으로 업데이트하거나, SCTP 모듈 언로드 시 커널 크래시 위험 제거
🔧 검증 코드
커널 버전과 sctp_listen_start 함수의 sk_state 복원 코드 확인; CLOSED로 설정되는 부분이 없으면 취약 버전
cat /proc/version | grep -oE 'version [0-9.]+' && cat /usr/src/linux/net/sctp/socket.c 2>/dev/null | grep -A5 'sctp_listen_start' | head -3