Ini didasarkan pada pertanyaan bohong ini di sini. Masalah yang dijelaskan adalah memiliki skrip bash yang berisi sesuatu dengan efek:
rm -rf {pattern1}/{pattern2}
... yang jika kedua pola menyertakan satu atau lebih elemen kosong akan diperluas ke setidaknya satu instance rm -rf /
, dengan asumsi bahwa perintah asli ditranskripsikan dengan benar dan OP melakukan ekspansi brace daripada ekspansi parameter .
Dalam penjelasan OP tentang tipuan itu , ia menyatakan:
Perintah [...] tidak berbahaya tetapi tampaknya hampir tidak ada yang memperhatikan.
Alat Ansible mencegah kesalahan ini, [...] tetapi [...] sepertinya tidak ada yang tahu itu, kalau tidak mereka akan tahu bahwa apa yang saya jelaskan tidak dapat terjadi.
Jadi dengan asumsi Anda memiliki skrip shell yang memancarkan rm -rf /
perintah melalui ekspansi brace atau ekspansi parameter, apakah benar bahwa menggunakan Ansible akan mencegah perintah itu dieksekusi, dan jika demikian, bagaimana cara melakukannya?
Apakah mengeksekusi rm -rf /
dengan hak akses root benar-benar "tidak berbahaya" selama Anda menggunakan Kemungkinan untuk melakukannya?
rm
sumbernya, yang saya analisis di bawah.Jawaban:
Saya punya mesin virtual, mari kita meledakkannya! Untuk sains.
Percobaan pertama:
Oke, jadi
command
lewati saja literalnya, dan tidak ada yang terjadi.Bagaimana dengan bypass keselamatan favorit kita
raw
?Jangan pergi lagi! Seberapa sulit mungkin untuk menghapus semua file Anda?
Oh, tetapi bagaimana jika mereka adalah variabel yang tidak ditentukan atau sesuatu?
Ya, itu tidak berhasil.
Tetapi bagaimana jika variabel didefinisikan, tetapi kosong?
Akhirnya, beberapa kemajuan! Tetapi masih mengeluh bahwa saya tidak menggunakan
--no-preserve-root
.Tentu saja, itu juga memperingatkan saya bahwa saya harus mencoba menggunakan yang
file
modul danstate=absent
. Mari kita lihat apakah itu berhasil.Berita bagus, semuanya! Itu mulai mencoba menghapus semua file saya! Namun sayangnya itu mengalami kesalahan. Saya akan meninggalkan memperbaikinya dan membuat buku pedoman untuk menghancurkan semuanya menggunakan
file
modul sebagai latihan untuk pembaca.JANGAN menjalankan buku pedoman apa pun yang Anda lihat di luar titik ini! Anda akan melihat mengapa suatu saat.
Akhirnya, untuk kudeta ...
VM ini adalah mantan burung beo !
Menariknya, hal di atas gagal melakukan apa pun dengan
command
alih - alihraw
. Itu hanya mencetak peringatan yang sama tentang penggunaanfile
denganstate=absent
.Saya akan mengatakan bahwa tampaknya jika Anda tidak menggunakan
raw
itu ada perlindungan darirm
amuk yang hilang. Anda seharusnya tidak mengandalkan ini. Saya melihat sekilas kode Ansible, dan ketika saya menemukan peringatan itu, saya tidak menemukan apa pun yang benar-benar akan menekan menjalankanrm
perintah.sumber
/boot
.boot
adalah entri direktori pertama di/
. Jadi tidak ada file yang hilang.rm -rf {{x}}/{{y}}
kapany
diatur"*"
. The--no-preserve-root
cek berguna untuk apa itu, tapi itu tidak akan membuat Anda keluar dari setiap situasi yang mungkin; cukup mudah untuk memotong. Itulah sebabnya pertanyaan itu tidak langsung dianggap sebagai tipuan: Mempertimbangkan bahasa Inggris yang buruk dan kesalahan sintaksis yang jelas, itu masuk akal .raw
, yang burukcron
bisa menjadi cara lain untuk menghancurkan suatu sistem.Apakah Ansible akan mencegah eksekusi
rm -rf /
dalam skrip shell?Saya telah memeriksa sumber rm coreutils , yang memiliki yang berikut:
Satu-satunya cara untuk menghapus dari root adalah melewati blok kode ini. Dari sumber ini :
Saya menafsirkan ini berarti bahwa fungsi
get_root_dev_ino
mengembalikan nol/
, dan dengan demikian rm gagal.Satu-satunya cara untuk mem-bypass blok kode pertama (dengan rekursi) adalah memiliki
--no-preserve-root
dan tidak menggunakan variabel lingkungan untuk menimpanya, sehingga harus diteruskan secara eksplisit ke rm.Saya percaya ini membuktikan bahwa kecuali Ansible secara eksplisit beralih
--no-preserve-root
kerm
, itu tidak akan melakukan ini.Kesimpulan
Saya tidak percaya bahwa Ansible secara eksplisit mencegah
rm -rf /
karena iarm
sendiri mencegahnya.sumber