gpt4 book ai didi

c - 在 BPF 程序中从指向大型结构的指针检索字段时权限被拒绝

转载 作者:太空宇宙 更新时间:2023-11-04 02:27:39 32 4
gpt4 key购买 nike

我正在尝试编写一个 BPF 程序来检查调用 tty_write 内核函数的任何进程的 session ID。为了检索 ID,我需要从一个指向当前 task_struct 的指针跟随一些字段,但是从一个指向当前任务的指针检索 group_leader 指针似乎错误,因为与当前任务指针的偏移量太大。我的BPF程序代码如下:

SEC("kprobe/tty_write")
int kprobe__tty_write(struct pt_regs *ctx)
{
struct task_struct *task;
struct task_struct *group_leader;
struct pid_link pid_link;
struct upid upid;
int sessionid;

// get current sessionid
task = (struct task_struct *)bpf_get_current_task();
bpf_probe_read(&group_leader, sizeof(group_leader), (void *)task->group_leader);
bpf_probe_read(&pid_link, sizeof(pid_link), (void *)(group_leader->pids + PIDTYPE_SID));
bpf_probe_read(&upid, sizeof(upid), (void *)pid_link.pid->numbers);
sessionid = upid.nr;

// do stuff with sessionid

return 0;
}

此操作失败并出现以下错误。注意我正在使用 gobpf's elf包加载编译好的程序:

failed to load BPF module: error while loading "kprobe/tty_write" (permission denied):
0: (bf) r6 = r1
1: (85) call bpf_get_current_task#35
2: (79) r3 = *(u64 *)(r0 +1464)
R0 invalid mem access 'inv'

我该如何解决这个问题,原因是什么?我认为这可能是由于堆栈大小的 512 字节限制,但我不知道为什么这在这种情况下很重要。

uname -a:Linux ubuntu1710 4.13.0-32-generic#35-Ubuntu SMP Thu Jan 25 09:13:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

最佳答案

我认为偏移量太大不是问题。 字段随机化问题会影响 Linux 4.13 中的 struct task_struct

您可以使用不同的内核,或者在您的#include 之前放置以下内容:

#define randomized_struct_fields_start  struct {
#define randomized_struct_fields_end };

您的第一个 bpf_probe_read 有第二个问题。第三个参数需要是指向要检索的值的指针(这里是指向指针的指针):

bpf_probe_read(&group_leader, sizeof(group_leader), &task->group_leader);

关于c - 在 BPF 程序中从指向大型结构的指针检索字段时权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48757705/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com