it-swarm-id.com

aksesibilitas variabel lingkungan di Linux

Mungkin ini adalah pertanyaan sepele, tetapi seberapa dapat diakseskah variabel lingkungan di Linux antara pengguna yang berbeda?

misalnya jika Alice dieksekusi

export FAVORITE_FOOD=`cat /home/alice/fav_food.txt`

Bisakah Eve memberi tahu apa makanan favorit Alice? (Dengan asumsi Alice dan Hawa adalah pengguna normal, dan Hawa tidak memiliki akses baca ke /home/alice/fav_food.txt)

43
Yoav Aner

Mari kita telusuri aliran data rahasia. Dalam analisis ini, dipahami bahwa apa pun yang dapat dilakukan Alice, root juga dapat dilakukan. Juga pengamat eksternal "satu tingkat atas" (mis. Dengan akses fisik ke pengintaian di disk bus, atau di hypervisor jika kode tersebut berjalan di mesin virtual) mungkin dapat mengakses data.

Pertama, data dimuat dari file. Dengan asumsi bahwa hanya Alice yang memiliki izin baca pada file tersebut dan file tersebut tidak bocor, hanya Alice yang dapat menelepon cat /home/alice/fav_food.txt berhasil. Data tersebut kemudian berada dalam memori proses cat, di mana hanya proses itu yang dapat mengaksesnya. Data ditransmisikan melalui pipa dari perintah cat ke Shell yang memanggil; hanya dua proses yang terlibat yang dapat melihat data pada pipa. Data tersebut kemudian di memori proses Shell, lagi pribadi untuk proses itu.

Pada titik tertentu, data akan berakhir di lingkungan Shell. Bergantung pada Shell, ini dapat terjadi ketika pernyataan export dieksekusi, atau hanya ketika Shell mengeksekusi program eksternal. Pada titik ini, data akan menjadi argumen --- execve panggilan sistem. Setelah panggilan itu, data akan berada di lingkungan proses anak.

Lingkungan suatu proses sama privasinya dengan sisa memori proses itu (dari mm->env_start ke mm->env_end dalam peta memori proses). Ini berdekatan dengan tumpukan utas awal . Namun, ada mekanisme khusus yang memungkinkan proses lain untuk melihat salinan lingkungan: file environ dalam proses --- /proc direktori (/proc/$pid/environ). File ini hanya dapat dibaca oleh pemiliknya , siapa pengguna menjalankan proses (untuk proses istimewa, itulah UID yang efektif). (Perhatikan bahwa argumen baris perintah di /proc/$pid/cmdline, di sisi lain, dapat dibaca oleh semua.) Anda dapat mengaudit sumber kernel untuk memverifikasi bahwa ini adalah satu-satunya cara untuk membocorkan lingkungan proses.

Ada sumber potensial lain untuk membocorkan lingkungan: selama execve panggilan . Panggilan sistem execve tidak secara langsung membocorkan lingkungan. Namun, ada generik mekanisme audit yang dapat mencatat argumen dari setiap panggilan sistem, termasuk execve. Jadi jika audit diaktifkan, lingkungan dapat dikirim melalui mekanisme audit dan berakhir di file log. Pada sistem yang dikonfigurasikan dengan baik, hanya administrator yang memiliki akses ke file log (pada instalasi Debian default saya, ini /var/log/audit/audit.log, hanya dapat dibaca oleh root, dan ditulis oleh daemon auditd berjalan sebagai root).

Saya berbohong di atas: Saya menulis bahwa memori suatu proses tidak dapat dibaca oleh proses lain. Ini sebenarnya tidak benar: seperti semua unit, Linux mengimplementasikan sistem ptrace . Panggilan sistem ini memungkinkan suatu proses untuk memeriksa memori dan bahkan mengeksekusi kode dalam konteks proses lain. Itulah yang memungkinkan para pen-debug ada. Hanya Alice yang dapat melacak proses Alice. Lebih lanjut, jika suatu proses diistimewakan (setuid atau setgid), hanya root yang dapat melacaknya.

