你的MiniFilter安全吗?

简介

筛选器管理器 (FltMgr.sys)是Windows系统提供的内核模式驱动程序, 用于实现和公开文件系统筛选器驱动程序中通常所需的功能; 第三方文件系统筛选器开发人员可以使用FltMgr的功能可以更加简单的编写文件过滤驱动, 这种驱动我们通常称为MiniFilter, 下面是MiniFilter的基本框架:
MiniFilter
简单的说就是我们可以通过微软提供的一些接口, 可以使我们方便的在内核层监控文件的操作(创建, 删除, 读写等), 例如杀毒软件利用MiniFilter监控文件的创建, 在文件创建时对文件进行病毒查杀; 又例如安全产品利用MiniFilter, 阻止第三方程序在自己的目录下面写文件等…

MiniFilter

由于在MiniFilter中我们不用关心IRP的处理工作, 这些都可以交给 Filter Manager处理, 所以我们要编写一个MiniFilter是很简单的, 只有调用几个API函数, 并在参数中填写我们关心的或者需要处理的结构就可以了;

FltRegisterFilter

我们使用FltRegisterFilter来注册一个过滤器:

NTSTATUS FLTAPI FltRegisterFilter([in]  PDRIVER_OBJECT         Driver,[in]  const FLT_REGISTRATION *Registration,[out] PFLT_FILTER            *RetFilter
);

第一个参数和DriverEntry的第一个参数一样, 第三参数RetFilter作为输出, 主要用于后续调用FltUnregisterFilter时注销MiniFilter:

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING reg_path)
{NTSTATUS status;	DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "DriverEntry Entry!\n");ExInitializeResourceLite(&GlobalResource);status = FltRegisterFilter(DriverObject, &FilterRegistration, &gFilterHandle);if (NT_SUCCESS(status)) {status = FltStartFiltering(gFilterHandle);if (!NT_SUCCESS(status)) {DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "FltUnregisterFilter status: %lx\n", status);FltUnregisterFilter(gFilterHandle);}else {DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "FltRegisterFilter Start!\n");}}else {DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "status: %lx\n", status);}DriverObject->DriverUnload = UnDriver;return STATUS_SUCCESS;
}

最重要的是第两个参数Registration, 这个参数中定义了一系列的结构, 用于注册监控文件操作的回调等;

typedef struct _FLT_REGISTRATION {USHORT                                      Size;USHORT                                      Version;FLT_REGISTRATION_FLAGS                      Flags;const FLT_CONTEXT_REGISTRATION              *ContextRegistration;const FLT_OPERATION_REGISTRATION            *OperationRegistration;PFLT_FILTER_UNLOAD_CALLBACK                 FilterUnloadCallback;PFLT_INSTANCE_SETUP_CALLBACK                InstanceSetupCallback;PFLT_INSTANCE_QUERY_TEARDOWN_CALLBACK       InstanceQueryTeardownCallback;PFLT_INSTANCE_TEARDOWN_CALLBACK             InstanceTeardownStartCallback;PFLT_INSTANCE_TEARDOWN_CALLBACK             InstanceTeardownCompleteCallback;PFLT_GENERATE_FILE_NAME                     GenerateFileNameCallback;PFLT_NORMALIZE_NAME_COMPONENT               NormalizeNameComponentCallback;PFLT_NORMALIZE_CONTEXT_CLEANUP              NormalizeContextCleanupCallback;PFLT_TRANSACTION_NOTIFICATION_CALLBACK      TransactionNotificationCallback;PFLT_NORMALIZE_NAME_COMPONENT_EX            NormalizeNameComponentExCallback;PFLT_SECTION_CONFLICT_NOTIFICATION_CALLBACK SectionNotificationCallback;
} FLT_REGISTRATION, *PFLT_REGISTRATION;

可以看到FLT_REGISTRATION有很多字段, 但是我们用到的通常是:

CONST FLT_REGISTRATION FilterRegistration = {sizeof(FLT_REGISTRATION),			//  SizeFLT_REGISTRATION_VERSION,           //  Version0,                                  //  FlagsNULL,                               //  ContextCallbacks,                          //  Operation callbacksPtUnload,                           //  MiniFilterUnloadPtInstanceSetup,                    //  实例绑定回调函数,可以决定绑定哪些卷PtInstanceQueryTeardown,            //  InstanceQueryTeardownPtInstanceTeardownStart,            //  InstanceTeardownStartPtInstanceTeardownComplete,         /** 过滤管理器在发送的I/O请求都被完成的时候,调用这个函数, 在这个函数中,微过滤驱动关闭所有还被打开的文件*/NULL,                               //  GenerateFileNameNULL,                               //  GenerateDestinationFileNameNULL                                //  NormalizeNameComponent
};

