原标题:Linux安全审计机制模块实现分析(7)
2.分析audit_syscall_entry函数
(1)audit_syscall_entry接口功能说明
函数名:audit_syscall_entry
参数:arch为CPU的架构,major为系统调用号,a1~a4为系统调用的参数,
返回值:无
功能:系统调用信息先暂存在进程的审计上下文中。该函数是__audit_syscall_entry的封装函数。
(2)__audit_syscall_entry.函数分析
该函数首先获取进程的审计上下文结构,然后查询entry规则链表,判断该审计上文中需要审计的项目是否符合规则,如果符合规则,返回对此类符合规则的审计消息所能采取的动作(不生成记录或生成记录),该函数还将此次系统调用的信息(系统调用号、调用参数、调用的时间等)写入审计上下文。 __audit_syscall_entry的调用层次图如下:
图2-18 __audit_syscall_entry的调用层次图
3.分析audit_syscall_exit函数
audit_syscall_exit是__audit_syscall_exit的封装函数,所以这里主要分析__audit_syscall_exit。
(1).audit_syscall_exit接口功能说明
函数名:__audit_syscall_exit
参数:success为系统调用是否成功的标志,return_code为系统调用的返回值。
返回值:无
功能:将审计上下文中所有本次系统调用期间产生的有关进程的各类信息,符合exit规则链表上规则的信息全部写出(发送给用户)。
(2).函数分析
函数 audit_syscall_exit 将系统调用退出时的审计信息填充到审计上下文中。如果审计上下文被标识为可审计的(在规则过滤时状态设置为 AUDIT_RECORD_CONTEXT或AUDIT_BUILD_CONTEXT),那么就将审计上下文中的信息发送给审计后台。该函数处理流程如下:
图2-19 audit_syscall_exit函数流程图
2.3.4.2其它内核函数的审计
进程在运行的过程中,许多操作会产生一些特征中间数据,如:执行二进制文件的文件名、参数、进程间通信的消息路径搜索时的目录项信息等,审计系统通过在内核的系统调用等函数中加入审计系统 hook函数来实现对特征数据的截获,截获的特征数据填充在进程的审计上下文结构的辅助数据链表aux上。
1.进程辅助审计数据
结构audit_aux_data 用来存储审计辅助数据,包括进程运行过程中的各种关键的数据。其列出如下:
struct audit_aux_data {
struct audit_aux_data *next;
Int type;
};
结构 audit_aux_data是个抽象的数据结构,必须由其他派生结构继承才能存放具体的信息,派生结构一般将基类结构作为第一个成员。通过基类结构指针,可将描述具体信息的派生结构形成链表放在审计上下文中。例如:记录执行应用程序环境信息的结构列出如下:
struct audit_aux_data_execve {
struct audit_aux_datad;
int argc;
int envc;
struct mm_struct *mm;
};
2.审计钩子函数
在任何需要写出审计信息的内核函数中都可以放置进程审计hook 函数,具体的审计信息存储在辅助数据结构audit_aux_data的派生结构中,hook函数完成的工作是:将内核函数的审计数据填充到派生结构并将派生结构挂接到进程审计上下文的辅助数据链表中。每个hook函数拦截的审计消息对应一个审计消息类型,工具auditctl可以过滤需要的审计消息。部分进程审计的hook函数如下表2-3:
表 2-3 进程审计的部分钩子函数
函数名
被放置的地点
作用
audit_alloc
fork调用
分配审计上下文结构
audit_getname
getname函数
获取名称信息
audit_inode
路径查询等函数
获取索引节点和设备信息
audit_inode_child
文件系统对象或删除的函数
获取父亲或孩子的索引节点信息
audit_ptrace
ptrace调用
获取进程的信用信息
audit_ipc_obj
msgctl调用
获取进程的ipc信息
audit_bprm
execve调用
获取执行该程序的信息
责任编辑: