这实际上是一个三部分问题,我将在下面解释,但问题是:
- 如何使用gdb,以root权限运行程序的一部分,其余部分以普通方式运行?
- 为什么我在使用mkstemp在setuid(到root)程序中创建/tmp中的文件时会收到“permission denied”错误消息?
- 为什么“sudo program_name”与具有setuid到root的“./program_name”相比会有任何不同表现?
我在Linux上运行一个C程序(多个发行版),通常由具有普通权限的用户运行,但程序的某些部分必须以root权限运行。为此,我使用了set-UID标志,这在功能上已经可以正常工作。
然而,现在我想使用普通用户权限调试程序,但我遇到了一个困境。我刚刚添加了一个用于创建临时文件(/tmp/my_name-XXXXXX)的函数,并且该函数从程序的许多点调用。由于某种原因,当运行该函数时,它会发出以下消息:
sh: /tmp/my_name-hhnNuM: Permission denied
(当然,实际名称可能会有所不同。)然而,该程序能够执行我绝对知道普通用户无法执行的原始套接字函数。 (如果我删除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
以下是我的问题,没有特定的顺序:
- 在gdb下,(如何)可以运行程序的不同部分以不同有效UID的方式运行?
- 当./program设置为root的set-uid时,“sudo ./program”和“./program”有什么不同?
- 为什么在由普通用户调用的setuid(到root)程序中调用mkstemp会失败?