利用eBPF+LSM实现内核级零侵扰HIDS(主机入侵检测系统)
摘要传统的 HIDS主机入侵检测通常依赖 Agent 轮询文件或拦截 Syscall极易被高级攻击者绕过如 Hook libc。本文将深入 Linux LSMLinux Security Module机制结合 eBPF 的lsmHook 点实现无需修改内核代码、无需加载内核模块即可实时拦截恶意文件篡改与提权行为的终极防御方案。1. 痛点分析为什么传统 HIDS 不够用了在攻防对抗中攻击者的手段在不断升级Fileless Attack无文件攻击直接在内存中执行不落盘传统文件完整性校验失效。Anti-Forensics攻击者通过ptrace注入或篡改readdir结果让ls命令看不到恶意文件。Rootkit直接 Hook 内核 Syscall 表。解决方案eBPF LSM。从内核 5.7 版本开始eBPF 获得了BPF_PROG_TYPE_LSM类型。这意味着我们可以在LSM Hook点如file_open,inode_unlink上挂载 eBPF 程序在内核做决策之前直接返回-EPERM拒绝请求且由于 eBPF 代码经过 Verifier 验证无法被恶意进程篡改。2. 核心原理LSM BPF 的执行流当进程尝试open(/etc/passwd, O_WRONLY)时执行流如下用户态 open()-sys_open()-security_file_open()(LSM Hook点) -VFS Layer我们要做的就是在security_file_open这个 Hook 点插入 eBPF 程序判断如果文件路径是/etc/passwd且是写操作直接杀掉这个请求。3. 实战构建“不可变文件”防护墙3.1 环境要求Kernel: 5.15 (必须开启CONFIG_BPF_LSMy和CONFIG_DEBUG_INFO_BTFy)OS: Ubuntu 22.04 / Debian Bullseye权限: 必须是 Root3.2 内核态代码 (C语言)创建lsm_tracer.c。注意这里的SEC名称变成了lsm/。// lsm_tracer.c#include linux/bpf.h#include linux/fs.h#include linux/namei.h#include linux/path.h#include linux/dcache.h#include bpf/bpf_helpers.h#include bpf/bpf_tracing.h// 定义需要保护的文件路径const volatile char protected_path[] /etc/passwd;// 定义一个Map用于存储日志可选struct { __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); __uint(max_entries, 128); } events SEC(.maps);// 辅助函数比较字符串static __always_inline int strcmp_ebpf(const char *s1, const char *s2) { int i; for (i 0; s1[i] ! \0 s2[i] ! \0; i) { if (s1[i] ! s2[i]) { return s1[i] - s2[i]; } } return s1[i] - s2[i]; }// Hook点file_open// 当任何进程尝试打开文件时触发SEC(lsm/file_open)int BPF_PROG(restrict_file_open, struct file *file){ // 获取文件的绝对路径 dentry struct path *path file-f_path; struct dentry *dentry path-dentry; // 获取文件名 char filename[256]; // 注意为了安全eBPF禁止直接解引用指针必须使用 helper 函数 // 这里简化处理实际应使用 bpf_d_path 或读取 d_name // 由于 LSM 程序上下文限制我们改用 inode 权限检查 // 获取文件标志位 (O_RDONLY, O_WRONLY, etc.) int flags file-f_flags; // 判断是否是要写入受保护文件 // 这里我们简化逻辑只要试图写 /etc/passwd 就拦截 // 实际场景中可以通过 bpf_probe_read_kernel_str 读取路径 // 示例拦截所有写操作O_WRONLY 或 O_RDWR if ((flags O_ACCMODE) O_WRONLY || (flags O_ACCMODE) O_RDWR) { // 这里可以加入更复杂的逻辑比如读取 task_struct 判断 UID // 返回 -EPERM (Operation not permitted) // 注意LSM Hook 返回 0 表示允许-ERROR 表示拒绝 bpf_printk(Blocked write attempt to protected file! Flags: %d\n, flags); return -EPERM; } // 允许读操作 return 0; }// Hook点task_fix_setuid// 防止非法提权SEC(lsm/task_fix_setuid)int BPF_PROG(restrict_setuid, struct cred *new, const struct cred *old, int flags){ // 如果尝试从 root 切换到其他用户或者反过来 // 我们可以记录日志或直接阻止 if (old-uid.val 0 new-uid.val ! 0) { bpf_printk(Root privilege drop detected\n); } return 0; }char __license[] SEC(license) GPL;3.3 编译注意参数变化LSM 程序需要特定的编译参数特别是要包含内核头文件。clang -O2 -g -target bpf \ -c lsm_tracer.c -o lsm_tracer.o3.4 用户态加载器 (Go语言)创建main.go。注意加载 LSM 程序比加载 Kprobe 复杂需要确保 LSM 钩子已注册。// main.gopackage mainimport ( fmt log os os/signal syscall github.com/cilium/ebpf github.com/cilium/ebpf/link github.com/cilium/ebpf/rlimit)func main() { // 1. 提升资源限制 if err : rlimit.RemoveMemlock(); err ! nil { log.Fatal(err) } // 2. 加载 eBPF Collection spec, err : ebpf.LoadCollectionSpec(lsm_tracer.o) if err ! nil { log.Fatalf(加载 eBPF 对象失败: %v (请确保内核 5.7 且开启了 BPF LSM), err) } coll, err : ebpf.NewCollection(spec) if err ! nil { log.Fatalf(创建 eBPF 集合失败: %v, err) } defer coll.Close() // 3. 获取 LSM 程序 progOpen : coll.Programs[restrict_file_open] progSetuid : coll.Programs[restrict_setuid] // 4. 附加到 LSM Hook // 注意这里使用的是 link.LSM这是 cilium/ebpf 库对 LSM 的特殊封装 // 实际上 LSM 程序是通过 bpf_link 机制附加的 lsmLink1, err : link.AttachLSM(link.LSMOptions{Program: progOpen}) if err ! nil { // 常见错误/sys/kernel/security/lsm 中没有 bpf // 解决方法启动时添加 lsmbpf 参数 log.Fatalf(附加 LSM Hook (file_open) 失败: %v, err) } defer lsmLink1.Close() lsmLink2, err : link.AttachLSM(link.LSMOptions{Program: progSetuid}) if err ! nil { log.Fatalf(附加 LSM Hook (setuid) 失败: %v, err) } defer lsmLink2.Close() fmt.Println(✅ LSM eBPF 防护墙已启动) fmt.Println(⚠️ 现在尝试执行: echo test /etc/passwd) fmt.Println( 你应该会看到 Permission denied) // 5. 保持运行 sig : make(chan os.Signal, 1) signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM) -sig fmt.Println(\n 正在卸载 LSM 程序...) }4. 测试与验证高能时刻启动程序sudo go run main.go另开一个终端尝试修改/etc/passwd$ echo hacker /etc/passwd bash: /etc/passwd: Operation not permitted结果操作被直接拒绝即使你是 root 用户查看内核日志sudo cat /sys/kernel/debug/tracing/trace_pipe# 输出:# Blocked write attempt to protected file! Flags: 655. 深度剖析5.1 为什么这比 iptables/seccomp 更强维度SeccompLSM BPF传统 HIDS拦截层级Syscall 层内核安全决策层用户态/日志层绕过难度易通过 ptrace极难需内核漏洞易隐藏进程性能损耗低极低高灵活性低白名单极高可编程中5.2 生产环境部署的坑启动参数大多数发行版默认没有启用 BPF LSM。你需要修改 Grub# /etc/default/grubGRUB_CMDLINE_LINUXlsmlockdown,yama,apparmor,bpfupdate-grub reboot路径解析在内核态解析完整路径非常困难且容易死机。推荐策略是基于 inode 号进行保护而不是字符串路径。误伤不要一上来就拦截所有写操作。建议第一阶段只做bpf_trace_printk记录日志观察一周后再开启拦截模式。5.3 进阶如何防御无文件攻击利用tracepoint/syscalls/sys_enter_execve配合 LSM 的bprm_check_security你可以在程序执行前检查其内存签名或 Hash 值如果不在白名单内直接拒绝执行。6. 总结本文展示的 LSM eBPF 技术是目前 Linux 内核安全领域的皇冠明珠。它不仅实现了真正的“内核态防火墙”还彻底改变了安全软件的架构形态——从“外挂式”Agent 变成了“内嵌式”基础设施。参考资料https://www.moyubuhuang.com/keji/202606/38090.html

