Apakah ada cara penyerang bisa menggunakan mkdir untuk berkompromi dengan sistem?

22

Saya menyiapkan akun pengguna terbatas untuk pengguna ricardo, pengguna bermasalah di sistem saya. Saya ingin memberinya hak untuk membuat direktori menggunakan sudo, yang kadang-kadang perlu dia lakukan. Saya mempertimbangkan aturan ini di /etc/sudoersfile saya :

ricardo   ALL=(root) NOPASSWD: /bin/mkdir

Hanya menggunakan aturan ini, adakah cara ricardo dapat dengan sengaja atau tidak sengaja membahayakan sistem?

Ricardo Altamirano
sumber
2
Jika Anda memiliki sistem file dengan jumlah inode statis, ia dapat menggunakan semua inode Anda.
jordanm
2
@ schaiba Dia suka bermain-main dan melihat apakah dia dapat mengeksploitasi sistem dan tidak selalu membaca halaman manual sebanyak yang seharusnya.
Ricardo Altamirano
8
Pendidikan pengguna yang tepat, dikombinasikan dengan tanpa sudo pada saat ini, akan menjadi hal yang direkomendasikan untuk dilakukan dari saya.
schaiba
2
Seperti yang dikatakan @schaiba, Anda dapat menggunakan pengguna tersebut dengan mengajar mereka, dan memberi mereka tanggung jawab (di bawah pengawasan ketat). Saya telah melihat perang antara sysdamin dan pengguna, karena yang pertama mencoba untuk mengunci sistem terlalu banyak. Para pengguna melebihi jumlah sysadmin 10 banding 1, dan bahkan saat itu ( tanpa akses Internet hari ini!), Kekalahan sysdamin memalukan. Jangan pernah berada dalam posisi seperti itu!
vonbrand
2
Itu kasus salah satu ricardo terlalu banyak. Atau setidaknya, demikianlah BOFH ...
Deer Hunter

Jawaban:

21

Saya menduga serangan seperti ini akan berhasil, di mana «sesuatu» adalah modul kernel yang akan mencoba memuat setelah rootfs di-mount:

$ sudo mkdir -m 777 /lib/modules/`uname -r`/a
$ cp evil.ko /lib/modules/`uname -r`/a/«something».ko

Perhatikan juga bahwa Anda dapat menggunakan nama lain, tergantung pada alias yang dinyatakan dalam modul. Saya kira itu tidak akan dimuat sampai depmod dijalankan, yang akan terjadi pada saat berikutnya ada pembaruan kernel-sehingga mkdirbahkan tidak akan ditampilkan baru-baru ini di log sudo.

Ada banyak hal di / etc yang membaca semua file dalam direktori, terkadang secara rekursif. Lebih buruk lagi, beberapa direktori tersebut tidak ada secara default, dan satu-satunya cara untuk mengetahuinya adalah dengan membaca halaman manual, skrip init, dll. Untuk program yang menggunakannya. Beberapa, bahkan lebih buruk, sudah usang hal-hal kompatibilitas, dan bahkan mungkin tidak didokumentasikan lagi.

sunting: Memikirkan beberapa direktori lagi, ini dalam /usr/local:

  • /usr/local/lib/perl/5.14.2(berbeda tergantung pada versi Perl, cobalah perl -Vuntuk mencari tahu). Buat Filesubdirektori di sana, dan letakkan Find.pmdi dalamnya. Sekarang setiap kali ada yang menggunakan File::Find, mereka akan menggunakan versi penyerang. Demikian pula, lakukan hal yang sama dengan Getopt::Long. Utilitas sistem sering ditulis dalam Perl, jadi ini mungkin memberikan root. (Coba ack-grep --color -a 'use.+::' /usr/sbin | less -R)
  • Saya pikir Python, Ruby, dll. Memiliki direktori yang sama. Utilitas sistem juga ditulis dalam Python.
  • Subvert banyak hal yang dikompilasi dengan subdirektori dari seseorang /usr/local/include.
