Bu şifreli Bash komutu ne anlama geliyor?


23

Ubuntu Forum'un kötü niyetli komutlarla ilgili uyarısını okudum ve şu ilginç cevheri buldum:

:(){ :|:& };:

UYARI: Yukarıdaki kod olacak siz (muhtemelen yoktur) sert bir yeniden başlatma isteyen yerinde sıkı proc sınırlarını yoksa makinenizi çökmesine.

Bu kodu çalıştırmaya benzer şekilde düşünün sudo rm -rf /.

Ama bu ne anlama geliyor? Programlama deneyimimde bile, derleme dili olmayan şifreli bir komut görmedim.


16
Ek bir nokta: bu gerçekten hiçbir şekilde benzer değil sudo rm -rf /. Bu komut tüm dosyalarınızı siler; bu, kullanılamaz hale gelinceye kadar makinenizin kaynaklarını tıkar ve yeniden başlatmanız gerekir.
jtbandes

@jtban: Sonra düzenleyin. Her iki kod parçası da "tehlikeli" sayılır. Evet sudo rm -rf /ise daha tehlikeli ama insanlar uzak sunuculardaki bu yürütmek gördüğüm "sadece ne yaptığını görmek istedim" Eğer zor bir zaman bir kontrol paneli erişimi olmayan yeniden başlatmayı sahip olduğu.
Josh K,

7
bir ifade: P
RCIX

Not olabilir arbitrary_name(){ arbitrary_name|arbitrary_name& };arbitrary_name. Adı :sadece bu komut eteğine ve şifreli yapar, ama aynı zamanda bir döner :yapar yerleşiğini şey yapan bir işleve içine çok . Eğer tanımını :(){ :|:& }başkasının çevresine gizlice sokar ve orada kalmasına izin verirseniz , mağdur en az onu beklediğinde grev yapacaktır .
Kamil Maciorowski

Yanıtlar:


40

Söylediğin gibi, bir çatallı bomba. Yaptığı şey bir fonksiyon tanımlamak, sonra çağırmak. İşlev denir :.

Hadi ismini verelim forkbombki neler olduğunu daha iyi görelim:

forkbomb(){ forkbomb|forkbomb& };forkbomb

Gördüğünüz gibi muhtemelen programlama deneyiminizden tahmin edersiniz, ilk kısım fonksiyon tanımıdır ( forkbomb(){ ... }) ve en son :fonksiyonun çağrıldığı yerdir ( ;sadece Bash'deki ifadeleri ayırır).

Şimdi, bu işlev ne yapar? Bash ile aşina iseniz, |karakterin bir komutun / programın standart çıktısını bir başkasının standart girişine yönlendirdiğini bilirsiniz . Temel olarak, fonksiyonun iki örneğini :|:başlatır (bu, "çatal" olduğu yer).

Ve sonra sihir: &bu komutları arka plana koyar, orijinal fonksiyonun geri dönmesine izin verirken, her örnek ineklerin arka planda eve gelmesini sağlar, böylece tüm kaynaklarınızı kullanır ve sistemi indirir (sınırlar olmadığı sürece) dayattı).


1
Mükemmel cevap! Bir işlev adı olarak kullanabileceğinizi bilmiyordum. Yeniden adlandırmak yardımcı olur. 3 dakika içinde kabul edecek.
TheLQ,

1
+1 Harika ... Harika bir açıklama. Bu bir OS görev sihirbazı için bir yığın taşması gibidir. Aslında çekirdeği çökertiyor mu yoksa sadece dayanılmaz hale gelinceye kadar kaynakları tüketiyor mu?
Evan Plaice

En azından doğrudan değil, aslında çekirdeği çöktüğünü sanmıyorum. Sadece her biri CPU ve bellek kullanan katlanarak daha fazla işlem oluşturmaya devam ediyor ve işlemci hepsini kullanmaya çalışırken işlem yapmak gerçekten imkansız hale geliyor. Çekirdek sonunda yük altında çökebilir (emin değilim), ama ondan önce kullanılamaz hale gelebilir.
jtbandes

3
:İşlevi gerçekten yapan finali açıklamayı unutmayın !
Phoshi

@ Phoshi: Yaptığımı düşündüm, ama açıklığa kavuşturmak için düzenleme yapacağım!
jtbandes

9

Forkbomb Vikipedi makalesinden alınmıştır :

:()      # define ':' -- whenever we say ':', do this:
{        # beginning of what to do when we say ':'
    :    # load another copy of the ':' function into memory...
    |    # ...and pipe its output to...
    :    # ...another copy of ':' function, which has to be loaded into memory
         # (therefore, ':|:' simply gets two copies of ':' loaded whenever ':' is called)
    &    # disown the functions -- if the first ':' is killed,
         #     all of the functions that it has started should NOT be auto-killed
}        # end of what to do when we say ':'
;        # Having defined ':', we should now...
:        # ...call ':', initiating a chain-reaction: each ':' will start two more.

7

Bozuldu:

: () // Define ':' as a function. When you type ':' do the following
{
    : // Call ':' 
    | // Redirect output
    : // Into ':'
    & // Push process to the background
}; // End of ':' def
: // Now do ':'

Değişim :için bombve sahip:

bomb(){ bomb|bomb& };bomb

Gerçekten çok zarif.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.