相关新闻

CAPL自动化实战:UDS安全访问Lv1的脚本实现与工程集成

CAPL自动化实战:UDS安全访问Lv1的脚本实现与工程集成

1. 为什么需要自动化UDS安全访问? 在车载ECU测试中,UDS(Unified Diagnostic Services)协议的安全访问机制是保护车辆关键功能的重要屏障。每次进行诊断操作前,都需要先通过$27服务完成安全解锁。手动操作不仅效率低下…

2026/6/30 8:33:37阅读更多 →
深入解析MSPM0 I2C模块:从协议基础到FIFO、时钟超时等高级特性配置

深入解析MSPM0 I2C模块:从协议基础到FIFO、时钟超时等高级特性配置

1. 项目概述与I2C总线核心价值 在嵌入式系统开发中,如何让微控制器(MCU)与周边的传感器、存储器、显示屏等芯片高效、可靠地“对话”,是每个工程师都要面对的基础课题。I2C(Inter-Integrated Circuit)总线协…

2026/6/30 8:33:37阅读更多 →
仅限首批200名开发者获取:ChatGPT-Vision企业级视频分析SDK(含OCR+动作识别+异常事件检测三合一模块)

仅限首批200名开发者获取:ChatGPT-Vision企业级视频分析SDK(含OCR+动作识别+异常事件检测三合一模块)

