Por que os executáveis estão em, e. / usr / sbin gravável por root?

30

Você poderia explicar por que um arquivo binário compilado (por exemplo, em /usr/sbin ) tem permissão de gravação para root user?

Para mim, isso é compilado. Significa que a escrita direta não tem uso e pode expor o arquivo a algum problema de segurança de alguma forma.

Um script (por exemplo, um arquivo bash ) pode ser gravável porque é basicamente um arquivo de texto, mas por que é o mesmo para um arquivo compilado em que nenhuma gravação é realmente necessária até onde eu sei?

Agradecemos antecipadamente pelo seu feedback.

    
por t1m0th33 26.01.2017 / 14:02

1 resposta

50

Realmente não importa se os arquivos em /bin (ou qualquer outro diretório padrão onde os executáveis são mantidos) são graváveis por root ou não. Em um servidor Linux que estou usando, eles são graváveis por root , mas na minha máquina do OpenBSD, eles não são.

Desde que não sejam graváveis pelo grupo ou por "outros"!

Não há nenhum problema de segurança, por exemplo,

-rwxr-xr-x 1 root root 126584 Feb 18  2016 /bin/ls

Se alguém quiser substituí-lo, ele precisará ser root e, se eles forem root e sobrescreverem, eles serão

  1. instalando uma nova versão ou
  2. desajeitado ou
  3. um invasor com root permissões já .

Outra coisa a considerar é que root pode gravar no arquivo independentemente de estar protegido contra gravação ou não, porque ... root .

Note também que "um script" é tanto executável quanto um arquivo binário. Um script não precisa ser gravável "porque é um arquivo de texto". Se qualquer coisa, provavelmente deveria ter a mesma permissão que os outros executáveis no mesmo diretório.

Não vá alterar as permissões em tudo agora! Isso pode causar todo tipo de confusão e potencialmente confundir os gerenciadores de pacotes que podem verificar se as permissões estão definidas corretamente. Isso também pode tornar o sistema vulnerável se você acidentalmente alterar as permissões de maneira errada em um aplicativo de segurança crítica.

Suponha apenas que as permissões nos executáveis estejam definidas corretamente, a menos que você encontre algo que pareça realmente ímpar, caso em que você provavelmente deveria contatar o mantenedor do pacote relevante para verificar ao invés de começar a mudar o material.

Nos comentários e no bate-papo , houve uma chamada por algum histórico.

O histórico das permissões em binários no Linux não é algo que eu saiba. Pode-se especular que eles simplesmente herdaram as permissões do diretório, ou apenas do padrão umask do Linux, mas eu realmente não sei.

O que eu sei é que o OpenBSD instala os binários no sistema básico 1 com o modo de permissão 555 por padrão ( -r-xr-xr-x ). Isso é especificado em um fragmento Makefile em /usr/share/mk/bsd.own.mk , que define BINMODE para 555 (a menos que já esteja definido). Isso é usado posteriormente ao instalar os executáveis durante make build in /usr/src .

Eu dei uma olhada no registro de CVS anotado para este arquivo , e descobriu que esta linha no arquivo é inalterada desde que foi importada do NetBSD em 1995.

No NetBSD, o arquivo era primeiro colocado no CVS em 1993, com BINMODE definido para 555.

O projeto FreeBSD parece ter usado exatamente o mesmo arquivo que o NetBSD desde pelo menos 1994 , e com um commit posterior adiciona uma dica na mensagem de commit que os arquivos antigos eram da versão 4.4BSD do o Berkeley Software Distribution.

Além disso, o CSRG em Berkeley manteve as fontes em SCCS mas seu repositório é disponível no formulário do Git no GitHub 2 . O arquivo que estamos dando o tratamento forencista aqui parece ter sido confirmado por Keith Bostic (ou alguém próximo a ele) em 1990.

Então essa é a história. Se você quer o porquê , então eu suponho que teremos que perguntar ao Keith. Eu estava meio que esperando ver uma mensagem de commit para uma mudança dizendo " isso precisa ser 555 porque ... ", mas não.

1 Os sistemas BSD possuem uma divisão mais estrita em "sistema base" e "ports / packages" do que no Linux. O sistema básico é uma unidade coerente que fornece um conjunto completo de instalações para executar o sistema operacional, enquanto as portas ou pacotes são vistos como "software local" e são instalados em /usr/local .

2 Um repositório GitHub mais abrangente de versões Unix dos anos 70 em diante está disponível também .

    
por 26.01.2017 / 14:14