授予可执行文件比 运行 用户更多的权限

Giving an executable more permissions than running user

我有一个小型 C++ 应用程序可以为 运行Debian 9.2 上的 BeagleBone Black 板打开和关闭灯。

它通过更新文本文件来实现。

// Turn light on
fs.open("/sys/class/leds/beaglebone:green:usr0", std::fstream::out);
fs << "1";
fs.close();

如果我 运行 作为标准用户使用该程序,它 运行 没有错误,但 none 指示灯发生变化。

如果我 运行 使用 sudo 的程序一切正常,灯也亮。 我猜这是因为这些文件需要更高的访问权限。

我不是很熟悉 Linux 权限,但是有没有办法允许您的程序访问用户无法访问的文件?

有很多方法可以解决这个问题,这在很大程度上取决于更大的设置,哪一个更合适。 一种方法是更改​​该特定文件的权限(不确定 sysfs 是否允许)。

另一种方法是将 运行 将此文件添加到具有文件写入权限的组中。

还有一个是已经提到的设置所谓的 setuid 位并将可执行文件的所有权更改为 root 或对该文件具有写入权限的用户。这通常具有更深层次的安全隐患。

使用 sudo 或 su 来执行文件也是一种有效的方法。要限制安全风险,您可以在 sudoers 中允许此特定命令。

上述其中一项的变体是 运行 持久进程侦听来自较低特权进程的命令。

如前所述,这在很大程度上取决于它如何适应更大的环境。还需要考虑避免打开安全漏洞的影响。

仔细阅读关于setuid and about credentials(7) (and execve(2) which is how programs are started). But be careful about vulnerabilities的内容。

阅读Advanced Linux Programming (freely downloadable, but a bit old) or some newer book about Linux programming. Read intro(2) and syscalls(2)

您还可以阅读 Operating Systems: Three Easy Pieces(可免费下载)以了解有关操作系统的更多信息。

您可以创建可执行文件 setuid(在适当的 chown 之后使用 chmod u+s)并在适当的地方小心地调用 setreuid(2)。这就是 sudosu 等程序的工作方式(它们都是 setuid)。有时您可以只使用组权限(仅设置 gid)。

但要小心,此类程序中的错误可能会造成巨大的安全漏洞。因此,保持 setuid 程序非常小并让其他人审查它们的代码是明智的。一种可能的方法是编写一个非常小的 setuid 可执行文件来做你奇怪的事情(例如只闪烁 LED)并与越来越大的普通程序(例如提供 GUI)进行通信(例如使用 pipe(7)-s or other forms of inter-process communication)。

也许您可以通过创建组 led 并授予组对 /sys/class/leds/beaglebone:green:usr0 的写权限并仅使用 setgid 技术来配置您的系统。