FLT_OPERATION_REGISTRATION这个结构中我们定义我们关心的文件操作:

const FLT_OPERATION_REGISTRATION Callbacks[] = {{IRP_MJ_CREATE,0,NPPreCreate,   	// 生成预操作回调函数NPPostCreate	// 生成后操作回调函数},{ IRP_MJ_OPERATION_END }
};

IRP_MJ_CREATE, IRP_MJ_SET_INFORMATION等是IPR请求信息, 操作系统发送 IRP_MJ_CREATE 请求,以打开文件对象或设备对象的句柄。 例如,当驱动程序调用 ZwCreateFile 时,操作系统会发送 IRP_MJ_CREATE 请求以执行实际打开操作; 每个FLT_OPERATION_REGISTRATION都必须以IRP_MJ_OPERATION_END结尾;
所以我们这里注册了有关IRP_MJ_CREATE的回调, 当有IRP_MJ_CREATE请求时, 就会触发我们的回调, 会进入我们的NPPreCreate回调函数, 我们可以在这个函数中处理文件, 例如阻止test1.exe的操作:

FLT_PREOP_CALLBACK_STATUS NPPreCreate(PFLT_CALLBACK_DATA Data,PCFLT_RELATED_OBJECTS FltObjects,PVOID *ComletionContext
) {char Filename[256] = { "X:" };NTSTATUS status;PFLT_FILE_NAME_INFORMATION nameinfo;UNREFERENCED_PARAMETER(FltObjects);UNREFERENCED_PARAMETER(ComletionContext);PAGED_CODE();__try {status = FltGetFileNameInformation(Data,FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_DEFAULT,&nameinfo);if (NT_SUCCESS(status)) {FltParseFileNameInformation(nameinfo);if (NPUnicodeStringToChar(&nameinfo->Name, Filename)) {if (strstr(Filename, "test1.exe") > 0) {DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "[NPPreCreate] Filename :%s\n", Filename);Data->IoStatus.Status = STATUS_ACCESS_DENIED;Data->IoStatus.Information = 0;FltReleaseFileNameInformation(nameinfo);return FLT_PREOP_COMPLETE;}}FltReleaseFileNameInformation(nameinfo);}}__except (EXCEPTION_EXECUTE_HANDLER) {DbgPrint("NPPreCreate EXCEPTION_EXECUTE_HANDLER");}return FLT_PREOP_SUCCESS_WITH_CALLBACK;
}

.inf文件

MiniFilter驱动加载到系统时, 和常规的驱动加载不太一样, 需要写注册表项, 定义一些字段, 例如Altitude, 这是最重要的一个字段之一;
因为不同的高度意味在不同的加载顺序和分组, 高度越高越会被先执行, 具体的高度以及分组可以参考微软的文档:
在这里插入图片描述
inf驱动安装文件:

;;;
;;; MiniFile
;;;
;;;
;;; Copyright (c) 1999 - 2002, Microsoft Corporation
;;;[Version]
Signature   = "$Windows NT$"
Class       = "ActivityMonitor"             ;This is determined by the work this filter driver does
ClassGuid   = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2}    ;This value is determined by the Class
Provider    = %ProviderString%
DriverVer   = 06/16/2007,1.0.0.0
CatalogFile = MiniFile.cat[DestinationDirs]
DefaultDestDir          = 12
MiniFile.DriverFiles  = 12;;
;; Default install sections
;;[DefaultInstall]
OptionDesc  = %ServiceDescription%
CopyFiles   = MiniFile.DriverFiles[DefaultInstall.Services]
AddService  = %ServiceName%,,MiniFile.Service;;
;; Default uninstall sections
;;[DefaultUninstall]
DelFiles   = MiniFile.DriverFiles[DefaultUninstall.Services]
DelService = %ServiceName%,0x200      ;Ensure service is stopped before deleting;
; Services Section
;[MiniFile.Service]
DisplayName      = %ServiceName%
Description      = %ServiceDescription%
ServiceBinary    = %12%\%DriverName%.sys
Dependencies     = "FltMgr"
ServiceType      = 2                        ;SERVICE_FILE_SYSTEM_DRIVER
StartType        = 3                        ;SERVICE_DEMAND_START
ErrorControl     = 1                        ;SERVICE_ERROR_NORMAL
LoadOrderGroup   = "FSFilter Activity Monitor"
AddReg           = MiniFile.AddRegistry;
; Registry Modifications
;[MiniFile.AddRegistry]
HKR,,"SupportedFeatures",0x00010001,0x3
HKR,"Instances","DefaultInstance",0x00000000,%DefaultInstance%
HKR,"Instances\"%Instance1.Name%,"Altitude",0x00000000,%Instance1.Altitude%
HKR,"Instances\"%Instance1.Name%,"Flags",0x00010001,%Instance1.Flags%;
; Copy Files
;[MiniFile.DriverFiles]
%DriverName%.sys[SourceDisksFiles]
MiniFile.sys = 1,,[SourceDisksNames]
1 = %DiskId1%,,,;;
;; String Section
;;[Strings]
ProviderString          = "TODO-Set-Provider"
ServiceDescription      = "MiniFile mini-filter driver"
ServiceName             = "MiniFile"
DriverName              = "MiniFile"
DiskId1                 = "MiniFile Device Installation Disk";Instances specific information.
DefaultInstance         = "Null Instance"
Instance1.Name          = "Null Instance"
Instance1.Altitude      = "370030"
Instance1.Flags         = 0          ; Suppress automatic attachments

