Yürütmeden önce komut ikili dosyalarının doğrulanması


13

Bir bash betiğinden gerçekte ne yürüttüğünüzü kontrol etmek için herhangi bir yöntem var mı?

(Örneğin: sizin bash komut çeşitli komutlar çağırıyor Say tar, mail, scp, mysqldump) ile emin olmak isteyen targerçek, gerçek olan tarile belirlenebilir olan rootdosya ve üst dizin sahibi ve yazma izinleri olan tek varlık kullanıcıya ve sahibi /tmp/surprise/tarolan www-dataveya olmayan bazıları apache2.

Tabii biliyorum PATHve çevre, bunun çalışan bir bash betiğinden ek olarak kontrol edilip edilemeyeceğini merak ediyorum ve eğer öyleyse, tam olarak nasıl?

Örnek: (sözde kod)

tarfile=$(which tar)
isroot=$(ls -l "$tarfile") | grep "root root"
#and so on...

2
Çok paranoyaksanız, kendi ikili dosyalarınızı kullanın!
Ipor Sircer

8
Xhienne tarafından yanıtlandığı gibi, whichne taryapacağını doğru bir şekilde söylememenin yanı sıra ls, varsa dosya (lar) hakkında yanlış bilgi döndürmek için saldırıya uğrayabilir . Ayrıca grepyanlış bilgi döndürmek için kesmek olabilir; bunun yerine kabuk eşleştirme kullanılarak önlenebilir, ancak daha sonra kabuk saldırıya uğrayabilir. Ve kabuk typeilk etapta yanlış sonuçlar vermek için hacklenebilir - veya kabuğun değiştirilebilirliği 50 yıllık işletim sistemlerine kıyasla Unix'in önemli bir yeniliği olduğu için tamamen değiştirilebilir. Bkz. Ken Thompson'ın 1984 Turing adresi. Tamamen kaplumbağalar.
dave_thompson_085

2
TEİmzaları olan bir veritabanına sahip olan (yani MD5 sağlama toplamından daha kapsamlı olan Linux - sadece AIX - Güvenilir Yürütme ( ) adında bir bileşeni olan) için bunu yanıtlayamıyorum . TE aktif olduğunda ve bir dosya veritabanındayken seçebilirsiniz Programın çalışıp çalışmadığı veya yalnızca veritabanıyla eşleşmediği konusunda uyarır. Ayrıca, iki ayar daha vardır: TEP(güvenilir yürütme PATH) ve TLP(güvenilir KÜTÜPHANE PATH) Yalnızca TEP'deki programlar yürütülebilir ve kitaplıklar yalnızca Linux'ta dizin, TLP'ye dahil edilmiştir.Linux'da size yardımcı olabilecek 'AppArmor' adı verilen bir şey var
Michael Felt

1
Bu tür bir güvenliğe sahip olabilirsiniz, ancak bir komut dosyasından değil - komut dosyanız denetlenmeyen bir ortamda yürütüldüğünde, çok geç. Tüm bildiğiniz için görebileceğiniz her şey bir saldırgan tarafından ayarlanmış bir kroottur.
Charles Duffy

2
... tamamen güvenilen bir sisteme sahip olmak istiyorsanız, ChromeOS yaklaşımına gitmeniz gerekir: Ürün yazılımınızın donanımınıza gömülü bir anahtarla imzalanmasını sağlayın; bellenim tarafından doğrulanan önyükleyiciniz / çekirdeğiniz; doğrulama için blok düzeyinde imzalar kullanarak root OS bölümünüz salt okunur; @ @MichaelFelt'in tartıştıklarına benzer yaklaşımlar da var - Dürüstlük Ölçüm Mimarisine bakın - ancak performans etkisi daha yüksek ve bütünlük seviyesi azaldı (çünkü ikili imzaları kontrol etmek , çalıştırılamayanlar yoluyla saldırılarda size yardımcı olmuyor içeriği).
Charles Duffy

Yanıtlar:


24

Yürüteceğiniz ikili dosyaları doğrulamak yerine, başlangıçtan itibaren doğru ikili dosyaları yürütebilirsiniz. Eğer koşmayacağınızdan emin olmak istiyorsanız , betiğinizde /tmp/surprise/tarçalıştırın /usr/bin/tar. Alternatif olarak, $PATHherhangi bir şey çalıştırmadan önce bir aklı başında değere ayarlayın .

Dosyalara /usr/bin/ve diğer sistem dizinlerine güvenmiyorsanız , güven kazanmanın bir yolu yoktur. Örneğinizde, sahibe sahibini kontrol ediyorsunuz ls, ancak güvenebileceğinizi biliyor musunuz ls? Aynı argüman md5sumve gibi diğer çözümler için de geçerlidir strace.

