การใช้นามแฝงการวางระเบิดในระดับโลกจะป้องกันไม่ให้มีการดำเนินการหรือไม่


15

ถ้าคุณจะตั้งทั่วโลก

alias ':(){ :|:& };:'='echo fork bomb averted'

นั่นจะเป็นกลยุทธ์ด้านความปลอดภัยที่มีประสิทธิภาพเพื่อหลีกเลี่ยงการประหารชีวิต Bash fork หรือจะมีวิธีในการดำเนินการหรือไม่?

ฉันคิดว่าคำถามเป็นเงินสดออกไป: มีวิธีดำเนินการคำสั่งเมื่อมันเป็นนามแฝงกับสิ่งอื่นหรือไม่?


1
@ user1717828 "fork bomb" เป็นโปรแกรมที่เรียกใช้สำเนาใหม่ของตัวเองตลอดไป การเติบโตแบบเลขชี้กำลังที่เกิดขึ้นในจำนวนของโปรแกรมที่ใช้งานมักจะทำให้บางสิ่งบางอย่างแตกในระยะเวลาอันสั้น
ทำเครื่องหมาย

1
แม้ว่าสิ่งนี้จะได้ผล - มันจะไม่ป้องกันโปรแกรมที่เรียก fork () ที่ไม่ผ่านการทุบตี?
UKMonkey

2
: () {: |: &: |: &} ;:
Joshua

3
เพิ่งรันa(){ a|a& };a
user253751

1
คุณจะหลีกเลี่ยงรูปแบบทั่วไป (หากคุณต้องการให้มันทำงานได้เลย) แต่ก็มีความผันแปรที่ใกล้เคียงกับมันมาก
เสา

คำตอบ:


52

สองไม่มีสาม ... ท่ามกลางอุปสรรคหลักในการที่มี:

  1. ไม่ใช่ชื่อที่ถูกต้องสำหรับนามแฝง คู่มือออนไลน์ของ Bash :

    อักขระ ... และอักขระตัวพิมพ์ใหญ่ของเชลล์หรือตัวอักษรที่กล่าวถึงข้างต้นอาจไม่ปรากฏในชื่อนามแฝง

    (, ), &, |และช่องว่างที่จะออกในทุบตี 4.4

  2. สตริงนั้นไม่ใช่วิธีเดียวที่จะเขียน fork fork ในเปลือก แต่มีชื่อเสียงเพราะมันดูคลุมเครือ ตัวอย่างเช่นไม่จำเป็นต้องเรียกใช้ฟังก์ชัน:แทนสิ่งที่ประกอบด้วยตัวอักษรจริง ๆ

  3. หากคุณสามารถตั้งค่านามแฝงผู้ใช้สามารถตั้งค่านามแฝงหลีกเลี่ยงได้โดยการหลีกเลี่ยงชื่อนามแฝงบนบรรทัดคำสั่งหรือปิดใช้งานนามแฝงพร้อมกันโดยอาจเรียกใช้ฟังก์ชันในสคริปต์ (Bash ไม่ขยายนามแฝงในเชลล์แบบไม่โต้ตอบ) .

  4. แม้ว่าเชลล์จะถูก จำกัด เพียงพอที่จะหยุดการ fork fork ทุกรุ่นระบบวัตถุประสงค์ทั่วไปจะมียูทิลิตี้ที่สามารถตั้งโปรแกรมอื่น ๆ ที่สามารถเรียกคืนและแยกการประมวลผลย่อยได้ มี Perl หรือคอมไพเลอร์ C ใช่ไหม ง่ายพอสมควร แม้แต่ awk ก็สามารถทำได้ แม้ว่าคุณจะไม่ได้ติดตั้งสิ่งเหล่านี้คุณจะต้องหยุดผู้ใช้ไม่ให้นำไบนารีที่รวบรวมมาจากภายนอกระบบหรือการทำงาน/bin/shซึ่งอาจจะต้องเป็นเชลล์การทำงานอย่างสมบูรณ์เพื่อให้ระบบที่เหลือทำงานได้อย่างเต็มที่

เพียงใช้ulimit -u(เช่นRLIMIT_NPROC) หรือเทียบเท่าเพื่อ จำกัด จำนวนกระบวนการที่ผู้ใช้สามารถเริ่มต้นได้ ในระบบลีนุกซ์ส่วนใหญ่จะมีการpam_limitsกำหนดจำนวนการ จำกัด กระบวนการก่อนที่คำสั่งใด ๆ ที่ผู้ใช้เลือกจะเริ่มขึ้น

สิ่งนี้/etc/security/limits.confจะทำให้กระบวนการ 50 ข้อ จำกัด แก่ผู้ใช้ทั้งหมด:

*        hard    nproc           50

