Permissões de arquivo no Linux

Olá a todos. Estamos trabalhando ativamente e já preparando muitos lançamentos poderosos em janeiro. Entre outros, foram anunciadas inscrições para um novo fluxo do curso favorito de todos. "Administrador Linux". Antecipando o lançamento, tradicionalmente compartilhamos traduções de materiais úteis.

Permissões de arquivo no Linux

As permissões de arquivo oferecem uma alternativa segura aos executáveis ​​SUID, mas podem parecer um pouco confusas no início.


Todos nós sabemos que binários SUID são má decisão do ponto de vista da segurança. Felizmente, se o seu aplicativo requer alguns privilégios limitados, existe uma maneira mais eficiente chamada permissões de arquivo.

Economizarei algum tempo se você quiser evitar a leitura detalhada do artigo acima: Essencialmente, as permissões de arquivo permitem processos que são executados como root e, portanto, têm permissão para fazer algo para reter certos recursos, limitados esta listaquando eles eliminam privilégios e são executados por um usuário sem privilégios. Isso significa que se um invasor conseguir comprometer um processo usando um buffer overflow ou outra exploração, ele não poderá tirar vantagem de nada além de certos privilégios mínimos que o processo realmente precisa.

As permissões são ótimas para serviços que normalmente sempre são executados como root, mas e os utilitários de linha de comando? Felizmente, isso também é compatível, desde que você tenha os utilitários corretos instalados. Se você estiver usando Ubuntu, você precisará, por exemplo, do pacote libcap2-bin. Você também precisará rodar um kernel não arcaico (da versão 2.6.24).

Essas funções permitem que permissões sejam associadas a arquivos executáveis, semelhante à configuração do bit SUID, mas apenas para um conjunto específico de permissões. Utilitário setcap usado para adicionar e remover permissões de um arquivo.

A primeira etapa é selecionar as permissões necessárias. Para fins deste artigo, presumo que exista uma ferramenta de diagnóstico de rede chamada tracewalk, que deve ser capaz de usar soquetes brutos. Isso geralmente requer que o aplicativo seja executado como root, mas ao visualizar listar acontece que apenas permissão é necessária CAP_NET_RAW.

Supondo que você esteja no diretório onde o binário está localizado tracewalk, você pode adicionar esta permissão assim:

sudo setcap cap_net_raw=eip tracewalk

Ignore o sufixo por enquanto =eip para resolução, falarei sobre isso em alguns segundos. Observe que o nome da permissão está em letras minúsculas. Agora você pode verificar se configurou as permissões corretamente com:

setcap -v cap_new_raw=eip tracewalk

Ou você pode listar todas as permissões definidas para um determinado executável:

getcap tracewalk

Para referência, você também pode remover todas as permissões do executável com:

setcap -r tracewalk

Neste ponto, você deverá ser capaz de executar o executável como um usuário sem privilégios e ele deverá ser capaz de trabalhar com soquetes brutos, mas não ter nenhum dos outros privilégios que o usuário root possui.

Então, o que significa esse sufixo estranho? =eip? Isso requer alguma compreensão da natureza das permissões. Cada processo tem três conjuntos de permissões - eficaz, herdável e permitido:

  • Eficaz Permissões são aquelas que definem o que um processo pode realmente fazer. Por exemplo, ele não pode lidar com soquetes brutos se CAP_NET_RAW não está no conjunto efetivo.
  • Disponível permissões são aquelas que um processo pode ter se as solicitar usando a chamada apropriada. Eles impedem que um processo realmente faça qualquer coisa, a menos que tenha sido escrito especificamente para solicitar essa permissão. Isso permite que processos sejam gravados para adicionar permissões críticas ao conjunto efetivo apenas durante o período em que forem realmente necessárias.
  • Herdável permissões são aquelas que podem ser herdadas no conjunto acessível do processo filho gerado. Durante a cirurgia fork() ou clone() o processo filho sempre recebe uma cópia das permissões do processo pai, pois ainda está executando o mesmo executável naquele ponto. Um conjunto herdável é usado quando exec() (ou equivalente) é chamado para substituir o arquivo executável por outro. Neste ponto, o conjunto disponível do processo é mascarado pelo conjunto herdável para obter o conjunto acessível que será utilizado para o novo processo.

Então a utilidade setcap nos permite adicionar as permissões desses três conjuntos de forma independente para um determinado executável. Observe que o significado dos grupos é interpretado de maneira um pouco diferente para permissões de arquivo:

  • Disponível permissões de arquivo são aquelas que estão sempre disponíveis para um arquivo executável, mesmo que o processo pai que o chamou não as possua. Costumavam ser chamadas de licenças “forçadas”.
  • Herdado as permissões de arquivo definem uma máscara adicional que também pode ser usada para remover permissões do conjunto do processo de chamada. Eles se aplicam além do conjunto herdado do processo de chamada, portanto a permissão será herdada somente se existir em ambos os conjuntos.
  • Eficaz as permissões de arquivo são, na verdade, apenas um bit, não um conjunto e, se definidas, significa que todo o conjunto disponível também será copiado para o conjunto efetivo do novo processo. Isso pode ser usado para adicionar permissões a processos que não foram escritos especificamente para solicitá-los. Como é um bit, se você defini-lo para qualquer permissão, ele deverá ser definido para todas as permissões. Você pode considerá-lo um bit legado porque é usado para permitir que permissões sejam usadas por aplicativos que não as suportam.

Ao especificar permissões via setcap três letras e, i и p relacionar-se com eficaz, herdável e acessível conjuntos respectivamente. Então, a especificação anterior:

sudo setcap cap_net_raw=eip tracewalk

...indica que a resolução CAP_NET_RAW deve ser adicionado aos conjuntos disponíveis e herdáveis ​​e que o bit efetivo também deve ser definido. Isso substituirá quaisquer permissões definidas anteriormente no arquivo. Para definir várias permissões de uma vez, use uma lista separada por vírgulas:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Guia de permissões discute tudo isso com mais detalhes, mas espero que este post tenha desmistificado um pouco o que está acontecendo. Restam apenas algumas advertências e truques a serem mencionados.

Primeiro, os recursos de arquivo não funcionam com links simbólicos - você deve aplicá-los ao próprio arquivo binário (ou seja, o destino do link simbólico).

Em segundo lugar, eles não funcionam com scripts interpretados. Por exemplo, se você tiver um script Python ao qual deseja atribuir permissão, deverá atribuí-lo ao próprio interpretador Python. Obviamente, este é um possível problema de segurança porque todos os scripts executados com esse intérprete terão a permissão especificada, embora isso ainda seja significativamente melhor do que torná-lo SUID. A solução mais comum parece ser escrever um executável separado em C ou equivalente que possa executar as operações necessárias e chamá-lo a partir de um script. Isso é semelhante à abordagem usada pelo Wireshark, que usa um binário /usr/bin/dumpcap para realizar operações privilegiadas:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

Terceiro, as permissões de arquivo serão desativadas se você usar uma variável de ambiente LD_LIBRARY_PATH por razões óbvias de segurança(1). O mesmo se aplica a LD_PRELOAD, até onde sei.

1. Como um invasor pode obviamente substituir uma das bibliotecas padrão e usar LD_LIBRARY_PATHpara forçar sua biblioteca a ser chamada em preferência à do sistema e, portanto, ter seu próprio código arbitrário executado com os mesmos privilégios do aplicativo chamador.

Isso é tudo. Mais detalhes sobre o programa do curso podem ser encontrados em webinar, que acontecerá no dia 24 de janeiro.

Fonte: habr.com

Adicionar um comentário