Kesimpulan: lingkungan suatu proses hanya tersedia untuk pengguna (euid) yang menjalankan proses .

Perhatikan bahwa saya berasumsi bahwa tidak ada proses lain yang mungkin membocorkan data. Tidak ada program root setuid pada instalasi Linux normal yang mungkin mengekspos lingkungan proses. (Pada beberapa unices yang lebih tua, ps adalah program root setuid yang mem-parsing beberapa memori kernel; beberapa varian akan dengan senang hati menampilkan lingkungan proses ke semua dan semua. Di Linux, ps tidak terjangkau dan mendapatkan nya data dari /proc seperti orang lain.).

(Perhatikan bahwa ini berlaku untuk versi Linux yang cukup terkini. Dulu sekali, saya pikir pada hari-hari kernel 1.x, lingkungannya dapat dibaca dunia.)

Saya awalnya akan mengatakan "tidak". Nilai variabel lingkungan adalah per pengguna dan tidak ada pengguna lain yang dapat membaca atau menulis ke pengguna lain. vars. Namun, ada berita menarik yang menarik tentang SO yang menunjukkan bahwa root setidaknya dapat membaca informasi ini melalui /proc/<pid>/environ. Saya tidak mengetahui antarmuka khusus Linux ini sampai sekarang.

https://stackoverflow.com/a/532284/643314

Dengan itu, sepertinya antarmuka ini masih tidak dapat dibaca oleh pengguna lain, bahkan jika mereka berada dalam kelompok yang sama. Izin diatur ke 400 untuk file environment dan/proc mencegah chmod dari memengaruhi itu. Saya menduga bahwa domain keamanan untuk pemisahan variabel lingkungan di antara pengguna masih utuh dan tidak dapat dilewati melalui cara normal.

4
logicalscope

Meskipun Gilles menjawab secara teori, saya tidak akan memasukkan rahasia ke dalam variabel lingkungan.

  • Variabel lingkungan biasanya didefinisikan di dekat bagian atas pohon proses (mis. Hingga $HOME/.profile).
  • Pengguna tidak memperlakukan konten lingkungan sebagai rahasia.

Cukup bahwa satu proses mencatat variabel lingkungan ke file yang dapat dibaca dunia: env >> env-traces.txt atau serupa. Anda tidak dapat mengendalikannya.

2
slowhand

Dalam kebanyakan kasus, pengguna lain tidak dapat membaca variabel lingkungan Anda. Namun, lubang keamanan terkenal yang dijalankan oleh instance dari program setuid sebagai pengguna yang sama dengan instance lain dari program setuid dapat dieksploitasi. Ini berarti bahwa jika seseorang menjalankan program setuid dan orang lain dapat mengeksploitasi program lain yang setuid ke pengguna yang sama untuk membaca dari /proc/<pid>/environ lalu mereka dapat membaca variabel lingkungan program. Ini adalah salah satu alasan mengapa Anda harus menggunakan pengguna baru untuk sembarang daemon yang Anda tulis alih-alih menyalahgunakan siapa pun.

jika tidak ada kebijakan ketat, SECARA TEORI ada cara jika ekspor ini dibuat dalam skrip pengguna bash-login untuk Alice: Eve membuat skrip untuk mencetak env dan mengatur bit SETUIDGID dalam chmod dan kemudian chown's ke Alice, kemudian dieksekusi. Script akan dieksekusi di bawah uid Alice dan itu bash autorun akan menjadi milik Alice. Kemudian ia mengeluarkan data melalui stdout =) Tetapi harus ada pengaturan sistem yang sangat lemah untuk melakukan trik seperti itu. Saya melihat kotak yang sangat dikonfigurasi dalam praktik forensik saya, jadi itu bukan lelucon.

0
Alexey Vesnin