Mengapa berisiko memberikan sudo vim akses ke pengguna biasa?


30

Saya ingin membuat pengguna baru dan memberinya akses sudo. Untuk lebih spesifik, saya ingin dia menggunakan sudo vimdan mengedit httpd.conf. Saya menulis ini di sudoers:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

Namun, saya mendengar bahwa ini bisa berisiko. Mengapa ini bermasalah? Seberapa serius masalahnya?


16
Pertama, perintah Anda akan memberi pengguna akses baca dan tulis ke semua file di komputer. Setelah masuk vim, pengguna bebas untuk membuka dan menulis ke file apa pun yang diinginkannya.
John1024

4
Sebagai tambahan, Anda dapat membuat grup baru untuk menambahkan pengguna yang membutuhkan akses /etc/httpd/confs/httpd.conf. Kemudian gunakan chgrp [OPTION] GROUPNAME FILEuntuk mengubah kepemilikan grup /etc/httpd/confs/httpd.conf. Sesuatu seperti groupadd vimportantmembuat grup baru dan chgrp -v vimportant /etc/httpd/confs/httpd.confmengubah kepemilikan grup. yolinux.com/TUTORIALS/LinuxTutorialManagingGroups.html
iyrin

4
Perhatikan bahwa, karena semua masalah yang disebutkan dalam jawaban, sudo menyertakan cara untuk memungkinkan pengguna mengedit file dengan editor yang berjalan dengan hak istimewa mereka sendiri. Cari "Pengeditan aman" di sudoershalaman manual.
Michał Politowski

2
(Tidak yakin apakah yang saya katakan benar) Karena Anda memberikan sudoakses ke vim, pengguna akan dapat menggunakan vim sebagai root. Dalam vim Anda dapat menjalankan perintah UNIX ( Bagaimana menjalankan perintah Unix dari dalam Vim? ) Sehingga pengguna dapat melakukan hal-hal seperti useradd <myuser>, rm -rf /atau banyak hal lainnya.
fedorqui

6
Ini adalah jenis pertanyaan yang salah untuk ditanyakan. Ketika mempertimbangkan untuk memberikan hak istimewa yang ditinggikan dalam bentuk apa pun, Anda tidak ingin berpikir "Saya akan melakukan ini, kecuali saya memikirkan beberapa alasan mengapa itu berbahaya." Anda ingin berpikir, "Saya tidak akan melakukan ini, kecuali saya bisa membuktikan kepada diri saya bahwa itu aman."
Nate Eldredge

Jawaban:


60

Meskipun Anda membatasi argumen baris perintah, tidak ada yang mencegah pengguna menggunakan vim untuk membuka, mengedit, dan menimpa file acak apa pun setelah dijalankan sebagai root.

Pengguna dapat menjalankan sudo vim /etc/httpd/conf/httpd.conf lalu

  • hapus semua teks dari buffer edit
  • kemudian untuk sumber kenyamanan file yang ada (walaupun itu bahkan tidak diperlukan): misalnya konfigurasi sudo
    :r /etc/sudoers CATATAN: Kecuali dibatasi oleh SELinux pengguna dapat membaca file apa pun dengan cara ini!
  • beri dia lebih banyak hak istimewa sudo user ALL=(ALL) NOPASSWD: ALL
  • menimpa konfigurasi lama :w /etc/sudoers

Saya dapat membayangkan lusinan cara serupa yang sekarang dapat diakses oleh pengguna Anda, memodifikasi atau menghancurkan sistem Anda.

Anda bahkan tidak akan memiliki jejak audit file mana yang diubah dengan cara ini karena Anda hanya akan melihatnya mengedit konfigurasi Apache Anda dalam pesan sudo log. Ini adalah risiko keamanan dalam memberikan sudohak istimewa kepada editor mana pun.

Ini kurang lebih alasan yang sama mengapa memberikan hak tingkat akar sudo untuk perintah seperti tardan unzipsering tidak aman, tidak ada yang mencegah Anda dari memasukkan penggantian untuk binari sistem atau file konfigurasi sistem dalam arsip.


