linux – 监视程序调用可执行文件

我想知道什么程序调用特定的可执行文件,包括何时通过shebang线将该可执行文件用作解释器.

这与knowing what program accesses a particular file不完全相同.例如,auditctl -w /usr/bin/myprogram告诉我程序正由……本身执行,因为审计事件是在成功执行execve之后生成的.

一个选项是用包装程序替换可执行文件,就像这样……

#!/bin/sh
logger "$0: executed by uid=$(id -u) ruid=$(id -ur) cmd=$(ps -o args= -p $PPID)"
exec "$0.real" "$@"

但这需要移动实际文件,这是破坏性的(文件不能是只读的,它与包管理器所做的修改相冲突等).如果程序用作脚本的解释器,它就不起作用,因为shebang没有嵌套. (在这种情况下,auditctl -w /usr/bin/interpreter确实提供了一个有用的结果,但我想要一个适用于这两种情况的解决方案.)如果/ bin / sh是bash,那么它也不适用于setuid程序删除特权.

如何监视特定可执行文件的执行,包括使用可执行文件作为shebang解释器,特别是记录有关调用进程的有用信息(不仅仅是PPID,而且至少是进程名称或父可执行文件路径,理想情况下也是调用用户和参数)?最好不要用包装器替换文件.特定于Linux的解决方案很好.

解决方法:

这将是hacky,但如果它是一个动态链接的可执行文件,你可以在/etc/ld.so.preload中设置一个全局预加载,如果它检测到你在正确的可执行文件中,它只会触发一个日志记录钩子.

就像是:

#define _XOPEN_SOURCE
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define TARGET "/some_executable"

__attribute__((constructor)) 
static void 
logger(int argc, char** argv){ 
    /*catch own argv right here and parent's later from /proc */

    static char buf[sizeof(TARGET)];

    readlink("/proc/self/exe", buf, sizeof(buf)-1);

    if ( 0==strcmp(TARGET, buf)){
        /* ... */
        syslog(/*...*/);
    }
}

这种方法的明显缺点是它会略微延迟系统上每个动态链接可执行文件的执行,但我的测量结果表明延迟非常小(< 1ms,其中fork执行程序的成本约为2ms). 至于删除的权限问题,你可以有一个小的setuid-root二进制文件,它将无条件地读取和回显它的祖父母proc文件(状态文件,最有可能),可能当且仅当它的父项是你想要的父项的可执行文件时登录.然后,您可以在日志记录钩子中生成该setuid可执行文件,以获取可执行文件父级的信息(setuid帮助程序的祖父项).

上一篇:监视Linux用户活动并审核它们


下一篇:mysql – 如何识别具有数百万条目的表