Processos que diminuem os privilégios via setuid()
e setgid()
parecem não herdar as associações de grupo do uid / gid que eles definem.
Eu tenho um processo de servidor que deve ser executado como root para abrir uma porta privilegiada; depois disso, ele é redimensionado para um uid / gid não privilegiado específico, 1 - por exemplo, o do usuário foo
(UID 73). O usuário foo
é um membro do grupo bar
:
> cat /etc/group | grep bar
bar:x:54:foo
Portanto, se eu entrar como foo
, posso ler um arquivo /test.txt
com estas características:
> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar 8 16:22 /test.txt
No entanto, o seguinte programa C (compilação std=gnu99
), quando executado root:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main (void) {
setgid(73);
setuid(73);
int fd = open("/test.txt", O_RDONLY);
fprintf(stderr,"%d\n", fd);
return 0;
}
Sempre relata Permissão negada . Eu imagino que isso tenha a ver com ser um processo sem logon, mas meio que prejudica a maneira como as permissões devem funcionar.
1. O que geralmente é SOP para servidores, e acho que deve haver uma maneira de contornar isso, pois encontrei um relatório de alguém fazendo o apache - o apache foi adicionado ao grupo de áudio e, aparentemente, pode usar o sistema de som. Obviamente, isso provavelmente acontece em um fork e não no processo original, mas, na verdade, o caso é o mesmo no meu contexto (é um processo filho bifurcado após a chamada setuid).
fonte
setuid()
/setgid()
chamadas.setgid(54)
vez desetgid(73)
(como em/etc/groups
, groupbar
has gid 54), isso funciona?setuid()
novamente depois de fazê-lo ... mas, hmmm ... Eu acho que você pode comseteuid()
...Respostas:
O problema é esse
setuid
esetgid
não é suficiente para fornecer ao seu processo todas as credenciais necessárias. As autorizações de um processo dependem deVeja
man 7 credentials
para obter uma visão geral mais detalhada. Portanto, no seu caso, o problema é que você definiu corretamente o UID e o GID, mas não definiu os grupos suplementares do processo. E o grupobar
tem GID 54, não 73, portanto não é reconhecido como um grupo em que seu processo está.Você deveria fazer
fonte
dialout
grupo e funcionou pela primeira vez.OK, arrastei um pouco pela rede. Primeiro pensei que o APUE continha todas as respostas, mas estava enganado. E minha cópia (edição antiga) está em funcionamento, então ... O capítulo 5 do Manual de Administração para Unix e Linux parece promissor, mas não o tenho (apenas uma cópia das duas primeiras edições, também em funcionamento).
Os poucos recursos que encontrei (google para "daemon writing unix") falam sobre etapas importantes, como dissociar o tty, etc. Mas nada sobre o UID / GID. Estranhamente, nem mesmo a extensa coleção HOWTO em http://tldp.org parece ter detalhes. Apenas excetion é de Jason Curto Vamos escrever uma Daemon Linux - parte I . Detalhes completos de como o SUID / SGID e toda essa bagunça funcionam são os desmistificados de Chen, Wagner e Dean (um artigo no USENIX 2002). Mas tenha cuidado, o Linux possui um UID extra, o FSUID (consulte Notas de incompatibilidade do Unol de Wolter : funções de configuração do UID para uma discussão).
Demonstrar um processo definitivamente não é para os fracos de coração. Considerações gerais de segurança são fornecidas no HOWTO da D. Wheeler Secure Programming para Linux e Unix - Criando software seguro . O Systemd promete simplificar a maior parte disso (e, assim, reduzir o espaço para erros que levam a problemas de segurança), consulte o manual do daemon .
fonte
setuid()
, o que permite que o processo altere seu UID arbitrariamente. Geralmente, o SUID destina-se a permitir uma escalada de permissões (sem privilégios -> privilegados), ao passo quesetuid()
só pode fazer o contrário.