setgid()/setuid()를 사용하려는 Apache2 CGI 실행 파일이 있습니다. 그러나 루트로의 전환은 실패합니다. 이 문제를 어떻게 해결할 수 있나요?

setgid()/setuid()를 사용하려는 Apache2 CGI 실행 파일이 있습니다. 그러나 루트로의 전환은 실패합니다. 이 문제를 어떻게 해결할 수 있나요?

내 거CGI 실행 파일이 예상대로 시작됩니다.. 그러나 어느 시점에서는 루트(그리고 다른 사용자)가 되려고 시도합니다. 그 시점에서 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범위. 이 매개변수는 기본적으로 설정되며 Apache2 파일 false에는 표시되지 않습니다 . .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()최신 버전의 Apache2에서 / setgid()기능이 작동하도록 하려면 어떻게 해야 합니까 ?

관련 정보