谈谈监控主机的“Hook链”问题

简介:
操作系统是通过消息传递驱动各种事件动作的,要想监控系统内的动态,发现黑客的入侵行为,需要对非常多的“重要操作”进行监控,比如:权限的变更、进程的创建与被杀、网络连接的变化、文件的读写、注册表的变化、驱动程序的加载、远程线程注入等等。
如何实现这些系统行为的监控呢?就是在这些动作程序被执行前,插入自己的一段程序代码,检查驱动程序的消息是从哪里来的,若跟自己无关,就交给原来的程序去执行,若关乎自己,则越俎代庖,先执行自己的动作,再看情况是否交给原来的程序,还是直接返回。这个过程就是我们常说的Hook
Hook的中文翻译是“钩子”, 其技术品种算起来很多,如IAT hookEAT hookSSDT hookShadow SSDT hookIDT hookIRP hookSPI hookTDI hookNDIS hookinline hook等。Hook监控功能很强大,比如木马记录你的键盘输入,就可盗取你的账户与密码。
操作系统为了安全起见分为不同的权限级别,常见的区分为用户模式与内核模式(Windows),两者之间通过系统服务描述表(SSDT)进行通讯,能进入系统内核模式,就意味着使用系统高级权限,所以SSDT Hook是很多杀毒与监控软件的选择。SSDT就是一张驱动程序的记录表,表中记录着要执行驱动程序所在位置的指针,Hook就是把这些指针先保留起来,再在表中填写上自己驱动程序的地址,从而获得优先执行权限。
如何挂钩子不是本文的重点,本文讨论的是某一个点上挂了很多钩子的情况下,会产生的一些安全问题。
 
问题提出:
下图是用户实现操作的调用过程:用户程序需要创建进程时,通过SSDT某位置的函数指针,找到系统驱动程序的物理位置。
当我们要监控这个创建动作时,就在函数调用表中挂上一个钩子。若还有其他的应用程序也想要监控这个动作时,又在这里挂上钩子。注意此时的钩子是挂在前一个钩子上的,由于挂钩子的时候,看到的地址指针,不知道是原始驱动程序的地址,还是别人的钩子地址,一般就直接挂上。如此下去最终形成一个如图的“钩子链”。
显然这个钩子链是倒序的,也就是说后来的监控者占据了调用表的地址空间。这就意味着后挂的钩子程序会先得到执行的权利,从安全的角度来讲,这显然是有问题的。
1、   后挂钩者的优先:
a)          后挂钩者先得到执行权,则可以屏蔽对自己的不利消息,让先挂钩的监控者得不到这个消息;
b)          后挂钩者可以在挂钩时,不管此处原来是否有钩子,直接替换为自己的驱动程序地址,并完全包含原有驱动程序的功能,不再调用原来的程序,达到类似rootkit入侵的效果;
2、   先挂钩者的反击:先挂钩子者意味着先启动自己,建立好监控进程,当发现后来者摘掉自己的钩子时,可以采取下面动作:
a)          立即报警,自己的监控可能要失效,通知管理员“有人在搞破坏”;
b)          重启自己的挂钩子程序,把自己的钩子重新挂上,保证自己才是钩子链的起始点;
c)          摘掉破坏者的钩子,保持自己的监控“垄断地位”;
当系统中有两个程序都有上述机制时,系统就“崩溃”了。比如我们同时安装两个病毒查杀软件,就有可能出现了“冲突而死机”的现象。
 