Risiko kedua, seperti yang ditunjukkan oleh banyak komentator lain, adalah vimmemungkinkan shell lolos , di mana Anda dapat memulai sub-shell dari dalam vim yang memungkinkan Anda menjalankan perintah sewenang-wenang . Dari dalam sesi sudo vim Anda, itu akan berjalan sebagai root, misalnya shell escape:

  • :!/bin/bash akan memberi Anda shell root interaktif
  • :!/bin/rm -rf / akan membuat cerita-cerita bagus di pub.

Apa yang harus dilakukan?

Anda masih dapat menggunakan sudountuk memungkinkan pengguna mengedit file yang tidak mereka miliki dengan cara yang aman.

Dalam konfigurasi sudoers Anda, Anda dapat mengatur perintah khusus yang disediakan sudoeditdiikuti dengan pathname (wildcard) lengkap ke file yang dapat diedit pengguna:

user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf

Pengguna kemudian dapat menggunakan -eswitch di baris perintah sudo mereka atau menggunakan sudoeditperintah:

sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf

Seperti yang dijelaskan di halaman manual :

The -e (edit)pilihan menunjukkan bahwa, alih-alih menjalankan perintah, pengguna ingin mengedit satu atau lebih file. Sebagai pengganti perintah, string "sudoedit" digunakan ketika berkonsultasi dengan kebijakan keamanan.
Jika pengguna diotorisasi oleh kebijakan, langkah-langkah berikut diambil:

  • Salinan sementara terbuat dari file yang akan diedit dengan pemiliknya diatur ke pengguna yang memohon.
  • Editor yang ditentukan oleh kebijakan dijalankan untuk mengedit file sementara. Kebijakan sudoers menggunakan variabel lingkungan SUDO_EDITOR, VISUAL dan EDITOR (dalam urutan itu). Jika tidak ada SUDO_EDITOR, VISUAL atau EDITOR yang ditetapkan, program pertama yang tercantum dalam opsi editor sudoers(5) digunakan.
  • Jika sudah dimodifikasi, file sementara disalin kembali ke lokasi aslinya dan versi sementara dihapus.
    Jika file yang ditentukan tidak ada, itu akan dibuat.
    Perhatikan bahwa tidak seperti kebanyakan perintah yang dijalankan oleh sudo, editor dijalankan dengan lingkungan pengguna yang memohon tidak dimodifikasi. Jika, karena suatu alasan, sudo tidak dapat memperbarui file dengan versi yang diedit, pengguna akan menerima peringatan dan salinan yang diedit akan tetap dalam file sementara.

The sudoerspengguna juga memiliki seluruh bagian bagaimana dapat menawarkan terbatas perlindungan terhadap lolos shell dengan RESRICTdan NOEXECpilihan.

restrict Hindari memberi pengguna akses ke perintah yang memungkinkan pengguna menjalankan perintah sewenang-wenang. Banyak editor memiliki mode terbatas di mana shell lolos dinonaktifkan, meskipun sudoedit adalah solusi yang lebih baik untuk menjalankan editor melalui sudo. Karena sejumlah besar program yang menawarkan pelarian shell, membatasi pengguna ke set program yang tidak sering tidak dapat dikerjakan.

dan

noexec
Banyak sistem yang mendukung pustaka bersama memiliki kemampuan untuk mengesampingkan fungsi pustaka default dengan mengarahkan variabel lingkungan (biasanya LD_PRELOAD) ke pustaka bersama alternatif. Pada sistem seperti itu, fungsionalitas noexec sudo dapat digunakan untuk mencegah program yang dijalankan oleh sudo dari menjalankan program lain. Catatan, ... ...
Untuk mengaktifkan noexec untuk suatu perintah, gunakan NOEXECtag seperti yang didokumentasikan di bagian Spesifikasi Pengguna di atas. Ini adalah contohnya lagi:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
Ini memungkinkan pengguna aaron untuk menjalankan /usr/bin/moredan /usr/bin/videngan noexec diaktifkan. Ini akan mencegah dua perintah dari mengeksekusi perintah lain (seperti shell).


