Embora você restrinja os argumentos da linha de comando, não há nada que impeça o usuário de usar o vim para abrir, editar e sobrescrever qualquer arquivo aleatório quando estiver rodando como root.
O usuário pode executar sudo vim /etc/httpd/conf/httpd.conf
e, em seguida,
- limpe todo o texto do buffer de edição
- então para a fonte de conveniência um arquivo existente (embora isso nem seja necessário): por exemplo a configuração sudo
:r /etc/sudoers
NOTA: A menos que seja restrito pelo SELinux, o usuário pode ler qualquer arquivo caminho! - conceda-se mais privilégios sudo
user ALL=(ALL) NOPASSWD: ALL
- sobrescrever a configuração antiga
:w /etc/sudoers
Posso imaginar dezenas de maneiras semelhantes pelas quais seu usuário agora pode acessar, modificar ou destruir seu sistema.
Você nem mesmo terá uma trilha de auditoria cujos arquivos foram alterados dessa forma, pois você só verá ele editando sua configuração do Apache nas mensagens do log do sudo. Este é um risco de segurança ao conceder sudo
privileges a qualquer editor.
Esse é mais ou menos o mesmo motivo pelo qual a concessão de direitos de nível raiz sudo a comandos como tar
e unzip
geralmente é insegura, nada impede que você inclua substituições para binários do sistema ou arquivos de configuração do sistema no archive. / p>
Um segundo risco, como muitos outros comentaristas apontaram, é que vim
permite escapes de shell , onde você pode iniciar um sub-shell de dentro do vim que permite executar qualquer comando arbitrário . Dentro da sessão do sudo vim, eles serão executados como root, por exemplo, o shell escape:
-
:!/bin/bash
lhe dará um shell de raiz interativo -
:!/bin/rm -rf /
fará boas histórias no pub.
O que fazer em vez disso?
Você ainda pode usar sudo
para permitir que os usuários editem arquivos que não possuem de maneira segura.
Na sua configuração de sudoers, você pode definir um comando reservado especial sudoedit
seguido do nome completo do caminho (curinga) para o (s) arquivo (s) que um usuário pode editar:
user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
O usuário pode então usar a opção -e
em sua linha de comando sudo ou usar o comando sudoedit
:
sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf
Como explicado na página do manual :
The
-e (edit)
option indicates that, instead of running a command, the user wishes to edit one or more files. In lieu of a command, the string "sudoedit" is used when consulting the security policy.
If the user is authorized by the policy, the following steps are taken:
- Temporary copies are made of the files to be edited with the owner set to the invoking user.
- The editor specified by the policy is run to edit the temporary files. The sudoers policy uses the SUDO_EDITOR, VISUAL and EDITOR environment variables (in that order). If none of SUDO_EDITOR, VISUAL or EDITOR are set, the first program listed in the editor
sudoers
(5) option is used.- If they have been modified, the temporary files are copied back to their original location and the temporary versions are removed.
If the specified file does not exist, it will be created.
Note that unlike most commands run by sudo, the editor is run with the invoking user's environment unmodified. If, for some reason, sudo is unable to update a file with its edited version, the user will receive a warning and the edited copy will remain in a temporary file.
O sudoers
manual também tem uma seção inteira como ele pode oferecer proteção limitada contra shell escapes com as opções RESRICT
e NOEXEC
.
restrict
Avoid giving users access to commands that allow the user to run arbitrary commands. Many editors have a restricted mode where shell escapes are disabled, though sudoedit is a better solution to running editors via sudo. Due to the large number of programs that offer shell escapes, restricting users to the set of programs that do not is often unworkable.
e
noexec
Many systems that support shared libraries have the ability to override default library functions by pointing an environment variable (usually LD_PRELOAD) to an alternate shared library. On such systems, sudo's noexec functionality can be used to prevent a program run by sudo from executing any other programs. Note,... ...
To enable noexec for a command, use theNOEXEC
tag as documented in the User Specification section above. Here is that example again:aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
This allows user aaron to run/usr/bin/more
and/usr/bin/vi
with noexec enabled. This will prevent those two commands from executing other commands (such as a shell).