Por que eu não posso largar privilégios de sudo root?

2

Estou depurando um programa e não tenho certeza porque não posso descartar privilégios.

Eu tenho permissões de root via sudo e posso chamar setgid/setuid , mas a operação [is] não é suportada.

Código básico para reproduzir (golang):

package main

import (
    "fmt"
    "os"
    "strconv"
    "syscall"
)

func main() {
    if os.Getuid() != 0 {
        fmt.Println("run as root")
        os.Exit(1)
    }

    uid, err := strconv.Atoi(os.Getenv("SUDO_UID"))
    check("", err)

    gid, err := strconv.Atoi(os.Getenv("SUDO_GID"))
    check("", err)

    fmt.Printf("uid: %d, gid: %d\n", uid, gid)

    check("gid", syscall.Setgid(gid))
    check("uid", syscall.Setuid(uid))
}

func check(message string, err error) {
    if err != nil {
        fmt.Printf("%s: %s\n", message, err)
        os.Exit(1)
    }
}

Exemplo de saída:

$ sudo ./drop-sudo 
uid: 1000, gid: 1000
gid: operation not supported

Informações do sistema:

$ uname -a
Linux jmuia 4.15.0-34-generic #37-Ubuntu SMP Mon Aug 27 15:21:48 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
    
por user2460234 17.09.2018 / 00:07

1 resposta

3

A sua linguagem de programação simplesmente não suporta tais coisas.

É complexo fazer isso no Linux, por causa da arquitetura do Linux. As bibliotecas C (por exemplo, GNU e musl) escondem essa complexidade. Continua sendo um dos problemas conhecidos com threads no Linux.

A linguagem Go não replica o mecanismo das bibliotecas C. A implementação atual dessas funções não é uma chamada de sistema e tem não foi desde 2014 .

Leitura adicional

por 17.09.2018 / 05:34