개발/윈도우
ReFS 실행 제어: 파일 필터 없이 커널 콜백으로 차단하기
-=HaeJuK=-
2025. 4. 16. 10:47
728x90
반응형
📌 ReFS 실행 제어: 파일 필터 없이 커널 콜백으로 차단하기
✅ 요약
NTFS에서는 파일 필터 드라이버(FltMgr)를 이용해 실행을 제어할 수 있지만,
ReFS는 필터링 지원이 제한되어 기존 방식이 작동하지 않습니다.
하지만 PsSetCreateProcessNotifyRoutineEx
를 사용하면 파일 시스템 종류와 관계없이 프로세스 실행을 차단할 수 있습니다.
✅ 언제 파일 필터 대신 PsNotify를 쓰는가?
기능 | 파일 필터 드라이버 | PsNotify 콜백 |
---|---|---|
.exe 실행 차단 | ✅ NTFS만 | ✅ NTFS + ReFS |
파일 읽기/쓰기 감시 | ✅ | ❌ |
ReFS 지원 | ❌ 제한적 | ✅ 완벽 지원 |
드라이버 구조 | 복잡 (FltMgr 기반) | 간단 (WDM 기반) |
📦 아키텍처 구조도
┌────────────┐ 프로세스 실행 요청 ┌──────────────┐
│ 사용자 앱 │ ──────────────────────────▶ │ CreateProcess│
└────────────┘ └──────┬───────┘
│
PsSetCreateProcessNotifyRoutineEx
│
정책 위반이면 ──────── STATUS_ACCESS_DENIED ◀────
│
실행 차단
🧪 .sys 드라이버 뼈대 예제
// KernelDriver.c
#include <ntddk.h>
VOID OnProcessNotify(
PEPROCESS Process,
HANDLE ProcessId,
PPS_CREATE_NOTIFY_INFO CreateInfo)
{
if (CreateInfo == NULL || CreateInfo->ImageFileName == NULL)
return;
UNICODE_STRING* imagePath = CreateInfo->ImageFileName;
// 정책: ReFS 영역 실행 차단
if (wcsstr(imagePath->Buffer, L"\\Device\\HarddiskVolumeX\\Restricted\\")) {
DbgPrint("[정책] 실행 차단됨: %wZ\n", imagePath);
CreateInfo->CreationStatus = STATUS_ACCESS_DENIED;
}
}
void UnloadDriver(PDRIVER_OBJECT DriverObject)
{
PsSetCreateProcessNotifyRoutineEx(OnProcessNotify, TRUE);
DbgPrint("드라이버 언로드 완료\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
UNREFERENCED_PARAMETER(RegistryPath);
DriverObject->DriverUnload = UnloadDriver;
PsSetCreateProcessNotifyRoutineEx(OnProcessNotify, FALSE);
DbgPrint("실행 차단 드라이버 로드됨\n");
return STATUS_SUCCESS;
}
📎 이 코드는 실행 시점에서 `.exe` 파일의 전체 경로를 확인하고, 정책에 따라 STATUS_ACCESS_DENIED
를 설정해 실행을 차단합니다.
✅ 결론
- ReFS는 NTFS처럼 파일 필터링으로 제어하기 어렵다.
PsSetCreateProcessNotifyRoutineEx
는 파일 시스템 종류에 관계없이 프로세스 실행 시점을 후킹 가능하다.- 간단한 WDM 드라이버만으로도 효과적인 실행 차단이 가능하다.
- 실행만 제어한다면, 파일 필터 드라이버는 불필요하다.
📌 실행 제어가 목적이라면, PsNotify 기반 커널 드라이버가 ReFS 환경에서도 가장 실용적인 방법입니다.
728x90