ทำให้กระบวนการไม่มีทักษะบน Linux


14

ฉันกำลังทำงานกับแอปพลิเคชันตัวจัดการรหัสผ่านและเพื่อเหตุผลด้านความปลอดภัยฉันต้องการเปิดใช้งานกระบวนการที่ไม่มีทักษะ

นอกจากนี้ฉันไม่ต้องการให้โปรแกรมนี้เป็นดีมอนเพราะฉันต้องอ่านจากอินพุตมาตรฐานและเขียนลงไป

มีวิธีทำเช่นนี้หรือไม่?


11
"เพื่อเหตุผลด้านความปลอดภัยฉันต้องการเปิดใช้งานกระบวนการที่ไม่มีทักษะ" เพียงแค่รับทราบ - หากได้รับอนุญาตผู้คนสามารถใช้ประโยชน์จากมันได้อย่างง่ายดายด้วยเหตุผลที่เลวร้ายเช่นเปิดตัว fork fork ที่ไม่มีใครหยุดได้
VLAZ

32
เสียงนี้เช่นปัญหา XY ฉันสงสัยว่าไม่ว่าคุณจะพยายามทำอะไรให้สำเร็จกระบวนการที่ไม่มีทักษะนั้นไม่ใช่วิธีที่จะทำ "เพื่อเหตุผลด้านความปลอดภัย" นั้นคลุมเครือมาก คุณต้องการป้องกันผู้ใช้จากการทำอะไร? พวกเขาเข้าถึงอะไรบ้าง
Nate Eldredge

4
กระบวนการใดที่ไม่สามารถฆ่าได้สำหรับเจตนาและวัตถุประสงค์ทั้งหมดนั้นคือไวรัส
Naftuli Kay

3
@NateEldredge: ให้โปรแกรมเพิกเฉยต่อสัญญาณ นั่นเป็นวิธีทั่วไปในการทำ มิฉะนั้นใครบางคนสามารถส่ง SIGINT หรือ SIGTSTP โดยตรงไปยังกระบวนการผ่านสถานี
Noah Spurrier

2
@NahahSpurrier: ฉันจินตนาการถึงสถานการณ์ที่คุณมีผู้ใช้ที่สามารถพิมพ์สิ่งต่าง ๆ บนคอนโซล แต่ผู้ที่ไม่สามารถเรียกใช้รหัสบนคอมพิวเตอร์ (เช่นตู้) คุณตั้งค่าเพื่อไม่ให้คีย์ที่พิมพ์สามารถมีผลกระทบที่ไม่คาดคิด หากพวกเขาสามารถรันโค้ดอื่น ๆ ได้การเพิกเฉย SIGINT และ SIGTSTP และ SIGQUIT ก็ไม่ได้ช่วยอะไร ใครก็ตามที่สามารถส่งสัญญาณเหล่านั้นโดยตรงไปยังกระบวนการสามารถส่ง SIGKILL หรือ SIGSTOP ซึ่งคุณไม่สามารถเพิกเฉยได้
Nate Eldredge

คำตอบ:


41

ทำให้การทำงานภายใต้การจัดการรหัสผ่านของผู้ใช้แยกต่างหากและจับ / ละเว้น / บล็อกสัญญาณขั้วสร้าง ( SIGINT, SIGQUIT, SIGHUP, SIGTSTP, SIGTTINและSIGTTOU)

คุณไม่สามารถส่งสัญญาณไปที่ (= kill) กระบวนการที่ทำงานภายใต้ผู้ใช้อื่น (ผู้ใช้ที่มีทั้ง uid จริงและ uid ที่บันทึกไว้ตั้งค่าจะแตกต่างจาก uid ที่มีประสิทธิภาพของคุณ) เว้นแต่ว่ารหัสประสิทธิผลของคุณคือ 0 (root)

กระบวนการทั้งหมดจะยังคงสามารถฆ่าได้โดยรูท

