Existe alguma maneira de impedir um usuário de criar executáveis ​​e executá-los?

31

Os ataques de ransomware podem usar explorações de dia zero, mas geralmente um invasor engana um usuário crédulo para executar um executável fazendo o download e clicando em.

Suponha que temos um usuário ingênuo e queremos restringi-lo ao caminho normal. Existe alguma maneira de impedi-los de criar um arquivo com privilégio executável?

Ou, de maneira mais geral, existe alguma maneira de criar uma lista de controle de acesso e definir que esse usuário possa executar apenas arquivos nessa lista?

Dov
fonte
7
Desabilitar a execução dessa maneira proibiria que os usuários pudessem fazer qualquer coisa no sistema. Não há mecanismo para isso embutido no sistema ou mesmo com software de terceiros que eu conheço para executar esse tipo de bloqueio de segurança
Thomas Ward
3
sem responder, mas sugerir o que você pode fazer: adicione noexec às montagens graváveis ​​pelo usuário. não impedirá scripts, mas a execução binária real.
GoFundMonica - codidact.org
3
@ThomasWard, não é exatamente isso que é um shell restrito?
Robert Riedl
7
@ThomasWard, existe um conceito geral de 'executáveis ​​da lista de permissões' em que uma certa lista de executáveis ​​(geralmente assinados) é permitida e nada mais pode ser executado sem privilégios elevados; e o Windows e o OS X têm soluções razoáveis ​​que fazem isso. Não sei se existe uma boa solução Ubuntu (ou outro Linux) para a lista de permissões de aplicativos.
Peteris
2
@ Peteris, existem várias soluções desse tipo. O meu favorito é ter um sistema de arquivos assinado, somente leitura, com seus executáveis ​​e montar todos os outros noexec, seguindo as linhas de como o ChromeOS usa dm_veritypara garantir a integridade do sistema de arquivos raiz. Para pessoas que não são tão hardcore, pode-se usar módulos EVM; veja wiki.gentoo.org/wiki/Extended_Verification_Module para obter a documentação do Gentoo sobre o mesmo.
Charles Duffy

Respostas:

50

O ataque específico sobre o qual você manifestou preocupação é:

geralmente um invasor engana um usuário crédulo para executar um executável fazendo o download e clicando em.

Pelo menos no caso comum em que o arquivo é baixado em um navegador da web, isso já deve ser evitado no Ubuntu pela aderência do navegador à política Execute-Permission Bit Required . As partes mais diretamente relevantes dessa política são:

  • Os aplicativos, incluindo áreas de trabalho e shells, não devem executar código executável a partir de arquivos quando ambos:

    • sem o bit executável
    • localizado no diretório inicial ou no diretório temporário de um usuário.
  • Os arquivos baixados de um navegador da Web, cliente de email etc. nunca devem ser salvos como executáveis.

Portanto, se um usuário é instruído a baixar um programa em um navegador da Web, o faz e tenta executar o arquivo clicando duas vezes nele, ele não será executado. Isso se aplica mesmo que o arquivo baixado seja um shell script ou mesmo um arquivo .desktop. (Se você já se perguntou por que os arquivos .desktop em seu diretório pessoal precisam ser marcados como executáveis, mesmo que não sejam realmente programas, é por isso.)

É possível que os usuários alterem esse comportamento através de alterações na configuração. A maioria não, e enquanto aqueles que provavelmente não deveriam, não é com isso que você deve se preocupar. A maior preocupação é o ataque mais complexo com o qual acho que você já está preocupado, no qual uma pessoa (ou bot) maliciosa instrui o usuário a baixar um arquivo específico, marcá-lo como executável (por meio do navegador de arquivos ou com chmod) e depois execute.

Infelizmente, restringir a capacidade de um usuário definir o bit de execução em um arquivo ou executar arquivos diferentes daqueles em alguma lista de permissões não atenuaria visivelmente o problema. Alguns ataques já funcionarão, e os que não o fizerem poderão ser modificados trivialmente para que funcionem. A questão fundamental é que o efeito de executar um arquivo pode ser alcançado mesmo se o arquivo não tiver permissões executáveis .

