2026/5/21 12:10:49
网站建设
项目流程
不相关的网站做单项链接可以吗,这个网站中有网名做会计的吗 了解一下,地方宣传网站建设的必要性,推广网页在上篇文章中#xff0c;我们剖析了用户态Rootkit的种种手法#xff0c;它们如同在操作系统的“外部广场”上进行伪装和欺骗。尽管手段多样#xff0c;但其隐蔽性终究受限于用户空间的环境#xff0c;细心的守护者总能通过多种方法发现端倪。
但此刻#xff0c;我们将要推…在上篇文章中我们剖析了用户态Rootkit的种种手法它们如同在操作系统的“外部广场”上进行伪装和欺骗。尽管手段多样但其隐蔽性终究受限于用户空间的环境细心的守护者总能通过多种方法发现端倪。但此刻我们将要推开一扇通往Linux系统核心深处的大门。在这里Rootkit不再仅仅是“欺骗”监控工具而是直接劫持了监控系统本身可以修改系统最底层的逻辑具备更强的隐蔽性和控制能力。本系列思维导图下面我们将分析LKM Rootkit、eBPF Rootkit等内核态Rootkit手法并简要讨论对应的检测思路。一、LKM Rootkit1. 系统调用表劫持通过修改系统调用表中的系统调用函数地址来劫持系统调用。以diamorphine.ko链接https://github.com/m0nad/Diamorphine为例下图展示了其修改系统调用表中getdents()、getdents64()、kill()三个系统调用函数地址的逻辑。下图分析了其HOOK kill系统调用函数实现隐藏进程的关键代码逻辑。检测思路内核模块名特征匹配若恶意内核模块隐藏是通过删除内核模块链表结点实现使得lsmod命令不可枚举那么可以通过/sys/module/目录对比查找出隐藏的内核模块查看dmesg内核环缓冲区日志过滤module关键字提取出加载模块可通过内核模块名特征匹配或 /sys/module/目录比对隐藏模块发现恶意内核模块使用rootkit扫描工具如chkrootkit、rkhunter通过编写自定义内核模块打印系统调用表中所有系统调用函数实际地址和名称其中地址与其它函数差异大或地址与通过/boot/system.map-$(uname -r)符号地址计算出的不一致即“可疑函数实际地址! (正常函数实际地址-正常函数符号地址)可疑函数符号地址”的系统调用函数可能已经被劫持通过检查/proc/kallsyms内容如根据kallsyms获取sys_call_table实际地址编写内核模块从内存读取系统调用表中可疑系统调用号对应的指针反查kallsyms获取该指针地址对应的函数名若不是正常的系统调用函数名则可能已经被劫持。2. VFS劫持VFSVirtual File System虚拟文件系统是类Unix操作系统内核的关键组成部分它作为操作系统内核中的一个抽象层为上层应用和内核自身提供统一的文件操作接口如open、read、write等并屏蔽了各种底层实际文件系统如ext4、nfs等的差异。可通过修改VFS接口函数指针的方式HOOK指定接口函数针对内存文件系统和虚拟文件系统如tmpfs、procfs也可通过HOOK simple_dir_operations结构中文件遍历接口函数指针或篡改VFS目录项包含目录和文件结构的子目录/文件链表即将指定目录或文件从对应的链表中脱链实现隐藏。低版本内核一般HOOK readdir接口函数和篡改dentry-d_child链表高版本内核一般HOOK iterate/iterate_shared接口函数和篡改parent-d_subdirs链表。以adore-ng.ko链接https://github.com/yaoyumeng/adore-ng为例下图展示了其修改接口函数readdir()、iterate()函数指针的关键代码逻辑。恶意的adore_root_readdir和adore_root_iterate最终调用adore_root_filldir下图分析了其HOOK iterate接口函数实现隐藏文件的关键代码逻辑。检测思路除了内核模块名特征匹配、/sys/module/查找隐藏内核模块、查看dmesg日志、使用rootkit扫描工具等通用检测方法还可以通过编写自定义内核模块进行VFS接口函数指针校验和dentry/inode完整性检查。通过遍历VFS相关结构如file_operations获取这些对象的*operations如file-f_op结构体指针进而获取实际的接口函数指针判断指针指向地址是否处于合法空间可与其它接口函数指针、/boot/system.map、未入侵类似系统对应的接口函数指针比对进行指针校验。通过遍历可疑目录磁盘inode表或内存中的dentry/inode链表与用户空间系统命令查询的结果比对进行完整性检查。另外编写自定义内核模块检查/proc/和内存中task_struct链表实际内容是否匹配可帮助排查内核级隐藏进程。3. 利用Ftrace追踪FtraceFunction Tracer是Linux内核中的内置跟踪框架提供了用于收集和分析内核行为和性能的不同类型的运行时信息的工具和基础设施旨在帮助开发人员和系统设计人员定位内核内部发生的情况。Ftrace允许注册回调可在内核导出函数入口自动运行指定的回调这些回调不但可用于监控、实时打补丁也可用于HOOK。这种无侵入式的HOOK隐蔽性高于上面两种传统的HOOK。以ftrace_hook.ko链接https://github.com/ilammy/ftrace-hook为例下图展示了其添加回调HOOK clone()和execve()函数的关键代码逻辑。以其中HOOK sys_execve系统调用为例下图分析了HOOK跳转至的恶意函数fh_sys_execve的实现逻辑。下图分析了Ftrace回调函数fh_ftrace_thunk的实现逻辑。需要注意的是fh_sys_execve实际上调用原生的sys_execve而调用sys_execve又会触发Ftrace回调跳转到fh_sys_execve目前处理这种递归调用的方式有两种一种是依赖新编译器选项在内核函数入口插入的mcount插桩点指令直接跳过后续Ftrace回调另一种是Ftrace回调检查调用是否来自当前模块如果不是才调用恶意函数。检测思路除了内核模块名特征匹配、/sys/module/查找隐藏内核模块、查看dmesg日志、使用rootkit扫描工具等通用检测方法加上基于rootkit运行效果的检测方法如对比系统关键数据结构存储的和系统工具查询的结果检测是否有隐藏文件、隐藏进程、隐藏端口、隐藏网络连接等还能够通过编写自定义内核模块查找所有注册的Ftrace回调判断是否来自可信内核模块或者检查ftrace_set_filter_ip设置的过滤表结构判断是否只包含合法的追踪目标还能够进行基于动态行为的分析如沙箱检测、基于Kprobes和eBPF技术监控内核函数行为如监控内核模块加载、文件创建等再通过行为规则匹配的方式发现系统中可能存在的rootkit。4. 利用Kprobes“探针”KprobeKernel Probe内核探针是Linux内核提供的一种动态调试和追踪机制相当于内核级别的“断点”或“调试钩子”允许开发者在无需修改和重启内核的情况下动态地在特定内核地址/指令/函数插入自定义代码旨在用于内核调试、性能分析、安全取证等场景。相比于Ftrace它的插桩点更丰富灵活但性能和稳定性略低可能导致内核崩溃。因其无侵入式动态插桩、插桩点灵活的特性已被广泛应用于rootkit。以reptile.ko链接https://github.com/f0rb1dd3n/Reptile为例Reptile引入了两个开源项目分别是KHOOK内核函数HOOK引擎链接https://github.com/milabs/khook和Matryoshka内核模块加载器链接https://github.com/milabs/kmatryoshkareptile.ko不直接作为LKM而是由加载器解密包含在数据段中的内核模块后然后使用sys_init_module系统调用加载下图展示了加载LKM的关键代码逻辑其中用到了Kprobes技术绕过符号解析限制。Reptile通过注册kprobe/kretprobe并将symbol_name设置为目标内核函数、将pre_handler/ post_handler/fault_handler等设置为恶意回调函数的方式实现HOOK包括HOOK ip_rcv()实现端口敲门HOOK fillonedir()、filldir()、filldir64()等实现文件/目录隐藏HOOK find_task_by_vpid()、vfs_statx()、next_tgid()、load_elf_binary()等实现进程隐藏HOOK tcp4_seq_show() 、udp4_seq_show()实现网络连接隐藏HOOK vfs_read()实现文件内容隐藏的功能。下图分析了文件/目录隐藏的逻辑。检测思路除了之前提到的一些基于运行效果的检测方法、动态行为分析检测方法、静态特征扫描方法、系统关键数据结构完整性检测方法、基于日志进行检测针对Kprobes Rootkit还可以通过/sys/kernel/debug/kprobes/list检查已注册的kprobes/kretprobes列表及其属性信息是否异常或者遍历内核中kprobe_table数据表该数据结构维护已注册的kprobes信息查看这些信息kprobes数量、目标函数、回调函数指针、结合回调函数指针和kallsyms获取的回调函数名等是否异常或者借助现有的内核完整性检测工具LKRG、内存取证工具LiMEVolatility查看是否有异常kprobe注册也可利用eBPF技术监控register_kprobe/ register_kretprobe或其它相关内核函数和结构体观察是否有异常变化。二、eBPF RootkiteBPFextended Berkeley Packet Filter扩展伯克利数据包过滤器是Linux内核中用于高效、安全执行 “沙箱程序小型、受限的虚拟机字节码程序”的通用基础设施用户空间将写好的eBPF程序编译成字节码加载到内核经内核校验合法的eBPF程序可动态HOOK到下图所示的多种HOOK点如系统调用、Kprobes、Uprobes、内核tracepoint、网络包处理、性能事件、cgroup hook、LSM hook等。相比于KprobeseBPF更隐蔽非LKM、非明显Kprobes表、少有日志记录、加载命令可混淆更稳定校验器保护更灵活HOOK点多、内核提供多种eBPF辅助函数、加载程序不受handler逻辑限制已被越来越多地用于实现rootkit。以隐藏指定进程pid的eBPF程序链接https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/24-hide为例下图展示了嵌入内核部分的隐藏进程的关键代码逻辑。利用eBPF技术动态HOOK到不同HOOK点可以实现各种不同的隐藏和攻击效果。例如HOOK kill/waitpid/pidfd_open等以pid入参的系统调用实现rootkit进程隐藏或免杀HOOK bpf系统调用和kprobe/bpf_map_new_fd实现rootkit bpf组件隐藏HOOK vfs_open/vfs_read/sys_getdents64实现隐藏或篡改文件如隐藏恶意文件、篡改ssh auth_keys、篡改/etc/passwd、篡改计划任务等、篡改/dev/kmsg日志达到持久化或规避检测目的HOOK uprobe/md5_crypt_verify绕过数据库认证达到持久化连接数据库目的HOOK XDP ingress/ ingress_dispatch/http_action劫持并篡改HTTP请求在执行恶意C2指令后替换请求为正常心跳包请求达到隐蔽地执行C2命令若进一步HOOK XDP egress劫持并篡改HTTP返回为执行信息收集指令的结果则可达到隐蔽地进行数据渗漏的目的由于Kprobes和tracepoint不受cgroups和命名空间的限制因此还可用ebpf HOOK它们提供的挂钩点进行容器逃逸可通过HOOK read系统调用劫持并篡改pipe中内容达到跨容器执行恶意指令的目的可通过HOOK uprobe/ParseNormalizedNamed将Pause容器镜像替换为恶意容器镜像达到打破资源隔离的目的。可参考项目https://github.com/Gui774ume/ebpfkit、https://github.com/pathtofile/bad-bpf检测思路若eBPF rootkit进程本身未被隐藏则直接对进程参数进行特征匹配检测查看是否存在指定pid、文件名或端口等特征如sudo ./pidtest -p 23408对这类可疑进程进一步确认是否业务或系统管理需要执行的正常进程这种方式易误报利用工具bpftool、bcc或/proc、/sys接口或监控bpf系统调用枚举系统已加载的所有eBPF程序查看是否有可疑的但对于带隐藏自身功能的eBPF失效静态分析所有eBPF字节码检查目标调用的HOOK点搜索敏感eBPF helper调用及参数特征监控eBPF活动并观察是否可疑包括审计bpf系统调用审计eBPF内核辅助函数调用高版本内核还能够编写eBPF LSM hook进行监控利用ebpfkit-monitor工具链接https://github.com/Gui774ume/ebpfkit-monitor该工具可静态分析eBPF字节码或在运行时监控可疑的eBPF活动但该工具仅针对ebpfkit。总结本系列通过介绍Linux系统中常见的Rootkit手法及其检测思路不难发现随着技术的不断发展Linux Rootkit的实现方式日益多样、隐蔽性和对抗性持续增强给安全检测与防御工作带来了新的挑战。应对这一趋势检测手法也需要不断创新和升级结合静态分析、动态监测、多层防护等多维度方法才能有效提升对新型Rootkit的检测与防护能力保障系统安全。