Bagaimana saya bisa membuat proses yang sulit untuk membunuh

10

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-

  1. Proses harus dijalankan dengan nama yang berbeda setiap kali dijalankan, sehingga saya tidak dapat memprediksi nama proses dan membunuhnya.

  2. Proses ini akan menghemat sendiri di /etc/rc5.d pada saat shutdown

  3. 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.

Miheer
sumber
2
Anda benar, itu terdengar seperti program yang sangat kejam
Kiwy
situs web budaya ... ya saya mengerti. Saya pikir mengkompilasi DNS dengan daftar dns yang salah dapat membantu Anda
Kiwy
@ Kiriw Ya itu adalah pilihan, tapi kemudian saya bisa menginstal ulang DNS bukan?
Miheer
Anda selalu dapat memiliki cara untuk setiap hal. Mungkin meminta seorang teman untuk menyimpan kata sandi root komputer Anda adalah cara yang baik untuk mematuhi apa yang Anda minta: D karena Anda akhirnya akan menggunakan kunci usb yang dapat di-boot, jika Anda sangat menyukai konten budaya.
Kiwy
Ya tapi itu seharusnya bukan pekerjaan sederhana 2 menit.
Miheer

Jawaban:

8

Salah satu pendekatan bisa menggunakan ruang nama PID:

Boot sistem Anda dengan init=/some/cmdparameter as kernel, tempat /some/cmdfork proses di namespace baru ( CLONE_NEWPID) dan berjalan /sbin/initdi 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/initseperti:

#! /bin/sh -
echo Starting
/usr/local/bin/unshare -fmp -- sh -c '
  umount /proc
  mount -nt proc p /proc
  exec bash <&2' &
ifconfig lo 127.1/8
exec socat tcp-listen:1234,fork,reuseaddr system:"ps -efH; echo still running"

(Anda perlu unsharedari versi terbaru util-linux (2.14)). Di atas kami menggunakan socatsebagai "program" yang hanya menjawab pada koneksi TCP pada port 1234 dengan output ps -efH.

Kemudian boot VM Anda sebagai:

kvm -kernel /boot/vmlinuz-$(uname -r) -initrd /boot/initrd.img-$(uname -r) \
    -m 1024 -fsdev local,id=r,path=/,security_model=none \
    -device virtio-9p-pci,fsdev=r,mount_tag=r -nographic -append \
    'root=r rootfstype=9p rootflags=trans=virtio console=ttyS0 init=/tmp/init rw'

Lalu, kita melihat:

Begin: Running /scripts/init-bottom ... done.
Starting
[...]
root@(none):/# ps -efH
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 14:24 ?        00:00:00 bash
root         4     1  0 14:24 ?        00:00:00   ps -efH
root@(none):/# telnet localhost 1234
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
UID        PID  PPID  C STIME TTY          TIME CMD
root         2     0  0 14:24 ?        00:00:00 [kthreadd]
root         3     2  0 14:24 ?        00:00:00   [ksoftirqd/0]
[...]
root         1     0  2 14:24 ?        00:00:00 socat tcp-listen:1234,fork,reuseaddr system:ps -efH; echo still running
root       204     1  0 14:24 ?        00:00:00   /usr/local/bin/unshare -fmp -- sh -c    umount /proc   mount -nt proc p /proc   exec bash <&2
root       206   204  0 14:24 ?        00:00:00     bash
root       212   206  0 14:25 ?        00:00:00       telnet localhost 1234
root       213     1  0 14:25 ?        00:00:00   socat tcp-listen:1234,fork,reuseaddr system:ps -efH; echo still running
root       214   213  0 14:25 ?        00:00:00     socat tcp-listen:1234,fork,reuseaddr system:ps -efH; echo still running
root       215   214  0 14:25 ?        00:00:00       sh -c ps -efH; echo still running
root       216   215  0 14:25 ?        00:00:00         ps -efH
still running
Connection closed by foreign host.
root@(none):/# QEMU: Terminated
Stéphane Chazelas
sumber
Tapi kemudian tidak bisakah saya hanya mengubah bootfile untuk tidak memulai / some / cmd?
Miheer
1
@Miheer, dan Anda dapat melakukan booting dari kunci USB, atau menginstal sistem operasi yang berbeda ... Untuk menghindarinya, Anda harus mengunci mesin dan BIOS secara fisik dan boot loader serta kernel dan initrd (dan programnya telah dimulai dari initrd itu) pada beberapa perangkat read-only. Jika tidak, apa pun yang Anda lakukan, Anda akan selalu dapat melepas hard drive dan menghapus hal yang memulai proses Anda.
Stéphane Chazelas
1

Tidak yakin apakah itu solusi terakhir atau apakah itu cara terbaik untuk melakukannya. Pendapat saya:

  • Ubah initkarena 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 initcontoh).

  • 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 initakan berjalan di userspace memungkinkan Anda untuk menggunakan banyak fitur itu.

Tinti
sumber
1
Tidak yakin apakah itu benar-benar aman.
Tinti
Dan bagaimana cara menghentikan prosesnya?
Miheer
Ini perlu dilakukan dalam perangkat lunak itu sendiri. Anda harus membuat cara untuk meminta perangkat lunak berhenti. Mari kita mengira bahwa ia memiliki utas yang memeriksa file seperti: /var/lib/stop.request. Jika file ini berisi kata sandi X, perangkat lunak menghentikan PEKERJAAN yang sedang dilakukannya dan masuk dalam semacam mode tidur. Anda dapat mengaktifkannya kembali dengan membuat file lain /var/lib/start.request.
Tinti