Larang kompromi alias & fungsi; alias cd = 'rm -rf ~'

2

Katakanlah seseorang duduk di belakang laptop saya sebentar dan berjalan:

alias cd='Ha Ha, Got You :))'

atau kami menjalankan perangkat lunak / skrip / etc yang tidak dikenal dan menambahkan sesuatu ~/.bashrc. Suka:

alias sort='rm -rf ~'

Ini hanya contoh aliases; Seperti yang Anda ketahui, hal-hal ini juga dapat dilakukan menggunakan fungsi:

 cd(){ echo "Removing everything you've got :D"; }

Situasi ini hanyalah contoh imajiner, pertimbangkan yang serupa.

Bagaimana dengan skrip kecil?

sudo -n ls &>/dev/null
if [ "$?" -eq "0" ]
 then
  sudo "Some dangerous command"
 else
  cd $1
fi

Lalu alias cd="/home/user/.config/gtk/.cd.sh".

Untuk perintah yang telah dijalankan di bash, kita cukup menutup dan membuka kembali terminal kita, tetapi bagaimana dengan yang telah diatur dalam file startup, kita tidak bisa memeriksa file atau daftar alias / fungsi setiap kali kita menjalankan terminal. .

Ravexina
sumber
Adakah yang tahu cara melarang alias dan fungsi jahat dalam shell non-login interaktif, selain hanya me-restart terminal?
wjandrea
Oke, ini ada dua: pertama masuk ke shell lain -> /bin/bash; yang lain menyimpan daftar alias di dalam skrip di tempat yang aman (izin) yang berisi sesuatu seperti unalias -a; alias x='...'; alias y='...';. kemudian menjalankannya dengan path absolut: /usr/local/bin/reload_aliases.
Ravexina
3
Jangan pernah biarkan orang yang tidak dipercaya menjalankan perintah atas nama Anda. Jangan pernah biarkan orang yang tidak dipercaya menjalankan perintah atas nama Anda. Jangan pernah biarkan orang yang tidak dipercaya menjalankan perintah atas nama Anda. Jangan pernah biarkan orang yang tidak dipercaya menjalankan perintah atas nama Anda. Sebagian besar tempat kerja akan bersikeras bahwa Anda mengunci workstation Anda setiap kali Anda meninggalkan meja Anda, dan akan membuat Anda bertanggung jawab atas apa pun yang dilakukan workstation Anda.
AlexP
+1 @AlexP Saya ingin menambahkan lebih banyak "tidak ada tambalan yang tersedia untuk kebodohan manusia" tidak ada perasaan sulit, saya membacanya di suatu tempat :)
Alok Yadav

Jawaban:

2

pengantar

File konfigurasi bash

Bash memiliki banyak file konfigurasi (alias startup), menggunakan file-file ini untuk mengatur lingkungan tertentu untuk setiap pengguna.

Beberapa file-file ini terletak di /etc, salah satunya yang saya ketahui adalah /etc/profile, ini adalah file konfigurasi global dan pengaturannya akan diterapkan ke semua sesi, yang lain adalah /etc/bash.bashrc; Kami tidak perlu menangani file-file ini karena lokasinya sudah terlindungi dan hanya root yang berhak mengeditnya.

Direktori yang sangat penting yang dapat banyak membantu kami adalah /etc/skel:; Setiap kali Anda membuat pengguna baru dengan direktori home, file dalam direktori ini akan digunakan sebagai kerangka untuk direktori home pengguna baru Anda.

ls -a /etc/skel

.bash_logout  .bashrc  .profile

Kami juga dapat menggunakan dpkguntuk menemukan tentang file-file ini:

$ dpkg -L bash | grep etc

/etc/skel/.bashrc
/etc/skel/.bash_logout
/etc/skel/.profile
/etc/bash.bashrc

kita dapat melihat bahwa semua ini diinstal oleh bash.

Cara kerja di bash

Alias ​​atau fungsi dapat diatur di salah satu file ini, jadi mari kita lihat bagaimana file-file ini akan digunakan oleh bash.

Dari bashhalaman manual:

Ketika bash dipanggil sebagai shell login interaktif, atau sebagai shell non-interaktif dengan opsi --login, ia pertama kali membaca dan mengeksekusi perintah dari file / etc / profile, jika file itu ada. Setelah membaca file itu, tampaknya untuk ~/.bash_profile, ~/.bash_logindan ~/.profile, agar, dan membaca dan exe-cutes perintah dari yang pertama yang ada dan dapat dibaca.

