Çatal bombanın küresel olarak örtüşmesi onun yürütülmesini engeller mi?


15

Eğer küresel olarak

alias ':(){ :|:& };:'='echo fork bomb averted'

Bash çatal bombalarının infaz edilmesinden kaçınmak için etkili bir güvenlik stratejisi mi olurdu yoksa bunu yürütmenin bir yolu var mı?

Ben soru nakit para için varsayalım: başka bir şey için takma olduğunda bir komut yürütmek için bir yolu var mı?


1
@ user1717828, "çatal bomba" sonsuza dek yeni kopyalarını çalıştıran bir programdır. Çalışan program sayısında ortaya çıkan üstel büyüme genellikle bir şeyin kısa sürede kırılmasına neden olur.
Mark

1
Bu işe yarasa bile - fork () 'i bash'dan geçmeyen bir programa karşı korumaz mı?
UKMonkey

2
: () {: |: &: |: &} ;:
Joshua

3
Sadece koşa(){ a|a& };a
user253751

1
Ortak formdan kaçınırsınız (eğer işe yaramasını sağlarsanız), ancak üzerinde neredeyse sonsuz miktarda varyasyon olabilir.
Mast

Yanıtlar:


52

İki , hayır, üç , ..., başlıca engeller arasında buna şunlardır:

  1. Bir takma ad için geçerli bir ad değil. Bash'in çevrimiçi kılavuzu :

    Karakterler ... ve yukarıda listelenen kabuk metakarakterlerinden veya tırnak işareti karakterlerinden herhangi biri bir takma adda görünmeyebilir.

    (, ) , &, |Ve boşluk Bash 4.4 içinde bulunmaktadır.

  2. Bu ip, mermiye çatal bomba yazmanın tek yolu değil, sadece meşhur olduğu için meşhur. Örneğin, :gerçekte harflerden oluşan bir şey yerine işlevi çağırmaya gerek yoktur .

  3. Diğer adı ayarlayabilirseniz, kullanıcı diğer adı ayarlayabilir, komut satırındaki diğer addan kaçarak onu atlatabilir veya muhtemelen bir komut dosyasında işlevi çalıştırarak diğer adları tamamen devre dışı bırakabilir (Bash, etkileşimli olmayan kabuklarda diğer adları genişletmez) .

  4. Kabuk bir çatal bombanın tüm versiyonlarını durduracak kadar kısıtlanmış olsa bile, genel amaçlı bir sistem alt süreçleri geri alabilecek ve çatabilecek diğer programlanabilir yardımcı programlara sahip olacaktır. Perl veya C derleyiciniz var mı? Yeterince kolay. Awk bile bunu yapabilirdi. Yüklü olmasanız bile, kullanıcının derlenmiş ikili dosyaları sistem dışından getirmesini veya sistemin /bin/shgeri kalanının çalışması için tamamen işlevsel bir kabuk olması gereken çalışmasını da durdurmanız gerekir .

Hemen kullanım ulimit -u(yani RLIMIT_NPROC) veya eşdeğer bir kullanıcı başlatmak süreç sayısını kısıtlamak için. Çoğu Linux sisteminde pam_limits, kullanıcı tarafından seçilen herhangi bir komut başlatılmadan önce işlem sayısı sınırını ayarlayabilen vardır.

Böyle bir şey /etc/security/limits.conf, tüm kullanıcılara 50 işlemden oluşan sert bir sınır koyacaktır:

*        hard    nproc           50

(Stephen Kitt daha önce 1. maddeden bahsetti , Jeff Schaller 2 ve 3.'den bahsetti .)


Olmadan çatal bombası yazmak mümkün mü &?
Stephen Kitt

4
@StephenKitt% 100 emin değilim ama tahminimce bash tamamlanıyor. Öyleyse muhtemelen sonsuz olasılıklar vardır. Örneğin, ascii karakter kodunu 38 ayrıştırabilir ve yürütebilirsiniz.
Marie

@ Bu özel bağlamda, &sınırlama üzerinde çalışırken diğer yasak karakterlerden de kaçınmanız gerekir .
Stephen Kitt

15
Demek istediğim, esasen kötü işlevselliği kara listeye almaya çalışmak kötü bir fikirdi. Neredeyse her zaman yol vardır.
Marie

2
@ Marie: Bash kesinlikle tamamlanıyor.
sonraki duyuruya kadar duraklatıldı.

18

Hayır. Çatal bomba yazmanın çok fazla yolu var.

Kötü çatal bomba yazarı farklı bir işlev adıyla tekrar deneyecek. Ya da çatal bombası başarılı olana kadar diğer değişiklikler.

Yanlışlıkla çatal-bomba yazarı ilk etapta kanonik çatal-bomba üretmez.

Kendinizi yanlışlıkla çatal-bomba yazar olmak oldukça kolaydır. Örneğin, özyinelemeyi makeharici, denetlenmeyen cd, -jseçenek ve var olmayan alt dizinlerle birleştirerek kullanabilirsiniz - gerçekte bir kez karşılaştığım bir örnek.

Tüm olasılıklara karşı güvende olamazsınız ve kesinlikle kararlı bir saldırgana karşı güvende olamazsınız. Tek elde edeceğiniz sisteminizin karmaşıklığını artırmaktır.


14

Çatal bombayı takma adlandıramazsınız , çünkü geçerli bir takma ad adı değildir :

$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name

'/', '$', '``,' = 'Karakterleri ve yukarıda listelenen kabuk metakarakterlerinden veya tırnak işareti karakterlerinden herhangi biri bir takma adda görünmeyebilir.

Bazı mermiler, takma adlar bildirildiklerinde değil, komutları yorumlarken kontrol etmez ve geçersiz adı atlar. Çatal bomba her zaman &geçerli bir takma adla eklenemez, bu nedenle kendinizi bu şekilde korumak mümkün değildir.


Bir kabuğun bu takma adı kurmaya izin verip vermemesinin bir önemi yoktur. Önemli olan, böyle bir takma ad olsa bile, takma ad izin verilen kalıpla eşleşmediğinden komutlar yorumlanırken genişletilmemesidir. dashve boshher ikisi de sessizce görmezden gelir.
schily

10

İki kere, hayır.

Çatal bomba yazmanın tek yolu bu değil.

Bir takma ad olduğunda "bir komut" yürütmenin birkaç yolu vardır:

command the-command
\the-command

Misal:

$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html  output.png
$ command ls
jeff.html  output.png

Ana konuyla ilgili değil, neden \lsgösterdim output.pngama göstermediniz command ls?
nxnev

İyi benekli! Gerçekten de ana konu ile ilgisi yoktur. Kopyaladığım / yanlış yapıştırdığım (veya aralarındaki output.png dosyasını temizlediğim) klasik bir PEBCAK hatası. Dikkat dağıtıcı unsurları en aza indirmek için düzeltirim. Teşekkürler @nxnev!
Jeff Schaller
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.