Olá a todos. Estamos ativamente nos integrando ao trabalho e já em janeiro preparamos muitos lançamentos poderosos. Entre outros, estamos anunciando a abertura de novas turmas do curso que todos amaram. . Na antevéspera do lançamento, tradicionalmente compartilhamos a tradução de material útil.

As permissões de arquivo oferecem uma alternativa segura para arquivos executáveis SUID, mas podem parecer um pouco confusas à primeira vista.
Todos nós sabemos que os arquivos binários são Felizmente, se seu aplicativo requer algumas permissões limitadas, existe uma maneira mais eficiente chamada .
Vou economizar seu tempo se você quiser evitar a leitura detalhada do artigo acima: essencialmente, as permissões de arquivo permitem que processos executados no nome do usuário root, e portanto, têm o direito de fazer qualquer coisa, mantenham certas capacidades restritas a , quando eles desligam as permissões e rodam como um usuário não privilegiado. Isso significa que, se um invasor conseguir comprometer um processo através de um estouro de buffer ou outro exploit, ele não poderá obter nada além de certas permissões mínimas que são realmente necessárias para o processo.
As permissões são ótimas para serviços que geralmente sempre rodam sob o nome do usuário root, mas e quanto às utilitários de linha de comando? Felizmente, isso também é suportado, desde que você tenha as utilitários adequadas instaladas. Se você estiver usando o Ubuntu, precisará do pacote libcap2-bin.Você também precisará rodar um núcleo não arcaico (a partir da versão 2.6.24).
Essas funções permitem vincular permissões a arquivos executáveis de forma semelhante à configuração do bit SUID, mas apenas para um conjunto específico de permissões. A ferramenta setcap é usada para adicionar e remover permissões de um arquivo.
O primeiro passo é escolher as permissões que você precisa. Para este artigo, suponho que existe uma ferramenta de diagnóstico de rede chamada tracewalk, que deve ser capaz de utilizar Normalmente, isso requer que o aplicativo seja executado sob o nome do usuário root, mas ao examinar descobrimos que só é necessária a permissão CAP_NET_RAW..
Assumindo que você esteja no diretório onde o executável está localizado tracewalk, você pode adicionar essa permissão da seguinte forma:
sudo setcap cap_net_raw=eip tracewalk Ignore o sufixo por enquanto =eip para a permissã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 tracewalkOu você pode listar todas as permissões definidas para o executável:
getcap tracewalk
Para sua informação, você também pode remover todas as permissões do executável usando:
setcap -r tracewalkNesse ponto, você deve ser capaz de executar o arquivo executável como um usuário não privilegiado, e ele deve ser capaz de trabalhar com sockets brutos, mas não ter nenhuma outra privilégio que o usuário root possui.
Então, o que significa esse estranho sufixo =eip? Здесь потребуется толика понимания природы разрешений. Каждый процесс имеет три набора разрешений — efetivas, herdáveis e permitidas (effective, inheritable e permitted):
- Efetivas (Effective) as permissões são aquelas que determinam o que o processo pode realmente fazer. Por exemplo, ele não pode lidar com sockets brutos se
CAP_NET_RAW.não estiver no conjunto efetivo. - Permitidas (Permitted) as permissões são aquelas que o processo está autorizado a ter se as solicitar com a chamada apropriada. Elas não permitem que o processo realmente faça nada, a menos que tenha sido especificamente escrito para solicitar a permissão especificada. Isso permite que os processos sejam escritos para adicionar permissões especialmente importantes ao conjunto efetivo apenas pelo tempo em que realmente são necessárias.
- Herdáveis (Inheritable) as permissões são aquelas que podem ser herdadas no conjunto disponível do processo filho gerado. Durante a operação
fork()ouclone()o processo filho sempre recebe uma cópia das permissões do processo pai, uma vez que nesse momento ele ainda está executando o mesmo executável. O conjunto herdável é usado quandoexec()(ou equivalente) é chamado para substituir o executável por outro. Nesse ponto, o conjunto disponível do processo é mascarado pelo conjunto herdável para obter o conjunto disponível que será usado para o novo processo.
Assim, a ferramenta setcap permite-nos adicionar permissões desses três conjuntos de forma independente para este executável. Observe que o valor do grupo é interpretado de forma um pouco diferente para as permissões de arquivos:
- Fontes de alimentação as permissões de arquivo são aquelas que sempre estão disponíveis para o executável, mesmo que o processo pai que o chamou não as possuísse. Antigamente eram conhecidas como permissões 'forçadas'.
- Herdadas as permissões de arquivo definem uma máscara adicional que também pode ser usada para remover permissões do conjunto do processo chamador. Elas são aplicadas além do conjunto herdado do processo chamador, portanto, a permissão só é herdada se existir em ambos os conjuntos.
- Eficazes as permissões de arquivo na verdade representam apenas um bit, e não um conjunto, e se estiver configurado, isso significa que todo o conjunto disponível também é copiado para o conjunto efetivo do novo processo. Isso pode ser usado para adicionar permissões a processos que não foram especificamente escritos para solicitá-las. Como esse é um bit, se você o configurar para alguma permissão, ele deve ser configurado para todas as permissões. Você pode pensar nele como um bit legado, pois é usado para permitir o uso de permissões para aplicativos que não as suportam.
Ao especificar permissões através de setcap três letras e, i e p referem-se a efetivo, herdado e acessível conjuntos, respectivamente. Assim, a especificação anterior:
sudo setcap cap_net_raw=eip tracewalk indica que a permissão CAP_NET_RAW. deve ser adicionada aos conjuntos disponíveis e herdados e que o bit efetivo deve ser definido. Isso substituirá quaisquer permissões anteriormente estabelecidas no arquivo. Para definir várias permissões ao mesmo tempo, use uma lista separada por vírgulas:
sudo setcap cap_net_admin,cap_net_raw=eip tracewalkdiscute tudo isso em mais detalhes, mas, espero, esta postagem desmistificou um pouco o que está acontecendo. Resta apenas mencionar algumas advertências e truques.
Primeiro, as capacidades de arquivo não funcionam com links simbólicos — você deve aplicá-las ao próprio arquivo binário (ou seja, ao 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ões, deve atribuí-las ao próprio interpretador Python. Isso é, evidentemente, um potencial problema de segurança, pois, assim, todos os scripts executados com esse interpretador terão a permissão especificada, embora ainda seja muito melhor do que fazer SUID. A solução mais comum parece ser escrever um executável separado em C ou equivalente, que possa realizar as operações necessárias e chamá-lo a partir do script. Isso é semelhante à abordagem utilizada pelo Wireshark, que utiliza um arquivo binário. /usr/bin/dumpcap para executar operações privilegiadas:
$ getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip Em terceiro lugar, as permissões de arquivos são desativadas se você usar uma variável de ambiente LD_LIBRARY_PATH por razões de segurança óbvias(1). O mesmo se aplica a LD_PRELOAD, pelo que sei.
1. Como um invasor, evidentemente, pode substituir uma das bibliotecas padrão e usar LD_LIBRARY_PATH, para fazer com que sua biblioteca seja chamada em vez da sistema, e, assim, ter seu próprio código arbitrário executado com os mesmos privilégios que o aplicativo chamador.
Isso é tudo. Detalhes sobre o programa do curso estarão disponíveis no
Fonte: habr.com
