1.通过Linux内核协议栈netfilter拦截数据报文
2.Linux下使用Netfilter框架编写内核模块
3.应用层加密与内核级加密有什么不同?
4.linux Netfilter在网络层的内核实现详细分析(iptables)
5.『网络安全科普』Windows安全之HOOK技术机制
6.剖析InfinityHook原理 掀起一场更激烈的攻与防恶战
通过Linux内核协议栈netfilter拦截数据报文
通过内核模块的方式向netfilter框架注册钩子函数,实现简单的码内数据包转发调试,当有数据包经过Linux协议栈时,内核打印相关信息。码内目的内核在于熟悉netfilter框架的基础api,为后续开发防火墙等功能做准备。码内processing源码
netfilter简介:netfilter是内核由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,码内可实现安全策略应用中的内核许多功能,如数据包过滤、码内数据包处理、内核地址伪装、码内透明代理、内核动态网络地址转换(Network Address Translation,码内NAT),内核以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。
网卡转发包流程:以下为网口收包到转发的流程,NF_HOOK位置为netfilter钩子。
netfilter框架流程:netfilter是Linux协议栈的一个子系统,用于数据报文的过滤。在路由器设备中,数据报文的来源和去向有很多场景。比如转发数据、本地发出的数据、访问设备本身的数据等,可以通过下图简单了解基本流程。
netfilter钩子注册:netfilter为通用的框架,Linux系统已经内建了常用的钩子。netfilter和iptables命令时密切相关的,iptables命令的最终实现是基于netfilter,比如filter表、nat表、mangle表的疫情日报系统源码各个链的实现,都在netfilter源码中找到具体实现,这里就不一一讲解。
netfilter外部接口:我们可以通过以下接口注册和卸载钩子函数,在钩子函数中可以将数据报文解析出来进行处理,比如过滤。
接口列表注册结构体定义结构体参数说明hooknum可配置的值priority可配置的值:priority可以配置任意整数的,因为系统有默认的钩子,定义了一些参考值,我们开发过程中一般在系统priority的基础上进行加减操作,用于标记自己加入钩子的位置以下为系统定义的优先级。
下面我们写一个实例,通过打印数据包信息,看看数据包的走向 代码中,我们定义hook_ops数组,包含3个钩子实体 forward_hook、forward_hook2、local_in_hook,其中前两个为forward钩子,但挂载的优先级不一样,我们可以通过打印看到,优先级情况,而local_in_hook为访问设备本身的数据,通过ip地址我们可以很方便查看是否是我们想要的结果。
钩子实例ops注册实例编译运行:环境 代码:OpenWrt . 或其他版本OpenWrt分支版本,linux内核5.4.xx版本 编译环境: ubuntu 运行环境: OpenWrt系统(内核版本和编译模块版本一致) 编译 将源码包拷贝到OpenWrt package目录,make menuconfig选择kmod-netfilter_hook并保存。
编译完成后会在build_dir子目录生成netfilter_hook.ko文件,将该文件通过winscp工具传输到OpenWrt开发板(路由器)中 然后执行以下命令:
保证开发板能够通过wan口连接外网,并接入一台pc到lan口,pc分别访问设备和外网。
测试结果开源作品:github.com/destan/Ope...
Linux下使用Netfilter框架编写内核模块
上篇文章我们从内核源码的角度分析Linux Netfilter框架下,hook钩子是如何被执行的,这次我们将通过一个示例代码,详细讲解如何利用Netfilter框架编写内核模块。扫雷定制源码大全
为了更好地理解,我绘制了一张图,通过源码中的具体实例,展示了自定义的钩子函数在内核中的位置。在内核中,有一个全局变量net_namespace_list链表,系统中所有的网络命名空间都挂载在这个链表上。系统默认的网络命名空间是init_net,内核启动时,会在初始化网络命名空间net_ns_init中调用setup_net将init_net挂在net_namespace_list链表上。当我们新增hook钩子时,通常都是将其挂载在net_namespace_list链表对应的网络命名空间上。
接下来,我们将开始编写一个基于netfilter框架的简单内核模块。首先,我们需要声明一个hook函数,然后定义一个nf_hook_ops。
①我们在IP层(网络层)对网络包进行处理,这里.pf = NFPROTO_INET;
②hook点在PREROUTING链上,这里.hooknum = NF_INET_PRE_ROUTING;
③hook函数在此链上执行的优先级设置为最高,即.priority = NF_IP_PRI_FIRST;
④设置hook函数为我们前面自定义的函数,即.hook = (nf_hookfn *)packet_filter。
然后,我们需要在内核模块的init函数中注册该nf_hook_ops。
接下来是自定义的hook函数的具体实现。在hook函数中,我们只需简单地打印出源、目的IP和端口信息。
最后,我们需要注销自定义的hook钩子,并在内核模块退出时完成这一操作。
在编写Makefile、所需的头文件、编译并插入模块之后,触动消消乐源码我们可以在系统日志中看到相关输出。
在测试完成后,别忘了卸载内核模块,以完成整个操作。
至此,我们的内核模块编写任务就完成了。
应用层加密与内核级加密有什么不同?
透明加解密技术是近年来针对企业文件保密需求应运而生的一种文件加密技术。所谓透明,是指对使用者来说是不可见的。当使用者在打开或编辑指定文件时,系统将自动对未加密的文件进行加密,对已加密的文件自动解密。文件在硬盘上是密文,在内存中是明文。一旦离开使用环境,由于应用程序无法获得自动解密的服务而无法打开,从而起到保护文件内容的效果。
透明加解密技术是与操作系统紧密结合的一种技术,它工作于操作系统底层,从技术角度看,可分为内核级加密和应用级加密两类。内核级通常采用文件过滤驱动技术,应用级通常采用 API HOOK(俗称钩子)技术,其基本原理都是要接管文件 IO(读写)操作,通过监视涉密进程(受保护程序)的磁盘读写,对保密文档进行动态的加密和解密。由于这些操作都在底层自动完成,除了速度可能稍有降低外,用户在使用方式上与平时没有差异。
个别基于内核级开发的产品厂商喜欢向用户宣称,用文件系统过滤驱动来实现透明加解密更加底层,安全性自然也最强。事实上,他们忽略了一个基本的同花顺追击指标源码原则——加密应尽可能早,解密应尽可能晚。只有当应用程序刚产生机密数据的时候就立即加密,而直到应用程序需要使用数据的前一刻才解密它,才能最大程度地降低机密信息被中途截取的可能。一味地追求底层,恰恰与以上原则背道而驰。
这里并不打算让大家相信产品完全工作在应用层才最安全,只是想让大家明白,透明加解密产品的安全性并非完全体现在产品基于内核级或应用级开发。客观地说,基于内核级与应用级的文件 IO 接管、对象访问控制等工作,在原理上并无本质不同,都属于广义的 HOOK 技术。由于内核级代码工作在驱动层,相对应用级代码更难于被恶意用户绕过,所以用于访问控制与自我保护的效果优于应用级。但另一方面,由于内核级代码工作在系统最底层,代码中稍有疏忽必将导致系统蓝屏和文件损坏,甚至其他应用软件的“不规范”操作也可能导致透明加解密产品的内核代码崩溃,稳定性与兼容性远不及应用级代码。这些特性迫使内核级开发人员必须尽可能保持代码的“简洁”,逻辑复杂一点、功能细致一点,开发与调试的难度都会成倍增长。我们针对竞争对手的产品测试结果也从侧面证明了以上观点:某内核级加解密产品对受保护程序的验证依据,仅仅是可执行程序的文件名。用户只要把任意一个网络程序改名为 Office 执行程序名,就可以将加密文档解密外发了。这样的透明加解密产品虽然完全工作在内核级,但是有安全性可言吗?
综合以上原因,铁卷产品采用了内核级与应用级技术相结合的实现方案:
1、加解密模块采用应用级 API HOOK 技术,在受保护程序读写文件的过程中,确保加密时机最早而解密时机最晚,最大限度缩短明文信息在内存中的可访问路径。同时强化各项验证的判断处理,降低程序实现的复杂性,避免纯驱动级文件透明加解密的实现方案中,可能由于任何细节处理不当而导致系统蓝屏、文件损坏的现象发生。
2、加解密模块在设计上不可拆分,若应用层 HOOK 模块被以任何方式摘除,则加解密功能同时失效,无法单独绕过加密流程。由此可保证受保护程序永远遵循以下规则:若能读取加密文档,则产生的所有文档均强制被加密;若产生的文档不加密,则无法读取任何被加密的文档。
3、访问控制及自我保护模块工作在内核级,确保控制、防护机制难以被上层程序绕过。
linux Netfilter在网络层的实现详细分析(iptables)
Linux netfilter在网络层的实现细节分析主要基于Linux内核版本4..0-。
我绘制了一张Linux内核协议栈网络层netfilter(iptables)的全景图,其中包含了许多内容,以下将详细讲解。
INGRESS入口钩子是在Linux内核4.2中引入的。与其他netfilter钩子不同,入口钩子附加到特定的网络接口。可以使用带有ingress钩子的nftables来实施非常早期的过滤策略,甚至在prerouting之前生效。请注意,在这个非常早期的阶段,碎片化的数据报尚未重新组装,例如匹配ip saddr和daddr适用于所有ip数据包,但匹配传输层的头部(如udp dport)仅适用于未分段的数据包或第一个片段,因此入口钩子提供了一种替代tc入口过滤的方法,但仍需tc进行流量整形。
Netfilter/iptables由table、chain和规则组成。
iptables的链(chain)
netfilter在网络层安装了5个钩子,对应5个链,还可以通过编写内核模块来扩展这些链的功能。
⑴五个链(chain)及对应钩子
以下是网络层五条链的位置图:
①网络数据包的三种流转路径
②源码中网络层的5个hook的定义
include\uapi\linux etfilter_ipv4.h
在include\uapi\linux etfilter.h中有对应的hook点定义:
注:在4.2及以上版本内核中又增加了一个hook点NF_NETDEV_INGRESS:
为NFPROTO_INET系列添加了NF_INET_INGRESS伪钩子。这是将这个新钩子映射到现有的NFPROTO_NETDEV和NF_NETDEV_INGRESS钩子。该钩子不保证数据包仅是inet,用户必须明确过滤掉非ip流量。这种基础结构使得在nf_tables中支持这个新钩子变得更容易。
iptables的表
⑴五张表(table)
以下是五张表分布在对应链上的图:
相关视频推荐
免费学习地址:Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)
需要C/C++ Linux服务器架构师学习资料加qun 获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享
⑵源码中IP层的表的定义
netfilter中的表的定义
include\linux etfilter\x_tables.h
网络层各hook点的优先级
数值越低优先级越高:
include\uapi\linux etfilter_ipv4.h
下面我们看下netfilter/iptables的这几张表在内核源码中的定义。
①raw表
源码里RAW_VALID_HOOKS宏可以看出raw表只有NF_INET_PRE_ROUTING、NF_INET_LOCAL_OUT链有效。
②mangle表
源码中valid_hooks参数可以看出mangle表对NF_INET_PRE_ROUTING、NF_INET_LOCAL_IN、NF_INET_FORWARD、NF_INET_LOCAL_OUT、NF_INET_POST_ROUTING五条链都有效。
③nat表
valid_hooks变量可以看出nat表只有NF_INET_PRE_ROUTING、NF_INET_POST_ROUTING、NF_INET_LOCAL_OUT、NF_INET_LOCAL_IN四条链有效。
④filter表
源码中valid_hooks参数可以看出filter表对NF_INET_LOCAL_IN、NF_INET_FORWARD、NF_INET_LOCAL_OUT三条链有效。
网络层的五张表在内核中对应了五个内核模块:
3、Netfilter在网络层安装的5个hook点
下面我们看下网络层的各个hook点安装的位置:
⑴、NF_INET_PRE_ROUTING
它是所有传入数据包到达的第一个hook点,它是在路由子系统中执行查找之前。这个钩子在IPv4的ip_rcv()方法中,在IPv6的ipv6_rcv()方法中。
①net\ipv4\ip_input.c
②net\ipv4\xfrm4_input.c
⑵、NF_INET_LOCAL_IN
这个钩子在IPv4的ip_local_deliver()方法中,在IPv6的ip6_input()方法中。所有路由到本地主机的数据包都会到达此hook点,它是在首先通过NF_INET_PRE_ROUTING hook点并在路由子系统中执行查找之后进到这里。
net\ipv4\ip_input.c
⑶、NF_INET_FORWARD
①net\ipv4\ip_forward.c
②net\ipv4\ipmr.c
⑷、NF_INET_LOCAL_OUT
①net\ipv4\ip_output.c
②net\ipv4\raw.c
⑸、NF_INET_POST_ROUTING
net\ipv4\ip_output.c
以上我们看到xfrm中也有安装相关hook点,这里引用官方资料介绍下什么是xfrm:
xfrm是IP层的一个框架,用于封装实现IPSec协议。
简单来说,xfrm就是IP层的一个框架,用于封装实现IPSec协议。
到此,我们基于源码分析介绍完了Netfilter在网络层的实现。
『网络安全科普』Windows安全之HOOK技术机制
Windows系统基于事件驱动机制,事件通过消息形式传递,每个进程维护着自己的消息队列。Windows消息机制允许程序进行HOOK,这是一种干预系统运行过程的消息处理方式。当事件发生时,消息会被转化为Windows消息并加入进程的消息队列,然后通过消息循环接收。HOOK技术允许用户在消息传递给应用程序前进行特殊处理,如调试追踪。
Windows的HOOK技术分为局部(线程本地)和全局(系统级),以及应用层和内核层。SetWindowsHookEx等函数是实现HOOK的主要途径,如Inline Hook通过修改内存地址实现,SetWindowsHookEx则用于消息Hook,全局钩子可能导致DLL自动加载到目标进程中。此外,还有调试HOOK、SSDT Hook(内核级)和DLL注入等应用场景。
HOOK技术并非仅与恶意软件有关,它在安全领域也有广泛应用,例如在防病毒、系统监控中用于检测和阻止恶意行为。早期安全防护依赖于HOOK关键系统函数,而Win 引入的Secure ETW通道减少了对内核HOOK的需求。尽管HOOK技术逐渐淡出公众视野,但其在历史中的重要性和经典性不容忽视,值得深入研究。
剖析InfinityHook原理 掀起一场更激烈的攻与防恶战
在现代操作系统中,Hook技术的应用面临着诸多限制,如Win的PatchGuard。然而,一种名为InfinityHook的创新技术挑战了这一现状,它能够在系统调用、内核事件等方面实现更底层的Hook,与PatchGuard共存且隐蔽性更强。这场攻防战的核心在于谁能先掌握对内核的Hook优势,而InfinityHook似乎打破了微软的保护壁垒。
深入理解InfinityHook,首先需了解Windows的Event Tracing(ETW)机制,它是内核级跟踪工具,允许在生产环境中进行详细跟踪。ETW由控制器、提供者和消费者三个组件构成,其中控制器定义跟踪配置,提供者生成事件,消费者接收并处理这些事件。InfinityHook利用了ETW的某些特性,尤其是在Ring0层的操作。
逆向分析StartTrace API的内部实现揭示了InfinityHook的关键。通过填充特定的结构体和调用NtTraceControl API,可以在Ring0层启动事件跟踪会话。然后,InfinityHook通过自定义的结构体和填充规则,实现了对Syscall中的NtOpenProcess等操作的拦截和修改,利用了GetCpuClock函数的ClientContext成员。
整个执行流程包括启动和更新CKCL事件跟踪会话,获取内核全局地址,以及对SyscallEntry的定位和修改。尽管InfinityHook可能面临微软后续的修复,但当前它为攻防战带来了新的动态,展现了技术对抗中的攻守平衡。