Saya tidak tahu itu sudo tardan sudo unzipjuga menyebabkan masalah. Terima kasih.
mi0pu

5
Jawaban bagus. Akan lebih baik jika juga disebutkan melarikan diri dari dalam vim ke dalam shell. Setelah Anda berada di shell, itu gratis-untuk-semua, dan masih semua yang akan muncul di log adalah bahwa pengguna mengedit file konfigurasi Apache Anda.
CVn

2
Selain itu? Jika Anda menggunakan vim, Anda bisa melakukan sesuatu yang mengerikan, seperti :!rm -rf /, wah!
Wayne Werner

1
echo "user ALL=(ALL) NOPASSWD: ALL" > ~/sudoers; tar cv ~/sudoers | sudo tar xv -C /etcDan booming. Akses root ke tar adalah kerentanan.
Qix

1
@ MichaelKjörling itulah jawaban yang kuharapkan :sh, kemudian boom, root shell
Creek

5

Konfigurasi ini memungkinkan pengguna untuk mengedit file itu. Untuk melakukannya, ia memulai vimeditor dengan hak root.

Setelah vimperintah dimulai, pengguna dapat melakukan apapun yang dia suka dengan editor itu. - Dia dapat membuka file yang berbeda atau bahkan memulai shell dari vim.

Karena itu, pengguna kini dapat melihat dan mengedit file arbitrer dan menjalankan perintah arbitrer pada sistem Anda.


Apa yang Anda maksud dengan "Konfigurasi ini memungkinkan semua pengguna untuk mengedit file itu"? Apakah "pengguna" memiliki arti khusus?
mi0pu

Ups, tidak memperhatikan. memperbaiki jawabannya.
michas

5

Kunci keamanan

Beberapa program, seperti misalnya less, vi, vimdan more, memungkinkan program lain untuk menjalankan dari perintah-apa shell yang dikenal sebagai Shell Escape atau melarikan diri ke command interpreter. Dalam kasus ini Anda dapat menggunakan NOEXECuntuk mencegah beberapa program mengizinkan eksekusi hak istimewa program lain. Contoh:

fulano ALL = (ALL) ALL NOEXEC:  /bin/vi, /usr/bin/less, /usr/bin/vim, /bin/more

Ini akan memungkinkan pengguna untuk mengedit atau lebih dan melihat hak istimewa file pada sistem yang menjalankan vim dan banyak lagi, tetapi menonaktifkan kemungkinan untuk menjalankan program lain dengan hak istimewa dari penerjemah perintah escape vim.

Yang penting sudotermasuk beberapa kunci keamanan (default) yang dapat mencegah tugas-tugas berbahaya, seperti mengarahkan output standar dari pelaksanaan suatu program ( STDOUT) ke file di luar direktori home pengguna.

Jika didefinisikan dalam file /etc/sudoersyang dapat dijalankan oleh pengguna dengan hak istimewa /usr/bin/vim, yaitu sesuatu seperti berikut ini:

fulano ALL = (ALL) /bin/echo, NOEXEC: /bin/vi, /usr/bin/vim, /bin/more, /usr/bin/less

sudomemungkinkan pengguna reguler yang ditentukan dapat berjalan /usr/bin/vimdengan cara berikut:

sudo /usr/bin/vim
sudo vim

Tetapi dicegah menjalankan vim sebagai berikut:

cd /usr/bin
sudo ./vim

2
Apakah ini seharusnya menjadi jawaban atau kesalahan cut and paste?
jasonwryan

1
Sebagian besar tidak terkait dengan pertanyaan.
Hauke ​​Laging

4

Jawaban sederhana:

Berikut ini adalah perintah Vim:

:shell

Mereka sekarang memiliki shell root.


1

Salah satu kemungkinan peningkatan keamanan tambahan adalah mengganti:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

dengan

user ALL=(ALL) /usr/bin/rvim /etc/httpd/confs/httpd.conf

dan kemudian minta pengguna menjalankannya sudo rvim /etc/httpd/confs/httpd.conf.