Sistem bütünlüğüne yüksek düzeyde güven duyulması gerektiğinde, IMA gibi özel çözümler kullanılır. Ancak bu bir senaryodan kullanabileceğiniz bir şey değildir: tüm sistem, değiştirilemez dosyalar kavramı ile özel bir şekilde kurulmalıdır.


Farklı dağıtımlar /binyerine ikili dosya koymayı seçtiğinde kırılır /usr/bin.
Damian Yerrick

IMA buna iki üretime hazır yaklaşımdan biridir - diğeri ise ChromeOS tarafından rootf'lerin blok düzeyinde doğrulamasını yapmak için alınan dm verity yaklaşımıdır.
Charles Duffy

@DamianYerrick Fuarı yorumu. $PATHBirden fazla dağıtım desteği gerekiyorsa, bu iki yola da ayarlayın .
Dmitry Grigoryev

AIX TE (RBAC ile veya RBAC olmadan), bunu başaracak üçüncü bir "üretime hazır" çekirdek yerleşik olacaktır - belki daha fazla. Bir kez pasif olmaktan daha fazlası etkinleştirilen TE, dosyaların açılmasını ve / veya programların yürütülmesini engeller. Ayrıca, uygulamalar ve kitaplık kullanımı yalnızca TEP (güvenilir yürütme yolu) veya TLP (güvenilir kitaplık yolu) üzerinde olacak şekilde ayarlanabilir. Temel bilgiler için bkz. İbm.com/
Michael Felt

6

Bir davetsiz misafir sisteminize erişebiliyorsa ve sisteminizi değiştirebiliyorsa $PATH(bu /tmphiçbir koşulda yer almamalıdır ), o zaman yürütülebilir dosyaların sahiplikleri hakkında endişelenmeye başlamak için çok geç.

Bunun yerine bir saldırı ile nasıl başa çıkılacağını okumalısınız .

İzinsiz girişten kaçınmaya konsantre olmak daha iyidir.

Bu tür şeylerin önemli olduğu bir sisteminiz varsa, kamuya açık olması gereken bölümlerini özel olması gereken bölümlerden izole etmek ve iletişim modlarını denetlemek iyi bir fikir olabilir. bunlar arasında.


4

md5sumBir dosyayı doğrulayarak bir dereceye kadar mümkündür . Bu nedenle, aptpaket yönetimini kullanan sistemlerde - özel durumumda, Ubuntu 16.04 - kurulum sırasında /var/lib/dpkg/info/tar.md5sumsgelen tüm dosyaların md5 toplamlarını depolayan dosya var tar. Böylece, çıktıların md5sum /bin/taro dosyadakilerle eşleşip eşleşmediğini kontrol eden basit bir if-ifadesi yazabilirsiniz .

Tabii ki dosyanın kendisi üzerinde oynanmış olmadığını varsayar. Bu tabii ki sadece saldırgan root / sudo erişimine sahip olduğunda gerçekleşebilir, bu noktada tüm bahisler kapalıdır.


8
Fakat nasıl doğrularsınız /usr/bin/md5sum?
Dmitry Grigoryev

Bir saldırganın değiştirmek mümkün değilse /bin/tarveya /usr/bin/tar, öyle çok büyük olasılıkla onlar da basitçe yerini alabilir md5sumya /var/lib/dpkg/info/tar.md5sums. Veya $SHELL.
Jonas Schäfer

1
Sanırım son paragrafta bahsetmiştim, böyle bir şeyin olması için bir saldırganın sisteme kök erişimi alması gerektiğini ve bu noktada her şeyin mümkün olduğunu söyledi. Saldırganın kök erişimine sahip olmadığı, ancak bir kullanıcı için PATH değişkenini değiştirebileceği veya tarfarklı ikiliğe işaret ettiği bir takma ad oluşturabileceği durumlarda , bu çalışır. Bir sistem kök düzeyinde tehlikeye düştüğünde, bir seçeneğiniz vardır - yörüngeden
çek

3

Evet, bir yöntem var: yerleşik type. whichYalnızca PATH'nizde arama yapan komutun aksine type, komut adının gerçekten ayrılmış bir anahtar kelime, yerleşik, takma ad, işlev veya disk dosyası olup olmadığını söyleyecektir.

$ type -t foobar || echo "Not found"
Not found

$ type -t echo
builtin

$ enable -n echo; type -t echo; type -p echo
file
/usr/bin/echo

$ echo() { printf "(echoing) %s\n" "$*"; }; type -t echo
function

$ alias echo="/bin/echo 'I say: ' "; type -t echo
alias

Ek type -aolarak emriniz için tüm adayları verecektir (ilk seçimden son tercihe kadar):

