Jest to oparte na tym mistyfikacyjnym pytaniu tutaj. Opisany problem polega na posiadaniu skryptu bash, który zawiera coś takiego:
rm -rf {pattern1}/{pattern2}
... który, jeśli oba wzorce zawierają jeden lub więcej pustych elementów, rozwinie się do co najmniej jednej instancji rm -rf /
, przy założeniu, że oryginalne polecenie zostało poprawnie przepisane, a OP wykonał interpretację nawiasów zamiast ekspansji parametrów .
W wyjaśnieniu OP dotyczącym mistyfikacji stwierdza:
Polecenie [...] jest nieszkodliwe, ale wydaje się, że prawie nikt tego nie zauważył.
Narzędzie Ansible zapobiega tym błędom, [...] ale [...] wydaje się, że nikt tego nie wie, w przeciwnym razie wiedziałby, że to, co opisałem, nie mogłoby się zdarzyć.
Zakładając, że masz skrypt powłoki, który wydaje rm -rf /
polecenie poprzez rozwinięcie nawiasów lub rozszerzenie parametrów, czy to prawda, że użycie Ansible uniemożliwi wykonanie tego polecenia, a jeśli tak, to w jaki sposób?
Czy wykonywanie rm -rf /
z uprawnieniami administratora jest naprawdę „nieszkodliwe”, o ile używasz do tego Ansible?
rm
źródle, które przeanalizowałem poniżej.Odpowiedzi:
Mam maszyny wirtualne, wysadźmy ich kilka! Dla nauki.
Pierwsze podejscie:
Ok, więc
command
po prostu przekazuje literały i nic się nie dzieje.A może nasza ulubiona obwodnica bezpieczeństwa
raw
?Nie idź ponownie! Jak trudne może być usunięcie wszystkich plików?
Och, ale co, jeśli byłyby to niezdefiniowane zmienne czy coś?
Cóż, to nie zadziałało.
Ale co, jeśli zmienne są zdefiniowane, ale puste?
Wreszcie trochę postępu! Ale nadal narzeka, że nie użyłem
--no-preserve-root
.Oczywiście, również ostrzega mnie, że powinienem spróbować korzystania z
file
modułu istate=absent
. Zobaczmy, czy to zadziała.Dobre wieści wszyscy! Zaczęło próbuje usunąć wszystkie moje pliki! Ale niestety wpadł w błąd. Zostawię naprawienie tego i nakłonienie playbooka do zniszczenia wszystkiego za pomocą
file
modułu jako ćwiczenia dla czytelnika.NIE uruchamiaj żadnych poradników, które zobaczysz poza tym punktem! Za chwilę zobaczysz dlaczego.
Wreszcie dla zamachu stanu ...
Ta VM jest byłą papugą !
Co ciekawe, powyższe nie pomogło nic zrobić
command
zamiastraw
. Po prostu wydrukował to samo ostrzeżenie o korzystaniufile
zstate=absent
.Powiem, że wygląda na to, że jeśli nie używasz
raw
tego, istnieje pewna ochrona przedrm
odejściem amoka. Jednak nie powinieneś na tym polegać. Szybko przejrzałem kod Ansible i chociaż znalazłem ostrzeżenie, nie znalazłem niczego, co faktycznie powstrzymałoby uruchomienierm
polecenia.źródło
/boot
.boot
jest to pierwszy wpis w katalogu/
. Więc żadne pliki nie zostały utracone.rm -rf {{x}}/{{y}}
kiedyy
jest ustawiony na"*"
.--no-preserve-root
Wyboru jest przydatna do tego, co to jest, ale to nie będzie cię z każdej możliwej sytuacji; łatwo to ominąć. Dlatego pytanie to nie zostało natychmiast uznane za mistyfikację: biorąc pod uwagę zły angielski i widoczne błędy składniowe, jest prawdopodobne .raw
złycron
może być innym sposobem na zniszczenie systemu.Czy Ansible uniemożliwi wykonanie
rm -rf /
skryptu powłoki?Sprawdziłem źródło rm coreutils , które ma następujące cechy :
Jedynym sposobem na wyczyszczenie z katalogu głównego jest ominięcie tego bloku kodu. Z tego źródła :
Interpretuję to w ten sposób, że funkcja
get_root_dev_ino
zwraca null/
, a zatem rm kończy się niepowodzeniem.Jedynym sposobem na ominięcie pierwszego bloku kodu (z rekurencją) jest posiadanie
--no-preserve-root
go i nie używa on zmiennej środowiskowej do zastąpienia, więc musiałby zostać jawnie przekazany do rm.Wierzę, że to dowodzi, że chyba ansibl wyraźnie przechodzi
--no-preserve-root
dorm
, to nie będzie to zrobić.Wniosek
Nie wierzę, że Ansible wyraźnie zapobiega,
rm -rf /
ponieważrm
sam temu zapobiega.źródło