Por que os executáveis ​​em, por exemplo, / usr / sbin, podem ser gravados por root?

31

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

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

Um script (por exemplo, um basharquivo) 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, tanto quanto eu saiba?

Agradecemos antecipadamente o seu feedback.

t1m0th33
fonte
6
Apenas para esclarecer, você está se perguntando por que o usuário roottem permissão de gravação em um arquivo binário? Se nada mais ajudaria ao atualizar esse pacote.
precisa saber é o seguinte
5
Observe que arquivos ironicamente binários são os únicos arquivos que normalmente escrevemos / editamos diretamente no disco. Não podemos fazer isso com arquivos de texto como scripts, porque as modificações de texto envolvem não gravar no arquivo, mas adicionar bytes extras no meio do arquivo ou excluir bytes no meio do arquivo. Isso é impossível de se fazer com fseek fwrite. Portanto, para arquivos de texto, normalmente lemos para a RAM, excluímos o arquivo antigo e gravamos o conteúdo da RAM no disco (ou seja, sobrescrevemos). Além disso, quando você instala, move ou substitui executáveis, está gravando no disco e precisa de permissões de gravação.
precisa saber é
1
@lebetman: Você pode editar diretamente arquivos de texto. Por exemplo, abra o arquivo, estenda-o, mapeie-o pela memória, use-o memmove()para mover a última parte até o fim e abrir um furo, depois insira um novo texto no furo. Ou você pode usar uma série de pread()/ pwrite()para fazer o mesmo.
Zan Lynx
6
@EricRenouf Na verdade, não é necessário ter permissões de gravação no arquivo binário para atualizar o pacote que o contém. Na atualização do pacote, o binário antigo não é gravado; de fato, isso é impossível se o binário estiver em execução no momento (procure ETXTBSY). Em vez disso, o binário antigo é removido e o novo binário é gravado em um novo arquivo com o mesmo nome. A remoção de arquivos não requer permissões de gravação, apenas no diretório que os contém (por exemplo, /usr/sbin/).
marcelm
1
@marcelm: Estritamente falando, você não está apenas usando o fseek e a gravação, mas também o buffer para a RAM. Você também pode armazenar o restante em outro arquivo. Ou você pode gravar novo conteúdo em um novo arquivo. Nada disso permite que você estenda arquivos de texto sem algum tipo de buffer grande.
slebetman

Respostas:

50

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

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

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

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

Se alguém quisesse sobrescrevê-lo, teria que ser root e, se é roote sobrescrevê-lo, então eles serão

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

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

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

Não altere as permissões de tudo agora! Isso pode causar todos os tipos de estragos e potencialmente confundir os gerenciadores de pacotes que podem verificar se as permissões estão definidas corretamente. Também pode tornar o sistema vulnerável se você alterar acidentalmente as permissões da maneira errada em um aplicativo crítico de segurança.

Apenas suponha que as permissões nos executáveis ​​estejam definidas corretamente, a menos que você encontre algo realmente estranho; nesse caso, você provavelmente deve entrar em contato com o mantenedor do pacote relevante para verificar em vez de começar a mudar as coisas.


A partir dos comentários e no bate-papo , houve um chamado para um pouco de história.

O histórico das permissões nos 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 umaskdo Linux, mas eu realmente não sei.

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

Eu dei uma olhada no log do CVS anotado para esse arquivo e descobri que essa linha no arquivo não foi alterada desde que foi importada do NetBSD em 1995.

No NetBSD, o arquivo foi colocado no CVS pela primeira vez em 1993, com BINMODE555.

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

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

Então essa é a história. Se você quer o porquê , acho que teremos que perguntar a Keith. Eu meio que esperava ver uma mensagem de confirmação para uma alteração dizendo " isso precisa ser 555 porque ... ", mas não.

1 Os sistemas BSD possuem uma divisão mais rígida em "sistema base" e "pacotes de terceiros" (portas / pacotes) que o Linux. O sistema base é uma unidade coerente que fornece um conjunto completo de recursos para a execução do sistema operacional, enquanto as portas ou pacotes são vistos como "software local" e instalados em /usr/local.

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

Kusalananda
fonte
1
Obrigado pela resposta. A permissão de gravação é normal, pois realmente não importa como usuário root (ele pode fazer qualquer coisa). Mas, como isso realmente não importa, por que não colocamos nenhuma permissão de gravação se é a mesma desde o início? É uma decisão arbitrária?
precisa saber é o seguinte
1
@ t1m0th33 Eu acredito que pode ser uma decisão arbitrária que alguém tomou, sim. Como eu disse, no meu sistema OpenBSD, os arquivos nesses locais não são graváveis root.
Kusalananda
1
Não acho que seja uma decisão consciente de ninguém. O gerenciador de pacotes assume como padrão instalar o arquivo com os bits de permissão com os quais eles terminaram durante o processo de compilação; durante a construção da vinculador criou os arquivos com permissões de 755, porque isso é o que você começa quando você subtrair o umask de 777, ea raiz umask (em máquinas de construção do vendedor OS) teve enquanto edifício foi 022 porque 022 é o umask padrão para todos e tomada ser 222 para a raiz seria um trabalho extra inútil.
Henning Makholm
8
+1 em "Não altere as permissões de tudo agora!" Vejo tantas perguntas como essa sobre ASK Ubuntu onde o usuário fez chmod -R em /usrou /var, e surpresa - o seu sudonão está funcionando ou outra coisa não está funcionando.
Sergiy Kolodyazhnyy
4
Historicamente, a ausência de permissão de gravação para o root não teria efeito (o root pode chmod qualquer coisa, e nem precisa, porque o root nunca abre um EPERM ao abrir ou gravar). Gostaria de saber se esta 555 coisa começou porque ele tinha realmente tornar-se possível para o root para ser restrito (quando foi securelevels mostrar pela primeira vez em torno do mesmo tempo como 4.4BSD ou início de 386BSD / NetBSD?)