🇰🇷 한글 설명
Linux 커널의 ROSE 소켓 모듈에서 이미 연결 중인 상태(TCP_SYN_SENT)를 확인하지 않아 두 번째 연결 시도 시 NULL 포인터 역참조가 발생하는 취약점입니다. rose_connect() 함수가 rose->neighbour를 덮어쓸 때 NULL이 반환되면 일관성 없는 상태가 남아 소켓 종료 시 커널 패닉을 유발합니다. 수정 사항은 TCP_SYN_SENT 상태에서 -EALREADY 에러를 반환하도록 상태 검증을 추가하는 것입니다.
💡 쉬운 설명
Linux 무선 통신 모듈에서 연결을 두 번 빠르게 시도할 때 메모리 오류가 발생하는 문제입니다. 이를 악용하면 로컬 공격자가 시스템 중단(DoS)을 일으킬 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
net/rose: fix NULL pointer dereference in rose_transmit_link on reconnect
syzkaller reported a bug [1], and the reproducer is available at [2].
ROSE sockets use four sk->sk_state values: TCP_CLOSE, TCP_LISTEN,
TCP_SYN_SENT, and TCP_ESTABLISHED. rose_connect() already rejects
calls for TCP_ESTABLISHED (-EISCONN) and TCP_CLOSE with SS_CONNECTING
(-ECONNREFUSED), but lacks a check for TCP_SYN_SENT.
When rose_connect() is called a second time while the first connection
attempt is still in progress (TCP_SYN_SENT), it overwrites
rose->neighbour via rose_get_neigh(). If that returns NULL, the socket
is left with rose->state == ROSE_STATE_1 but rose->neighbour == NULL.
When the socket is subsequently closed, rose_release() sees
ROSE_STATE_1 and calls rose_write_internal() ->
rose_transmit_link(skb, NULL), causing a NULL pointer dereference.
Per connect(2), a second connect() while a connection is already in
progress should return -EALREADY. Add this missing check for
TCP_SYN_SENT to complete the state validation in rose_connect().
[1] https://syzkaller.appspot.com/bug?extid=d00f90e0af54102fb271
[2] https://gist.github.com/mrpre/9e6779e0d13e2c66779b1653fef80516
📍 영향받는 시스템
Linux kernel with ROSE (packet radio) networking module enabled; affects kernels before the patch
⚔️ 공격 벡터
Local attacker with socket creation privileges; trigger via rapid successive connect() calls on ROSE socket in TCP_SYN_SENT state
🛡️ 대응 방법
Update Linux kernel to patched version; apply fix adding TCP_SYN_SENT validation in rose_connect() returning -EALREADY
🔧 검증 코드
CONFIG_NETROM=y 또는 CONFIG_NETROM=m이 나타나면 ROSE 모듈이 활성화되어 있으며, 해당 커널 버전이 취약점의 영향을 받을 가능성이 있습니다.
grep CONFIG_NETROM /boot/config-$(uname -r) 2>/dev/null | grep -E 'y|m'