Làm thế nào tôi có thể tạo ra một quá trình khó giết


10

Tôi muốn tạo một chương trình sẽ khó dừng (ngay cả đối với quản trị viên) khi chương trình được khởi động (với quyền root). Sau khi bắt đầu quá trình nên tiếp tục tự khởi động khi khởi động cho đến khi được yêu cầu dừng lại. Quá trình dừng nên mất một thời gian (Tức là phải tốn kém).

Tôi biết điều này nghe có vẻ như là một phần mềm độc hại, nhưng tôi muốn nó vì một lý do thực sự. Tôi muốn chạy trình chặn trang web trên Máy tính xách tay của mình (trên đó tôi là quản trị viên). Và tôi muốn làm cho bản thân khó ngăn chặn họ.

Giải pháp mà tôi nghĩ đến là:

  1. Quá trình nên chạy với một tên khác nhau mỗi lần nó chạy, do đó tôi không thể dự đoán tên quy trình và giết nó.

  2. Quá trình sẽ tự lưu trong /etc/rc5.d khi tắt máy

  3. Quá trình sẽ mã hóa tên của nó bằng cách sử dụng một cypher ở một số vị trí đã biết. Quá trình dừng sẽ phải sử dụng bruteforce để khôi phục tên chương trình và tiêu diệt nó.

Tôi muốn tìm một giải pháp tốt cho nhiệm vụ này.


2
bạn thực sự đúng, nó nghe có vẻ như là một chương trình rất có ý nghĩa
Kiwy 12/12/13

trang web văn hóa ... vâng tôi hiểu. Tôi nghĩ rằng việc biên dịch DNS với một danh sách các dns không chính xác có thể giúp bạn
Kiwy

@Kiwy Có, đó là một tùy chọn, nhưng sau đó tôi chỉ có thể cài đặt lại DNS phải không?
Miheer

Bạn luôn có thể có một cách cho mọi thứ. Có thể yêu cầu một người bạn giữ mật khẩu gốc của máy tính của bạn là một cách hay để tuân thủ những gì bạn yêu cầu: D vì cuối cùng bạn sẽ sử dụng khóa usb có thể khởi động, nếu bạn thích nội dung văn hóa đó.
Kiwy

Có nhưng nó không phải là một công việc 2 phút đơn giản.
Miheer

Câu trả lời:


8

Một cách tiếp cận có thể là sử dụng không gian tên PID:

Khởi động hệ thống của bạn với init=/some/cmdtham số kernel, trong đó tạo /some/cmdmột tiến trình trong không gian tên mới ( CLONE_NEWPID) và chạy /sbin/inittrong nó (nó sẽ có PID 1 trong không gian tên mới đó và pid 2 trong không gian tên gốc), sau đó trong cha mẹ, thực thi " chương trình".

Bạn có thể muốn có một cách để kiểm soát chương trình của mình bằng cách này hay cách khác (ví dụ như socket TCP hoặc ABSTRACT Unix).

Bạn có thể muốn khóa chương trình của mình trong bộ nhớ và đóng hầu hết các tham chiếu đến hệ thống tập tin để nó không phụ thuộc vào bất cứ điều gì.

Quá trình đó sẽ không được nhìn thấy từ phần còn lại của hệ thống. Phần còn lại của hệ thống sẽ có hiệu lực chạy như trong một container.

Nếu quá trình đó chết, kernel sẽ hoảng loạn mang đến cho bạn một sự đảm bảo thêm.

Một tác dụng phụ bất tiện là chúng ta sẽ không thấy các luồng nhân trong đầu ra của ps.

Như một bằng chứng về khái niệm (sử dụng thủ thuật này để khởi động một bản sao hệ thống của bạn trong máy ảo qemu):

Tạo một lượt /tmp/initthích:

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

(bạn cần unsharetừ một phiên bản gần đây của linux-linux (2.14)). Ở trên chúng tôi đang sử dụng socatlàm "chương trình" chỉ trả lời các kết nối TCP trên cổng 1234 với đầu ra của ps -efH.

Sau đó khởi động VM của bạn dưới dạng:

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'

Sau đó, chúng ta thấy:

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

Nhưng sau đó tôi không thể thay đổi bootfile để không bắt đầu / some / cmd?
Miheer

1
@Miheer và bạn có thể khởi động từ khóa USB hoặc cài đặt hệ điều hành khác ... Để tránh điều đó, bạn cần khóa vật lý máy và BIOS và bộ tải khởi động cũng như kernel và initrd (và khởi động chương trình từ initrd) trên một số thiết bị chỉ đọc. Mặt khác, bất cứ điều gì bạn làm, bạn sẽ luôn có thể tắt ổ cứng và loại bỏ thứ bắt đầu quá trình của bạn.
Stéphane Chazelas

1

Không chắc chắn nếu đó là giải pháp cuối cùng hoặc nếu đó là cách tốt nhất để làm điều đó. Ý kiến ​​của tôi:

  • Sửa đổi initvì nó là quá trình đầu tiên nếu nó chết tất cả những người khác cũng chết. Vì vậy, máy của bạn sẽ chỉ có thể sử dụng với nó.

  • Tạo một mô-đun hạt nhân và tải các mô-đun quan trọng tùy thuộc vào nó (nếu nó bị giết, nó sẽ gây ra phản ứng dây chuyền như initví dụ).

  • Sửa đổi kernel để bỏ qua các yêu cầu tiêu diệt cho một quy trình nhất định.

Hãy nhớ rằng hai cái cuối cùng sẽ chạy trong chế độ kernel (rất hạn chế về lib và vì vậy một cái). Sửa đổi initsẽ chạy trong không gian người dùng cho phép bạn sử dụng nhiều tính năng của nó.


1
Không chắc chắn nếu nó thực sự an toàn.
Tinti

Và làm thế nào để dừng quá trình?
Miheer

Điều này sẽ cần phải được thực hiện trong chính phần mềm. Bạn sẽ phải tạo một cách để yêu cầu phần mềm dừng lại. Giả sử rằng nó có một luồng kiểm tra một tệp như: /var/lib/stop.request. Nếu tệp này chứa mật khẩu X, phần mềm sẽ dừng CÔNG VIỆC mà nó đang thực hiện và nhập vào một loại chế độ ngủ. Bạn có thể kích hoạt lại nó bằng cách tạo một tệp khác /var/lib/start.request.
Tinti
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.