Як я можу створити важкий для вбивства процес


10

Я хочу створити програму, яку буде важко зупинити (навіть для адміністратора) після її запуску (з привілеями root). Після запуску процес повинен продовжувати себе при запуску до тих пір, поки не попросять припинити. Процес зупинки повинен зайняти деякий час (тобто, він повинен бути дорогим).

Я знаю, це може здатися шкідливим програмним забезпеченням, але я хочу це з справжньої причини. Я хочу запустити блокатори сайтів на своєму ноутбуці (на якому я адміністратор). І я хочу ускладнити себе, щоб зупинити їх.

Я вирішив таке рішення:

  1. Процес повинен запускатися з іншим ім'ям кожного разу, коли він запускається, так що я не можу передбачити ім'я процесу та вбити його.

  2. Процес збереже себе в /etc/rc5.d при відключенні

  3. Процес буде зашифрувати своє ім'я за допомогою "cypher" у відомому місці. Для зупинення процесу доведеться використовувати грубу силу для відновлення назви програми та вбити її.

Я хотів би знайти гарне рішення для цього завдання.


2
ти насправді маєш рацію, це звучить як дуже гарна програма
Kiwy

культурні веб-сайти ... так, я розумію. Я думаю, що складання DNS зі списком неправильних dns може допомогти вам
Kiwy

@Kiwy Так, це варіант, але тоді я можу просто встановити DNS правильно?
Miheer

Ви завжди можете знайти шлях до кожної речі. Можливо, попросіть друга зберегти кореневий пароль вашого комп’ютера - це хороший спосіб виконати те, про що ви просите: D, оскільки ви в кінцевому підсумку скористаєтеся завантажувальним ключем usb, якщо вам так сподобається культурний контент.
Ківі

Так, але це не повинно бути простою двохвилинною роботою.
Міхер

Відповіді:


8

Одним із підходів може бути використання просторів імен PID:

Завантажте систему з init=/some/cmdпараметром як ядро, де /some/cmdроздвоює процес у новому просторі імен ( CLONE_NEWPID) і запускається /sbin/initв ньому (він буде мати PID 1 у новому просторі імен та pid 2 у кореневому просторі імен), а потім у батьківському, виконайте свій " програма ".

Ймовірно, ви хочете, щоб так чи інакше керувати вашою програмою (наприклад, сокет TCP або ABSTRACT Unix).

Напевно, ви захочете заблокувати програму в пам'яті та закрити більшість посилань на файлову систему, щоб вона ні на що не покладалася.

Цей процес не буде видно з решти системи. Решта системи фактично працюватимуть як у контейнері.

Якщо цей процес загине, ядро ​​впаде в паніку, що дає додаткову гарантію.

Незручним побічним ефектом є те, що ми не побачимо потоки ядра у висновку ps.

Як доказ концепції (використовуючи цей трюк для завантаження копії вашої системи у віртуальній машині qemu):

Створіть /tmp/initподібне:

#! /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"

(вам потрібна unshareостання версія util-linux (2.14)). Вище ми використовуємо socatяк "програму", яка просто відповідає на з'єднання TCP на порту 1234 з виходом ps -efH.

Потім завантажте свій VM як:

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'

Потім ми бачимо:

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

Але тоді я не можу просто змінити завантажувальний файл, щоб не запустити / some / cmd?
Miheer

1
@Miheer, і ви можете завантажуватися з USB-ключа або встановити іншу операційну систему ... Щоб уникнути цього, вам потрібно буде фізично заблокувати машину та BIOS, завантажувач і ядро ​​та initrd (і запустити програму з цього initrd) на деяких пристроях, доступних лише для читання. Інакше, що б ви не робили, ви завжди зможете зняти жорсткий диск і видалити те, що запускає ваш процес.
Стефан Шазелас

1

Не впевнений, чи це остаточне рішення, чи це найкращий спосіб зробити це. Моя думка:

  • Змінюйте, initоскільки це перший процес, якщо він помирає, всі інші теж вмирають. Таким чином, ваша машина буде корисна тільки з нею.

  • Створіть модуль ядра та завантажте критичні модулі залежно від нього (якщо він загине, це спричинить ланцюгову реакцію, як initприклад).

  • Змініть ядро, щоб ігнорувати запити на знищення для певного процесу.

Майте на увазі, що останні два працюватимуть в режимі ядра (що дуже обмежено з точки зору libs і так один). Модифікація initпрацюватиме в просторі користувачів, що дозволяє використовувати безліч її функцій.


1
Не впевнений, чи справді це безпечно.
Тінті

І як зупинити процес?
Miheer

Це потрібно зробити в самому програмному забезпеченні. Вам доведеться створити спосіб запиту програмного забезпечення зупинитись. Припустимо, що у нього є потік, який перевіряє файл типу: /var/lib/stop.request. Якщо цей файл містить пароль X, програмне забезпечення зупиняє РОБОТУ, яку він робить, і вводить у своєрідний режим сну. Ви можете повторно активувати його, створивши інший файл /var/lib/start.request.
Тінті
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.