Lệnh Bash khó hiểu này có nghĩa là gì?


23

Tôi đã đọc cảnh báo của Diễn đàn Ubuntu về các lệnh độc hại và tìm thấy viên ngọc thú vị này:

:(){ :|:& };:

CẢNH BÁO: Đoạn mã trên sẽ làm sập máy của bạn trừ khi bạn có giới hạn kiểm soát nghiêm ngặt (mà bạn có thể không có) khiến khởi động lại khó khăn.

Xem xét mã này tương tự như chạy sudo rm -rf / .

Nhưng điều đó có nghĩa gì? Ngay cả với kinh nghiệm lập trình của tôi, tôi chưa bao giờ thấy một lệnh khó hiểu không phải là ngôn ngữ lắp ráp.


16
Một điểm bổ sung: điều này thực sự không có cách nào tương tự sudo rm -rf /. Lệnh đó sẽ xóa tất cả các tệp của bạn; cái này chỉ làm tắc nghẽn tài nguyên của máy cho đến khi nó không sử dụng được và bạn phải khởi động lại.
jtbandes

@jtban: Sau đó chỉnh sửa nó ra. Cả hai đoạn mã là những gì tôi sẽ coi là "nguy hiểm" để chạy. Có sudo rm -rf /nhiều nguy hiểm nhưng tôi đã nhìn thấy người thực hiện điều này trên các máy chủ từ xa "chỉ muốn xem những gì nó đã làm" , nơi bạn có một thời gian khó khởi động lại mà không cần truy cập vào một bảng điều khiển.
Josh K

7
nó là một emotibomb: P
RCIX

Lưu ý nó có thể được arbitrary_name(){ arbitrary_name|arbitrary_name& };arbitrary_name. Tên này :không chỉ làm cho lệnh này ngắn và khó hiểu, mà còn biến một :nội trang không có gì thành một chức năng làm được nhiều việc . Nếu bạn lẻn định nghĩa của nó :(){ :|:& }vào môi trường của người khác và để nó ở đó, nó sẽ tấn công khi nạn nhân mong đợi điều đó ít nhất .
Kamil Maciorowski

Câu trả lời:


40

Như bạn đã nói, đó là một cái nĩa. Những gì nó làm là xác định một chức năng, sau đó gọi nó. Hàm được gọi :.

Hãy đặt tên cho nó forkbombđể chúng ta có thể thấy rõ hơn những gì đang diễn ra:

forkbomb(){ forkbomb|forkbomb& };forkbomb

Như bạn có thể thấy, và có thể đoán từ kinh nghiệm lập trình của bạn, phần đầu tiên là định nghĩa hàm ( forkbomb(){ ... }) và phần cuối cùng :là nơi hàm được gọi ( ;chỉ tách các câu lệnh trong Bash).

Bây giờ, chức năng này làm gì? Nếu bạn quen thuộc với Bash, bạn sẽ biết rằng |ký tự chuyển đầu ra tiêu chuẩn của một lệnh / chương trình sang đầu vào tiêu chuẩn của một lệnh khác. Về cơ bản, :|:khởi động hai trường hợp của hàm (đây là nơi nó "rẽ nhánh").

Và sau đó là phép màu: &đặt các lệnh đó ở chế độ nền, cho phép hàm ban đầu quay trở lại, trong khi mỗi trường hợp sẽ cho các con bò về nhà trong nền, do đó sử dụng hết tài nguyên của bạn và lấy xuống hệ thống (trừ khi nó có giới hạn áp đặt lên nó).


1
Câu trả lời chính xác! Tôi không nhận ra bạn có thể sử dụng: như một tên hàm. Việc đổi tên giúp. Sẽ chấp nhận trong 3 phút.
TheLQ

1
+1 Tuyệt vời ... Giải thích tuyệt vời. Điều này giống như một ngăn xếp tràn cho trình điều khiển tác vụ hệ điều hành. Nó thực sự làm hỏng kernel hay nó chỉ ăn hết tài nguyên cho đến khi nó trở nên quá khó sử dụng?
Evan Plaice

Tôi không nghĩ rằng nó thực sự làm hỏng kernel, ít nhất là không trực tiếp. Nó chỉ tiếp tục tạo ra nhiều tiến trình hơn theo cấp số nhân, mỗi quá trình chiếm CPU & bộ nhớ và với bộ xử lý cố gắng xử lý tất cả chúng, nó thực sự trở nên không thể sử dụng. Có thể là hạt nhân cuối cùng bị hỏng dưới tải (tôi không chắc chắn), nhưng nó sẽ không thể sử dụng được trước đó.
jtbandes

3
Đừng quên giải thích cuối cùng :, mà thực sự thực hiện chức năng!
Phoshi

@Phoshi: nghĩ rằng tôi đã làm, nhưng tôi sẽ chỉnh sửa để làm rõ!
jtbandes

9

Lấy từ bài viết 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

Hỏng:

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

Thay đổi :thành bombvà bạn có:

bomb(){ bomb|bomb& };bomb

Nó thực sự khá thanh lịch.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.