どうすれば殺しにくいプロセスを作成できますか


10

(root権限で)起動すると(管理者でも)停止しにくいプログラムを作成したい。いったん開始すると、プロセスは、停止するように要求されるまで、起動時にそれ自体を開始し続けるはずです。停止プロセスには時間がかかるはずです(つまり、コストがかかるはずです)。

これは悪意のあるソフトウェアのように聞こえるかもしれませんが、本当の理由でそれが欲しいです。自分のラップトップ(管理者)でサイトブロッカーを実行したい。そして、私がそれらを止めることを困難にしたいと思います。

私が考えた解決策は次のとおりです-

  1. プロセスは実行されるたびに異なる名前で実行する必要があるため、プロセス名を予測して強制終了することはできません。

  2. プロセスはシャットダウン時に自身を/etc/rc5.dに保存します

  3. プロセスは、既知の場所にある暗号を使用してその名前を暗号化します。停止プロセスは、ブルートフォースを使用してプログラム名を回復し、強制終了する必要があります。

このタスクの良い解決策を見つけたいのですが。


2
あなたは実際に正しい、それは非常に意地悪なプログラムのように聞こえる
Kiwy

文化的なWebサイト...はい、わかります。正しくないDNSのリストを使用してDNSをコンパイルすると役立つ場合があると思います
Kiwy

@Kiwyはい、それはオプションですが、DNSを再インストールできますよね?
Miheer 2013

あなたはいつでもあらゆることに道を開くことができます。たぶん友人にあなたのコンピュータのrootパスワードを保存するように頼むことは、あなたが求めているものに準拠する良い方法です:D文化的なコンテンツが好きなら、ブート可能なUSBキーを使うことになるからです。
Kiwy

はい、しかしそれは単純な2分の仕事ではありません。
Miheer 2013

回答:


8

1つのアプローチは、PID名前空間を使用することです。

init=/some/cmdasカーネルパラメータでシステムを起動/some/cmdし、新しい名前空間(CLONE_NEWPID)でプロセスをフォークして実行します(新しい名前空間に/sbin/initPID 1があり、ルート名前空間にpid 2があります)。次に、親で「プログラム"。

おそらく、プログラムを何らかの方法で制御する方法が必要になります(たとえば、TCPまたはABSTRACT Unixソケット)。

おそらく、プログラムをメモリ内でmlockし、ファイルシステムへのほとんどの参照を閉じて、何にも依存しないようにする必要があります。

そのプロセスは、システムの他の部分からは見えません。システムの残りの部分は、コンテナのように実行されます。

そのプロセスが停止すると、カーネルはパニックに陥り、追加の保証が与えられます。

ただし、の出力にはカーネルスレッドが表示されないという不便な副作用があり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"

unshareutil-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 2013

1
@ Miheer、USBキーから起動したり、別のオペレーティングシステムをインストールしたりできます。これを回避するには、マシンとBIOS、ブートローダー、カーネル、initrdを物理的にロックダウンする必要があります(そしてプログラムを起動する必要があります)そのinitrdから)一部の読み取り専用デバイス。それ以外の場合は、何をしても、常にハードドライブを取り外して、プロセスを開始するものを削除できます。
ステファンChazelas

1

それが最終的な解決策であるのか、それがそれを行う最善の方法であるのかはわかりません。私の意見:

  • init他のすべても死ぬ場合は、最初のプロセスなので、変更します。だからあなたのマシンはそれでしか使えないでしょう。

  • カーネルモジュールを作成し、それに応じて重要なモジュールをロードします(強制終了すると、init例のような連鎖反応が発生します)。

  • カーネルを変更して、特定のプロセスのkill要求を無視します。

最後の2つはカーネルモードで実行されることに注意してください(libsなどの点で非常に制限されています)。変更initはユーザー空間で実行され、その多くの機能を使用できます。


1
それが本当に安全かどうかわからない。
ティンティ

そして、プロセスを停止するには?
Miheer 2013

これは、ソフトウェア自体で行う必要があります。ソフトウェアに停止を要求する方法を作成する必要があります。/var/lib/stop.requestのようなファイルをチェックするスレッドがあるとしましょう。このファイルにパスワードXが含まれている場合、ソフトウェアは実行中のWORKを停止し、一種のスリープモードに入ります。別のファイル/var/lib/start.requestを作成することで、これを再度有効にすることができます。
ティンティ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.