linux มีมาตรการป้องกันการระเบิดจากส้อมหรือไม่?


12
#include <unistd.h>
int main(int argc, char* argv[]) {
  while(1)
  {
    fork();
  } 
}

ฉันเรียกใช้โปรแกรมนี้บน linux ของฉันไม่มีอะไรออกมาบน terminal, ระบบปฏิบัติการดูเหมือนจะตาย linux มีมาตรการป้องกันโปรแกรมดังกล่าวซึ่งสามารถใช้หน่วยความจำไม่เพียงพอหรือไม่?


2
ฉันสงสัยว่าผลกระทบจะน้อยลงหากคุณไม่ทำตามคำแนะนำที่ไม่ดีนัก distros หลายคนให้สร้างพาร์ติชั่น swap ขนาดใหญ่ ...
.. GitHub STOP ช่วย ICE

1
"ไม่ได้สร้างกระบวนการใหม่ใด ๆ หลังจากที่กดปุ่ม 65k" นับเป็นมาตรการตอบโต้หรือไม่? ;)
Bobby

คำตอบ:


18

นี้เป็นที่รู้จักกันเป็นระเบิดส้อม

linux มีมาตรการป้องกันโปรแกรมดังกล่าวซึ่งสามารถใช้หน่วยความจำไม่เพียงพอหรือไม่?

ไม่ได้จริงๆ แต่ละ fork สร้างกระบวนการใหม่โดยมีพื้นที่ที่อยู่เสมือนและการใช้หน่วยความจำของตัวเอง ดังนั้นแต่ละสำเนามีขนาดค่อนข้างเล็ก ในที่สุดคุณจะใช้หน่วยความจำกายภาพ + swap ทั้งหมดในระบบและนักฆ่า out-of-memory (OOM) จะเริ่มฆ่ากระบวนการแต่ละกระบวนการ แต่ส้อมระเบิดจะยังคงสร้างกระบวนการอย่างรวดเร็ว (ถ้าไม่เร็วขึ้น)

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


2
สิ่งหนึ่งที่ควรทราบulimitคือเฉพาะทุบตี; เชลล์อื่นอาจมีคำสั่งในตัวเหมือนกัน แต่อาจมีชื่ออื่น
Jay

@Jay: จุดยุติธรรม ฉันสังเกตเห็นว่าในคำตอบตอนนี้ขอบคุณ!
Oliver Charlesworth

1
การ จำกัด หน่วยความจำ / ตัวอธิบายไฟล์ต่อผู้ใช้ควรเพียงพอ การ จำกัด หน่วยความจำต่อผู้ใช้เป็นความคิดที่ดีเสมอ เมื่อกระบวนการถูกฆ่า (oom) จ้องจับผิดควรส่งการแจ้งเตือนเพื่อให้ BOFH สามารถบูตผู้ใช้ 'คนโกง' ด้วยกระบวนการทั้งหมดที่เป็นของนอกระบบ

ฉันเชื่อว่าคุณสามารถกำหนดข้อ จำกัด บางอย่างผ่านพารามิเตอร์การเข้าสู่ระบบได้ด้วย
p_l

10

ใช่แม้ว่าจะไม่ได้เปิดใช้งานโดยค่าเริ่มต้นในระบบของคุณ การsetrlimitเรียกระบบกำหนดขีด จำกัด ของระบบ - รวมถึงจำนวนกระบวนการต่อผู้ใช้

มาดูกันก่อนใน kernel API (เนื่องจากคุณพูดถึง "linux"): คุณสามารถใช้ manpage สำหรับ setrlimit ซึ่งจะบอกให้คุณทำอะไรบางอย่างเช่น

#include <sys/resource.h>
...

struct rlimit  r;

rnew.r_cur = 40;
rnew.r_max = 50;
setrlimit(RLIMIT_NPROC,&r);

สิ่งนี้จะกำหนดกระบวนการสูงสุดต่อผู้ใช้ ( RLIMIT_NPROC) ถึง 40 (ซอฟต์ จำกัด ) และ 50 (ฮาร์ด จำกัด )

ตอนนี้จากเชลล์ถ้าคุณใช้ bash คุณสามารถใช้ulimitคำสั่งในตัว:

ulimit -u
29089

คุณสามารถตั้งค่าขีด จำกัด โดยส่งผ่านเป็นอาร์กิวเมนต์:

ulimit -u 100

ulimit --help จะแสดงให้คุณเห็นว่ามีข้อ จำกัด อื่น ๆ อีกมากมายที่คุณสามารถตั้งค่าได้ (อันที่น่าสนใจคือจำนวนตัวอธิบายไฟล์สูงสุดที่ผู้ใช้ใช้)


7

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

อย่างไรก็ตามในระดับระบบมีกลไกในการป้องกันผู้ใช้ที่เป็นอันตราย (หรือเพียงแค่ไม่ใช้ ulimit) จากการหยุดระบบ กลไก Linux cgroups สามารถ จำกัด ทรัพยากรได้ในแต่ละกลุ่ม คุณสามารถบังคับ (โดยpam_systemdกลไก) เซสชันผู้ใช้ให้อยู่ในกลุ่มเฉพาะ สิ่งนี้มีประโยชน์อื่น ๆ เช่น CPU scheduler


1
+1: กลุ่ม cg เป็นของใหม่จริงๆและคนส่วนใหญ่ยังไม่รู้เกี่ยวกับพวกเขามากนัก เราจะเรียนรู้เพิ่มเติมได้ที่ไหน
Ken Bloom

1
@KenBloom: 1. โดยการเรียกดู/sys/fs/cgroup/2. โดยการค้นหาใน google 3. โดยการเรียกดูผ่านmake menuconfig4. โดยดูที่/usr/src/linux/Documentation/cgroups5. โดยการอ่านเอกสาร systemd ขออภัยฉันไม่สามารถช่วยเพิ่มเติมได้ แต่ฉันใช้ทรัพยากรเหล่านั้นเท่านั้น ฉันใช้ cgroups บนเดสก์ท็อปเพื่อควบคุมทรัพยากร
Maciej Piechotka

6

ใช้ulimit -uจาก bash shell เพื่อตั้งข้อ จำกัด ใน "กระบวนการผู้ใช้สูงสุด"

จาก C เชลล์คุณใช้limitคำสั่ง

หากคุณต้องการเรียกระบบการทำเช่นนี้ใช้การเรียกร้องให้ชุดsetrlimitRLIMIT_NPROC


1

เนื่องจากคำตอบล่าสุดที่นี่มีอายุเกิน 3 ปีฉันต้องการชี้ให้เห็นว่าเมล็ดใหม่ (ตั้งแต่ 4.3) มีการสนับสนุนอย่างชัดเจนเพื่อป้องกันการวางระเบิดผ่านทางระบบย่อย "PIDs ใหม่" (ดูhttps://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=49b786ea146f69c371df18e81ce0a2d5839f865cและhttps://git.kernel.org/cgit/linux/kernel// /torvalds/linux.git/commit/?id=917d8e2d10f40e28aa9e0d824b2e5b8197d79fc2 )

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