Saya ingin membuat program yang akan sulit dihentikan (bahkan untuk administrator) setelah dijalankan (dengan hak akses root). Setelah memulai proses harus terus memulai sendiri saat startup sampai diminta berhenti. Proses penghentian harus memakan waktu (mis. Harus mahal).
Saya tahu ini mungkin terdengar seperti perangkat lunak berbahaya, tetapi saya menginginkannya karena alasan yang tulus. Saya ingin menjalankan pemblokir situs di Laptop saya (di mana saya adalah admin). Dan saya ingin menyulitkan saya untuk menghentikan mereka.
Solusi yang saya pikirkan adalah sebagai berikut-
Proses harus dijalankan dengan nama yang berbeda setiap kali dijalankan, sehingga saya tidak dapat memprediksi nama proses dan membunuhnya.
Proses ini akan menghemat sendiri di /etc/rc5.d pada saat shutdown
Proses ini akan mengenkripsi namanya menggunakan cypher di beberapa lokasi yang diketahui. Proses penghentian harus menggunakan bruteforce untuk memulihkan nama program dan membunuhnya.
Saya ingin mencari solusi yang baik untuk tugas ini.
Jawaban:
Salah satu pendekatan bisa menggunakan ruang nama PID:
Boot sistem Anda dengan
init=/some/cmd
parameter as kernel, tempat/some/cmd
fork proses di namespace baru (CLONE_NEWPID
) dan berjalan/sbin/init
di dalamnya (PID 1 akan ada di namespace baru dan pid 2 di namespace root), lalu di induk, jalankan " program".Anda mungkin menginginkan cara untuk mengontrol program Anda dengan satu atau lain cara (TCP atau soket Unix ABSTRAK misalnya).
Anda mungkin ingin memlocking program Anda di memori dan menutup sebagian besar referensi ke sistem file sehingga tidak bergantung pada apa pun.
Proses itu tidak akan terlihat dari sisa sistem. Sisa dari sistem akan berjalan seperti dalam wadah.
Jika proses itu mati, kernel akan panik yang memberi Anda jaminan ekstra.
Efek samping yang tidak nyaman adalah kita tidak akan melihat utas kernel di keluaran
ps
.Sebagai bukti konsep (menggunakan trik ini untuk mem-boot salinan sistem Anda di mesin virtual qemu):
Buat yang
/tmp/init
seperti:(Anda perlu
unshare
dari versi terbaru util-linux (2.14)). Di atas kami menggunakansocat
sebagai "program" yang hanya menjawab pada koneksi TCP pada port 1234 dengan outputps -efH
.Kemudian boot VM Anda sebagai:
Lalu, kita melihat:
sumber
Tidak yakin apakah itu solusi terakhir atau apakah itu cara terbaik untuk melakukannya. Pendapat saya:
Ubah
init
karena ini adalah proses pertama jika mati semua yang lain mati juga. Jadi mesin Anda hanya akan dapat digunakan dengannya.Buat modul kernel dan muat modul penting tergantung padanya (jika terbunuh itu akan menyebabkan reaksi berantai seperti
init
contoh).Ubah kernel untuk mengabaikan permintaan mematikan untuk proses tertentu.
Perlu diingat bahwa dua yang terakhir akan berjalan dalam mode kernel (yang sangat terbatas dalam hal libs dan satu). Memodifikasi
init
akan berjalan di userspace memungkinkan Anda untuk menggunakan banyak fitur itu.sumber