我的CGI 可执行文件按预期启动。但在某些时候,它会尝试成为 root(然后又成为不同的用户)。那时,CGI 失败了。
这是相关的代码片段:
[...]
int const pid(fork());
if(pid == 0)
{
if(setgid(0) == -1) // <-- this fails.
{
std::cerr << "error: cannot become the \"root\" group.\n";
exit(0);
}
[...]
我认为这可能与 systemd 有关NoNewPrivileges
范围。该参数默认设置为false
,并且不会出现在 Apache2.service
文件中。所以我想知道接下来我可以尝试什么来让这一切顺利进行。
这是apache2.service
文件(在 Ubuntu 20.04 上):
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=https://httpd.apache.org/docs/2.4/
[Service]
Type=forking
Environment=APACHE_STARTED_BY_SYSTEMD=true
ExecStart=/usr/sbin/apachectl start
ExecStop=/usr/sbin/apachectl stop
ExecReload=/usr/sbin/apachectl graceful
PrivateTmp=true
Restart=on-abort
[Install]
WantedBy=multi-user.target
我们可以看到NoNewPrivileges
没有设置,也没有具有与 Freedesktop 上列出的类似副作用的字段。
如何让setuid()
/setgid()
函数在较新版本的 Apache2 中工作?