NOW Briefing
cifs.spnego 키의 출처를 검증하지 않아 일반 사용자가 root 권한으로 코드 실행이 가능한 로컬 권한 상승 취약점 CIFSwitch(CVE-2026-46243)가 공개됐습니다.
cifs.upcall 헬퍼를 자신의 마운트 네임스페이스로 끌어들인 뒤, 가짜 NSS 라이브러리를 통해 임의 코드를 실행할 수 있습니다.
cifs 모듈 로딩과 cifs-utils 패키지의 존재 여부를 공격 표면 관점에서 점검해야 합니다.
Linux 커널 cifs.spnego 키 미검증 권한 상승 취약점 (CVE-2026-46243)
■ 개요
CIFSwitch(CVE-2026-46243)는 Linux 커널의 SMB/CIFS 클라이언트가 cifs.spnego 키 타입을 등록하면서 키의 description(디스크립션) 필드 출처를 검증하지 않아 발생하는 로컬 권한 상승 취약점입니다. 결함 자체는 키 타입이 추가된 2007년부터 존재했지만, 실제 공격은 네임스페이스 인지 로직이 들어간 cifs-utils 6.14 이상에서만 가능해 영향 범위는 비교적 최신 환경으로 좁혀집니다.
연구자(SpaceX 보안 엔지니어 Asim Viladi Oglu Manizada) 분석 기준, 기본 설치만으로 악용 가능한 배포판에는 Linux Mint 21.3·22.3, CentOS Stream 9, Rocky Linux 9, AlmaLinux 9, SLES 15 SP7, Kali Linux 2021.4~2026.1이 포함됩니다. Ubuntu 18.04~24.04, Debian 11~13, openSUSE Leap/Tumbleweed, Oracle Linux 8·9도 cifs-utils가 추가 설치된 경우 영향 범위에 들어갑니다.
영향 범위는 배포판 기본 구성과 cifs-utils 설치 여부에 따라 달라지지만, 악용 전 조건은 ▲비특권 사용자/마운트 네임스페이스 활성화 ▲cifs.spnego 기본 request-key 규칙 ▲cifs 모듈 로드 가능 세 가지입니다. 모두 일반 배포판 기본값에 해당하며, 권한 상승 결과로는 root 셸 또는 임의 파일 작성이 가능합니다.
⚠️ WARN
PoC가 공개 GitHub 저장소에 동시 배포된 상태이며, 영향받는 다수 배포판에서 그대로 동작합니다.
다만 패치는 커널 정식 소스에 반영됐으나 배포판마다 적용하는 시점이 달라, 패치 적용 전 임시 완화책 병행이 필요합니다.
■ 요약
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2026-46243(CIFSwitch) |
| CVSS 점수 | CVSS v3.1 7.8 / High(AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H) |
| 취약점 유형 | CWE-20: 부적절한 입력 검증(Improper Input Validation), 로컬 권한 상승 |
| 영향/위험 |
- 비특권 사용자의 root 권한 코드 실행 가능 - root 권한 cifs.upcall 프로세스를 공격자 네임스페이스로 유인 가능- 가짜 NSS 모듈 로드를 통한 임의 라이브러리 실행 가능 - sudoers.d 등 root 전용 경로에 임의 파일 작성 가능
|
| 취약 버전 | 커밋 3da1fdf4efbc 이전의 Linux 커널 메인라인 및 스테이블(2007년 도입 시점부터 잠재), cifs-utils 6.14 이상이 설치된 환경에서 악용 가능 |
| 패치 버전 | 메인라인 커밋 3da1fdf4efbc 적용 커널, 각 배포판별 적용 상태 확인 필요 |
■ 기술 분석
영향 조건이 cifs.spnego 키 생성 경로로 좁혀지는 이유는 fs/smb/client/cifs_spnego.c의 cifs_spnego_key_type 구조체가 .vet_description 콜백을 정의하지 않은 채 커널에 등록돼 있기 때문입니다. 해당 콜백은 키 서브시스템이 신규 키 디스크립션을 받을 때 호출하는 검증 훅으로, 부재 시 커널은 request_key(2)나 add_key(2)를 통한 사용자 영역의 키 생성도 동등하게 허용합니다.
검증 훅이 비어 있으면 cifs.spnego 디스크립션의 신뢰 모델도 함께 무너집니다. cifs.spnego 디스크립션은 본래 서버 주소·uid·creduid·pid·upcall_target 등을 세미콜론으로 연결한 권한 정보입니다. 이 값은 커널 CIFS 코드가 비공개 spnego_cred 컨텍스트에서만 만들도록 설계됐고, 사용자 영역의 cifs.upcall은 이를 커널이 보증한 사실로 신뢰합니다. 그러나 검증이 없으면 비특권 사용자가 동일한 형식의 위조 디스크립션을 직접 만들어 /sbin/request-key로 root 권한 헬퍼를 깨울 수 있습니다.
위조 디스크립션이 root 헬퍼까지 전달되면 cifs.upcall은 upcall_target=app 분기에서 switch_to_process_ns(arg->pid)를 호출해 공격자가 지정한 PID의 마운트 네임스페이스로 진입합니다. 이후 getpwuid() 호출이 일어나는데, 이 함수는 NSS 설정과 libnss_*.so.2를 동적으로 적재합니다. 결과적으로 공격자 네임스페이스의 /etc/nsswitch.conf와 가짜 NSS 모듈이 root 컨텍스트에서 로드됩니다.
이 경로를 차단하기 위해 메인라인 패치는 키 타입에 검증 콜백을 추가해 사용자 영역이 생성하는 키를 거부하는 구조로 바꿉니다. current_cred()가 커널 내부의 spnego_cred와 일치하지 않으면 -EPERM을 반환하며, request_key(2)/add_key(2) 경로의 위조 시도가 차단됩니다.
/* [패치 후] fs/smb/client/cifs_spnego.c - commit 3da1fdf4efbc */
#include <linux/cred.h>
static int
cifs_spnego_key_vet_description(const char *description)
{
/*
* cifs.spnego descriptions are authority-bearing inputs to
* cifs.upcall. They are only valid when produced by CIFS while
* using the private spnego_cred installed below. Do not let
* userspace create this type of key through request_key(2)/
* add_key(2), since the helper treats pid/uid/creduid/
* upcall_target as kernel-originating fields.
*/
if (current_cred() != spnego_cred)
return -EPERM;
return 0;
}
struct key_type cifs_spnego_key_type = {
.name = "cifs.spnego",
.instantiate = cifs_spnego_key_instantiate,
/* ... 생략 ... */
.vet_description = cifs_spnego_key_vet_description,
};
📘 INFO
키 서브시스템은 디스크립션을 받을 때마다 .vet_description 콜백을 호출하므로, 검증을 통과하지 못한 위조 호출은 cifs.upcall이 실행되기 전 단계에서 실패합니다.
반면 패치 전에는 동일한 검증 지점이 비어 있어 사용자 영역이 cifs.spnego 키를 직접 생성할 수 있었습니다.
■ PoC
공개된 manizada/CIFSwitch 저장소도 이 검증 부재를 이용하며, cifswitch-poc.py와 인라인 C 헬퍼, 가짜 NSS 라이브러리, cifs.upcall 트리거를 묶어 비특권 사용자가 root 권한으로 /etc/sudoers.d에 항목을 작성하도록 동작합니다. 본 글에서는 재현을 돕지 않는 범위에서, 취약점의 근본 논리만 의사 코드 수준으로 정리합니다.
/* 이 코드는 실제 익스플로잇이 아니라 공개 PoC의 검증 관점을 방어적으로 단순화한 예시입니다. */
/* [패치 전] 사용자 영역에서 직접 키 생성이 가능했던 흐름 */
char desc[] = "cifs.spnego;ver=...;uid=0;creduid=0;pid=<attacker>;target=app;...";
/* 비특권 프로세스가 request_key(2)/add_key(2)로
* cifs.spnego 디스크립션을 만들면 키 서브시스템은 출처를 묻지 않고 통과시킴 */
key_serial_t k = request_key("cifs.spnego", desc, NULL, KEY_SPEC_THREAD_KEYRING);
/* 이후 /sbin/request-key가 root 권한의 cifs.upcall을 호출하고,
* cifs.upcall은 desc의 pid/uid/target 필드를 커널 보증으로 신뢰
* → switch_to_process_ns(공격자_pid) → 공격자 NSS 모듈 로드
*
* // ... 트리거 타이밍·네임스페이스 준비·페이로드 배치 세부는 생략 ... */
⚠️ WARN
위 스니펫은 취약점의 위치(키 타입에 출처 검증 콜백 부재)와 신뢰 경계 붕괴 효과만 설명합니다.
실제 트리거 시퀀스·네임스페이스 구성·NSS 모듈 배치 절차는 생략했습니다.
■ 탐지 및 점검
• 패치 적용 여부를 기준으로 모든 호스트에서 uname -r로 가동 중인 커널 버전을 확인하고, 배포판 보안 권고에 따라 커밋 3da1fdf4efbc 반영 여부를 대조합니다.
• dpkg -l cifs-utils 또는 rpm -q cifs-utils로 패키지 설치 여부를 살피고, 사용 사례가 없는 호스트에서는 제거 대상으로 분류합니다.
• lsmod | grep -E '^cifs'와 modinfo cifs로 cifs 모듈이 적재 가능한 상태인지 점검하며, 자동 적재 정책(/etc/modules-load.d/, /etc/modprobe.d/)도 함께 검토합니다.
• sysctl kernel.unprivileged_userns_clone(Debian 계열) 또는 kernel.userns.allowed를 조회해 비특권 사용자 네임스페이스 활성화 여부를 파악합니다.
• auditd 또는 EDR 로그에서 비특권 UID가 cifs.upcall을 트리거하는 비정상 호출 패턴(request-key → cifs.upcall 체인, 직후 NSS 라이브러리 로드)을 룰로 등록합니다.
✅ CHECK
점검 우선순위는 ▲기본 구성으로 영향받는 배포판(Linux Mint 21.x·22.x, CentOS Stream 9, Rocky 9, AlmaLinux 9, SLES 15 SP7, Kali 2021.4~2026.1) ▲워크스테이션·점프 호스트 등 비특권 셸 접근이 일상적인 시스템 순으로 두는 것이 효과적입니다.
■ 대응 방안
• 점검 결과 영향 가능성이 확인된 호스트는 배포판 보안 권고에서 커밋 3da1fdf4efbc가 포함된 커널 패키지로 즉시 업데이트하고, 재부팅으로 신규 커널을 활성화합니다.
• 업데이트 적용 전까지는 echo "blacklist cifs" > /etc/modprobe.d/cifs-blacklist.conf 후 modprobe -r cifs로 모듈을 차단해 공격 표면을 제거합니다.
• CIFS 마운트가 필요 없는 서버·워크스테이션에서는 cifs-utils 패키지를 삭제해 cifs.upcall 헬퍼 자체가 호출되지 않도록 합니다.
• /etc/request-key.d/cifs.spnego.conf의 기본 규칙을 negate로 덮어써 request-key가 위조 디스크립션에 대해 헬퍼를 실행하지 않도록 임시 차단합니다.
• 운영 정책상 필요하지 않다면 비특권 사용자 네임스페이스를 비활성화(sysctl -w kernel.unprivileged_userns_clone=0 등)해 익스플로잇 전제 조건을 무효화합니다.
💡 TIP
패치 적용과 별개로, cifs.upcall이 비정상적으로 호출된 시점 이후의 호스트는 root 컨텍스트에서 임의 라이브러리가 적재됐을 가능성을 전제로 우선 조사 대상으로 분류해 점검해야 합니다.
[참고 자료]
oss-security, CIFSwitch disclosure (2026-05-28)
Linux kernel commit 3da1fdf4efbc, smb: client: reject userspace cifs.spnego descriptions
manizada/CIFSwitch PoC repository
Researcher writeup, heyitsas.im/posts/cifswitch
BleepingComputer, New CIFSwitch Linux flaw gives root on multiple distributions



