CVE-2026-89784 in Linux
요약
\~에 의해 VulDB • 2026. 09. 16.
리눅스 커널에서 다음 취약점이 해결되었습니다:
SUNRPC: rpcb_register_inet4/6에서 rpc_sockaddr2uaddr()의 반환값 확인
rpcb_register_inet4() 및 rpcb_register_inet6()는 NULL인지 여부를 확인하지 않고 `rpc_sockaddr2uaddr()`의 결과를 `map->r_addr`에 저장합니다. `rpc_sockaddr2uaddr()`은 최종적인 `kstrdup()` 호출이 실패할 경우 NULL을 반환하며, 이 검증되지 않은 NULL 값이 동기식 RPCBPROC_SET 인코딩 경로인 rpcb_register_call() -> rpc_call_sync() -> rpcb_enc_getaddr() -> encode_rpcb_string()로 전달됩니다. 여기서 첫 번째 문장은 `strlen(string)`이며, 이는 NULL 포인터를 역참조하여 커널oops(비정상 종료)를 유발합니다.
이 크래시는 v6.12에서 failslab 사용 시 재현되며, KASAN을 사용할 경우 NULL 역참조는 주소 0의 쉐도우 메모리 상에서 다음과 같은 결함으로 나타납니다:
Oops: general protection fault, probably for non-canonical address 0xdffffc0000000000 [#1] PREEMPT SMP KASAN
RIP: 0010:strlen (lib/string.c:409) Call Trace: encode_rpcb_string (net/sunrpc/rpcb_clnt.c:890) rpcb_enc_getaddr (net/sunrpc/rpcb_clnt.c:910) rpcauth_wrap_req_encode (net/sunrpc/auth.c:745) call_encode (net/sunrpc/clnt.c:1966) __rpc_execute (net/sunrpc/sched.c:952) rpc_run_task (net/sunrpc/clnt.c:1243) rpc_call_sync (net/sunrpc/clnt.c:1272) rpcb_v4_register (net/sunrpc/rpcb_clnt.c:500) svc_generic_rpcbind_set nfsd_rpcbind_set svc_register svc_setup_socket svc_addsock write_ports nfsctl_transaction_write vfs_write
이 크래시는 커널 내부 RPC 서비스(nfsd, lockd, nfs-callback)가 로컬 rpcbind에 등록할 때 발생하며, `rpc_sockaddr2uaddr()` 내의 작은 GFP_KERNEL `kstrdup()` 호출이 실패하기에 충분한 메모리 압박 조건 하에서 접근 가능합니다. 비동기식 getport 경로는 이미 이 정확한 실패 모드를 -ENOMEM 반환으로 처리하고 있습니다. 다만 두 가지 등록 헬퍼 함수(rpcb_register_inet4/6)만 검사를 생략했습니다.
해당 처리 방식을 반영하여, 주소가 인코더에 전달되기 전에 `rpc_sockaddr2uaddr()`이 NULL을 반환할 경우 -ENOMEM과 함께 중단되도록 수정합니다.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.