Ambiente de outro usuário em um processo filho

2

Eu tenho um processo pai em execução como usuário 'root'. Depois de fork() , execl() e setuid()/setgid() , o processo filho é iniciado como outro usuário do sistema operacional (digamos, user1).

A impressão do ambiente mostra que isso é o mesmo que o ambiente raiz (como se fizesse login como root) e não como se fizesse login como usuário1. Por quê?

Existe uma maneira de ler o ambiente do usuário1 no processo filho?

    
por Balu T 02.04.2013 / 11:07

4 respostas

2

Cada processo tem seu próprio ambiente, copiado do pai . Se o pai é um shell, há um conceito de variáveis exportáveis que precisa ser considerado, mas isso não se aplica quando você está lidando diretamente com exec() etc. A variável LOGNAME é normalmente definida por um shell de login, você está vendo apenas um valor restante que não foi redefinido. Então, você está vendo o ambiente filho. Em alguns sistemas, você não pode acessar facilmente o ambiente pai (ou outro processo), no Linux, você pode fazer isso facilmente (sujeito a permissões) via /proc )

Provavelmente você pode reproduzir o efeito que você está experimentando su e su - , este último inicializará um ambiente de login de shell que (quase certamente) redefinirá LOGNAME entre outras coisas, o primeiro o deixará intocado.

Usar o comando env é uma maneira de obter um ambiente limpo ao iniciar um novo processo a partir de uma linha de comando, você deve verificar a documentação execle() em seu sistema para ver como fazer algo semelhante.

    
por 02.04.2013 / 11:13
1

Você pode simplesmente verificar o env do usuário usando:

su -l user_name  -c "run_programm && env"

Ou você pode verificar env do processo filho usando o pid,

suponha que seu pid do processo filho seja 24112 e, em seguida, apenas verifique env usando:

cat /proc/24112/environ
    
por 02.04.2013 / 11:14
1

Algumas informações:

  • Você pode usar execle ou execve para fornecer variáveis de ambiente ao filho. Você pode usar isso para suprimir variáveis de ambiente do processo pai que não são mais adequadas para o filho e para fornecer variáveis adicionais ao filho.
  • Você pode iniciar um "login shell" para a criança, por exemplo usando bash -l . Isso irá preencher o ambiente como para uma criança. Para muitos shells (incluindo o bash), prefixar um hífen ao nome do binário, isto é, passar -bash as argv[0] , tem o mesmo efeito. Um efeito primário dessa distinção é que um shell de login executará os scripts de shell /etc/profile e / ou outros perfis, que por sua vez definem um grande número de variáveis de ambiente.
  • Para serviços que usam o PAM para autenticação e inicialização de sessão, o módulo pam_env cuidará de inicializar corretamente o ambiente. Você pode dar uma olhada nisso e em sua configuração, seja para usá-lo ou para imitar seu comportamento.
por 02.04.2013 / 11:32
0

Cada processo tem um conjunto de variáveis de ambiente (que podem ser definidas em um shell por export SOMEVAR=value e assim). Eles são herdados como estão por processos filhos. Se você quiser redefini-las, use extern char **environ; para acessar o ambiente passado (consulte environ(7) ) e, em seguida, use execle(3) ou execve(3) transmitindo uma nova matriz de ambiente com valores de variáveis copiados. Algumas orientações sobre o que e como é feito por David Wheeler em seu "Secure Unix / Linux programming HOWTO"

    
por 02.04.2013 / 14:24