gpt4 book ai didi

linux - 从具有 CAP_SYS_ADMIN 和 CAP_IPC_LOCK 功能的 bash 脚本启动 perf

转载 作者:太空狗 更新时间:2023-10-29 11:17:29 27 4
gpt4 key购买 nike

我想利用 perf 运行一些测试的能力,而不用 root 运行命令,也不调整 /proc/sys/kernel/perf_event_paranoid。 perf 的一些错误消息说:

You may not have permission to collect stats.
Consider tweaking /proc/sys/kernel/perf_event_paranoid,
which controls use of the performance events system by
unprivileged users (without CAP_SYS_ADMIN).
The current value is 2:
-1: Allow use of (almost) all events by all users
>= 0: Disallow raw tracepoint access by users without CAP_IPC_LOCK
>= 1: Disallow CPU event access by users without CAP_SYS_ADMIN
>= 2: Disallow kernel profiling by users without CAP_SYS_ADMIN

所以我尝试通过以下方式创建一些源相同但功能不同的 bash 脚本:

wrapper_no_cap.sh -> no capabilities set
wrapper_cap_ipc_lock.sh -> setcap cap_ipc_lock+eip ./wrapper_cap_ipc_lock.sh
wrapper_cap_sys_admin.sh -> setcap cap_sys_admin+eip ./wrapper_cap_sys_admin.sh

每个脚本都有相同的来源,如下:

#!/bin/bash
perf stat -e L1-dcache-load-misses:k seq 1 10

但是我运行的每个脚本都会给我结果,就好像我是普通用户一样(这意味着我无法计算内核事件或其他特权内容)。这就像我调用脚本时丢弃了功能。 perf 版本是 4.11.ga351e9

这个方法有什么问题?

最佳答案

脚本文件通常禁用它们的 suid 位(在内核和一些 shell 解释器中),似乎对功能有类似的影响(并且脚本文件实际上是使用解释器启动的,例如 bash ./scriptfile ,因此进程可能不会继承脚本文件的功能):

使用小型简单编译程序通过 exec/execve 调用 perf 并在二进制 ELF 上设置功能。<​​/p>

Linux 内核中用于脚本启动的实际代码 - http://elixir.free-electrons.com/linux/v4.10/source/fs/binfmt_script.c - 使用解释器二进制文件,而不是脚本文件(旧的 bprm->file),来获得类似 suid 的权限

/*
* OK, now restart the process with the interpreter's dentry.
*/
file = open_exec(interp);
if (IS_ERR(file))
return PTR_ERR(file);

bprm->file = file;
retval = prepare_binprm(bprm);

http://elixir.free-electrons.com/linux/v4.10/source/fs/exec.c#L1512

/*
* Fill the binprm structure from the inode.
* Check permissions, then read the first 128 (BINPRM_BUF_SIZE) bytes
*
* This may be called multiple times for binary chains (scripts for example).
*/
int prepare_binprm(struct linux_binprm *bprm)
{
int retval;

bprm_fill_uid(bprm);

/* fill in binprm security blob */
retval = security_bprm_set_creds(bprm);
if (retval)
return retval;
bprm->cred_prepared = 1;
...

static void bprm_fill_uid(struct linux_binprm *bprm)
{
/* Be careful if suid/sgid is set */
inode_lock(inode);

/* reload atomically mode/uid/gid now that lock held */
mode = inode->i_mode;
uid = inode->i_uid;
gid = inode->i_gid;
...

关于linux - 从具有 CAP_SYS_ADMIN 和 CAP_IPC_LOCK 功能的 bash 脚本启动 perf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43981547/

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