- VAROVÁNÍ NEPOKOUŠEJTE SE TOTO SPUSTIT NA VÝROBNÍM STROJI
Při čtení stránky Wikipedie na toto téma obecně sleduji, co se děje s následujícím kódem:
:(){ :|:& };:
úryvek z popisu
Následující vidlicová bomba byla prezentována jako umění v roce 2002;56
její přesný původ není znám, ale existovala na Usenetu před rokem 2002.
Bomba se spustí vložením následujících 13 znaků do
UNIX shell, jako je bash nebo zsh. Funguje tak, že definuje
funkci nazvanou „:“, která se volá dvakrát, jednou v popředí
a jednou na pozadí.
Poslední část mi však není úplně jasná. Vidím definici funkce:
:(){ ... }
Ale co se ještě děje? Proveďte také další shelly, jako je ksh
, csh
a tcsh
také trpí stejným osudem, že bude schopen postavit něco podobného?
Přijatá odpověď:
Tato vidlicová bomba mi vždy připomíná něco, co řekl učitel programování AI na jedné z prvních lekcí, které jsem navštívil:„Abyste pochopili rekurzi, musíte nejprve porozumět rekurzi.“
V jádru je tato bomba rekurzivní funkcí. V podstatě vytvoříte funkci, která se volá, která se volá, která se volá…. dokud nebudou spotřebovány systémové prostředky. V tomto konkrétním případě je rekurze zesílena použitím propojení funkce na sebe A jejího pozadí.
Viděl jsem to zodpovězené na StackOverflow a myslím, že uvedený příklad to ilustruje nejlépe, protože je snazší vidět, co to dělá na první pohled (ukradeno z odkazu výše…)
☃(){ ☃|☃& };☃
Definujte funkci chyby ☃() { ... }
, jehož tělo volá samo sebe (funkce bug), přivádí výstup na sebe (funkce bug) ☃|☃
a výsledek na pozadí &
. Poté, co je funkce definována, skutečně zavolejte funkci bug, ; ☃
.
Podotýkám, že alespoň na mém Arch VM není potřeba pozadí procesu požadavkem mít stejný konečný výsledek, spotřebovat veškerý dostupný prostor procesu a vykreslit hostitele b0rked. Vlastně jsem teď řekl, že se zdá, že to někdy ukončí proces útěku a po obrazovce -bash: fork: Resource temporarily unavailable
zastaví se s Terminated
(a journalctl
ukazuje bash core dumping).
Chcete-li odpovědět na vaši otázku o csh/tcsh, žádný z těchto shellů nepodporuje funkce, můžete pouze alias. Takže pro tyto shelly byste museli napsat skript shellu, který se volá rekurzivně.
Zdá se, že zsh čeká stejný osud (se stejným kódem), neprovádí výpis jádra a způsobuje, že Arch dává Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.
, ale stále pokračuje v rozvětvení. Po chvíli se zobrazí Killed process 162 (systemd-logind) ...
(a stále má rozvětvené zsh).
Zdá se, že Arch nemá pacman
verzi ksh, takže jsem to musel zkusit na debianu. ksh objektů do :
jako název funkce, ale pomocí něčeho – řekněte b()
místo toho se zdá, že má požadovaný výsledek.