Cách ngăn chặn Fork Bomb khỏi lỗi bộ nhớ - RHEL 6


7

Tôi thiết lập VM thử nghiệm để kiểm tra tác dụng của bom ngã ba. Vì vậy, tôi đã chỉnh sửa limits.confnhư sau cho rootngười dùng:

root    hard         nproc  512

Bây giờ tôi thả một quả bom ngã ba như vậy:

:(){ :|:& };:

Sau này, sau một thời gian (mà tôi tin rằng cần phải đạt đến giới hạn 512), lỗi sau sẽ xuất hiện: thí dụ

Điều này tiếp tục mà không dừng lại. Có cách nào để ngăn chặn điều này mà không cần khởi động lại máy không?


Bạn có quyền truy cập vào một vỏ?
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


3

Có cách nào để ngăn chặn điều này mà không cần khởi động lại máy không?

Điều đó không hoàn toàn là không thể, và bạn có thể làm điều đó thông qua may mắn - tức là, bạn có thể giết tất cả các quy trình trước khi một quy trình khác được sinh ra. 1 Nhưng bạn phải nhận được rất may mắn, vì vậy đó không phải là một nỗ lực đáng tin cậy hay đáng giá [có lẽ slm may mắn hơn tôi ở đây, lol - TBH Tôi đã không cố gắng như vậy] . Nếu bạn chơi xung quanh với các ưu tiên, cơ hội của bạn có thể cải thiện (xem man nice), mặc dù tôi nghi ngờ điều này cũng sẽ gây rối với hiệu quả của bom ngã ba.

Một ý tưởng tốt hơn có thể là sử dụng một lần mà ra. Để biết ví dụ trong C, xem chú thích số 5 cho câu trả lời của tôi ở đây . 2 Bạn có thể làm điều tương tự với tập lệnh shell, mặc dù sẽ không ngắn như :(){ :|:& };::

#!/bin/bash

export fbomb_duration=$1
export fbomb_start=$(date +%s)

go () {
    now=$(date +%s)
    if [[ $(($now-$fbomb_start)) -gt $fbomb_duration ]]
        then exit 0;
    fi
    go &
}

while ((1)); do
    go
done           

Thực hiện điều đó với một đối số, một số giây. Tất cả các dĩa sẽ chết sau thời gian đó.

1 Trên thực tế, cuối cùng, nó có thể tự xảy ra nếu kẻ giết người OOM hạt nhân gặp may mắn. Nhưng đừng nín thở.

2 Phương pháp được sử dụng ở đó để gân kheo quả bom cụ thể đó (bằng cách cài đặt vm.overcommit_memory=2) gần như chắc chắn sẽ không hoạt động nói chung, nhưng bạn có thể thử. Tôi không muốn rời khỏi hệ thống của mình bây giờ;)


Tôi nghĩ rằng bạn có thể đơn giản hóa điều này bằng cách sử dụng giấc ngủ thay thế. Có lẽ?
slm

@slm Điều tốt nhất bạn có thể làm với một hạt nhân bình thường về độ chi tiết của giấc ngủ là 10ms và quá dài - nó sẽ giống như một chiếc bánh ngã ba xì hơi hơn là một quả bom nĩa.
goldilocks

3

Trong khi phát triển câu trả lời cho câu hỏi này, có tiêu đề: Cái nĩa () trên quả bom ngã ba: () {: |: &};:? , Tôi kết hợp những gì tôi gọi là một quả bom ngã ba bị trì hoãn, dễ giết hơn.

Ngoài ra, trong khi phát triển câu trả lời đó, tôi thường xuyên có thể ngăn chặn một quả bom ngã ba bằng cách giết tất cả các quy trình. Nó dễ dàng và lặp lại nhiều hơn tôi mong đợi.

Phương pháp sử dụng

Đã được một thời gian kể từ khi tôi viết câu trả lời đó vì vậy bây giờ tôi không chắc chắn 100% nhưng ngoài đỉnh đầu tôi nghĩ rằng tôi đang sử dụng phương pháp này:

$ pkill -f :

Nó sẽ bị đình trệ một chút chờ đợi một quá trình nhưng cuối cùng nó đã có thể chạy. Ngoài ra tôi sẽ lưu ý ID tiến trình cha mẹ trước khi bắt đầu ném bom ngã ba và cũng sẽ làm điều này:

$ pkill -P <PPID>

Đó là ID tiến trình mẹ (PPID) từ nơi bom ngã ba được chạy. Phương pháp đó sẽ đưa tất cả các quá trình con xuống, điều này sẽ khiến tất cả chúng bị vỡ và chết.


+1 nếu bạn đưa ra gợi ý về cách tiêu diệt tối ưu tất cả các quy trình;)
goldilocks

@goldilocks - xem cập nhật.
slm

:) Nếu bạn đặt ngã ba trong một tập lệnh gọi chính nó bằng tên, bạn cũng có thể làm một cái gì đó như while ((1)); do killall myscript.sh; done.
goldilocks

@goldilocks - ý kiến ​​hay.
slm

2

Tôi tin rằng bạn có thể làm như được đề xuất trong câu trả lời từ đây giả sử bạn có quyền truy cập vào shell.

killall -STOP -u user1
killall -KILL -u user1
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.