bpftrace и sys_read системный вызов - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь написать один скрипт bpftrace, который захватывает строки, передаваемые процессом postfix, и 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

Я могу восстановить логин / пароль и определить, работает ли bruteforce.

но я пытаюсь получить те же результаты с bpftrace с:

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

В этом случае я могу прочитать некоторые строки syscall sys_read, но не все. Я не понимаю, почему мой bpftrace не дает такой же результат. Я также думаю о нулевом символе и о том, почему я использую str (arg1, arg2) , чтобы форсировать размер массива. Я также пытался использовать трассировку, и это тот же результат.

Может быть, кто-то может помочь мне понять, где моя ошибка? Так что любой вклад будет оценен

1 Ответ

1 голос
/ 05 апреля 2020

TL; DR. Это фактически ожидаемое поведение str(buf, len). Он извлекает строку, указанную buf, с ограничением len символов, включая символ NULL. Таким образом, поскольку в вашем случае некоторые строки начинаются с символа NULL, str() скопирует пустую строку.


Sources. bpftrace переводит str() в вызов помощнику BPF_FUNC_probe_read_str BPF. В ядре этот помощник сам вызывает strncpy_from_unsafe.

Я не думаю, что в bpftrace уже есть функция, реализующая то, что вы ищете. Если вы хотите описанную вами семантику, вы можете запросить функцию copy() в bpftrace. Хотя, глядя на коммит, который ввел str(), не должно быть слишком сложно написать патч для этого. Не стесняйтесь, отправьте запрос на включение!

...