ฉันจะสร้างกระบวนการที่ยากต่อการฆ่าได้อย่างไร


10

ฉันต้องการสร้างโปรแกรมที่ยากต่อการหยุด (แม้กระทั่งสำหรับผู้ดูแลระบบ) เมื่อมันเริ่มขึ้น (ด้วยสิทธิ์ของรูท) เมื่อเริ่มต้นกระบวนการควรเริ่มต้นเองต่อเมื่อเริ่มต้นจนกว่าจะขอให้หยุด กระบวนการหยุดควรใช้เวลาสักครู่ (เช่นควรมีราคาแพง)

ฉันรู้ว่านี่อาจฟังดูเหมือนซอฟต์แวร์ที่เป็นอันตราย แต่ฉันต้องการด้วยเหตุผลของแท้ ฉันต้องการเรียกใช้ตัวบล็อกไซต์บนแล็ปท็อปของฉัน (ซึ่งฉันเป็นผู้ดูแล) และฉันต้องการทำให้มันยากสำหรับตัวฉันที่จะหยุดพวกเขา

ทางออกที่ฉันคิดว่าเป็นดังต่อไปนี้ -

  1. กระบวนการควรรันด้วยชื่อแตกต่างกันในแต่ละครั้งที่รันดังนั้นฉันไม่สามารถคาดการณ์ชื่อกระบวนการและฆ่ามันได้

  2. กระบวนการจะบันทึกตัวเองใน /etc/rc5.d เมื่อปิดเครื่อง

  3. กระบวนการนี้จะเข้ารหัสชื่อโดยใช้เลขศูนย์ในบางตำแหน่งที่ทราบ กระบวนการหยุดจะต้องใช้ bruteforce เพื่อกู้คืนชื่อโปรแกรมและฆ่ามัน

ฉันต้องการค้นหาวิธีแก้ปัญหาที่ดีสำหรับภารกิจนี้


2
คุณพูดถูกจริงๆมันฟังดูเหมือนโปรแกรมที่มีความหมายมาก
Kiwy

เว็บไซต์ทางวัฒนธรรม ... ใช่ฉันเข้าใจ ฉันคิดว่าการรวบรวม DNS ด้วยรายการ DNS ที่ไม่ถูกต้องสามารถช่วยคุณได้
Kiwy

@ กีวีใช่นั่นคือตัวเลือก แต่หลังจากนั้นฉันสามารถติดตั้ง DNS ใหม่ได้ใช่มั้ย
Miheer

คุณสามารถมีทุกสิ่งได้เสมอ อาจขอให้เพื่อนเก็บรหัสผ่านรูทของคอมพิวเตอร์ของคุณเป็นวิธีที่ดีในการปฏิบัติตามสิ่งที่คุณขอ: D เพราะคุณจะจบลงด้วยการใช้คีย์ usb ที่สามารถบูตได้หากคุณชอบเนื้อหาทางวัฒนธรรมที่มาก
Kiwy

ใช่ แต่ไม่ควรทำอย่างง่าย 2 นาที
Miheer

คำตอบ:


8

วิธีการหนึ่งอาจใช้เนมสเปซ PID:

บูตระบบของคุณด้วยinit=/some/cmdพารามิเตอร์เคอร์เนลโดย/some/cmdให้กระบวนการในเนมสเปซใหม่ ( CLONE_NEWPID) และทำงาน/sbin/initในมัน (มันจะมี PID 1 ในเนมสเปซใหม่นั้นและ pid 2 ในรูทเนมสเปซ) จากนั้นในพาเรนต์ โปรแกรม".

คุณอาจต้องการวิธีควบคุมโปรแกรมของคุณไม่ทางใดก็ทางหนึ่ง (เช่น TCP หรือ ABSTRACT Unix socket)

คุณอาจต้องการ 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"

(คุณต้องการ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

แต่ฉันไม่สามารถเปลี่ยน bootfile เป็นไม่เริ่ม / some / cmd ได้หรือไม่
Miheer

1
@Miheer และคุณสามารถบูตจากคีย์ USB หรือติดตั้งระบบปฏิบัติการอื่น ... เพื่อหลีกเลี่ยงปัญหานี้คุณต้องล็อคเครื่องและไบออสและบูตโหลดเดอร์และเคอร์เนลและเริ่มต้น (และเริ่มโปรแกรม จาก initrd นั้น) ในอุปกรณ์แบบอ่านอย่างเดียว ไม่ว่าคุณจะทำอะไรคุณจะสามารถถอดฮาร์ดไดรฟ์ออกได้ตลอดเวลาและนำสิ่งที่เริ่มกระบวนการของคุณออก
Stéphane Chazelas

1

ไม่แน่ใจว่ามันเป็นทางออกสุดท้ายหรือถ้าเป็นวิธีที่ดีที่สุดที่จะทำ ความคิดเห็นของฉัน:

  • ปรับเปลี่ยนinitเนื่องจากมันเป็นกระบวนการแรกถ้ามันตายคนอื่น ๆ ทั้งหมดตายด้วย ดังนั้นเครื่องของคุณจะสามารถใช้ได้กับมันเท่านั้น

  • สร้างโมดูลเคอร์เนลและโหลดโมดูลที่สำคัญขึ้นอยู่กับมัน (ถ้ามันถูกฆ่ามันจะทำให้เกิดปฏิกิริยาลูกโซ่เช่นinitตัวอย่าง)

  • ปรับเปลี่ยนเคอร์เนลเพื่อละเว้นคำร้องขอ kill สำหรับกระบวนการที่แน่นอน

โปรดทราบว่าทั้งสองจะทำงานในโหมดเคอร์เนล (ซึ่งมีข้อ จำกัด มากในแง่ของ libs และอื่น ๆ ) การแก้ไขinitจะทำงานใน userspace ซึ่งช่วยให้คุณสามารถใช้คุณสมบัติต่างๆได้


1
ไม่แน่ใจว่าปลอดภัยหรือไม่
Tinti

และวิธีการหยุดกระบวนการ?
Miheer

สิ่งนี้จะต้องทำในซอฟต์แวร์เอง คุณจะต้องสร้างวิธีการขอให้ซอฟต์แวร์หยุด ให้สมมติว่ามันมีเธรดที่ตรวจสอบไฟล์เช่น: /var/lib/stop.request หากไฟล์นี้มีรหัสผ่าน X ซอฟต์แวร์จะหยุดการทำงานและเข้าสู่โหมดสลีป คุณสามารถเปิดใช้งานได้อีกครั้งโดยสร้างไฟล์ /var/lib/start.request อีกไฟล์
Tinti
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.