jadi urutannya adalah: ~/.bash_profile > ~/.bash_login > ~/.profile

Ketika shell login keluar, bash membaca dan mengeksekusi perintah dari file ~ / .bash_logout, jika ada.

yang ini akan dijalankan setiap kali kita keluar dari shell login, saya tidak bisa melihat bagaimana yang satu ini memiliki efek pada situasi kita.

Ketika shell interaktif yang bukan shell login dimulai, bash membaca dan mengeksekusi perintah dari /etc/bash.bashrc dan ~ / .bashrc, jika file-file ini ada.

jadi yang paling penting adalah ~/.bashrc, karena hampir 90% shell bash yang kita jalankan berada dalam mode interaktif dan tanpa login. dan jika kita melihat file ini kita dapat melihat bahwa ia akan mencari file lain bernama ~/.bash_aliases, jika ia dapat menemukannya, maka itu akan sourcefile itu juga.


Mulailah merawat file-file ini

Pertama-tama kita harus pindah ~/.profileke ~/.bash_profilesebaliknya tidak masalah jika kita melindungi ~/.profilefile, seseorang dapat membuat ~/.bash_profiledan itu akan menimpa konfigurasi kita, jadi:

mv ~/.profile ~/.bash_profile

Setelah itu jika Anda tidak menggunakan ~/.bash_aliasesfile kemudian membuat itu, lagi seperti di atas, seseorang dapat dengan mudah membuat file ini dan ada kemungkinan bahwa ia dapat mengubah atau alias di dalamnya.

touch ~/.bash_aliases

Terakhir digunakan chattruntuk melindungi file-file ini dari pengeditan dan penghapusan.

Dari chattrhalaman manual:

File dengan atribut 'i' tidak dapat dimodifikasi: tidak dapat dihapus atau diganti namanya, tidak ada tautan yang dapat dibuat ke file ini dan tidak ada data yang dapat ditulis ke file. Hanya superuser atau proses yang memiliki kemampuan CAP_LINUX_IMMUTABLE yang dapat mengatur atau menghapus atribut ini.

sudo chattr +i ~/.bash_profile ~/.bashrc ~/.bash_aliases

Kami selesai, Jangan lupa bahwa setiap kali Anda ingin mengedit file-file ini, Anda harus terlebih dahulu menghapus -iatribut.

Setel ulang semuanya tanpa menutup / membuka kembali terminal

Solusi lain adalah, membuat file:

sudo touch /usr/local/bin/reload_aliases

Letakkan alias Anda di sana:

unalias -a
alias x='...'
alias b='...'

Pastikan tidak ada yang bisa menulis ke file itu:

sudo chmod a=r,x /usr/local/bin/reload_aliases

Sekarang setiap kali Anda ingin memuat ulang semua yang berjalan:

/usr/local/bin/reload_aliases

Kembalikan

Dan jika Anda berubah pikiran:

sudo chattr -i ~/.bash_profile ~/.bashrc ~/.bash_aliases
mv ~/.bash_profile ~/.profile
rm ~/.bash_aliases # if you don't use it
Ravexina
sumber
1
Tidak akan bertahan melawan bash --rcfile=/home/evil/bashrc.bad(dan biarkan luser mengeluarkan perintah ke shell itu).
waltinator
Bisakah Anda menjelaskannya lebih lanjut? Saya tidak mengerti bagaimana mungkin ... karena saya sendiri tidak akan menjalankan perintah seperti itu.
Ravexina
Seperti kata OP, dia takut orang jahat mengeksekusi perintah yang mendefinisikan alias jahat. Anda menawarkan apa yang seharusnya mencegah hal ini. Saya memberikan bukti konsep yang tidak akan mencegah hal ini. Baca man bash, dan cari --rcfile. Dikatakan " Execute commands from file *instead* of the system wide initialization file /etc/bash.bashrc and the standard personal initialization file ~/.bashrc if the shell is interactive (see INVOCATION below)." (tanda bintang saya)
waltinator
Bagaimana jika kita menutup dan membuka kembali terminal? itu akan melakukan pekerjaan dengan benar?
Ravexina
0

Jika Anda melakukan hal-hal bodoh (berjalan pergi tanpa mengunci layar, membabi buta menjalankan skrip yang tidak diketahui dari sumber yang tidak dipercaya, dll), Anda akan mendapatkan hasil yang buruk.

Berusaha cukup pintar untuk pulih dari praktik buruk tidak pernah berhasil sebelumnya.

waltinator
sumber