derobert
sumber
Oh, tetapi jika <evil user> dapat menyalin modul ke tempat kernel akan memuatnya, gim telah berakhir sebelum memulai.
vonbrand
1
@vonbrand <pengguna jahat> biasanya tidak bisa, tetapi menggunakannya sudo mkdiruntuk membuat direktori baru di mana ia bisa.
derobert
20

Dengan menjalankan mkdirsebagai root, pengguna dapat memblokir proses / pengguna lain dari membuat file dan direktori baru dengan membuat direktori dengan nama yang identik (dan / atau hak yang salah) sebelumnya.

Ini bisa menjadi keamanan yang relevan terutama dengan file log dan kunci .

Seperti yang dicatat jordanm , jumlah maksimal inode juga dapat digunakan yang dapat memblokir seluruh sistem.

Dengan menambahkan pengguna ke grup tertentu (atau menggunakan ACL ), Anda harus dapat menyelesaikan masalah tanpa memberikan hak apa pun melalui sudo.

Jofel
sumber
Poin bagus. Saya mungkin akan meninggalkan mkdirdaftar perintah ricardo diizinkan untuk digunakan.
Ricardo Altamirano
Jika itu untuk melelahkan inode, sederhana for((i = 0;; i++)); do touch $i; doneakan baik-baik saja (bashism, maaf; tetapi Anda mendapatkan ide).
vonbrand
@vonbrand Kecuali itu bukan sebagai root, jadi itu akan dihentikan oleh kuota. Tentu saja, sudoperintah lain yang dipertimbangkan OP dapat memungkinkan inode yang melelahkan juga; OP perlu mengetahui vektor DoS itu.
derobert
11

Anda harus mengarahkannya ke penjara chroot. Atau bahkan lebih baik, untuk VM kecil, bahwa ia dapat crash sekali dalam satu jam. Yang perlu Anda lakukan adalah memberikan salinan baru.

ott--
sumber
Saya sangat merekomendasikan ini. Beri dia akses root pada VM-nya sendiri.
emory
ke chroot ^ H ^ H ^ H ^ H ^ Hounty jail ...
Deer Hunter
6

Ada kemungkinan karena dapat membuat direktori dengan akses tulis. Dengan mkdir -m 777 blahini ricardopengguna bisa menulis apapun yang mereka suka ke direktori baru. Anda akan memerlukan proses pada sistem yang sudah berjalan sebagai pengguna lain yang akan mengulang pohon direktori untuk memuat konfigurasi, skrip atau modul. Kemudian pengguna mungkin dapat menambahkan barang-barang mereka sendiri untuk dimuat atau dijalankan. Hal pertama yang dapat saya pikirkan adalah jika Anda menjalankan server web yang dapat menjalankan php atau cgi. Anda kemudian dapat menjalankan skrip sebagai pengguna itu. Saya berjuang untuk menghasilkan lebih banyak contoh dunia nyata, terutama rootyang tapi saya yakin mereka tentang.

ssh adalah contoh dari daemon yang memerangkap skenario semacam ini. Jika Anda membuat .sshdirektori untuk pengguna yang tidak memilikinya dan letakkan authorized_hostsfile Anda sendiri di tempatnya. sshdpemberitahuan bahwa izin direktori terlalu terbuka dan mengabaikan kunci publik.

Anda pasti bisa membuat gangguan pada diri sendiri membuat direktori di mana file diharapkan muncul (seperti transient tmp atau swap file) yang banyak program tidak akan menangani dengan baik.

Anda dapat membuat banyak grup, tetapi sepertinya Anda tidak melakukan apa-apa dengannya. Anda mungkin bisa membawa sistem ke lutut setidaknya. Butuh sekitar 10.000 cgroup pada sebuah kotak dengan 256 juta untuk OOM killer untuk mengeluarkan sshd.

Jika Anda mengontrol -mopsi untuk mkdirdan UMASK sudolingkungan saya pikir itu kembali menjadi gangguan saja.

Mat
sumber