FltCreateCommunicationPort

FltCreateCommunicationPort函数可以创建一个通信服务器端口,微筛选器驱动程序可在该端口上接收来自用户模式应用程序的连接请求; 也通过这个函数注册就是可以让ring3的程序直接和MiniFilter驱动进行通信, FltCreateCommunicationPort函数原型如下:

NTSTATUS FLTAPI FltCreateCommunicationPort([in]           PFLT_FILTER            Filter,[out]          PFLT_PORT              *ServerPort,[in]           POBJECT_ATTRIBUTES     ObjectAttributes,[in, optional] PVOID                  ServerPortCookie,[in]           PFLT_CONNECT_NOTIFY    ConnectNotifyCallback,[in]           PFLT_DISCONNECT_NOTIFY DisconnectNotifyCallback,[in, optional] PFLT_MESSAGE_NOTIFY    MessageNotifyCallback,[in]           LONG                   MaxConnections
);

处理与应用层程序通信的逻辑主要就是就在MessageNotifyCallback回调当中;

Flt函数

通过以上的基础知识, 我们知道了在实际的应用当中我们可以通过MiniFilter来监控文件操作, 并且杀毒软件也是通过这种机制来监控文件的创建等事件, 对我们落盘的文件进行查杀的; 同时安全软件软件EDR产品等也会通过这种方式来对自己的安装目录进行保护, 禁止第三方软件等往自己的目录写入文件, 例如我们往一个受保护的目录中创建一个新文件, 会被阻止:
Can't
如果我们在自己的MiniFilter驱动中调用FltCreateFileEx, FltWriteFile, FltReadFile等函数去操作文件, 会不会被其他MiniFilter拦截呢?
我们来看看微软的文档中对FltCreateFileEx的描述, 原型是这样的:

NTSTATUS FLTAPI FltCreateFileEx([in]           PFLT_FILTER        Filter,[in, optional] PFLT_INSTANCE      Instance,[out]          PHANDLE            FileHandle,[out]          PFILE_OBJECT       *FileObject,[in]           ACCESS_MASK        DesiredAccess,[in]           POBJECT_ATTRIBUTES ObjectAttributes,[out]          PIO_STATUS_BLOCK   IoStatusBlock,[in, optional] PLARGE_INTEGER     AllocationSize,[in]           ULONG              FileAttributes,[in]           ULONG              ShareAccess,[in]           ULONG              CreateDisposition,[in]           ULONG              CreateOptions,[in, optional] PVOID              EaBuffer,[in]           ULONG              EaLength,[in]           ULONG              Flags
);

在这这些参数中, 微软对第二个参数Instance有这样的描述:

[in, optional] Instance
创建请求要发送到的微筛选器驱动程序实例的不透明实例指针。
实例必须附加到文件或目录所在的卷。
此参数是可选的,可以为 NULL。 
如果此参数为 NULL,则请求将发送到卷的文件系统驱动程序堆栈顶部的设备对象。 
如果为非 NULL,则请求仅发送到附加到指定实例下方的微型筛选器驱动程序实例。

这里有一个问题, 假如我们有两个MiniFilter驱动AB, A的高度也就是Altitude是370030, B的高度是180000; 如果在B中调用FltCreateFileEx函数并且第二个参数设置为非 NULL, 这个时候对文件的操作在驱动A中就收不到相关的回调, 因为A的高度比B的高, 所以文件操作的请求发不到A去;
同样的, 在FltWriteFile, FltReadFile等函数中, 也有这种机制:
FltWriteFile
FltReadFile
如果有这样的MiniFilter驱动, 满足了这两个条件:

  1. Altitude比杀软或者EDR的Altitude低;
  2. 存在文件读写的接口;