(Stephen Kitt พูดถึงประเด็นที่ 1 แล้ว Jeff Schaller พูดถึง 2 และ 3)


เป็นไปได้ไหมที่จะเขียน fork fork โดยปราศจาก&?
Stephen Kitt

4
@StephenKitt ฉันไม่แน่ใจ 100% แต่ฉันเดาว่าการทุบตีนั้นสมบูรณ์ ถ้าเป็นเช่นนั้นมีความเป็นไปได้ที่ไม่มีที่สิ้นสุด ตัวอย่างเช่นคุณสามารถแยกวิเคราะห์รหัส ascii 38 และดำเนินการได้
มารี

@Marie ในบริบทนี้คุณต้องหลีกเลี่ยงอักขระต้องห้ามอื่น ๆ ในขณะที่หลีกเลี่ยง&ข้อ จำกัด
Stephen Kitt

15
ประเด็นหลักของฉันคือการพยายามที่จะขึ้นบัญชีดำฟังก์ชั่นที่ไม่ดีเป็นความคิดที่ไม่ดี มีวิธีการเกือบตลอดเวลา
มารี

2
@ มารี: ทุบตีค่อนข้างทัวริงสมบูรณ์
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

18

ไม่ได้มีวิธีมากมายในการเขียน fork-bomb

ผู้เขียน fork-bomb ชั่วร้ายจะลองอีกครั้งด้วยชื่อฟังก์ชันที่แตกต่าง หรือการดัดแปลงอื่น ๆ จนกระทั่งการวางระเบิดของเขาสำเร็จ

ผู้เขียนโดยไม่ตั้งใจ fork-bomb จะไม่สร้าง forkical bomb-canonical ตั้งแต่แรก

จริง ๆ แล้วมันค่อนข้างง่ายที่จะเป็นนักเขียนส้อมระเบิดโดยไม่ตั้งใจ ตัวอย่างเช่นคุณสามารถใช้ recursive makeกับภายนอกไม่ได้ตรวจสอบcdรวมกับ-jตัวเลือกและไดเรกทอรีย่อยที่ไม่ได้มีอยู่ - ตัวอย่างจริงที่ฉันเคยเจอครั้งเดียว

คุณไม่สามารถป้องกันความเป็นไปได้ทั้งหมดและแน่นอนไม่ได้กับผู้โจมตีที่มุ่งมั่น สิ่งที่คุณจะทำได้คือเพิ่มความซับซ้อนของระบบ


14

คุณไม่สามารถใช้นามแฝง fork fork ได้เนื่องจากไม่ใช่ชื่อนามแฝงที่ถูกต้อง :

$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name

อักขระ '/', '$', '`', '=' และอักขระตัวพิมพ์ใหญ่ของเชลล์หรืออักขระที่อยู่ในรายการด้านบนอาจไม่ปรากฏในชื่อนามแฝง

เชลล์บางตัวไม่ตรวจสอบชื่อนามแฝงเมื่อมีการประกาศ แต่เมื่อตีความคำสั่งแล้วข้ามชื่อที่ไม่ถูกต้องไปก่อน Fork fork จะรวมอยู่เสมอ&ซึ่งไม่สามารถรวมอยู่ในชื่อนามแฝงที่ถูกต้องได้ดังนั้นการป้องกันตัวเองด้วยวิธีนี้จึงเป็นไปไม่ได้


ไม่ว่าเชลล์จะอนุญาตให้ตั้งค่านามแฝงนี้หรือไม่ก็ตาม สำคัญคือแม้ว่า iff เช่น alias จะมีอยู่ แต่จะไม่ถูกขยายขณะตีความคำสั่งเนื่องจากชื่อ alias ไม่ตรงกับรูปแบบที่อนุญาต dashและboshเช่นทั้งสองอย่างเงียบ ๆ ไม่สนใจมัน
Schily

10

สองครั้งที่

นั่นไม่ใช่วิธีเดียวที่จะเขียนส้อม - ระเบิด

มีหลายวิธีในการเรียกใช้ "คำสั่ง" เมื่อมีนามแฝง:

command the-command
\the-command

ตัวอย่าง:

$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html  output.png
$ command ls
jeff.html  output.png

ไม่เกี่ยวข้องกับหัวข้อหลัก แต่ทำไมไม่\lsแสดงoutput.pngแต่command lsไม่ได้?
nxnev

ดีเห็น! นั่นคือแน่นอนไม่เกี่ยวข้องกับหัวข้อหลัก มันเป็นข้อผิดพลาดPEBCAKแบบคลาสสิกที่ฉันคัดลอก / วางผิด (หรือลบล้าง output.png ที่อยู่ระหว่าง) ฉันจะแก้ไขเพื่อลดการรบกวน ขอบคุณ @nxnev!
Jeff Schaller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.