Qual é o objetivo da permissão de execução?

2

Suponha que setuid / setgid bits não sejam preocupantes. Por que há uma permissão separada para execução?

Filosoficamente, parece-me que a permissão de gravação inclui a permissão de leitura e que a permissão de leitura submete a permissão de execução. Claro, as coisas não são assim no Linux, e isso às vezes pode ser útil, mas eu diria que raramente é. Por exemplo, se um processo puder ler um arquivo que não seja executável, contanto que esse processo possa gravar em algum diretório, ele poderá simplesmente copiar o arquivo, definir o bit de execução e, em seguida, executar esse programa. Então, verdadeiramente, leia subsumes executar em casos simples. Obviamente, isso não funcionará corretamente se o arquivo de origem tiver o bit setuid ou se o processo puder gravar apenas em pontos de montagem noexec.

A razão pela qual eu pergunto é que estou implementando um syscall do Linux que permitiria que um processo em exec fosse um pedaço arbitrário de sua memória. (O caso de uso específico é que tenho um programa completo no meu programa principal, e não quero gravá-lo no disco para chamar execve .) Existe alguma preocupação séria com esse syscall que eu deveria estar ciente de?

    
por Jacob Errington 13.08.2017 / 15:38

2 respostas

2

  1. Ignorando o setuid / setgid , o único propósito do executar bit é:

    • Para permitir que um arquivo com o modo execute-only - execute o acesso a um arquivo que não seja legível.
  2. Com relação à segunda parte da sua pergunta, sobre o linux syscall que você implementou:

Parece que está criando uma nova fonte de ataque.

Se você quiser receber uma resposta séria, forneça detalhes (preferidos em uma nova pergunta):

  • Qual lógica você implementará?
  • Como os dados serão copiados para a RAM?
  • Quais verificações a API executará antes da execução do código na RAM?
  • A API também será executada por root (portanto, pode permitir escalação privilegiada )
por 13.08.2017 / 15:48
1

Como você supõe, a permissão de execução raramente é útil como uma permissão. Tê-lo como uma permissão e não como um atributo do arquivo é um pouco de um acidente histórico. No entanto, desde que existe, não vai desaparecer. Ter uma permissão de execução diferente da permissão de leitura é importante em dois casos.

  • Se a execução de um arquivo confere privilégios adicionais, importa quem pode executar esse arquivo em particular. Um executável setuid ou setgid ou setcap pode ser legível pelo mundo, mas não ser executável em todo o mundo (muitas distribuições tornam os arquivos setxid legíveis para o mundo, mesmo que não sejam executáveis por não serem confidenciais - qualquer um pode fazer o download do arquivo arquivos).
  • Algumas contas podem estar restritas de tal forma que não podem gravar nenhum conteúdo em um arquivo executável. Por exemplo, uma conta pode ter acesso somente a um shell restrito sem chmod ou só pode gravar em diretórios em um sistema de arquivos montado com noexec . Esse usuário está restrito aos arquivos executáveis que já existem.

Adicionar uma chamada de sistema para exec a partir da memória permite que contas restritas executem código arbitrário. É equivalente a ter um interpretador de código nativo acessível de qualquer lugar, até mesmo de contas restritas. Isso não seria aceito no kernel mainstream, uma vez que iria quebrar as restrições de segurança. Você pode implantá-lo em suas próprias máquinas, mas deve ter em mente as implicações.

No entanto, há muito trabalho e muita bagagem de segurança para carregar para um recurso que já existe. É possível executar código sem gravar no disco. Você só precisa escrever o código em um arquivo em um sistema de arquivos que não seja de disco, como o tmpfs.

    
por 14.08.2017 / 02:09