🇰🇷 한글 설명
Linux 커널의 CIFS(SMB Direct) 클라이언트 코드에서 smbd_response 슬랩(slab) 객체의 패킷 영역이 usercopy 권한을 허용하도록 설정되지 않아 발생하는 취약점입니다. CONFIG_HARDENED_USERCOPY가 활성화된 환경에서 copy_to_iter() 함수를 통해 데이터를 복사할 때 커널 보안 검사를 통과하지 못해 커널 패닉(Oops)이 발생할 수 있습니다.
💡 쉬운 설명
리눅스 컴퓨터가 네트워크를 통해 파일을 주고받을 때, 보안 설정이 강화된 시스템에서 데이터 복사 과정 중 오류가 발생하여 시스템이 갑자기 멈추거나 꺼질 수 있는 문제입니다. 이는 공격자가 시스템을 중단시키는 용도로 악용될 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
cifs: Fix the smbd_response slab to allow usercopy
The handling of received data in the smbdirect client code involves using
copy_to_iter() to copy data from the smbd_reponse struct's packet trailer
to a folioq buffer provided by netfslib that encapsulates a chunk of
pagecache.
If, however, CONFIG_HARDENED_USERCOPY=y, this will result in the checks
then performed in copy_to_iter() oopsing with something like the following:
CIFS: Attempting to mount //172.31.9.1/test
CIFS: VFS: RDMA transport established
usercopy: Kernel memory exposure attempt detected from SLUB object 'smbd_response_0000000091e24ea1' (offset 81, size 63)!
------------[ cut here ]------------
kernel BUG at mm/usercopy.c:102!
...
RIP: 0010:usercopy_abort+0x6c/0x80
...
Call Trace:
<TASK>
__check_heap_object+0xe3/0x120
__check_object_size+0x4dc/0x6d0
smbd_recv+0x77f/0xfe0 [cifs]
cifs_readv_from_socket+0x276/0x8f0 [cifs]
cifs_read_from_socket+0xcd/0x120 [cifs]
cifs_demultiplex_thread+0x7e9/0x2d50 [cifs]
kthread+0x396/0x830
ret_from_fork+0x2b8/0x3b0
ret_from_fork_asm+0x1a/0x30
The problem is that the smbd_response slab's packet field isn't marked as
being permitted for usercopy.
Fix this by passing parameters to kmem_slab_create() to indicate that
copy_to_iter() is permitted from the packet region of the smbd_response
slab objects, less the header space.
📍 영향받는 시스템
CONFIG_HARDENED_USERCOPY가 활성화된 Linux 커널 (CIFS/SMB Direct 사용 환경)
⚔️ 공격 벡터
악의적으로 조작된 SMB Direct 패킷을 전송하여 커널의 usercopy 검사를 유발하고 시스템을 중단시킴 (DoS)
🛡️ 대응 방법
smbd_response 슬랩 생성 시 usercopy 허용 파라미터를 포함하도록 커널을 최신 버전으로 업데이트
🔧 검증 코드
커널 버전과 CONFIG_HARDENED_USERCOPY 설정이 'y'로 되어 있는지 확인하여 취약한 환경인지 판단합니다.
uname -r && grep CONFIG_HARDENED_USERCOPY /boot/config-$(uname -r)