Apakah ada metode untuk memeriksa apa yang sebenarnya Anda jalankan dari skrip bash?
Katakanlah bash script Anda memanggil beberapa perintah (misalnya: tar
, mail
, scp
, mysqldump
) dan Anda bersedia untuk memastikan bahwa tar
adalah yang sebenarnya, real tar
, yang ditentukan oleh root
pengguna menjadi file dan direktori induk pemilik satu-satunya dengan hak akses menulis dan bukan sebagian /tmp/surprise/tar
dengan www-data
atau apache2
menjadi pemilik.
Tentu saya tahu tentang PATH
dan lingkungan, saya ingin tahu apakah ini juga dapat diperiksa dari skrip bash yang sedang berjalan dan, jika demikian, bagaimana tepatnya?
Contoh: (pseudo-code)
tarfile=$(which tar)
isroot=$(ls -l "$tarfile") | grep "root root"
#and so on...
bash
shell-script
shell
security
Miloš Đakonović
sumber
sumber
which
tidak mengatakan dengan benar apa yangtar
akan dilakukan, seperti dijawab oleh xhienne,ls
dapat diretas untuk mengembalikan info palsu tentang file, jika ada. Jugagrep
bisa diretas untuk mengembalikan info palsu; yang bisa dihindari dengan menggunakan pencocokan shell saja, tetapi kemudian shell bisa diretas. Dan shell dapat diretas untuk memberikan hasil yang salah sejaktype
awal - atau diganti seluruhnya karena penggantian shell adalah inovasi penting dari Unix dibandingkan dengan OS yang berusia 50 tahun. Lihat alamat Turing 1984 Ken Thompson. Ini kura-kura sepanjang jalan.TE
) - yang memiliki database dengan tanda tangan (yaitu, lebih luas daripada MD5 checksum. Ketika TE aktif dan file ada dalam database Anda dapat memilih apakah program berjalan - atau hanya memperingatkan bahwa itu tidak cocok dengan database. Selanjutnya, ada dua pengaturan lain:TEP
(PATH eksekusi tepercaya) danTLP
(PATH LIBrary tepercaya). Hanya program di TEP yang dapat dieksekusi dan perpustakaan hanya boleh dimuat dengan direktori ini termasuk dalam TLP. Di Linux saya ada sesuatu yang disebut 'AppArmor' yang dapat membantu AndaJawaban:
Alih-alih memvalidasi binari yang akan Anda jalankan, Anda bisa menjalankan binari yang tepat dari awal. Misalnya, jika Anda ingin memastikan Anda tidak akan menjalankan
/tmp/surprise/tar
, jalankan saja/usr/bin/tar
dalam skrip Anda. Atau, atur nilai Anda$PATH
menjadi waras sebelum menjalankan apa pun.Jika Anda tidak mempercayai file
/usr/bin/
dan direktori sistem lainnya, tidak ada cara untuk mendapatkan kembali kepercayaan. Dalam contoh Anda, Anda sedang memeriksa pemiliknyals
, tetapi bagaimana Anda tahu Anda bisa percayals
? Argumen yang sama berlaku untuk solusi lain sepertimd5sum
danstrace
.Di mana kepercayaan tinggi dalam integritas sistem diperlukan, solusi khusus seperti IMA digunakan. Tapi ini bukan sesuatu yang bisa Anda gunakan dari skrip: seluruh sistem harus diatur dengan cara khusus, dengan konsep file yang tidak dapat diubah.
sumber
/bin
bukannya/usr/bin
.$PATH
ke kedua jalur tersebut kemudian, jika dukungan distribusi berganda diperlukan.Jika penyusup mendapatkan akses ke sistem Anda dan dapat memodifikasi Anda
$PATH
(yang seharusnya tidak termasuk/tmp
dalam keadaan apa pun), maka sudah terlambat untuk mulai khawatir tentang kepemilikan dari executable.Alih-alih, Anda harus membaca tentang cara menghadapi gangguan .
Lebih baik berkonsentrasi pada menghindari intrusi sama sekali.
Jika Anda memiliki sistem di mana hal-hal semacam ini penting, maka mungkin ide yang baik untuk mengisolasi bagian-bagiannya yang perlu diketahui publik dari bagian-bagian yang perlu pribadi, serta melakukan audit terhadap mode komunikasi di antara ini.
sumber
Mungkin sampai batas tertentu dengan memverifikasi
md5sum
file. Jadi pada sistem yang menggunakanapt
manajemen paket - dalam kasus khusus saya, Ubuntu 16.04 - ada file/var/lib/dpkg/info/tar.md5sums
, yang menyimpan jumlah md5 dari semua file yang berasal daritar
saat instalasi. Jadi, Anda bisa menulis pernyataan if sederhana yang memeriksa apakah outputmd5sum /bin/tar
cocok dengan apa yang ada di file itu.Itu tentu saja mengasumsikan bahwa file itu sendiri belum dirusak. Ini tentu saja hanya dapat terjadi ketika penyerang mendapatkan akses root / sudo, di mana semua taruhan dimatikan.
sumber
/usr/bin/md5sum
?/bin/tar
atau/usr/bin/tar
, sangat mungkin mereka juga dapat dengan mudah menggantimd5sum
atau/var/lib/dpkg/info/tar.md5sums
. Atau$SHELL
.tar
menunjuk ke biner yang berbeda, itu akan berfungsi. Ketika sebuah sistem dikompromikan pada level root, Anda memiliki satu opsi saat itu - nuke dari orbitYa, ada metode: builtin
type
. Berlawanan denganwhich
perintah yang hanya mencari di PATH Anda,type
akan memberi tahu Anda apakah nama perintah itu benar-benar kata kunci yang dipesan, bawaan, alias, fungsi, atau file disk.Selain itu
type -a
akan memberi Anda semua kandidat untuk perintah Anda (dari pilihan pertama hingga terakhir):Akhirnya, jika Anda hanya peduli tentang binari pada disk Anda, Anda dapat menggunakan
type -Pa
untuk mendapatkan semua binari di PATH Anda (urutan yang sama seperti di atas):Yang mengatakan,
type
sendirian tidak akan memberi tahu Anda dengan tepat perintah apa yang akan dipanggil pada akhirnya. Misalnya, jika Andatar
adalah alias yang memanggil biner (mis.alias tar="/tmp/tar"
) Makatype
akan memberi tahu Anda ini adalahalias
.sumber
type -a
termasuk semua bentuk (misalnya program alias dan eksternal)type
akan memberitahumu inasfar sebagai bash yang tahu, tetapi jika kita di bawah kendali dari penyerang jahat, tidak ada alasan untuk percaya bahwa apa yang menurut bash tahu itu mencerminkan kebenaran yang sebenarnya. Untuk semua yang Anda tahu adaLD_PRELOAD
modul yang mencegat setiap panggilan C-library yang Anda buat.which
.enable
sebelumnya. Saya menggunakan saran dari jawaban ini untuk menjalankannyatype enable
untuk mencari tahu bahwa itu adalah built-in shell dan kemudianhelp enable
untuk melihat apa fungsinya.Anda dapat memeriksa perintah apa yang sebenarnya dieksekusi oleh skrip dengan menggunakan
strace
. Sebagai contoh:Dengan skrip berikut:
strace
akan memberi tahu Anda jalur yang tepat ke perintah yang dijalankan saat digunakan dengan-e execve
parameter:Parameter (dari strace man):
-f
: Lacak proses anak karena dibuat oleh proses yang saat ini dilacak sebagai hasil dari garpu (2), vfork (2) dan panggilan sistem klon (2). Catatan yang-p PID -f
akan melampirkan semua utas proses PID jika multi-utas, tidak hanya utas dengan thread_id = PID.-e trace=file
: Lacak semua panggilan sistem yang menggunakan nama file sebagai argumen. Anda dapat menganggap ini sebagai singkatan-e trace=open,stat,chmod,unlink,...
yang berguna untuk melihat file apa yang dirujuk oleh proses. Selanjutnya, menggunakan singkatan akan memastikan bahwa Anda tidak sengaja lupa untuk memasukkan panggilan seperti lstat dalam daftar.sumber
strace
itu sendiri belum ditumbangkan.OS Linux didasarkan pada file dan banyak perintah yang dijalankan di linux kemungkinan akan menyelesaikan beberapa perubahan pada file yang terletak di mesin Anda. Karena itu mungkin adalah solusi terbaik untuk masalah Anda. Anda dapat menguji perintah Anda untuk setiap perubahan pada sistem file sebelum dieksekusi.
Ada perintah 'strace' yang mendekompilasi perintah Anda di beberapa bagian ...
Jika Anda benar-benar ingin masuk lebih dalam, Anda ingin checkout dekompiler untuk skrip yang akan dieksekusi. Dengan kata lain Anda harus memeriksa interpretasi assembler dari perintah itu. Untuk bash di sana
objdump -d
. Skrip Linux bin terutama dibuat denganC
bahasa pemrograman jadi gunakanC
decompiler yang bagus .sumber