Buat suatu proses tidak dapat digunakan di Linux

14

Saya sedang mengerjakan aplikasi manajer kata sandi, dan untuk alasan keamanan saya ingin meluncurkan proses yang tidak dapat dilakukan.

Dan selain itu saya tidak ingin program ini menjadi daemon karena saya perlu membaca dari input standar dan menulisnya.

Apakah ada cara untuk melakukan ini?

Mohammad Razeghi
sumber
11
"Untuk alasan keamanan saya ingin meluncurkan proses yang tidak dapat dicapai." Hanya sebuah catatan - jika ini diizinkan, orang dapat dengan mudah mengeksploitasinya karena alasan jahat - misalnya, meluncurkan bom fork yang tak terhentikan.
VLAZ
32
Ini terdengar seperti masalah XY . Saya curiga bahwa apa pun yang benar-benar Anda coba capai, proses yang tidak dapat diraih bukanlah cara untuk melakukannya. "Untuk alasan keamanan" sangat tidak jelas. Apa sebenarnya yang ingin Anda lakukan agar pengguna tidak melakukannya? Akses apa yang mereka miliki?
Nate Eldredge
4
Setiap proses yang tidak dapat digunakan untuk semua maksud dan tujuan adalah virus.
Naftuli Kay
3
@NateEldredge: Sebaliknya, minta program mengabaikan sinyal. Itulah cara khas untuk melakukannya; jika tidak, seseorang dapat mengirim SIGINT atau SIGTSTP langsung ke proses, melewati terminal.
Noah Spurrier
2
@NoahSpurrier: Saya membayangkan situasi di mana Anda memiliki pengguna yang dapat mengetik sesuatu di konsol, tetapi yang tidak bisa mengeksekusi kode di komputer (seperti kios). Anda mengaturnya sehingga tidak ada kunci yang bisa mereka ketik akan memiliki efek yang tidak terduga. Jika mereka dapat mengeksekusi kode lain, maka mengabaikan SIGINT dan SIGTSTP dan SIGQUIT tidak membantu; siapa pun yang dapat mengirim sinyal tersebut langsung ke proses juga dapat mengirim SIGKILL atau SIGSTOP yang tidak dapat Anda abaikan.
Nate Eldredge

Jawaban:

41

Membuat password manager berjalan di bawah pengguna dan pegangan terpisah / mengabaikan / blok terminal yang dihasilkan sinyal ( SIGINT, SIGQUIT, SIGHUP, SIGTSTP, SIGTTIN, dan SIGTTOU).

Anda tidak dapat mengirim sinyal ke (= membunuh) proses yang dijalankan di bawah pengguna yang berbeda (pengguna yang baik uid nyata dan disimpan-set berbeda dengan uid efektif Anda) kecuali id ​​efektif Anda adalah 0 (root).

Semua proses masih akan dapat dibunuh dengan root.

Untuk detail lebih dekat, lihat membunuh (2) .

PSkocik
sumber
15

Satu-satunya cara untuk membuat suatu proses tidak dapat digunakan adalah dengan mengimplementasikannya sebagai utas kernel , yang bukan sesuatu yang sepele.

Anda masih dapat membunuhnya tetapi itu akan menjadi kerusakan jaminan OS shutdown.

Anda mungkin juga mengembangkan modul kernel khusus yang akan mengatur SIGNAL_UNKILLABLEflag ke proses Anda. Bendera ini dirancang untuk hanya ditetapkan untuk init(atau systemd, apa pun proses awal peluncuran kernel) yang merupakan satu-satunya proses userland yang dilindungi terhadap pembunuhan tanpa syarat, tetapi tampaknya tidak ada yang melarang bendera tersebut hadir untuk proses reguler.

Jlliagre
sumber
1
itu bisa menjadi proses init
muhmuhten
@muhmuhten Anda benar, init adalah proses userland yang dilindungi terhadap pembunuhan tanpa syarat. Namun ini tidak dirancang untuk dikustomisasi sementara pasti ada API untuk modul dan utas kernel.
jlliagre
Untuk menguraikan jawaban saya sendiri, saya berasumsi bahwa Anda tidak memiliki akses ke akun root (yang, secara kebetulan, mengisyaratkan bahwa ini adalah contoh mainan, proyek kursus atau malware). Yang menghalangi gagasan bahwa Anda dapat memasang modul kernel untuk tujuan itu. Juga perhatikan bahwa flag SIGNAL_UNKILLABLE tidak tersedia untuk proses normal dan menghalangi beberapa operasi normal yang penting (seperti vforking) dan jadi saya akan menganggapnya sebagai case edge yang biasanya tidak praktis.
GregD
@ jlliagre memang, bukan.
muhmuhten
@dudek Proses yang tidak dapat dikerjakan sudah merupakan kasus tepi yang biasanya tidak praktis.
jlliagre
11

Secara teknis, tidak ada cara untuk membuat suatu proses tidak dapat diraih.

Tentu saja, untuk pengguna non-root mereka hanya dapat membunuh proses yang memiliki ID pengguna yang sama dengan yang mereka lakukan, jadi jika Anda dapat membuat akun yang berbeda, Anda dapat menggunakan ID pengguna "unik" untuk proses tersebut dan kemudian hanya root yang dapat membunuhnya.

Solusi sederhana, tetapi kurang kuat, adalah membuat proses Anda menangkap sinyal sebanyak mungkin (mungkin mengabaikannya). Ini hanya cocok untuk contoh mainan atau lingkungan non-permusuhan karena tidak ada cara untuk menangkap sinyal KILL (sinyal 9), tetapi sebaliknya Anda dapat menghindari terbunuh oleh mereka.

Akhirnya, Anda dapat mengatur agar proses Anda respawn jika terbunuh. Ini juga rapuh (sangat rapuh), tetapi akan membuatnya agak sulit untuk dihapuskan. Ini dapat dilakukan dengan menggunakan proses monitor Anda sendiri, atau menggunakan inittab. Untuk musuh yang tahu apa yang mereka lakukan, ini dapat dengan mudah dielakkan dengan membunuh banyak proses sekaligus.

GregD
sumber
1
Tapi (selain inittab) itu mungkin proses monitor juga bisa mati, bukan?
roaima
Tidak, driver perangkat (modul kernel) dapat membuat proses yang tidak dapat dimatikan oleh root.
Noah Spurrier