드라이버를 가져올 필요도 없었다 — 관리자 권한이 그대로 커널 문이 된 순간
드라이버를 가져올 필요도 없었다 — 관리자 권한이 그대로 커널 문이 된 순간
분류: Security · 커널·OS · 루트킷/BYOVD 커널접근 [정보성]
덱. 보안 업체 Avast는 북한 연계 해킹 그룹 라자루스(Lazarus)가 실전에서 사용한 윈도우 커널 제로데이(개발사도 모르는 미공개 취약점)를 발견해 마이크로소프트에 신고했습니다. 이 취약점은 2024년 2월 정기 패치에서 CVE-2024-21338로 수정됐습니다. 눈에 띄는 건 취약점 자체보다 라자루스가 이걸 쓴 방식입니다 — 취약한 서명 드라이버를 따로 가져다 쓰는 기존 수법(BYOVD) 대신, 윈도우에 원래 있던 드라이버 하나의 결함만으로 관리자 권한을 커널 권한으로 바꿔치기했습니다.
리드
윈도우 보안모델은 “관리자 권한에서 커널까지는 보안 경계가 아니다”라는 입장을 오래전부터 고수해 왔습니다. 관리자 권한을 가진 공격자가 커널에 접근하는 걸 막아주겠다고 약속한 적이 없다는 뜻입니다. 그래서 공격자들은 관리자 권한만 확보하면 취약한 서명 드라이버를 하나 가져와 로드해 커널까지 넘어가는 게 일반적이었습니다(BYOVD, Bring Your Own Vulnerable Driver). 이번 사례가 중요한 이유는, 그 마지막 관문 — 드라이버를 새로 가져오는 행위 자체 — 마저 생략할 수 있다는 걸 실전에서 보여줬기 때문입니다. 방어자 입장에서 “낯선 드라이버가 로드된다”는 탐지 신호 하나가 통째로 사라지는 셈입니다.
01 개념 30초 — BYOVD와 그 다음 단계
BYOVD는 공격자가 이미 알려진, 취약하지만 정상 서명된 드라이버 파일을 시스템에 몰래 가져다 놓고 로드시켜 커널 코드 실행 권한을 얻는 기법입니다. 서명 검사(드라이버 서명 강제, DSE)는 통과하지만, 낯선 드라이버 파일이 디스크에 떨어지고 로드된다는 두 가지 흔적이 남아 탐지하기 쉬운 편입니다. Avast는 이 기법을 난이도·은밀성 기준으로 세 단계로 나눕니다: ①이미 알려진 취약점을 쓰는 n-day BYOVD, ②서드파티 드라이버에서 직접 찾아낸 제로데이 BYOVD, ③그리고 가장 은밀한 단계로 아예 새 드라이버를 가져오지 않고, 대상 컴퓨터에 원래 깔려 있는 윈도우 내장 드라이버의 제로데이를 쓰는 것입니다. 이번에 발견된 사례는 세 번째 단계에 해당합니다.
02 빈틈 — 커널 함수 포인터를 사용자 입력에서 그대로 받다
문제의 드라이버는 애플리케이션 화이트리스팅 기능인 AppLocker의 핵심 드라이버 appid.sys입니다. 이 드라이버에는 실행 파일의 해시를 계산해주는 IOCTL(입출력 제어 코드) 하나가 있는데, 유연성을 위해 호출자가 “파일 크기를 어떻게 조회할지”, “데이터를 어떻게 읽을지”를 함수 포인터 두 개로 직접 지정할 수 있게 설계돼 있었습니다. 원래 이 함수 포인터들은 커널 내부(다른 AppLocker 관련 드라이버)에서만 넘겨받는 걸 전제로 만들어진 것으로 보이는데, 실제로는 사용자 모드에서도 이 IOCTL을 호출할 수 있는 경로가 그대로 열려 있었습니다. 결과적으로 사용자 권한의 공격자가 커널에게 “이 임의의 함수를, 내가 지정한 데이터를 첫 인자로 넘겨서 호출해달라”고 시킬 수 있는 셈이었습니다.
다만 아무 함수나 부를 수 있는 건 아니었습니다. SMEP(사용자 모드 코드를 커널이 실행하지 못하게 막는 CPU 보호 기능)와 kCFG(커널 제어 흐름 보호, 호출 대상이 유효한 함수인지 검증)가 걸려 있어서, 공격자는 이 검증을 통과하면서도 원하는 결과를 내는 “가젯”(제어흐름 보호를 우회하지 않으면서 의도한 부작용을 내는 코드 조각) 함수를 골라야 했습니다.
03 트릭 — 관리자에서 로컬서비스로, 그리고 커널 읽기·쓰기 원시능력까지
이 IOCTL은 아무나 부를 수 있는 게 아니라 특정 권한을 가진 핸들이 필요했는데, 흥미롭게도 접근 제어 목록을 보면 administrators(관리자) 그룹에는 쓰기 권한이 없고, local service 계정에는 있었습니다. 즉 엄밀히는 “관리자→커널”이 아니라 “로컬서비스→커널” 취약점에 더 가깝습니다. 라자루스의 실제 공격 흐름은 이미 확보한 관리자 권한에서 시작해, 직전에 로컬서비스 계정을 잠시 사칭(임퍼스네이션)한 뒤 이 IOCTL을 호출하는 방식이었습니다 — 그래서 이 글에서도 원문과 마찬가지로 넓은 의미의 “관리자→커널” 취약점으로 다룹니다.
공격자는 이 임의 함수 호출 능력을 이용해, 현재 스레드의 PreviousMode라는 커널 내부 값 1바이트를 지워버리는 데 씁니다. 이 값이 지워지면 커널은 이후의 메모리 읽기·쓰기 요청을 “커널 모드에서 온 요청”으로 착각하게 되고, 그 결과 NtReadVirtualMemory/NtWriteVirtualMemory라는 정상 시스템 호출만으로 임의의 커널 메모리를 읽고 쓸 수 있는 능력을 얻게 됩니다. 드라이버를 추가로 로드하거나 커널에 직접 코드를 심을 필요 없이, 이 하나의 원시능력(read/write primitive)만으로 커널을 조작할 수 있는 겁니다.
마이크로소프트는 신고를 받은 뒤, 이 IOCTL 핸들러에 호출 출처가 사용자 모드인지 확인하는 검사(ExGetPreviousMode 체크)를 추가해 2024년 2월 패치로 막았습니다.
04 왜 반복되는가 — 데이터만 조작하는 루트킷의 확장
이 커널 읽기·쓰기 능력을 발판 삼아 Avast가 분석한 것이 라자루스의 “FudModule” 루트킷입니다. 이 루트킷은 흥미롭게도 자체 코드를 커널에 심지 않고, 커널이 이미 갖고 있는 데이터 구조체만 직접 고쳐 쓰는 방식(data-only, direct kernel object manipulation)으로 동작합니다. 코드 실행 없이 데이터만 건드리기 때문에, 코드 무결성 검증(HVCI 같은) 방어를 상당 부분 비켜갈 수 있습니다.
이전 변종(2021~2022년, ESET·AhnLab이 분석)은 7가지 기법으로 레지스트리 콜백, 오브젝트 콜백 등 보안 소프트웨어가 의존하는 커널 감시 지점들을 지웠습니다. 이번에 발견된 변종은 9가지 기법(신규 4개, 개선 3개)으로 늘었고, 방어 소프트웨어를 무력화하는 방식도 더 정교해졌습니다 — 예를 들어 파일시스템 미니필터(백신 스캔에 쓰이는 커널 후킹 지점)를 코드 패치가 아니라 링크드 리스트 조작으로 제거하도록 바뀌었는데, 이는 HVCI가 기본으로 켜진 윈도우 11 환경에서 기존 방식(함수 코드 직접 패치)이 더 이상 통하지 않기 때문으로 보입니다. 또한 스레드 핸들 하나를 조작해 다른 프로세스를 가리키게 만드는 방식으로, PPL(Protected Process Light, 보호 프로세스)로 지정된 백신·EDR 프로세스(Defender, CrowdStrike Falcon, HitmanPro)를 강제로 정지시키는 기법도 새로 등장했습니다.
이런 흐름이 반복되는 이유는 결국 하나입니다. 방어 기술이 “코드를 새로 심는 공격”을 점점 잘 막아낼수록, 공격자는 “이미 있는 데이터 구조체를 뒤트는” 쪽으로 옮겨간다는 것입니다. 이건 저희가 다른 글에서 다룬 필터·검증 우회의 구도와도 닮았습니다 — 정문(코드 실행 검증)을 잠그면 공격자는 문지기가 미처 못 보는 뒷문(데이터 구조 자체의 신뢰)으로 옮겨갑니다.
05 남는 교훈
관리자 권한과 커널 권한 사이의 경계는 마이크로소프트 스스로도 “보안 경계로 보장하지 않는다”고 명시한 지대입니다. 이번 사례가 남기는 실질적 교훈은, 서명된 드라이버 하나를 블록리스트에 올리는 방어만으로는 부족하다는 것입니다. 윈도우에 원래 있던 드라이버라도 IOCTL 설계가 사용자 입력을 지나치게 신뢰하면, 관리자 권한을 얻은 공격자에게는 “새 드라이버를 가져올 필요조차 없는” 통로가 열립니다. ⚠️미확인 — 이 취약점이 실제로 어느 시점부터 악용됐는지, 다른 피해 사례가 더 있었는지는 이 초안에서 1차 확증하지 못했습니다.
References / 참고자료
- Jan Vojtěšek (Avast Threat Labs), “Lazarus and the FudModule Rootkit: Beyond BYOVD with an Admin-to-Kernel Zero-Day” — 이 글이 재구성한 원 분석. CVE-2024-21338의 발견 경위와 FudModule 루트킷의 9가지 기법을 상세히 다룸. https://decoded.avast.io/janvojtesek/lazarus-and-the-fudmodule-rootkit-beyond-byovd-with-an-admin-to-kernel-zero-day/
이 글은 위 원 분석을 우리 관점에서 다시 쓰고 짧은 논평을 더한 정보성 초안입니다. 특정 문장·코드·스크린샷을 그대로 옮기지 않았으며, 작동하는 재현 절차나 익스플로잇 세부는 싣지 않았습니다. ⚠️미확인 표시 항목은 발행 전 독립 팩트체크에서 확증·정정되어야 합니다.