คำสั่ง cashic Bash นี้หมายความว่าอย่างไร


23

ฉันอ่านคำเตือนของ Ubuntu Forum เกี่ยวกับคำสั่งที่เป็นอันตรายและพบอัญมณีที่น่าสนใจนี้:

:(){ :|:& };:

คำเตือน:โค้ดด้านบนจะทำให้เครื่องของคุณผิดพลาดเว้นแต่คุณจะมีข้อ จำกัด ของ proc อย่างเข้มงวด

sudo rm -rf /พิจารณารหัสนี้คล้ายกับการทำงาน

แต่นั่นหมายความว่าอย่างไร แม้จะมีประสบการณ์การเขียนโปรแกรมของฉันฉันไม่เคยเห็นคำสั่งที่คลุมเครือนั่นไม่ใช่ภาษาแอสเซมบลี


16
มีจุดเชื่อมต่อเพิ่มเติม: sudo rm -rf /นี้เป็นจริงในทางไม่คล้ายกับ คำสั่งนั้นจะลบไฟล์ทั้งหมดของคุณ อันนี้อุดตันทรัพยากรเครื่องของคุณจนกว่าจะใช้ไม่ได้และคุณต้องรีสตาร์ท
jtbandes

@jtban: จากนั้นแก้ไขออก โค้ดทั้งสองเป็นสิ่งที่ฉันคิดว่า "อันตราย" ในการทำงาน ใช่sudo rm -rf /เป็นสิ่งที่อันตรายมากขึ้นแต่ฉันเคยเห็นคนดำเนินการนี้บนเซิร์ฟเวอร์ระยะไกล"แค่อยากเห็นว่ามันทำอะไร"ซึ่งคุณเริ่มต้นใหม่ได้ยากโดยไม่ต้องเข้าถึงแผงควบคุม
Josh K

7
ข้อความแสดงอารมณ์: P
RCIX

arbitrary_name(){ arbitrary_name|arbitrary_name& };arbitrary_nameหมายเหตุมันอาจจะเป็น ชื่อ:ไม่เพียง แต่ทำให้สั้นนี้คำสั่งและความลับ แต่ยังเปลี่ยน:ในตัวที่ไม่อะไรในการทำงานที่ไม่มาก หากคุณแอบหมายของมัน:(){ :|:& }ในสภาพแวดล้อมของคนอื่นและปล่อยให้มันอยู่ที่นั่นก็จะนัดหยุดงานเมื่อเหยื่อคาดว่าอย่างน้อย
Kamil Maciorowski

คำตอบ:


40

อย่างที่คุณพูดไว้ สิ่งที่มันคือการกำหนดฟังก์ชั่นแล้วเรียกมันว่า :ฟังก์ชั่นที่เรียกว่า

ลองตั้งชื่อforkbombเพื่อที่เราจะได้เห็นว่าเกิดอะไรขึ้น:

forkbomb(){ forkbomb|forkbomb& };forkbomb

ดังที่คุณเห็นและอาจเดาได้จากประสบการณ์การเขียนโปรแกรมของคุณส่วนแรกคือนิยามฟังก์ชัน ( forkbomb(){ ... }) และสุดท้าย:คือตำแหน่งที่เรียกใช้ฟังก์ชัน ( ;แยกคำสั่งใน Bash)

ตอนนี้ฟังก์ชั่นนี้ทำอะไร? หากคุณคุ้นเคยกับ Bash คุณจะรู้ว่า|ตัวละครไพพ์ไปที่เอาต์พุตมาตรฐานของคำสั่ง / โปรแกรมหนึ่งไปยังอินพุตมาตรฐานของอีกอันหนึ่ง ดังนั้นโดยทั่วไปแล้วให้:|:เริ่มต้นฟังก์ชันสองอินสแตนซ์ (นี่คือตำแหน่งที่ "ส้อม")

แล้วเวทมนตร์: การ&ทำให้คำสั่งเหล่านั้นอยู่ในพื้นหลังทำให้ฟังก์ชั่นดั้งเดิมกลับมาในขณะที่แต่ละตัวอย่างแยกแยะจนกระทั่งแม่วัวกลับมาบ้านดังนั้นจึงใช้ทรัพยากรทั้งหมดของคุณและทำให้ระบบล้มเหลว (เว้นแต่มีข้อ จำกัด ) กำหนดไว้ในนั้น)


1
คำตอบที่ดี! ฉันไม่ทราบว่าคุณสามารถใช้: เป็นชื่อฟังก์ชัน การเปลี่ยนชื่อช่วย จะยอมรับใน 3 นาที
TheLQ

1
+1 เจ๋ง ... คำอธิบายที่ดี นี่เป็นเหมือนสแต็คโอเวอร์โฟลว์สำหรับ OS taskwitcher จริง ๆ แล้วมันทำให้เคอร์เนลผิดพลาดหรือไม่ก็กินทรัพยากรจนมันเหลือทนเกินกว่าจะใช้?
Evan Plaice

ฉันไม่คิดว่ามันจะเกิดปัญหาเคอร์เนลอย่างน้อยก็ไม่โดยตรง มันเพิ่งสร้างกระบวนการเพิ่มเติมแบบทวีคูณซึ่งแต่ละกระบวนการใช้ CPU & หน่วยความจำและด้วยโปรเซสเซอร์ที่พยายามจัดการกับมันทั้งหมดมันก็เป็นไปไม่ได้ที่จะใช้จริง ๆ อาจเป็นไปได้ว่าในที่สุดเคอร์เนลจะล่มภายใต้โหลด (ฉันไม่แน่ใจ) แต่มันจะใช้ไม่ได้ก่อนหน้านี้
jtbandes

3
อย่าลืมอธิบายขั้นตอนสุดท้าย:ซึ่งจะใช้งานฟังก์ชันจริง!
Phoshi

@Phoshi: คิดว่าฉันทำ แต่ฉันจะแก้ไขเพื่อชี้แจง!
jtbandes

9

นำมาจากบทความ Wikipedia Forkbomb :

:()      # define ':' -- whenever we say ':', do this:
{        # beginning of what to do when we say ':'
    :    # load another copy of the ':' function into memory...
    |    # ...and pipe its output to...
    :    # ...another copy of ':' function, which has to be loaded into memory
         # (therefore, ':|:' simply gets two copies of ':' loaded whenever ':' is called)
    &    # disown the functions -- if the first ':' is killed,
         #     all of the functions that it has started should NOT be auto-killed
}        # end of what to do when we say ':'
;        # Having defined ':', we should now...
:        # ...call ':', initiating a chain-reaction: each ':' will start two more.

7

พังทลายลง:

: () // Define ':' as a function. When you type ':' do the following
{
    : // Call ':' 
    | // Redirect output
    : // Into ':'
    & // Push process to the background
}; // End of ':' def
: // Now do ':'

เปลี่ยน:เป็นbombและคุณมี:

bomb(){ bomb|bomb& };bomb

มันค่อนข้างหรูหราจริงๆ

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