Isso é melhor ilustrado pelo exemplo. Suponha que evilseja um arquivo no diretório atual que, se recebesse permissões executáveis ​​( chmod +x evil) e run ( ./evil), faria algo errado. Dependendo do tipo de programa, o mesmo efeito pode ser alcançado por um dos seguintes:

Nenhum deles, nem mesmo o último, exige que o arquivo tenha permissões executáveis ​​ou que o usuário possa conceder permissões executáveis ​​ao arquivo.

Mas as instruções maliciosas nem precisam ser tão complicadas. Considere este comando não malicioso , que é uma das maneiras oficialmente recomendadas para instalar ou atualizar o NVM :

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

A razão pela qual não é malicioso é que o NVM não é malware, mas se a URL fosse para o script de alguém que faz mal ao executar, esse comando faria o download e executaria o script. Em nenhum momento qualquer arquivo precisaria receber permissões executáveis. Baixar e executar o código contido em um arquivo malicioso com um único comando como este é, acredito, uma ação bastante comum que os invasores induzem os usuários a executarem.

Você pode tentar restringir quais intérpretes estão disponíveis para os usuários executarem. Mas não há realmente uma maneira de fazer isso que não afete substancialmente as tarefas comuns que você presumivelmente deseja que os usuários possam executar. Se você estiver configurando um ambiente extremamente restrito no qual quase tudo o que um usuário pensa em fazer no computador é proibido, como um quiosque que executa apenas alguns programas, isso pode fornecer uma certa proteção significativa. Mas não parece que esse é seu caso de uso.

Portanto, a resposta aproximada à sua pergunta é "Não". A resposta mais completa é que você provavelmente conseguirá impedir que os usuários executem arquivos, exceto aqueles que você fornece em uma lista de permissões. Mas isso é no sentido estrito e técnico de "executar", que não é necessário para obter o efeito total da execução da maioria dos programas ou scripts. Para evitar isso , você pode tentar tornar a lista de permissões muito pequena, para não listar intérpretes, exceto aqueles que podem ser altamente restritos. Mas mesmo se você conseguisse isso, os usuários não poderiam fazer muito e, se você o tornasse tão pequeno que não se machucasse, provavelmente não poderia fazer nada. (Veja o comentário de Thomas Ward .)

Se seus usuários podem se machucar, eles podem ser enganados.

Você pode impedir que programas específicos sejam usados ​​ou se comportem de maneiras que possam ser prejudiciais e, se você observar padrões específicos que o ransomware tende a seguir, poderá evitar alguns casos comuns específicos. (Consulte AppArmor .) Isso pode fornecer algum valor. Mas isso não lhe dará nada perto da solução abrangente que você espera.

Quaisquer que sejam as medidas técnicas (se houver) que você acaba adotando, sua melhor aposta é educar os usuários. Isso inclui dizer a eles para não executar comandos que eles não entendem e não usar arquivos baixados em situações em que não poderiam explicar por que é razoavelmente seguro fazê-lo. Mas também inclui coisas como fazer backups, de modo que, se algo der errado (devido a malware ou outro), o dano causado será o mínimo possível.

Eliah Kagan
fonte
6
Talvez as medidas não técnicas precisem incluir informações de contato para alguém que possa verificar a sanidade de algo que deseja fazer. Sempre que não tiver certeza, ligue ou envie uma mensagem e peça. Isso pode remover a tentação de adivinhar.
Peter Cordes
11
Este é um ótimo resumo sobre as questões e os medos por trás da questão dos OPs
Robert Riedl
Nit menor: " . ./evilou source ./evilexecuta os comandos em evil.sh" - Esses sourcecomandos executariam os comandos a evilmenos que eles especifiquem a extensão, por exemplo. ./evil.sh
Pausado até novo aviso.
@DennisWilliamson Thanks - corrigido! Isso foi deixado de um rascunho antigo (não enviado) da resposta em que usei nomes de script diferentes. Eu rapidamente percebi que isso era bobo, mas aparentemente falhei em mudar todas as ocorrências.
Eliah Kagan
11
Toda vez que vejo uma maneira de instalar ou atualizar um software que envolve "apenas executar esse script e executá-lo", minhas unhas dos pés se curvam um pouco. Nada impede que alguém crie uma conta / repositório do GitHub desativada por um único caractere, use 0 em vez de O ou use caracteres UTF-8 para obscurecer e colocar seu próprio script malicioso nele ... então tudo o que você precisa é de um erro de digitação no seu comando wget e bam.
Ian Kemp
11

