调试源码调查auditd增删改文件时文件路径记录不完整的问题

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

[toc]

简介

重要更新

发现问题不在这里,可能出在其他地方,就当是排错的记录吧

遇到的问题

  • auditd添加一条规则,监控的路径是一个目录
    [root@localhost ~]# auditctl -w /home/kira/test
    [root@localhost ~]# auditctl -l
    -w /home/kira/test -p rwxa
    复制代码
    • 目录已添加,注意,后面的操作我会在上层/home/kira进行操作
  • 增加一个文件
    [kira@localhost test]$ cd ..
    [kira@localhost ~]$ touch xx
    复制代码
  • 看一下日志,发现问题
    type=PATH msg=audit(1655776535.937:257): item=1 name="xx" inode=665677 dev=08:02 mode=040755 ouid=1000 ogid=1000 rdev=00:00 obj=unconfined_u:object_r:user_home_t:s0 nametype=DELETE cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0OUID="kira" OGID="kira"
    复制代码

问题就在这里,我在home,目录删除了test目录下的xx文件,但是只显示了我在home目录下删除了xx,但是这中间夹杂的还有其他目录

排查记录

打断点

  • 这个地方是大部分的事件到来时会处理的函数,在这里的断点能看到很多后续对事件的处理信息,比如生成最后的log字符串
    /usr/src/debug/audit-3.0.1-3.oe2203.x86_64/src/auditd.c
    
    default:
    	distribute_event(cur_event);
    	cur_event = NULL;
    	break;
    复制代码
  • 这个回调函数是收到事件的入口函数,所有回调的事件都从这里开始
    /usr/src/debug/audit-3.0.1-3.oe2203.x86_64/src/libev/ev.c
    
    ecb_noinline
    void
    ev_invoke_pending (EV_P)
    {
      pendingpri = NUMPRI;
    
      do
        {
          --pendingpri;
    
          /* pendingpri possibly gets modified in the inner loop */
          while (pendingcnt [pendingpri])
            {
              ANPENDING *p = pendings [pendingpri] + --pendingcnt [pendingpri];
    
              p->w->pending = 0;
              EV_CB_INVOKE (p->w, p->events);
              EV_FREQUENT_CHECK;
            }
        }
      while (pendingpri);
    }
    复制代码
    • 可以在while里打断点

排查

最开始看的是distribute_event函数,发现里面其实对字符串的处理很少,无非是添加时间信息,开始查找,name这个字段到底是什么时候添加的,这时候把字符串的地址拿去监视,再网上排查,发现其实这个字符串在收到这个事件的时候,字符串就是就绪的,后续基本没有修改了

最后

写完文章,发现,其实可能是规则弄错了,,,,, 明天继续排查,,, 发现今天一天可能都是无用功。。。

完结、撒花、毁灭把。。。

猜你喜欢

转载自juejin.im/post/7111634654595121165