欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

基于Linux连接器的审计进程事件实现方案

来源:本站整理 作者:佚名 时间:2019-03-29 TAG: 我要投稿

一 引言
主机安全反入侵检测的核心数据包含命令、网络、文件三大类型,文件产生进程、进程产生网络,从进程的角度出发可以捕获到最多的安全事件,因此进程事件在反入侵检测中是最重要安全感知数据,是安全检测和异常分析的基础。这样不论在攻击事前的弱口令扫描或暴力破解动作;还是事中的反弹shell、命令执行注入;或事后的后门或隐藏进程,都可以依赖进程事件的基础数据分析,同时根据不同的攻击向量,多维护分析出安全事件。
在常见的进程事件数据采集方案包括两种,第一种内核模块hook,拦截系统调用fork、exec等,优点:不易被绕过,缺点:方案过重,风险较高。第二种借助preload机制,拦截同名函数,优点:方案轻量,实现简单,缺点:对部分安全场景不能覆盖。
本文提供了第三种方案:通过linux连接器实现进程事件审计,由linux内核提供的接口,安全可靠,结合用户态轻量级ncp应用程序,对主机影响较小,并且能覆盖更多安全场景。
二 实现方案

1、linux内核提供连接器模块与进程事件收集机制,无需任何改动
2、在用户态实现轻量级ncp(netlink connector process)应用程序接收netlink进程事件消息
三 linux连接器
连接器是一种新的用户态与内核态的通信方式。本质上,连接器是一种netlink通信,用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC), 连接器最常见应用是进程事件连接器。
linux内核从2.6.15版本开始支持连接器,可以检查内核模块配置文件(例 /boot/config-3.10.0-327.36.3.el7.x86_64 )是否配置CONFIG_CONNECTOR,CONFIG_PROC_EVENTS确定。
CONFIG_CONNECTOR=y
CONFIG_PROC_EVENTS=y
3.1 连接器内核模块
连接器内核模块实现核心代码主要在:
driver/connector/connector.c,driver/connector/cn_queue.c
int cn_add_callback(struct cb_id *id, const char *name,
            void (*callback)(struct cn_msg *,
                     struct netlink_skb_parms *))
void cn_del_callback(struct cb_id *id)
cn_add_callback:用于向连接器注册新的连接器实例以及相应的回调函数,参数id 指定注册的标识 ID,参数 name 指定连接器回调函数的符号名,参数 callback 为回调函数。
连接器模块注册了”cn_proc”的连接器实例,并设置cn_proc_mcast_ctl回调函数
cn_add_callback(&cn_proc_event_id,
                  "cn_proc",
                  &cn_proc_mcast_ctl)
static void cn_proc_mcast_ctl(struct cn_msg *msg,
                  struct netlink_skb_parms *nsp){
        *
        mc_op = (enum proc_cn_mcast_op *)msg->data;
        switch (*mc_op) {
        case PROC_CN_MCAST_LISTEN:
            atomic_inc(&proc_event_num_listeners);
            break;
        case PROC_CN_MCAST_IGNORE:
            atomic_dec(&proc_event_num_listeners);
            break;
        default:
            err = EINVAL;
            break;
        }
        *
}
cn_proc_mcast_ctl:接收通过连接器通道发来的用户态消息,主要处理PROC_CN_MCAST_LISTEN,PROC_CN_MCAST_IGNORE两种控制消息。
3.2 进程事件
进程事件连接器的实现代码主要在
drivers/connector/cn_proc.c
int cn_netlink_send(struct cn_msg *msg, u32 __group, gfp_t gfp_mask)
cn_netlink_send:用于向用户态发送 netlink 消息,参数 msg 为发送的 netlink 消息的消息头。
在内核实现中,进程创建、执行、退出的系统调用sys_fork, sys_exec,sys_exit最终都会通过cn_netlink_send发送消息到用户态
sys_fork->do_fork->copy_process->proc_fork_connector->cn_netlink_send
sys_exec->do_execve->do_execve_common->search_binary_handler->proc_exec_connector->cn_netlink_send
sys_exit->do_exit->proc_exit_connector->cn_netlink_send
在proc_fork_connector、proc_exec_connector、proc_exit_connector都是从内核进程数据结构task_struct获取信息封装netlink消息。

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载