LINUX.ORG.RU

Переменные окружения, после сброса привелегий

 ,


0

1

Привет. Вот код, запускаем его с правами рута.

package main

import (
    "log"
    "syscall"
    "os"
)

func main() {

    myGid := 1000
    myUid := 1000

    if syscall.Getuid() == 0 {
	log.Printf("USER %s", os.Getenv("USER"))
        if err := syscall.Setgid(myGid); err != nil {
            log.Fatalf("Error setting gid as %d: %s", myGid, err)
        }
        if err := syscall.Setuid(myUid); err != nil {
            log.Fatalf("Error setting uid as %d: %s", myUid, err)
        }
    }
    log.Printf("My uid is %d, my gid is %d", syscall.Getuid(), syscall.Getgid())
    u, _ := syscall.Getenv("USER")
    log.Printf("USER %s", u)
}

Выход:

USER root
My uid is 1000, my gid is 1000
USER root 

Видно, что привелегии скинулись, но вот доступ к переменным окружения по прежнему root пользователя. Что можно сделать?


Ответ на: комментарий от WitcherGeralt

После того как дропнуты привелегии. Надо подключиться к dbus. Адрес лежит в DBUS_SESSION_BUS_ADDRESS. Но там выходит, пустая строка. Можно конечно, спарсить из /proc/

wncpw
() автор топика
Последнее исправление: wncpw (всего исправлений: 1)

Попробуй посмотреть в сторону pam_env. Хотя я не уверен, что это то, что нужно.

squareroot ★★★★
()
Последнее исправление: squareroot (всего исправлений: 1)

Видно, что привелегии скинулись, но вот доступ к переменным окружения по прежнему root пользователя. Что можно сделать?

Переменные окружения у процесса, а не у юзера/uid.

Смена gid/uid через syscall никак не влияет на переменные окружения.

Если тебе нужны переменные окружения «пользователя» на который ты переключился, то ты должен сам это сделать. Сделать это совсем не просто.

IMHO самое простое это выполнить «su -l -c set username» и забрать из выхлопа все необходимые переменные.

vel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.