Saya akan mengatakan itu, ketika bash adalah / bin / sh Anda. Ini bukan fitur shell bourne, dan saya berani bertaruh itu bukan fitur shell posix, sebenarnya mereka mungkin ingin melarangnya.
Bash sebenarnya lebih merupakan shell turunan korn, daripada shell bourne, terlepas dari namanya, dan itu satu-satunya shell seperti Korn yang memiliki fitur, dan menurut saya itu adalah fitur kitchensink yang tidak memiliki sifat praktis. Pengembang yang menghindari fitur bash untuk standar, seperti shell bourne, shell posix, atau subset ksh88 yang memiliki kesamaan shell modern, atau dengan kata lain, berkomitmen pada praktik yang baik, dan idiom standar, terkejut ketika perangkat lunak mereka aktif linux dan mac dan sekarang berpotensi rentan, karena penulis yang mengeksploitasi bebas untuk menggunakan 'bashism', terlepas dari niat mereka. Sejauh kompatibilitas ditingkatkan, ketika dipanggil sebagai / bin / sh, atas turunan shell korn lainnya, hanya jika / bin / sh adalah shell login Anda, atau shell interaktif, ketika bash berperilaku lebih seperti shell bourne, daripada shell korn,
Saya akan mencoba meyakinkan Anda bahwa ini adalah fitur kitchen-sink, dengan 2 case: Anda seorang pengembang yang tertanam, yang membuat perangkat seperti router, penyimpanan pertama yang terhubung dengan jaringan, lebih banyak, memori, jadi, lebih banyak biaya, jadi lebih sedikit keuntungan, jadi, jika ini adalah alasan untuk mempertimbangkan untuk menggunakan fitur bash ini, bukankah Anda seharusnya menggunakan FPATH dan pengisian otomatis, fitur ksh88? bukannya melewati seluruh fungsi byte untuk byte di lingkungan? Anda bahkan dapat mempertimbangkan parsing dan pemangkasan grosir lingkungan, sebelum sampai ke shellscript yang dapat salah menguraikan variabel, seperti hanya menyaring ^ $ (. *) $, Dan sejenisnya ...
Itu menggarisbawahi apa yang unik tentang ini, tidak peduli apa variabelnya, dan skrip tidak harus referensi atau menggunakan variabel, itu masih bisa rentan.
#!/bin/sh
exec /usr/local/myapp/support/someperlscript.pl
Untuk hal lain di bawah matahari, di atas harus seaman skrip perl, Anda tidak menggunakan variabel apa pun bagaimana Anda bisa salah menguraikannya? Berubah menjadi
#!/bin/bash -norc
exec /usr/local/myapp/support/someperlscript.pl
Tidak membantu, ini tidak ada hubungannya dengan ENV atau yang seperti itu - semua orang terbakar karena bash harus unik. Fakta bahwa bash versi 2 memiliki masalah, bagi saya membuktikan bahwa tidak ada yang pernah menggunakan fitur ini untuk aplikasi mereka, karena kalau tidak seharusnya tidak bersembunyi selama ini . Dan yang lebih buruk, pada dasarnya tidak ada yang menghindari fitur ini . Berikut ini sebuah contoh dengan: dengan 'su -', yang jika Anda akan bertanya kepada seseorang, penjelasannya akan membuang lingkungan, periksa halaman manual, dan Anda akan menemukan hanya 99,9%. Saya menguji dengan cara yang benar, karena pada sistem ini / bin / sh adalah shell login root, dan / bin / sh adalah bash TAPI , dalam contoh ini saya mencobauntuk mengeraskan .bash_profile saya. Saya mengganti nama root saya yang ada (yang diaktifkan), tetapi pemikiran saya adalah jika su, maka mungkin sudo, bagaimanapun, saya berubah menjadi ini:
exec env -i TERM=vt102 LOGNAME=root USER=root HOME=/var/root /bin/ksh -i
Jadi, saya benar-benar membuang lingkungan sepenuhnya, dan menggunakan env minimal, dan kemudian menjalankan shell yang seharusnya tidak memiliki masalah, di tempat proses saat ini. Kemudian di tempat contoh standar coba:
%dock='() { echo -e "\e[2t\c"; echo dockshock;} ; dock' su
Ini mengilustrasikan bagaimana itu tidak ada hubungannya dengan parsing fungsi tertentu, dan eksploit dapat merujuk dan menggunakan, fungsi tersebut. Anda dapat membayangkan fungsi yang memiliki logika untuk menguji apakah root, dll. Dalam hal ini, itu hanya bentuk yang dimodifikasi dari fungsi untuk memberi ikon atau merapat jendela terminal, menggunakan urutan escape, itu cukup standar, jadi setelah saya mengklik untuk mendeikonifikasi, saya lihat dockshock - tapi, jadi apa? Sekarang coba ini:
%TERM='() { echo -e "\e[2t\c"; echo dockshock;} ; TERM' su -
Dan coba tebak? Jendela tersedot ke dermaga. Begini setelahnya ..
%TERM='() { echo -e "\e[2t\c"; echo dockshock;} ; TERM' su -
Password:
dockshock
# env
_=/usr/bin/env
HOME=/var/root
LOGNAME=root
TERM=vt102
USER=root
# echo $0
/bin/ksh
#
Jadi, sangat, banyak untuk itu! Fungsi yang diekspor sebenarnya memiliki prioritas di atas skrip rc. Anda tidak bisa mengelak.