Pertanyaan ini benar-benar umum dan tidak hanya berlaku untuk situasi saya, tetapi ... Saya memiliki alat busybox kecil di mana saya ingin pengguna non-root dapat mengeksekusi skrip tertentu dengan hak akses root. Sebagai contoh, sesuatu seperti skrip kecil ini untuk mengaktifkan DHCP, di mana satu-satunya variabel ( $1
) untuk dikirim pada cmdline (!!) adalah nama host yang akan dikirim:
#!/bin/bash
udhcpc -b -i eth0 -h $1
menjalankan udhcpc seperti ini membutuhkan akses root, jadi untuk melakukan ini saya berencana memodifikasi /etc/sudoers
untuk mengandung baris ini:
joe ALL = NOPASSWD: /path/to/enable_dhcp.sh
yang seharusnya mengaktifkan "joe" untuk dengan mudah menjalankan skrip itu dengan hak akses root dengan hanya menjalankan:
sudo /path/to/enable_dhcp.sh
dan tidak dimintai kata sandi (yang saya inginkan, karena saya ingin joe dapat menulis skrip ini).
Sekarang .. Saya tahu (atau setidaknya berpikir saya lakukan) bahwa menggunakan $1
dalam skrip yang dapat dengan mudah dijalankan dengan hak akses root adalah ide HORRIBLE karena Anda dapat menyuntikkan apa pun yang Anda inginkan ke dalamnya.
Jadi ... apa cara terbaik untuk menghadapi ini? Bagaimana saya membiarkan joe melakukan apa yang saya inginkan dengan hak akses root, mengizinkannya untuk memasukkan variabel (atau secara efektif melakukannya dengan variabel lingkungan), sementara tidak terbuka lebar untuk serangan injeksi?
Anda harus mencocokkan input yang lulus dengan pola yang dikenal baik.
Misalnya, sepertinya alamat IP mungkin merupakan input yang valid untuk Anda. Jadi Anda bisa menggunakan sesuatu seperti ini:
Catatan, bahwa regexp belum diuji, Anda bertanggung jawab untuk memastikan regexp Anda tidak mengizinkan sesuatu yang berbahaya.
sumber