如何从系统调用确定对应的LSM钩子?含openat实例疑问
判断系统调用与LSM钩子对应关系的通用方法
1. 从LSM钩子的封装函数入手
每个LSM钩子都会对应一个security_xxx格式的封装函数(比如file_open对应security_file_open),直接在内核源码中全局搜索这个封装函数的调用位置,就能找到它被系统调用路径触发的点。比如你关注的security_file_open,实际是在fs/open.c的do_dentry_open函数里被调用的——这个函数是do_sys_openat后续调用的关键流程,负责完成文件对象的初始化,自然会触发文件打开相关的LSM钩子。
2. 顺着系统调用的完整执行链路追踪
系统调用的执行往往会经过多层函数调用,不要只停留在do_sys_xxx这类顶层封装,要继续往下追踪:
- 以
openat为例,完整执行链路是:sys_openat->do_sys_openat->do_filp_open->path_openat->do_dentry_open,security_file_open正是在do_dentry_open中被调用。 - 可以利用代码阅读工具的函数调用链功能,或者直接在源码中搜索函数的调用者,逐步梳理完整流程。
3. 借助LSM框架的生成规则
LSM钩子的定义和调用是通过宏自动生成的,查看include/linux/lsm_hook_defs.h里的钩子定义,每个钩子都会关联对应的调用点生成逻辑。你还可以查看security/security.c中的LSM核心逻辑,了解钩子如何被统一调度执行。
4. 参考内核文档与成熟LSM实现示例
内核文档Documentation/security/LSM中包含钩子与系统调用关联的说明;另外可以参考SELinux、AppArmor这类成熟LSM模块的实现,看它们如何挂载特定钩子来拦截对应系统调用——比如通过SELinux的file_open钩子实现,能反向推导出调用该钩子的系统调用路径。
内容的提问来源于stack exchange,提问作者phoxd
相关产品推荐
相关产品推荐

