강제 종료 프로세스를 만드는 방법


10

루트 권한으로 시작된 후에는 관리자에게도 중지하기 어려운 프로그램을 만들고 싶습니다. 일단 시작되면 프로세스는 중지 요청이있을 때까지 시작시 계속해서 시작해야합니다. 중지 프로세스는 시간이 좀 걸립니다 (즉, 비싸야합니다).

나는 이것이 악의적 인 소프트웨어처럼 들릴지 알고 있지만 진정한 이유로 그것을 원합니다. 내 랩톱 (관리자)에서 사이트 차단기를 실행하고 싶습니다. 그리고 나는 그들을 막기 어렵게 만들고 싶습니다.

내가 생각한 해결책은 다음과 같습니다.

  1. 프로세스가 실행될 때마다 다른 이름으로 프로세스를 실행해야 프로세스 이름을 예측하여 종료 할 수 없습니다.

  2. 프로세스는 종료시 /etc/rc5.d에 자체 저장됩니다.

  3. 프로세스는 알려진 위치에서 사이퍼를 사용하여 이름을 암호화합니다. 중지 프로세스는 프로그램 이름을 복구하고 종료하기 위해 bruteforce를 사용해야합니다.

이 작업에 대한 좋은 해결책을 찾고 싶습니다.


2
당신은 실제로 맞습니다, 그것은 매우 의미있는 프로그램처럼 들립니다
Kiwy

문화 웹 사이트 ... 예, 이해합니다. 잘못된 DNS 목록으로 DNS를 컴파일하면 도움이 될 것입니다.
Kiwy

@Kiwy 예, 이것은 옵션이지만 DNS를 다시 설치할 수 있습니까?
Miheer

당신은 항상 모든 것을위한 길을 가질 수 있습니다. 어쩌면 친구에게 컴퓨터의 루트 암호를 유지하도록 요청하는 것이 문화 콘텐츠를 좋아하는 경우 부팅 가능한 USB 키를 사용하게 될 것이기 때문에 원하는 것을 준수하는 좋은 방법입니다.
Kiwy

예, 그러나 간단한 2 분 작업이되어서는 안됩니다.
Miheer

답변:


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의 출력은 1234 포트의 TCP 연결에 응답하는 "프로그램"으로 사용 하고 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에서). 그렇지 않으면, 무엇을 하든지 항상 하드 드라이브를 제거하고 프로세스를 시작하는 것을 제거 할 수 있습니다.
Stéphane Chazelas

1

그것이 최종 솔루션인지 또는 최선의 방법인지 확실하지 않습니다. 내 의견 :

  • init다른 모든 다이도 죽으면 첫 번째 프로세스이므로 수정 하십시오. 따라서 귀하의 기계는 기계에서만 사용할 수 있습니다.

  • 커널 모듈을 생성하고 그에 따라 중요한 모듈을로드하십시오 (죽인 경우 init예제 와 같은 연쇄 반응을 일으킬 것입니다 ).

  • 특정 프로세스에 대한 강제 종료 요청을 무시하도록 커널을 수정하십시오.

마지막 두 개는 커널 모드에서 실행됩니다 (lib와 매우 제한적입니다). 수정 init은 사용자 공간에서 실행되어 많은 기능을 사용할 수 있습니다.


1
그것이 안전한지 확실하지 않습니다.
Tinti

그리고 프로세스를 중지하는 방법?
Miheer

이것은 소프트웨어 자체에서 수행해야합니다. 소프트웨어 중지를 요청하는 방법을 만들어야합니다. /var/lib/stop.request와 같은 파일을 검사하는 스레드가 있다고 가정합니다. 이 파일에 암호 X가 포함되어 있으면 소프트웨어가 수행중인 WORK를 중지하고 일종의 절전 모드로 들어갑니다. 다른 파일 /var/lib/start.request를 만들어 다시 활성화 할 수 있습니다.
Tinti
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.