【问题标题】:bpftrace and sys_read syscallbpftrace 和 sys_read 系统调用
【发布时间】:2020-07-17 05:27:19
【问题描述】:

我正在尝试编写一个 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) 来强制数组的大小。我也尝试过使用 tracepoint,结果是一样的。

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

【问题讨论】:

    标签: system-calls bpf ebpf bcc-bpf


    【解决方案1】:

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


    来源。 bpftrace translates str() 调用 BPF_FUNC_probe_read_str BPF 助手。 In the kernel,该助手本身调用strncpy_from_unsafe

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

    【讨论】:

    • 非常感谢您的回复,您用一些有效的事实证实了我对 bpf 的 str() 函数的怀疑。我将研究您发布的提交,然后尝试发送拉取请求。
    • 如果/当您的拉取请求被接受时,请在此处发布,以便我更新我的答案。
    猜你喜欢
    • 2019-10-26
    • 1970-01-01
    • 2012-12-11
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多