通过 execv(snoopy) 来做用户行为 audit

github 有个叫 snoopy 的项目,专门用来做 audit,比系统原生的 auditd 好用的多,思路很好,关键的就是执行任何的命令之前确保第一调用的是 /etc/ld.so/preload 里面的 snoopy.so 这个动态库文件,而他调用的则是 exec()。
* execl
* execlp
* execle
* execv
* execvp
* execve
上面 6 个 sys call 的区别仅仅在于 arg 是 list 还是 array,是否使用了当前的环境变量已经 PATH 的使用。详细的区别请看这里(1, 2)。  
顺便提下 fork 跟 exec 的区别

当然,该服务并不是那么的完全,最少有下面几个问题:
1. 默认只接受 4096 长度的 argv,超过的或直接 trunk,这个不是什么大问题,可以在源码里面直接修改其 MACRO SNOOPY_MAX_ARG_LENGTH,增大到你需要的长度就好了
2. 对于 pipe 的处理,snoopy 会分别记录每一个 pipe 下的命令,然后分别打到 syslog 里面
3. 性能,网上有说会对性能产生一定的影响,目前来看,当然会有影响,毕竟多调用 sys call,但是从我们线上使用的情况来看,微乎其微,不管什么方案,最终都是 tradeoff 的结果

有人想做 audit 就有人想 bypass,结果还真有人想出了一套方案,简单的说就是在加载 snoopy.so 之前通过 dlopen() 加载这段 bypass 的代码。这仅仅是从技术的角度来分析,实际的线上是通过制度保证绝对不允许有任何人突破这道红线的。

  • harveyzh

    最近也在看 snoopy,snoopy 1.9.0 之前的版本在一些 Linux 发新版上,会造成无法重启系统。2013.4.6 发布1.9.0 的版本说是修复了。https://github.com/a2o/snoopy/commit/34306f75922fab47b9f7ecba75684800db9545a4

    淘宝褚霸 2013-10-18 在微博上说『linux 下SNOOPY LOGGER 有严重的bug, 会关闭被preload程序的某号句柄,造成目标程序的不可预期行为,用的同学要小心。』

    http://weibo.com/1915508822/AeCgUiLnt

    不知道他用的是哪个版本。

    • jaseywang

      我们用的是 1.9.0,不过还没遇到上面说的这些情况还没遇到过。最近有新版本发布了。

  • http://ayanamist.tumblr.com/ ayanamist

    LD_PRELOAD=”/lib64/libc.so.6″ bash
    这样就可以绕过了
    ref: http://coolex.info/blog/445.html

  • Pingback: 全网统一账户实践 | Jasey Wang()