- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这其实是一个三段式的问题,下面我会解释,但是问题是:
我有一个在 Linux(多个发行版)上运行的 C 程序,通常由具有普通权限的用户运行,但程序的某些部分必须以 root 权限运行。为此,我使用了 set-UID 标志,就目前而言,它工作正常。
但是,现在我想用普通用户权限调试程序,我发现我有一个陷阱。我刚刚添加了一个函数来创建一个临时文件 (/tmp/my_name-XXXXXX),并且从程序中的许多点调用该函数。无论出于何种原因,此函数在运行时都会发出以下消息:
sh: /tmp/my_name-hhnNuM: Permission denied
(当然,实际名称会有所不同。)然而,该程序能够执行原始套接字功能,我绝对知道不能由 root 以外的用户执行。 (如果我删除 setuid 标志,程序就会失败。)
如果我在没有 sudo 的情况下通过 gdb 运行这个程序,它会死于原始套接字(因为 gdb 显然不——或者可能不能——遵守程序上的 setuid 标志)。如果我在“sudo gdb”下运行它,那么一切正常。如果我以“sudo ./my_name,一切正常。
这是该程序的 ls -l 输出:
-rwsr-xr-x 1 root root 48222 Jun 23 08:14 my_name
所以我的问题,没有特定的顺序:
最佳答案
1在 gdb 下正确调试 setuid 应用程序的唯一方法是以 root 身份运行 gdb。对 setuid 应用程序执行此操作的最明智方法是在应用程序启动后附加到该应用程序。一个快速的技巧是在 setuid 应用程序中添加一行:
kill(getpid(), SIGSTOP);
这会导致它在此时停止,然后您使用以下方式附加 gdb:
sudo gdb <application> <pid>
然后您将附加到应用程序并可以正常调试它。
2 sudo 更改规则,因为它允许将当前用户环境中的各种项目导出到根用户环境中。这完全取决于当前的 sudo 配置,并且会给您留下一个与 setuid 应用程序截然不同的环境,这就是为什么您需要依赖一些技巧,例如停止应用程序,然后在运行时附加到它。
此外,应用程序中可能有逻辑来检测它是否在 setuid 环境中运行,而在 sudo 下运行时实际上并非如此 - 请记住 sudo 设置所有进程的 id 字段(真实 uid、有效 uid 和保存的 uid)到相同的值,而 setuid 没有(真正的 uid 仍然是原始调用者的 uid)。您可以使用 getresuid()调用以确定三个变量的状态。
3 Permission Denied
消息的前缀是 sh:
;这似乎暗示正在执行另一个试图访问该文件的子进程。调用 mkstemp 后,您可能希望放宽读取文件的权限,以便子进程能够读取文件。
关于c - 使用 setuid 调试 setuid 程序/"Permission denied",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11169656/
这其实是一个三段式的问题,下面我会解释,但是问题是: 如何使用 gdb 以 root 权限运行程序的一部分,而其余部分以正常方式运行? 为什么我使用 mkstemp 在/tmp 中创建文件时会得到“权
我不得不为某人做一个肮脏的 Linux hack,这样他们就可以在非根用户的情况下使用 cupsenable printername shell 命令启动打印机。我不希望他们能够以 root 身份使用
我编写的一个 Python 扩展需要 root 访问权限才能执行单个硬件初始化调用。我不想仅仅为了我的扩展中的这个调用而以 root 身份运行整个脚本,所以我想编写一个包装器来执行此初始化,然后再降低
我已经使用 root 运行了一个程序,在其中我为 uid 9999999 调用了 setuid 函数,然后它成功地设置了这个 uid,即使它不存在于/etc/passwd 中。那么 setuid 如何
我有一个要设置 uid 位的 shell 脚本。我将所有者设置为 root 并设置 uid 位。我在 shell 中添加了 'whoami' 以检查它是否正常工作但是当我执行脚本时,whoami 返回
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
如果我在循环中调用 setuid 以成为 root 并重置 uid,这只会工作一次。我有以下代码: #include #include #include int my_func(int i) {
我正在扩展一些在 GNU/Linux (Ubuntu 14.04) 下运行的软件(我不是作者),由一个 manager 进程和几个 worker 组成过程。管理器可以通过我可以在配置文件中指定的命令行
当我在我的程序中尝试 setuid 时,它创建了 2 个进程。一个是父进程,另一个是子进程。 int isRoot() { if (getuid() != 0) {
假设我们正在查看以下场景: 文件 saymyname.c(包括省略) int main(int argc, char** argv){ system("whoami"); } 构建并设置权
正在尝试设置 cap_setgid、cap_setuid、cap_setpcap。 #include #include int main() { cap_t caps; caps
我目前正在尝试了解文件权限中的特殊位的作用,但目前正试图了解 setuid 位的作用。从所有在线资源中,它说: Commonly noted as SUID, the special permissi
我有以下简单代码来检查我的 getuid 函数: uidActual=getuid(); printf ("User id is [%d]\n", ui
我被要求找到一个命令,该命令将仅列出从当前目录(及其下)开始的具有 setuid 位的文件。有人告诉我这是正确的方法: find /home/anyuser -type f \( -perm -400
伙计们。 这是我的问题: 我有一个可执行文件需要在系统的特定位置创建一个文件夹。 无论谁执行它,我都希望它能够这样做。 我的想法是将父文件夹(可执行文件需要在其中创建文件夹的文件夹)提供给用户,并将可
我正在尝试了解缓冲区溢出和 setuid。我使用这个来源: #include #include #include int main(void){ char prog[]="/bin/ls
我在 Linux 中工作,并尝试在 Linux 上使用 setuid 执行 C 程序。这是我的代码: #include #include #include #include int main(
需要一些关于传递 argv 的帮助,以便 shell 脚本可以作为/usr/local/bin/script.sh 用户域运行 #include #include #include #inclu
我一直在努力思考 setuid/setgid 是如何工作的……我想到了这个人为的例子: 用户: 用户A属于A组 用户B属于B组 文件 a.txt 由用户 A 拥有,权限为 rw-rw----- (66
changeIDs() is trying to use setuid() to change the effective user id but it always errors out and I
我是一名优秀的程序员,十分优秀!