我有一个 Apache2 CGI 可执行文件尝试使用 setgid()/setuid()。但切换到 root 失败。我该如何解决这个问题?

我有一个 Apache2 CGI 可执行文件尝试使用 setgid()/setuid()。但切换到 root 失败。我该如何解决这个问题?

我的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 中工作?

相关内容