1

我正在尝试编写一个 bpftrace 脚本来获取从后缀进程传递的字符串和用于身份验证部分的 saslauthd。目标是检测我公司的入侵帐户。strace 命令给了我一些好的结果:

strace -p PID -s 100 -e 'read'
read(7, "\0\20", 2)                     = 2
read(7, "xxxxxxxxxx", 10)               = 10
read(7, "\0\t", 2)                      = 2
read(7, "YYYYYYYYY", 9)                 = 9
read(7, "\0\4", 2)                      = 2
read(7, "smtp", 4)                      = 4

我可以恢复登录名/密码并检测是否有暴力破解运行。

但我尝试使用 bpftrace 获得相同的结果:

$ bpftrace -e 'kprobe:sys_read /comm=="saslauthd"/ {printf("%<%s>\n",str(arg1,arg2));}'
<>
<login>
<>
<>
<>
<smtp>

在这种情况下,我可以读取一些 sys_read 系统调用字符串,但不是全部。我不明白为什么我的 bpftrace 没有相同的结果。我还考虑了空字符以及为什么我使用str(arg1,arg2)来强制数组的大小。我也尝试过使用跟踪点,这是相同的结果。

也许有人可以帮助我了解我的错误在哪里?所以任何输入将不胜感激

4

1 回答 1

1

TL;博士。这实际上是str(buf, len). 它检索由 指向的字符串buf,限制len字符包括 NULL 字符。因此,由于在您的情况下,某些字符串以 NULL 字符开头,因此str()将复制一个空字符串。


来源。bpftrace转换 str()为对BPF_FUNC_probe_read_strBPF 助手的调用。在内核中,该助手本身调用strncpy_from_unsafe.

我认为 bpftrace 还没有实现您正在寻找的功能。如果你想要你描述的语义,你可以copy()在 bpftrace 中请求一个函数。不过,看看引入的提交,str()为此编写补丁应该不会太难。不要犹豫,发送拉取请求!

于 2020-04-05T09:37:58.683 回答