Isso é baseado nesta questão de fraude aqui. O problema descrito é ter um script bash que contém algo com o efeito de:
rm -rf {pattern1}/{pattern2}
... que se ambos os padrões incluírem um ou mais elementos vazios serão expandidos para pelo menos uma instância de rm -rf /
, assumindo que o comando original foi transcrito corretamente e o OP estava fazendo expansão de chaves em vez de expansão de parâmetros .
Na explicação do OP sobre a fraude , ele afirma:
O comando é inofensivo, mas parece que quase ninguém percebeu.
A ferramenta Ansible evita esses erros, mas [...] ninguém parecia saber disso, caso contrário eles saberiam que o que eu descrevi não poderia acontecer.
Portanto, supondo que você tenha um script de shell que emita um rm -rf /
comando por meio de expansão entre chaves ou expansão de parâmetros, é verdade que o uso do Ansible impedirá que esse comando seja executado e, em caso afirmativo, como isso acontece?
A execução rm -rf /
com privilégios de root é realmente "inofensiva" desde que você esteja usando o Ansible para fazer isso?
rm
fonte, que analisei abaixo.Respostas:
Eu tenho máquinas virtuais, vamos explodir várias delas! Pela ciência.
Primeira tentativa:
OK,
command
apenas passa os literais e nada acontece.Que tal nosso desvio de segurança favorito
raw
?Não vá de novo! Quão difícil pode ser excluir todos os seus arquivos?
Ah, mas e se fossem variáveis indefinidas ou algo assim?
Bem, isso não funcionou.
Mas e se as variáveis forem definidas, mas vazias?
Finalmente, algum progresso! Mas ainda reclama que eu não usei
--no-preserve-root
.Claro, também me avisa que eu deveria tentar usar o
file
módulo estate=absent
. Vamos ver se isso funciona.Boas notícias, pessoal! Começou a tentar excluir todos os meus arquivos! Mas, infelizmente, ocorreu um erro. Vou deixar consertar isso e fazer com que o manual destrua tudo usando o
file
módulo como um exercício para o leitor.NÃO gere nenhum playbook que você veja além deste ponto! Você verá o porquê em um momento.
Finalmente, para o golpe de estado ...
Esta VM é um ex-papagaio !
Curiosamente, o acima falhou em fazer qualquer coisa em
command
vez deraw
. Apenas imprimiu o mesmo aviso sobre o usofile
comstate=absent
.Eu vou dizer que parece que se você não estiver usando
raw
isso, existe alguma proteção contra orm
mal. Você não deve confiar nisso, no entanto. Examinei rapidamente o código de Ansible e, embora encontrasse o aviso, não encontrei nada que realmente suprimisse a execução dorm
comando.fonte
/boot
.boot
é a primeira entrada de diretório em/
. Portanto, nenhum arquivo foi perdido.rm -rf {{x}}/{{y}}
quandoy
estiver definido como"*"
. A--no-preserve-root
verificação é útil para o que é, mas não o tira de todas as situações possíveis; é fácil o suficiente para ignorar. É por isso que essa pergunta não foi identificada como uma farsa imediatamente: levando em consideração o mau inglês e os aparentes erros de sintaxe, é plausível .raw
, um problemacron
pode ser outra maneira de destruir um sistema.O Ansible impedirá a execução de
rm -rf /
um script de shell?Inspecionei a fonte coreutils rm , que tem o seguinte:
A única maneira de apagar a raiz é ultrapassar esse bloco de código. A partir desta fonte :
Interpreto que isso significa que a função
get_root_dev_ino
retorna nula/
e, portanto, rm falha.A única maneira de ignorar o primeiro bloco de código (com recursão) é ter
--no-preserve-root
e ele não usa uma variável de ambiente para substituir, portanto, ele teria que ser passado explicitamente para rm.Eu acredito que isso prova que a menos que Ansible passa explicitamente
--no-preserve-root
pararm
, ele não vai fazer isso.Conclusão
Não acredito que o Ansible previna explicitamente
rm -rf /
porquerm
ele o impede.fonte