สำหรับรายละเอียดที่ใกล้ชิดและดูฆ่า (2)


15

วิธีเดียวที่จะทำให้กระบวนการไม่สามารถทำได้คือการใช้มันเป็นเคอร์เนลเธรดซึ่งไม่ใช่เรื่องเล็กน้อย

คุณยังสามารถฆ่ามันได้ แต่นั่นจะเป็นความเสียหายของระบบปิดระบบปฏิบัติการ

คุณอาจพัฒนาโมดูลเคอร์เนลแบบกำหนดเองที่จะตั้งค่าSIGNAL_UNKILLABLEสถานะเป็นกระบวนการของคุณ การตั้งค่าสถานะนี้ถูกออกแบบมาเพื่อตั้งค่าเฉพาะสำหรับinit(หรือsystemdกระบวนการเริ่มต้นใดก็ตามที่เคอร์เนลเรียกใช้) ซึ่งเป็นกระบวนการ userland เดียวที่ได้รับการปกป้องจากการฆ่าแบบไม่มีเงื่อนไข


1
อาจเป็นกระบวนการเริ่มต้น
muhmuhten

@muhmuhten คุณถูกต้อง init คือกระบวนการของ userland ที่ได้รับการปกป้องจากการฆ่าอย่างไม่มีเงื่อนไข อย่างไรก็ตามมันไม่ได้ถูกออกแบบมาให้ปรับแต่งในขณะที่มี API แน่นอนสำหรับโมดูลเคอร์เนลและเธรด
jlliagre

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

@jlliagre แน่นอนมันไม่ใช่
muhmuhten

@dudek กระบวนการที่ไม่มีทักษะนั้นเป็นกรณีขอบทำไม่ได้ตามปกติแล้ว
jlliagre

11

ในทางเทคนิคแล้วไม่มีวิธีที่จะทำให้กระบวนการไม่สามารถฆ่าได้

แน่นอนสำหรับผู้ใช้ที่ไม่ใช่รูทพวกเขาสามารถฆ่ากระบวนการที่มี ID ผู้ใช้เดียวกับที่พวกเขาทำดังนั้นหากคุณสามารถสร้างบัญชีที่แตกต่างกันคุณสามารถใช้ ID ผู้ใช้ "ที่ไม่ซ้ำ" สำหรับกระบวนการและจากนั้นรูทเท่านั้น

โซลูชันที่เรียบง่าย แต่มีประสิทธิภาพน้อยกว่าคือการทำให้กระบวนการของคุณจับสัญญาณได้มากที่สุด (อาจเพิกเฉยต่อสัญญาณเหล่านั้น) เหมาะสำหรับตัวอย่างของเล่นหรือสภาพแวดล้อมที่ไม่เป็นอันตรายเนื่องจากไม่มีวิธีจับสัญญาณ KILL (สัญญาณ 9) แต่ไม่เช่นนั้นคุณสามารถหลีกเลี่ยงการถูกฆ่าได้

ในที่สุดคุณสามารถจัดการให้มีกระบวนการเกิดใหม่ได้หากถูกฆ่า นอกจากนี้ยังเปราะบาง (บอบบางมาก) แต่จะทำให้ยากขึ้นเล็กน้อยในการลบล้าง สามารถทำได้โดยใช้กระบวนการตรวจสอบของคุณเองหรือใช้ inittab สำหรับคู่ปรับที่รู้ว่ากำลังทำอะไรอยู่สามารถหลบเลี่ยงได้โดยง่ายด้วยการฆ่ากระบวนการหลายอย่างพร้อมกัน


1
แต่ (นอกเหนือจากinittab) เป็นไปได้ว่ากระบวนการตรวจสอบอาจถูกฆ่าได้หรือไม่?
roaima

ไม่โปรแกรมควบคุมอุปกรณ์ (โมดูลเคอร์เนล) สามารถสร้างกระบวนการที่ไม่สามารถฆ่าได้โดย root
Noah Spurrier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.