更多请点击: https://intelliparadigm.com 第一章:ChatGPT 视频理解 ChatGPT 本身并不原生支持视频输入,其核心架构基于文本 token 的处理。然而,随着多模态技术演进,开发者可通过“视频→帧提取→视觉描述→文本注入…

2026/6/30 8:28:36阅读更多 →
如何用Universal Pokemon Randomizer打造完全不同的宝可梦冒险体验

如何用Universal Pokemon Randomizer打造完全不同的宝可梦冒险体验

如何用Universal Pokemon Randomizer打造完全不同的宝可梦冒险体验 【免费下载链接】universal-pokemon-randomizer Public repository of source code for the Universal Pokemon Randomizer 项目地址: https://gitcode.com/gh_mirrors/un/universal-pokemon-randomizer …

2026/6/30 9:38:45阅读更多 →
FREE!ship Plus:专业船舶设计软件完整入门指南

FREE!ship Plus:专业船舶设计软件完整入门指南

FREE!ship Plus:专业船舶设计软件完整入门指南 【免费下载链接】freeship-plus-in-lazarus FreeShip Plus in Lazarus 项目地址: https://gitcode.com/gh_mirrors/fr/freeship-plus-in-lazarus 你是否正在寻找一款功能强大且完全免费的船舶设计工具&#xff…

2026/6/30 9:38:45阅读更多 →
SMUDebugTool:AMD Ryzen处理器底层硬件调试与精准超频的5大实战技巧

SMUDebugTool:AMD Ryzen处理器底层硬件调试与精准超频的5大实战技巧

SMUDebugTool:AMD Ryzen处理器底层硬件调试与精准超频的5大实战技巧 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址…

2026/6/30 9:38:45阅读更多 →
RPG Maker MV资源解密终极指南:3个简单步骤解锁加密游戏素材

RPG Maker MV资源解密终极指南:3个简单步骤解锁加密游戏素材

RPG Maker MV资源解密终极指南:3个简单步骤解锁加密游戏素材 【免费下载链接】RPG-Maker-MV-Decrypter You can decrypt RPG-Maker-MV Resource Files with this project ~ If you dont wanna download it, you can use the Script on my HP: 项目地址: https://g…

2026/6/30 9:38:45阅读更多 →
CasaOS:一键部署家庭云与Docker应用管理的轻量级解决方案

CasaOS:一键部署家庭云与Docker应用管理的轻量级解决方案

这次我们来看一个开源的轻量级家庭云操作系统——CasaOS。如果你正在寻找一个能快速将闲置硬件(比如旧电脑、树莓派、NAS)变成易用个人云/家庭服务器的解决方案,这个项目值得重点关注。它由 IceWhaleTech 团队开发,核心目标不是提…

2026/6/30 9:38:45阅读更多 →
HTTPS加密原理与Linux Nginx实战部署深度解析

HTTPS加密原理与Linux Nginx实战部署深度解析

1. 项目概述:为什么HTTPS是网络安全的基石在Linux运维和Web开发的日常工作中,我们每天都在和HTTP/HTTPS打交道。你可能经常听到“网站必须上HTTPS”、“HTTP不安全”这样的说法,但你是否真正理解,为什么一个简单的“S”字母&#…

2026/6/30 9:33:44阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/30 4:03:30阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/30 4:36:27阅读更多 →
为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南

为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南

为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南 【免费下载链接】Destiny-2-Solo-Enabler Repo containing the C# and XAML code for the D2SE program. Included is also the dependency for the program, and image asset. 项目地址: https://gitcode…

2026/6/30 0:02:58阅读更多 →
第六章:PowerPoint 2010 核心功能与实战应用 —— 从入门到精通

第六章:PowerPoint 2010 核心功能与实战应用 —— 从入门到精通

1. PowerPoint 2010基础操作全攻略 刚接触PowerPoint 2010时,很多人会被它复杂的界面吓到。其实只要掌握几个核心区域,就能快速上手。我最开始用PPT时,经常找不到功能按钮在哪,后来发现主要操作都集中在顶部功能区。 工作窗口主要…

2026/6/30 0:02:58阅读更多 →
XGBoost超参数实战:从理论到调优策略

XGBoost超参数实战:从理论到调优策略

1. XGBoost超参数基础认知 第一次接触XGBoost时,我被它那密密麻麻的参数列表吓到了。这感觉就像面对一架波音747的驾驶舱——每个按钮都可能有神奇的效果,但按错了就可能坠机。经过多年实战,我发现其实掌握十几个核心参数就能解决90%的问题。…

2026/6/30 0:02:59阅读更多 →