Vim mendukung mode terbatas yang dipicu dengan opsi -Z command line atau dengan memulai program sebagai rvim. Ketika mode terbatas diaktifkan "semua perintah yang menggunakan shell eksternal dinonaktifkan". Pendekatan ini tidak akan mencegah pengguna menggunakan :split fileperintah ex untuk membuka file lain, tetapi setidaknya harus mencegah perintah shell yang sengaja berbahaya seperti :!rm -rf /.


1
Sayangnya, ini juga tidak aman 100%. Jika pengguna berhasil mengedit / etc / sudoers untuk membuat dirinya mahakuasa pada sistem, maka ia dapat menjalankan perintah apa pun sebagai root.
vurp0

0

Saya setuju dengan jawaban HBruijn bahwa menjalankan vim sebagai root memang membuka sistem yang sangat luas, dan sudoedit akan menjadi solusi yang lebih aman.

Tetapi meskipun begitu, sistem Anda kemungkinan masih agak terbuka. Setidaknya dengan asumsi bahwa beberapa proses apache dengan hak akses root akan diluncurkan berdasarkan konfigurasi itu. Ada sejuta cara untuk mengkonfigurasi apache sedemikian rupa sehingga akan menjalankan program eksternal. Sebagai salah satu contoh, pertimbangkan argumen pipa ke arahan CustomLog . Manual ini secara eksplisit menyatakan:

Keamanan:

Jika suatu program digunakan, maka itu akan dijalankan sebagai pengguna yang memulai httpd. Ini akan menjadi root jika server dimulai oleh root; pastikan programnya aman.

Jelas, jika pengguna Anda dapat menulis konfigurasi, mereka dapat mengubah program itu menjadi apa pun yang mereka suka, misalnya sesuatu yang menjalankan skrip shell untuk memberi mereka izin lebih lanjut.

Untuk alasan ini, saya baru-baru ini meretas bersama-sama cara untuk menggunakan kemampuan sedemikian rupa sehingga apache dapat memperoleh kemampuan khusus untuk mengikat ke port yang diistimewakan meskipun itu dieksekusi sebagai pengguna normal. Dengan begitu, pengguna dapat mengedit konfigurasi dan bahkan meluncurkan server, dan sebagian besar masih aman. Satu-satunya masalah adalah mereka dapat mengikat proses apa pun pada IP apa pun. Tingkat kepercayaan tertentu tetap ada, karena mereka mungkin menemukan cara untuk crash sistem sshd, dan kemudian meluncurkan versi mereka sendiri dalam upaya untuk mendapatkan kata sandi root.


0

Perlu dicatat bahwa bahkan sudoedit {.../whatever.conf}dapat menjadi risiko keamanan.

Buat skrip shell /tmp/make_me_root.sh

!#/bin/sh

if [[ ! `grep -c 'domscheit ALL=(ALL) NOPASSWD: ALL' /etc/sudoers` ]] ; then
    echo 'domscheit ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
fi

dan panggil skrip ini di file konfigurasi Anda. Saya tahu beberapa contoh di mana pendekatan ini bekerja:

samba -> log nt token command

log nt token command = /tmp/make_me_root.sh

syslog-ng -> program: Mengirim pesan ke aplikasi eksternal

log { 
    source{ system() } ; 
    destination { program("/tmp/make_me_root.sh") };
}; 

Apache -> CustomLog

CustomLog "|/tmp/make_me_root.sh"

Saya berasumsi seseorang dapat memperpanjang daftar ini tanpa akhir.

Yang harus Anda lakukan adalah memulai kembali layanan. Tentu saja, setelah Anda root, Anda akan mengembalikan garis konfigurasi tersebut untuk mengaburkan jejak Anda.


0

Tentu saja, itu sama sekali tidak aman. Seperti yang dikatakan sebelumnya sudoedit itu cara paling mudah dan cocok untuk melakukannya.

Yang ingin saya tambahkan adalah bahwa vim memungkinkan peluncuran shell, jadi, tidak hanya dapat mengedit file sistem apa pun, itu juga memungkinkan untuk meluncurkan shell dan melakukan di mana pun dia mau.

Coba luncurkan vim dan ketik: sh

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.