那我们是不是就可以绕过杀毒软件或者EDR的自保了呢:

Wcifs.sys

在Windows中有一个驱动, 是处理容器相关的, 叫做wcifs.sys:
wcifs
这个驱动注册了MiniFilter, 并且Altitude也比较低, 远远小于常规EDR注册的MiniFilter的高度:
Altitude
在这个驱动中还注册了与应用层之间的通信接口:
FltCreateCommunicationPort
WcPortMessage函数中, MessageCode == 4时, 有一个WcCopyFileHandler函数
WcPortMessage
WcCopyFileHandler函数中利用FltWriteFileFltReadFile实现了一个文件拷贝的功能:
FltWrite
并且文件打开时是用的FltCreateFileEx2函数, 并且Instance参数并不是为NULL:
FltCreateFileEx2
这就导致如果使用wcifs.sys提供的文件拷贝功能, 那么常规的EDR或者杀软的MiniFilter根本就监控不到, 因为wcifs.sys的高度更低, 这就导致我们可以绕过EDR或者杀软的自保;
调用驱动需要的结构体:

struct WcifsPortMessageCopyFileHandler
{/*0*/   DWORD MessageVersionOrCode;/*4*/   DWORD MessageSize;/*8*/   wchar_t InstanceName[50];/*108*/ DWORD InstanceNameLength;/*112*/ DWORD ReparseTag;/*116*/ DWORD OffsetToSourceContainerRootId;/*120*/ DWORD SizeOfSourceContainerRootId;/*124*/ DWORD OffsetToTargetContainerRootId;/*128*/ DWORD SizeOfTargetContainerRootId;/*132*/ DWORD OffsetToSourceFileRelativePath;/*136*/ DWORD SizeOfSourceFileRelativePath;/*140*/ DWORD OffsetToTargetFileRelativePath;/*144*/ DWORD SizeOfTargetFileRelativePath;/*148*/ char UnionData[]; // 2*ContainerRootId + source & target relative paths
};

总结

wcifs.sys是系统自带的, 并且默认就会加载, 所以利用该驱动的接口来拷贝文件对于绕过一些文件过滤驱动是很方便的, 同时作为EDR或者杀软产品也不能绝对的相信自己的MiniFilter可以阻止第三方文件的写入, 应该做一些额外的验证, 确保自保目录的安全;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/249413.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+Vue学科竞赛管理系统

文章目录 基于SpringBootVue学科竞赛管理系统1系统概述1.3系统设计思想 2相关技术2.1 MYSQL数据库2.2 B/S结构2.3 Spring Boot框架简介2.4 Vue简介 3系统分析3.1可行性分析3.1.1技术可行性3.1.2经济可行性3.1.3操作可行性 3.2系统性能分析3.2.1 系统安全性3.2.2 数据完整性 3.4…

【2024】大三寒假再回首:缺乏自我意识是毒药,反思和回顾是解药

2024年初,学习状态回顾 开稿时间:2024-1-23 归家百里去,飘雪送客迟。 搁笔日又久,一顾迷惘时。 我们饱含着过去的习惯,缺乏自我意识是毒药,反思和回顾是解药。 文章目录 2024年初,学习状态回顾一…

虚拟机(VMware)ubuntu16.04 直接连接网口设备 USRP 吊舱

编辑虚拟网络编辑器 点击之后 选择网卡之后,点击确定。 电脑配置 使用了:192.168.2.56 虚拟机内部配置 和PC的配置一致

【Matlab】音频信号分析及FIR滤波处理——凯泽(Kaiser)窗

一、前言 1.1 课题内容: 利用麦克风采集语音信号(人的声音、或乐器声乐),人为加上环境噪声(窄带)分析上述声音信号的频谱,比较两种情况下的差异根据信号的频谱分布,选取合适的滤波器指标(频率指标、衰减指标),设计对应的 FIR 滤波器实现数字滤波,将滤波前、后的声音…

Zoho Mail 2023:回顾过去,展望未来:不断进化的企业级邮箱解决方案

当我们告别又一个非凡的一年时,我们想回顾一下Zoho Mail如何融合传统与创新。我们迎来了成立15周年,这是一个由客户、合作伙伴和我们的敬业团队共同庆祝的里程碑。与我们一起回顾这段旅程,探索定义Zoho Mail历史篇章的敏捷性、精确性和创新性…

Spring 事务原理二

