Algumas noções básicas sobre caminhos de pesquisa
Quando você executa um comando que não contém barras, como vim
, o shell precisa saber qual arquivo (ou shell construído / função) executar. Ele encontra isso seguindo o caminho de pesquisa, definido na variável de ambiente PATH
. A variável PATH
é uma lista de caminhos separados por dois pontos e o shell procurará o nome do comando em cada um desses caminhos nessa ordem.
Por exemplo, um PATH
básico de uma instalação Debian se parece com o seguinte:
/usr/local/bin:/usr/bin:/bin
Nesse caso, você encontra /usr/bin/vim
primeiro, conforme mostrado pela saída de which vim
e type vim
.
Agora, quando você executar um comando via sudo
, onde as opções env_reset
e secure_path
são especificadas, sudo
redefinirá o caminho de pesquisa para o conteúdo de secure_path
antes de executar o comando que você passa. Isso significa que um comando executado por meio de sudo
poderia ter um caminho de pesquisa diferente e poderia encontrar um executável diferente da execução direta do comando.
Por exemplo, um% básicosudo
PATH
do Debian:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Seu cenário
O que eu suspeito que está acontecendo aqui é o seu secure_path
especifica uma ordem em que /bin
vem antes de /usr/bin
ou o último não existe. Nesse caso, o shell procurará vim
e, eventualmente, encontrará /bin/vim
, desde que ele exista. E se apenas /usr/bin/vim
estiver na lista de permissões, o primeiro não poderá ser executado.
Você pode verificar seu atual PATH
com echo $PATH
. Você pode verificar o sudo
de PATH
com sudo env | grep PATH
. Se o seu administrador tiver definido listas de permissão somente permitindo vim
, você poderá acessar sudo vim
e executar o comando :echo $PATH
.
Você deve conseguir contornar isso especificando um caminho absoluto, por exemplo, sudo /usr/bin/vim
.
Por que o search_path
existe?
Quanto a por que sudo
define um caminho diferente, considere este cenário de ataque:
Seu PATH
é apenas uma variável de ambiente. Pode ser definido de muitas maneiras diferentes, possivelmente invisíveis para o usuário. Você pode ter diretórios inseguros que permitem que qualquer um escreva para eles. Se alguém criar um arquivo executável mal-intencionado chamado algo como ls
, quando você executar ls
, estará executando esse arquivo em vez do ls
real.
Mas o dano seria limitado ao que sua conta tem acesso. Agora, digamos que você execute sudo ls
- se o PATH
for retirado do seu atual PATH
em vez de ser redefinido, você executará agora um executável mal-intencionado com privilégios de root - um ataque de escalonamento de privilégios. Muito mais dano possível do que apenas correr como seu próprio usuário.
Agora, você pode argumentar que um invasor com a capacidade de colocar arquivos no seu PATH
ou modificar seu PATH
já pode causar muitos danos. E você provavelmente está certo. Há opiniões de ambos os lados sobre a utilidade de secure_path
, que não vou abordar aqui.