安全思考:
钩子是系统监控最常用的手段,我们能监控到系统内的动态变化时,会有安全感;而我们能确定没有人能偷偷监控我时,我们才不会有恐惧感。因此,能把钩子链可视化地展现出来,是安全上的需求。对于开源的Linux,可以修改内核驱动;但对于不开源Windows,就只能利用微软提供的接口函数,对内核的操作是很有限的。
要解决的问题很多,我这里列出了一些,希望能有好的解决办法:
1、   挂钩子时,如何确认我的前边是否为原始的系统驱动程序?
看到的只是程序的内存地址。有一个方法是,因为我知道这个点具体驱动是什么,可以查找对应DLL的内存基地址,从而计算出正确的函数地址,与这里进行比较是否正确。如果还要确定这个被调入内存的DLL是否被篡改过,还需要对其磁盘上的文件进行校验,如MD5码校验
2、   如果前面已经是别人的钩子,我想确定它是谁引入的,DLL是谁,主程序是谁?
希望有好的办法
3、   当我前边不只有一个钩子时,我想画出这个钩子链每个节点的属主图?
希望有好的办法
4、   当后边来的进行挂钩子时,或来摘我的钩子时,我是否可以直接拒绝它的动作?
重新启动挂钩进程是没有办法的办法,希望有更好的办法
5、   可以用来挂钩子的技术方法究竟有多少种?
希望有好的办法
6、   需要监控的挂钩子点究竟有多少个,多少个是对系统安全造成威胁的?
需要经验值,希望有好的办法
 
    钩子是驱动程序开发发展来的技术,成为安全常用手段。本文只是从需求的角度起个头,欢迎爱好的同学一起探




本文转自 zhaisj 51CTO博客,原文链接:http://blog.51cto.com/zhaisj/806081,如需转载请自行联系原作者
目录
相关文章
|
存储 监控 Java
一篇文章带你搞懂SkyWalking调用链追踪框架
介绍了Skywalking的作用,安装方法,架构设计等等
一篇文章带你搞懂SkyWalking调用链追踪框架
|
25天前
|
存储 安全 Java
JVM工作原理与实战(六):类的生命周期-连接阶段
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了类的生命周期、类的连接阶段等内容。
30 4
|
6月前
|
存储 监控 Cloud Native
剖析Linux网络包接收过程:掌握数据如何被捕获和分发的全过程(上)
剖析Linux网络包接收过程:掌握数据如何被捕获和分发的全过程
|
6月前
|
存储 网络协议 Linux
剖析Linux网络包接收过程:掌握数据如何被捕获和分发的全过程(下)
剖析Linux网络包接收过程:掌握数据如何被捕获和分发的全过程
|
8月前
|
安全 编译器
4.1 应用层Hook挂钩原理分析
InlineHook 是一种计算机安全编程技术,其原理是在计算机程序执行期间进行拦截、修改、增强现有函数功能。它使用钩子函数(也可以称为回调函数)来截获程序执行的各种事件,并在事件发生前或后进行自定义处理,从而控制或增强程序行为。Hook技术常被用于系统加速、功能增强、等领域。本章将重点讲解Hook是如何实现的,并手动封装实现自己的Hook挂钩模板。
82 0
|
12月前
|
JavaScript 前端开发 中间件
谈谈复杂应用的状态管理(上):为什么是 Zustand
谈谈复杂应用的状态管理(上):为什么是 Zustand
661 0
|
Android开发
《Android内存泄漏自动化链路分析组件Probe》电子版地址
Android内存泄漏自动化链路分析组件Probe
66 0
《Android内存泄漏自动化链路分析组件Probe》电子版地址
|
Android开发
《Android内存泄漏自动化链路分析组件--Probe》电子版地址
Android内存泄漏自动化链路分析组件--Probe
58 0
《Android内存泄漏自动化链路分析组件--Probe》电子版地址
|
移动开发 JSON 小程序
动态路由 TheRouter 的设计与实践
这篇文章是我在 2022【[GIAC 全球互联网架构大会](https://giac.msup.com.cn/2022sh/course?id=16425)】分享时所讲内容的文字版本,修改删减了演讲时的冗余言语,现开放给大家阅读,希望能给买不到票参加分享的 开源实验室 读者带来帮助。
157 0
EMQ
|
消息中间件 运维 监控
新增桥接连接状态监控、重构日志系统
9 月,NanoMQ 0.12.1版本发布带来丰富更新:桥接功能新增上下线事件和连接状态监控能力;原有的日志系统重构升级;配置文件简化。
EMQ
110 0
新增桥接连接状态监控、重构日志系统