$ type -a echo
echo is aliased to `/bin/echo 'I say: ' '
echo is a function
echo () 
{ 
    printf "(echoing) %s\n" "$*"
}
echo is a shell builtin
echo is /usr/local/bin/echo
echo is /bin/echo

Son olarak, yalnızca diskinizdeki ikili dosyalar hakkında endişeleriniz varsa, PATH'nizdeki type -Patüm ikili dosyaları almak için kullanabilirsiniz (yukarıdakiyle aynı sırada):

$ type -Pa tar
/home/me/bin/tar                <= oh oh, is this normal?
/bin/tar

Bununla typebirlikte, sonunda size tam olarak hangi komutun çağrılacağını söylemeyecektir. Örneğin, tarbir ikili (ör. alias tar="/tmp/tar") Çağıran bir takma adsa, typebunun bir alias.


type -atüm formları içerir (ör. hem diğer ad hem de harici program)
dave_thompson_085

Teşekkürler @dave, gerçekten ilginç, cevabımı güncelledim
xhienne

1
typebash'ın bildiği kadarıyla size söyleyecektir, ancak kötü niyetli bir saldırganın kontrolü altındaysak, bash'ın bildiklerinin gerçek gerçeği yansıttığına inanmak için bir neden yoktur. Tüm bildiğiniz için, yaptığınız LD_PRELOADher bir C-kütüphane çağrısını engelleyen bir modül vardır .
Charles Duffy

1
@CharlesDuffy Elbette haklısın. Güvenlik açısına cevap vermek istemedim. Ben sadece en üstteki soruya bir cevap öneriyorum: "Aslında bir bash betiğinden ne yürütmek kontrol etmek için herhangi bir yöntem var mı" ve bir alternatif önerdi which.
xhienne

Daha enableönce hiç görmedim . Bu cevapların tavsiyesini, type enableyerleşik bir kabuk bulmak ve sonra help enablene yaptığını görmek için kullandım.
Joe

3

Kullanarak bir komut dosyası tarafından tam olarak hangi komutların yürütüldüğünü kontrol edebilirsiniz strace. Örneğin:

strace -f -e execve ./script.sh

Aşağıdaki komut dosyasıyla:

#!/bin/bash
touch testfile.txt
echo "Hello" >> testfile.txt
cat testfile.txt
rm testfile.txt

strace-e execveparametresiyle kullanıldığında yürütülen komutların tam yolunu söyleyecektir :

execve("./script.sh", ["./script.sh"], [/* 69 vars */]) = 0 
Process 8524 attached
[pid  8524] execve("/usr/bin/touch", ["touch", "testfile.txt"], [/* 68 vars */]) = 0 
[pid  8524] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8524, si_status=0, si_utime=0, si_stime=0} --- 
Process 8525 attached [pid > 8525] execve("/bin/cat", ["cat", "testfile.txt"], [/* 68 vars */]) = 0
Hello [pid  8525] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8525, si_status=0, si_utime=0, si_stime=0} --- 
Process 8526 attached [pid > 8526] execve("/bin/rm", ["rm", "testfile.txt"], [/* 68 vars */]) = 0
[pid  8526] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8526, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 0 +++

Parametreler (strace man'dan):

-f: Çatal (2), vfork (2) ve klon (2) sistem çağrılarının bir sonucu olarak şu anda izlenen süreçler tarafından oluşturulan alt süreçleri izleyin. Not -p PID -fo çok kanallı ise sadece thread_id = PID ile iplik değil, Proses PID tüm konuları ekleyecektir.

-e trace=file: Bir dosya adını bağımsız değişken olarak alan tüm sistem çağrılarını izleyin. Bunu -e trace=open,stat,chmod,unlink,..., sürecin hangi dosyalara başvurduğunu görmek için yararlı olan bir kısaltma olarak düşünebilirsiniz . Ayrıca, kısaltmayı kullanmak yanlışlıkla lstat gibi bir çağrıyı listeye dahil etmeyi unutmamanızı sağlar.


3
Bu hiçbir şekilde bir komut dosyası tarafından otomatik sınama yapmak için kullanılamaz ve stracekendisinin bozulmadığına inanmak için özel bir neden yoktur .
Charles Duffy

0

Linux işletim sistemi dosyaları temel alır ve linux üzerinde yürütülen birçok komut büyük olasılıkla makinenizde bulunan dosyalardaki bazı değişiklikleri çözecektir. Bu yüzden belki de probleminiz için en iyi çözümdür. Yürütülmeden önce komutlarınızı dosya sistemindeki herhangi bir değişiklik açısından test edebilirsiniz.

resim açıklamasını buraya girin

Komutunuzu parçalara ayıran 'strace' komutu var ...

resim açıklamasını buraya girin

Eğer gerçekten derinlere inmek istiyorsanız, çalıştırılacak scriptler için dekomperi kontrol etmek istersiniz. Başka bir deyişle, bu komutun derleyici yorumunu kontrol etmelisiniz. Orada bash için objdump -d. Linux bin komut dosyaları esas olarak Cprogramlama dili ile oluşturulur, bu nedenle iyi bir Ckod çözücü kullanın .

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.