Ngã ba bom trên máy Mac?


8

Tôi mới biết về một quả bom ngã ba , một loại thú vị của một cuộc tấn công từ chối dịch vụ. Wikipedia (và một vài nơi khác) đề nghị sử dụng :(){ :|:& };:trên các máy UNIX để xử lý số lần xử lý. Tuy nhiên, nó dường như không hoạt động trên Mac OS X Lion (Tôi nhớ rằng đọc các hệ điều hành phổ biến nhất không dễ bị tấn công trực tiếp như vậy). Tuy nhiên, tôi rất tò mò về cách một cuộc tấn công như vậy hoạt động (và trông), và muốn dùng thử máy Mac của tôi. Có cách nào để đi xung quanh các biện pháp bảo vệ của hệ thống không, hay đó là trường hợp bom ngã ba không thể thực hiện được trên máy Mac?


2
Lưu ý: Tôi không khuyên bạn nên thử bom ngã ba trực tiếp trên hệ thống của bạn (và không bao giờ trên hệ thống của người khác). Một số HĐH vẫn dễ bị tấn công. Thử trong một VM đầy đủ (ví dụ VirtualBox).
Gilles 'SO- ngừng trở nên xấu xa'

Có phải câu hỏi này đã được trả lời (tức là tại sao bom ngã ba không hoạt động trên máy Mac)? Câu trả lời được chấp nhận (của Bruce Ediger ) chỉ đơn thuần là giải thích chức năng của một quả bom nĩa và không nhất thiết phải nói với các thợ máy trong OS X đang ngăn một quả bom ngã ba phá hủy (vì nó sẽ không làm ở nơi nào khác trên đất Linux) .
decimus phostle

@decimusphostle Tôi không chắc bạn đã đi đến kết luận rằng câu hỏi của tôi là tại sao bom ngã ba không hoạt động trên máy Mac. Vì vậy, có, câu hỏi đã được trả lời.

Câu trả lời:


3

Làm thế nào một quả bom ngã ba hoạt động: trong mã C (hoặc giống như C), một hàm có tên fork()được gọi. Điều này khiến linux hoặc Unix hoặc Unix-a-like tạo ra một quy trình hoàn toàn mới. Quá trình này có một không gian địa chỉ, ID tiến trình, mặt nạ tín hiệu, mô tả tệp mở, tất cả các cách chiếm không gian trong bộ nhớ có phần hạn chế của nhân hệ điều hành. Quá trình mới được tạo cũng có một vị trí trong cấu trúc dữ liệu của kernel để các tiến trình chạy. Đối với quá trình được gọi fork(), có vẻ như không có gì xảy ra. Một quá trình ném bom sẽ cố gắng gọi fork()nhanh nhất có thể, nhiều lần nhất có thể.

Thủ thuật là quá trình mới được tạo cũng trở lại từfork() cùng một mã. Sau một ngã ba, bạn có hai quy trình chạy cùng một mã. Mỗi quá trình ném bom mới cố gắng gọi fork()nhanh nhất có thể, nhiều lần có thể. Mã bạn đã đưa ra làm ví dụ là phiên bản Bash-script của bom ngã ba.

Ngay sau đó, tất cả các tài nguyên liên quan đến quá trình của nhân hệ điều hành sẽ được sử dụng hết. Bảng quy trình đã đầy. Danh sách các quy trình chờ để chạy đã đầy. Bộ nhớ thực đã đầy, vì vậy phân trang bắt đầu. Nếu điều này diễn ra đủ lâu, phân vùng trao đổi sẽ lấp đầy.

Điều này trông giống như một người dùng: mọi thứ chạy siêu chậm. Bạn nhận được thông báo lỗi như "không thể tạo quy trình" khi bạn thử những thứ đơn giản như ls. Cố gắng psgây ra một khoảng dừng tạm thời (nếu nó hoàn toàn chạy) và đưa ra một danh sách rất dài các quy trình. Đôi khi tình huống này yêu cầu khởi động lại thông qua dây nguồn.

Bom ngã ba từng được gọi là "thỏ" ngày xưa. Vì chúng sinh sản rất nhanh.

Để cho vui, tôi đã viết một chương trình ném bom trong C:

#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
        while (1)
                fork();

        return 0;
}

Tôi đã biên dịch và chạy chương trình đó dưới Arch Linux trong một xterm. Tôi một xterm khác tôi đã cố gắng để có được một danh sách quá trình:

1004 % ps -fu bediger
zsh: fork failed: resource temporarily unavailable