SIM *


É chamado de shell restrito.

Você pode usar o /bin/rbashque já está disponível no Ubuntu e combiná-lo com uma variável PATH restrita . O rbashproibirá a execução de qualquer coisa que não esteja presente $PATH.

Adicione um usuário restrito:

sudo adduser --shell /bin/rbash res-user

Crie um novo diretório, no qual possamos vincular binários, ao qual o usuário será limitado a:

sudo mkdir /home/res-user/bin

Modifique o .profilearquivo:

sudo vim /home/res-user/.profile

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

readonly PATH=/home/res-user/bin
export PATH

Faça o .profile, bashrce .bash_profileimutável:

sudo chattr +i /home/res-user/.profile
sudo chattr +i /home/res-user/.bashrc
sudo chattr +i /home/res-user/.bash_profile

Agora, damos ao usuário a única coisa que ele poderá fazer, ou seja, abra o Firefox:

sudo ln -s /usr/lib/firefox/firefox /home/res-user/bin/

Agora, se fizermos login res-user, podemos apenas abrir o Firefox:

res-user@localhost:~$ /home/res-user/bin/firefox --version
Mozilla Firefox 68.0.1

Não podemos escapar facilmente de nossa concha restrita:

res-user@localhost:~$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
-su: PATH: readonly variable

O usuário restrito não pode tornar os arquivos executáveis ​​ou iniciá-los:

res-user@localhost:~$ chmod +x script.sh 
Command 'chmod' is available in '/bin/chmod'
res-user@localhost:~$ bash script.sh 
Command 'bash' is available in '/bin/bash'
The command could not be located because '/bin' is not included in the PATH environment variable.
bash: command not found

O usuário restrito não pode executar scripts maliciosos da Internet, porque o usuário não pode executar os comandos necessários:

res-user@localhost:~$ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
Command 'wget' is available in '/usr/bin/wget'
The command could not be located because '/usr/bin' is not included in the PATH environment variable.
wget: command not found
Command 'bash' is available in '/bin/bash'
The command could not be located because '/bin' is not included in the PATH environment variable.
bash: command not found

* Existem maneiras de romper conchas restritas , mas se o usuário for capaz disso, elas podem não ser tão ingênuas quanto você pensa.

Robert Riedl
fonte
2
Isso tenta alcançar "um ambiente extremamente restrito no qual quase tudo o que um usuário pensa em fazer no computador é proibido" (como eu disse na minha resposta). res-usernão pode fazer login graficamente. A única coisa útil que eles podem fazer é ssh -Xentrar e sair correndo firefox. Você pode permitir mais comandos para que o usuário possa fazer seu trabalho. Então sair fica mais fácil. Vários dos métodos vinculados podem ser transformados em one-liners (que um invasor pode fornecer). Se os usuários encontrarem restrições sufocantes, se tornarão especialistas em contorná-las, mantendo-se tão esclarecidos ou ingênuos quanto antes.
Eliah Kagan
11
@EliahKagan sim, correto. Você teria que vincular tudo o que o usuário precisa. Mas isso está muito próximo de [...] haver alguma maneira de criar uma lista de controle de acesso e definir que esse usuário só pode executar arquivos nessa lista [...] . Portanto, isso pode ajudar o OP. Quebrar essas conchas não é impossível, mas é bastante difícil. Tivemos configurações semelhantes para acesso externo a recursos específicos ou jump-hosts. Duvido que haja ataques amplos por aí, contra configurações de shell restrito ... e se você estiver lidando com um ataque direcionado , em que o invasor conhece o ambiente ... todas as apostas estão desativadas de qualquer maneira.
Robert Riedl
4
Eu elevaria a nota de rodapé para a primeira linha da sua resposta.
Pausado até novo aviso.
Provavelmente é melhor que eles usem o chrome no modo quiosque ou outro navegador protegido. Deve ser bem fácil instalar um plug-in ou extensão do firefox com permissão muito elevada e execução de comandos do sistema. No firefox, use a última versão e não permita extensões.
Benjamin Gruenbaum
Para proteção adicional, forneça ao usuário acesso de gravação apenas aos sistemas de arquivos montados com a opção noexec.
Dan D.