Toàn cầu sẽ đặt bí danh cho quả bom ngã ba sẽ ngăn chặn việc thực hiện nó?


15

Nếu bạn đã thiết lập toàn cầu

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

đó sẽ là một chiến lược an ninh hiệu quả để tránh vụ hành quyết bom ngã ba Bash hay vẫn còn cách để thực hiện nó?

Tôi cho rằng câu hỏi rút ra là: có cách nào để thực thi một lệnh khi nó được đặt bí danh cho thứ khác không?


1
@ user1717828, "bom ngã ba" là một chương trình chỉ đơn giản là chạy các bản sao mới của chính nó, mãi mãi. Sự tăng trưởng theo cấp số nhân của số lượng chương trình đang chạy thường khiến một cái gì đó bị phá vỡ theo thứ tự ngắn.
Đánh dấu

1
Ngay cả khi điều này đã làm việc - nó sẽ không bảo vệ chống lại một chương trình gọi fork () không thông qua bash?
UKMonkey

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

3
Chỉ cần chạya(){ a|a& };a
user253751

1
Bạn sẽ tránh được hình thức phổ biến (nếu bạn muốn nó hoạt động hoàn toàn), nhưng có thể có một số lượng biến thể gần như vô hạn trên đó.
Cột

Câu trả lời:


52

Các hai , không, ba , ... Trong số những trở ngại chính đó là:

  1. Nó không phải là một tên hợp lệ cho một bí danh. Hướng dẫn trực tuyến của Bash :

    Các ký tự ... và bất kỳ ký tự đại diện hoặc ký tự trích dẫn nào được liệt kê ở trên có thể không xuất hiện trong tên bí danh.

    (, ), &, |Và khoảng trắng là ra trong Bash 4.4.

  2. Chuỗi đặc biệt đó không phải là cách duy nhất để viết một quả bom nĩa trong vỏ, chỉ nổi tiếng vì nó trông tối nghĩa. Ví dụ, không cần phải gọi hàm :thay vì một cái gì đó thực sự bao gồm các chữ cái.

  3. Nếu bạn có thể đặt bí danh, người dùng có thể hủy đặt bí danh, phá vỡ nó bằng cách thoát tên bí danh trên dòng lệnh hoặc vô hiệu hóa bí danh hoàn toàn, có thể bằng cách chạy hàm trong tập lệnh (Bash không mở rộng bí danh trong các vỏ không tương tác) .

  4. Ngay cả khi lớp vỏ bị hạn chế đủ để dừng tất cả các phiên bản của bom ngã ba, một hệ thống mục đích chung sẽ có các tiện ích lập trình khác có thể tái diễn và tắt các quy trình con. Có Perl hoặc trình biên dịch C? Vừa đủ dễ. Ngay cả awk có thể làm điều đó. Ngay cả khi bạn chưa cài đặt, bạn cũng cần ngăn người dùng đưa các tệp nhị phân được biên dịch từ bên ngoài hệ thống hoặc chạy /bin/shcó lẽ cần phải là một vỏ hoạt động đầy đủ để phần còn lại của hệ thống hoạt động.

Chỉ cần sử dụng ulimit -u(nghĩa là RLIMIT_NPROC) hoặc tương đương để hạn chế số lượng quy trình mà người dùng có thể bắt đầu. Trên hầu hết các hệ thống Linux pam_limits, có thể đặt giới hạn đếm quá trình trước khi bất kỳ lệnh nào được người dùng chọn bắt đầu.

Một cái gì đó như thế này /etc/security/limits.confsẽ đặt giới hạn cứng của 50 quy trình cho tất cả người dùng:

*        hard    nproc           50

(Stephen Kitt đã đề cập đến điểm 1, Jeff Schaller đã đề cập đến 2 và 3.)


Có thể viết một quả bom ngã ba mà không cần &?
Stephen Kitt

4
@StephenKitt Tôi không chắc chắn 100% nhưng tôi đoán là bash đã hoàn tất. Nếu vậy có khả năng vô hạn. Ví dụ, bạn có thể phân tích cú pháp mã ascii 38 và thực thi nó.
Marie

@Marie trong bối cảnh cụ thể này, bạn cũng phải tránh bất kỳ nhân vật bị cấm nào khác trong khi làm việc xung quanh &giới hạn.
Stephen Kitt

15
Quan điểm của tôi chủ yếu là cố gắng đưa vào danh sách đen chức năng xấu là một ý tưởng tồi. Hầu như luôn luôn có những cách xung quanh.
Marie

2
@Marie: Bash khá chắc chắn Turing hoàn thành.
Tạm dừng cho đến khi có thông báo mới.

18

Không. Có quá nhiều cách để viết một quả bom ngã ba.

Nhà văn ném bom ác độc sẽ chỉ thử lại với một tên chức năng khác. Hoặc những thay đổi khác cho đến khi bom ngã ba của anh thành công.

Nhà văn ném bom vô tình sẽ không sản xuất bom nĩa kinh điển ngay từ đầu.

Thật ra khá dễ dàng để trở thành một nhà văn ném bom vô tình. Chẳng hạn, bạn chỉ có thể sử dụng đệ quy makevới bên ngoài, không được kiểm tra cd, kết hợp nó với -jtùy chọn và thư mục con không tồn tại - một ví dụ thực tế mà tôi đã vấp ngã một lần.

Bạn không thể bảo vệ chống lại tất cả các khả năng, và chắc chắn nhất là không chống lại một kẻ tấn công quyết tâm. Tất cả những gì bạn sẽ đạt được là tăng độ phức tạp của hệ thống của bạn.


14

Bạn không thể đặt bí danh cho một quả bom ngã ba, vì đó không phải là tên bí danh hợp lệ :

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

Các ký tự '/', '$', '`', '=' và bất kỳ ký tự đại diện hoặc ký tự trích dẫn nào được liệt kê ở trên có thể không xuất hiện trong tên bí danh.

Một số shell không kiểm tra tên bí danh khi chúng được khai báo, nhưng khi diễn giải các lệnh và sau đó bỏ qua tên không hợp lệ. Một quả bom ngã ba sẽ luôn bao gồm &, không thể bao gồm trong tên bí danh hợp lệ, vì vậy bảo vệ bản thân theo cách này là không thể.


Việc một vỏ có cho phép thiết lập bí danh này hay không không quan trọng. Quan trọng là ngay cả khi có một bí danh như vậy tồn tại, nó không được mở rộng trong khi diễn giải các lệnh vì tên bí danh không khớp với mẫu được phép. dashboshvd cả âm thầm bỏ qua nó.
schily

10

Hai lần, không.

Đó không phải là cách duy nhất để viết một quả bom ngã ba.

Cũng có một số cách để thực thi "lệnh" khi có bí danh:

command the-command
\the-command

Thí dụ:

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

Không liên quan đến chủ đề chính nhưng tại sao lại \lsthể hiện output.pngnhưng command lskhông?
nxnev

Phát hiện tốt! Đó là, thực sự, không liên quan đến chủ đề chính. Đó là một lỗi PEBCAK cổ điển khi tôi sao chép / dán sai (hoặc dọn sạch output.png ở giữa). Tôi sẽ sửa nó để giảm thiểu phiền nhiễu. Cảm ơn bạn, @nxnev!
Jeff Schaller
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.