Vỏ Z trong xterm thứ 2 không thể gọi fork()thành công vì các quá trình ném bom liên kết với xterm thứ 1 đã sử dụng hết tất cả các tài nguyên hạt nhân liên quan đến quá trình được tạo và chạy.


3

Có nhiều biện pháp bảo vệ có thể được đưa ra để ngăn bom ngã ba hoạt động.

Đơn giản nhất là:

ulimit -u 1024

giới hạn số lượng quá trình người dùng đến 1024.

Theo như xung quanh các biện pháp bảo vệ hệ thống, chắc chắn có những cách bạn có thể tìm thấy để làm điều đó nhưng tôi không nghĩ rằng bất cứ ai ở đây sẽ cho bạn cách để làm điều đó nhưng về cơ bản, hệ thống của bạn sẽ hết PID và không thể sinh ra nữa. các quá trình và về cơ bản hoàn toàn dừng lại do bom của bạn đang chiếm 100% CPU đang cố gắng tự sinh ra nhiều hơn.


Bom ngã ba đã được xung quanh như bao giờ hết. Đây thực sự là một sự bảo vệ rất đơn giản chống lại bom ngã ba, nhưng cho đến nay hầu hết các bản phân phối Linux không thực hiện nó. Không chắc chắn tại sao, nhưng tôi nghĩ nó cũng có liên quan đến việc hạn chế các quy trình người dùng đáng tin cậy.
jippie

@jippie Bởi vì tốt hơn là làm điều này theo một cách khác nhưrlimit
Karlson

4
Tuy nhiên, tôi nghĩ rằng đó là một mặc định ngu ngốc khi hầu hết các bản phân phối cho phép một quả bom ngã ba từ những người dùng không có đặc quyền đến DoS một máy.
jippie

1
@jippie Triết lý đằng sau hầu hết các bản phân phối Unix là chúng được điều hành bởi những người "thông minh". Vì vậy, theo mặc định, những người "thông minh" này được phép làm hầu hết mọi thứ và các quản trị viên sẽ kiểm soát để làm cho hệ thống an toàn hơn ... Tôi sẽ để lại kết luận cho trí tưởng tượng của người đọc. Và tập tin trong câu hỏi là/etc/security/limits.conf
Karlson

1
Hạn chế số lượng quy trình không phải lúc nào cũng đủ: nhu cầu liên tục về việc làm quá tải một số bộ lập lịch (một bộ lập lịch không được viết với mục đích ngăn chặn bom ngã ba có thể dành thời gian từ chối ngã ba trên ngã ba và gần như không bao giờ lên kế hoạch cho các quy trình hữu ích) .
Gilles 'SO- ngừng trở nên xấu xa'

2

Nếu bạn thật sự tuyệt vọng khi thấy quả bom ngã ba hoạt động như thế nào, hãy thử chạy nó dưới quyền root, ví dụ sudo :(){ :|:& };:, nhưng một lần nữa, sẽ được cảnh báo. Đã thử nó trên Ubuntu. Hệ thống S FREE MIỄN PHÍ!

Một mổ xẻ đơn giản cho bạn:

:() { #Define a new shell function
  :|:& #Pipe function named ':' through itself, creating two copies of itself, and make them run in the background
} #End of function definition block
;: #Call the ':' function. Note how the function is defined with two calls to itself piped through each other. This starts a chain reaction: those two copies will in turn create two more, and so on, as infinitum

Hãy nhận ra điều này khi cố gắng làm hại như vậy ...


Kịch bản này sẽ hoạt động như đối với Linux, nhưng trên MAC, hãy xóa ';' trên dòng cuối cùng.
HashHazard

2
Bạn không thể sử dụng sudonhư thế
anh chàng kia

1
Đây chỉ là tạm thời và khởi động lại phải không?
Winnemucca

1
@Winnemucca Vâng, khi RAM và CPU bị quá tải, hệ thống bị đóng băng, chỉ cần khởi động lại và máy của bạn sẽ khởi động bình thường, trừ khi bạn đặt nó làm tập lệnh khởi động. Đó không phải là một ý tưởng rất thông minh mặc dù.
Manchineel

2
Tôi vừa mới sudo su rootchạy bom fork thực sự là người dùng root.
sudo

0

bạn có thể làm điều này nhưng đảm bảo rằng tệp có tên là file.py

import os 
while True
os.startfile(file.py)

1
Có lẽ, bạn muốn nó được chạy như một kịch bản python, phải không? Bạn sẽ không cần một shebang cho điều đó? Làm thế nào điều này có thể chạy mà không làm cho tập tin thực thi và thêm một #!/usr/bin/pythonshebang?
terdon
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.