Nasıl öldürmek zor bir süreç oluşturabilirim


10

Başlatıldıktan sonra (yönetici ayrıcalıklarıyla) durması zor bir program oluşturmak istiyorum. Başlatıldıktan sonra, işlemin durması istenene kadar başlangıçta kendini başlatmaya devam etmesi gerekir. Durdurma işlemi biraz zaman alacaktır (yani pahalı olmalıdır).

Bunun kötü amaçlı bir yazılım gibi gelebileceğini biliyorum, ama gerçek bir nedenden dolayı istiyorum. Dizüstü bilgisayarımda site engelleyicileri çalıştırmak istiyorum (üzerinde yönetici olduğum). Ve onları durdurmamı zorlaştırmak istiyorum.

Düşündüğüm çözüm şu-

  1. İşlem her çalıştırıldığında farklı bir adla çalıştırılmalıdır, böylece işlem adını tahmin edip öldüremem.

  2. İşlem kapanırken kendini /etc/rc5.d dosyasına kaydeder.

  3. İşlem, adını bilinen bir konumda bir şifre kullanarak şifreleyecektir. Durdurma işlemi, program adını kurtarmak ve öldürmek için bruteforce kullanmalıdır.

Bu görev için iyi bir çözüm bulmak istiyorum.


2
haklısın, kulağa çok kötü bir program gibi geliyor
Kiwy

kültürel web siteleri ... evet anlıyorum. Sanırım DNS'yi yanlış dns listesiyle derlemek size yardımcı olabilir
Kiwy

@Kiwy Evet, bu bir seçenektir, ancak DNS'yi yeniden yükleyebilir miyim?
Miheer

Her şey için her zaman bir yolunuz olabilir. Belki bir arkadaşınızın bilgisayarınızın kök şifresini tutmasını isteyin: İstediğinize uymanın güzel bir yoludur: D çünkü kültürel içeriği çok seviyorsanız, önyüklenebilir bir usb anahtarı kullanacaksınız.
Kiwy

Evet ama 2 dakikalık basit bir iş olmamalı.
Miheer

Yanıtlar:


8

Bir yaklaşım PID ad alanlarını kullanmak olabilir:

Sisteminizi, yeni bir ad alanında ( ) bir işlem çatalla (ve bu işlemde çalıştırır) init=/some/cmd, çekirdek /some/cmdad parametresiyle önyükleyin (bu yeni ad alanında PID 1 ve kök ad alanında pid 2 olacaktır), ardından üst öğede " Program".CLONE_NEWPID/sbin/init

Muhtemelen programınızı şu veya bu şekilde kontrol etmenin bir yolunu isteyeceksiniz (örneğin, TCP veya ABSTRACT Unix soketi).

Muhtemelen programınızı bellekte kilitlemek ve dosya sistemine yapılan çoğu referansı kapatmak, böylece hiçbir şeye güvenmemek istersiniz.

Bu süreç sistemin geri kalanından görülmeyecek. Sistemin geri kalanı aslında bir kapta olduğu gibi çalışacaktır.

Bu işlem sona ererse, çekirdek size ekstra bir garanti veren panikleyecektir.

Rahatsız edici bir yan etki, çıktısında çekirdek ipliklerini görmeyeceğimizdir ps.

Bir kavram kanıtı olarak ( sisteminizin bir kopyasını qemu sanal makinesinde önyüklemek için bu hileyi kullanarak ):

Bir /tmp/initbeğenme oluşturun :

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

( unshareutil-linux'un (2.14) son sürümlerinden birine ihtiyacınız var ). Yukarıda socat, 1234 numaralı bağlantı noktasındaki TCP bağlantılarının çıkışıyla yanıt veren "program" olarak kullanıyoruz ps -efH.

Ardından VM'nizi şu şekilde başlatın:

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'

Sonra görüyoruz:

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

Ama daha sonra bootfile dosyasını start / some / cmd olarak değiştiremez miyim?
Miheer

1
@Miheer ve bir USB anahtarından önyükleme yapabilir veya farklı bir işletim sistemi yükleyebilirsiniz ... Bundan kaçınmak için, makineyi ve BIOS'u ve önyükleme yükleyicisini ve çekirdeği ve initrd'ı fiziksel olarak kilitlemeniz gerekir (ve programı başlatmanız gerekir) bazı initrd). Aksi takdirde, ne yaparsanız yapın, sabit sürücüyü her zaman çıkarabilir ve işleminizi başlatan şeyi kaldırabilirsiniz.
Stéphane Chazelas

1

Son çözüm olup olmadığından veya bunu yapmanın en iyi yolu olup olmadığından emin değilim. Benim düşüncelerim:

  • Öldürün init, eğer ölürse ilk süreç olduğu için diğerlerinin de ölmesi. Böylece makineniz sadece onunla kullanılabilir.

  • Bir çekirdek modülü oluşturun ve kritik modülleri ona bağlı olarak yükleyin (eğer öldürülürse initörnek gibi bir zincirleme reaksiyona neden olacaktır ).

  • Belirli bir işlem için öldürme isteklerini yoksaymak için çekirdeği değiştirin.

Son ikisinin çekirdek modunda çalışacağını unutmayın (ki bu, libs ve benzeri bir şey açısından çok sınırlıdır). Değiştirme init, kullanıcı alanında çalışır ve birçok özelliğini kullanmanıza olanak tanır.


1
Gerçekten güvenli olup olmadığından emin değilim.
Tinti

Ve süreci nasıl durdurabilirim?
Miheer

Bunun yazılımın kendisinde yapılması gerekir. Yazılımın durmasını istemek için bir yol oluşturmanız gerekir. Diyelim ki /var/lib/stop.request gibi bir dosyayı kontrol eden bir iş parçacığı var. Bu dosya X şifresi içeriyorsa, yazılım yaptığı işi durdurur ve bir tür uyku moduna girer. Başka bir dosya /var/lib/start.request oluşturarak yeniden etkinleştirebilirsiniz.
Tinti
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.