该说些什么呢?一连几天,我都沉溺在孤芳自赏的思维中无法自拔。不知道自己为什么会有这种令人不齿的表现,更不知道这颗定时炸弹何时会将人炸的粉身碎骨。好在儒派宗师曾老夫子“吾日三省吾身”的名言警醒了我。遂潜心自省,溯源头以…

C++初阶入门之命名空间和缺省参数的详细解析

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.前言 二.命名空间 2.1命名冲突的例子 2.2解决方案 2.3命…

MyBatis概述与MyBatis入门程序

MyBatis概述与MyBatis入门程序 一、MyBatis概述二、入门程序1.准备开发环境(1)准备数据库(2)创建一个maven项目 2.编写代码(1)打包方式和引入依赖(2)新建mybatis-config.xml配置⽂件…

node.js(nest.js控制器)学习笔记

nest.js控制器: 控制器负责处理传入请求并向客户端返回响应。 为了创建基本控制器,我们使用类和装饰器。装饰器将类与所需的元数据相关联,并使 Nest 能够创建路由映射(将请求绑定到相应的控制器)。 1.获取get请求传参…

祖传代码里的神逻辑

昨天做权限限制的需求,给自己配置了两个新的分组,然后就发现登录不了项目了,sql报错ORA-01795: maximum number of expressions in a list is 1000,一路debugger找到了元凶,看逻辑是想把两个不同表里的分组去重然后合并…

【CMU-自主导航与规划】M-TARE planner 配置与运行

M-TARE docker M-TARE 源码 一、依赖 Docker, Docker Compose, NVIDIA Container Toolkit, Nvidia GPU Driver(需要至少2个,带Nvidia GPU) 1.1 Docker docker -v #查询版本1.2 Docker Compose docker compose version1.3 …

分布式搜索引擎_学习笔记_3

分布式搜索引擎03 0.学习目标 1.数据聚合 **聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎?这些手机的平均价格、最高价格、最低价格?这些手机每月的销售…

Here Document免交互和Expect

文章目录 Here Document免交互和Expect自动化交互一、Here Document—免交互1、Here Document 免交互概述2、语法格式3、免交互的用法3.1 cat命令3.2 tee命令3.3 wc命令3.4 read命令3.5 passwd命令 4、Here Document 变量设定 二、Expect自动化交互1、expect基本使用1.1 脚本解…

【Linux】Linux基本指令

目录 1.ls指令 2.cd指令 3.touch指令 4.mkdir指令 5.rmdir指令和rm指令 5.1rmdir指令 5.2rm指令 6.man指令 7.cp指令 8.mv指令 9.cat指令 10.more指令 && less指令 10.1more指令 10.2less指令 11.head指令 && tail指令 11.1head指令 11.2tai…

【数学】【记忆化搜索 】【动态规划】964. 表示数字的最少运算符

作者推荐 【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数 本文涉及知识点 动态规划汇总 数学 记忆化搜索 LeetCoce964表示数字的最少运算符 给定一个正整数 x,我们将会写出一个形如 x (op1) x (op2) x (op3) x … 的表达式,其中每…

自动保存知乎上点赞的内容至本地

背景:知乎上常有非常精彩的回答/文章,必须要点赞收藏,日后回想起该回答/文章时翻看自己的动态和收藏夹却怎么也找不到,即使之前保存了链接网络不好也打不开了(。所以我一般碰到好的回答/文章都会想办法保存它的离线版本…

mac安装mysql的8.0设置面板启动不了

1、前言 记得之前安装mysql5.7的时候,是可以直接从设置里面的mysql面板启动的,但是到了mysql8.0之后就启动不了了,这个问题不知道是版本问题还是我换了m系列芯片的mysql导致的,之前很多次都启动不了,这次搞了下&#x…

2024年1月份实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先,来看下效果图 在线体验地址:https://geojson.hxkj.vip,并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

字觅网“正式上线登陆中国大陆,助力全球用户畅享正版字体服务

在中国上海,专注于提供正版字体授权服务的平台"字觅网"正式宣布在中国大陆上线,为全球用户提供更广泛、更便捷的正版字体选择。 "字觅网"以致力于推动正版字体服务为核心,通过深度合作,汇聚了众多国内知名字库,包括汉标字库、上首字库、汉呈字库、名家字库…

防火墙详解

一、基本定义 所谓“防火墙”是指一种将内部网和公众访问网(如Internet)分开的方法,它实际上是一种建立在现代通信网络技术和信息安全技术基础上的应用性安全技术,隔离技术。越来越多地应用于专用网络与公用网络的互联环境之中&a…