Các lệnh BusyBox có thực sự được xây dựng không?


28

Tôi đang đọc Truyền thuyết phục hồi Unix nổi tiếng và tôi tự hỏi:

Nếu tôi mở shell BusyBox và nhị phân BusyBox bị xóa, tôi vẫn có thể sử dụng tất cả các lệnh có trong nhị phân BusyBox chứ?

Rõ ràng tôi sẽ không thể sử dụng phiên bản BB của các lệnh đó từ một shell đang chạy khác, chẳng hạn như bash, vì tệp BusyBox sẽ không có sẵn bashđể mở và chạy. Nhưng từ trong phiên bản đang chạy của BusyBox, tôi thấy có thể có hai phương thức để BB chạy lệnh:

  1. Nó có thể rẽ nhánh và thực thi một phiên bản mới của BusyBox, gọi nó bằng cách sử dụng tên thích hợp và đọc tệp BusyBox từ đĩa để làm như vậy.
  2. Nó có thể rẽ nhánh và thực hiện một số logic bên trong để chạy lệnh được chỉ định (ví dụ: bằng cách chạy nó dưới dạng gọi hàm).

Nếu (1) là cách BusyBox hoạt động, tôi hy vọng rằng một số lệnh do BusyBox cung cấp sẽ không khả dụng trong một phiên bản BB đang chạy sau khi nhị phân BB bị xóa.

Nếu (2) là cách nó hoạt động, BusyBox có thể được sử dụng ngay cả để phục hồi hệ thống mà bản thân BB đã bị xóa, miễn là vẫn có thể truy cập BusyBox.

Đây có phải là tài liệu ở bất cứ đâu? Nếu không, có cách nào để kiểm tra nó một cách an toàn không?


2
is there a way to safely test it?Tải xuống openwrthình ảnh x86 chung và đính kèm hình ảnh vào máy VirtualBox mới
lưu vực

2
Và điều này đặt ra câu hỏi, làm thế nào để các lệnh Busybox tiếp tục hoạt động sau khi PATHkhông được đặt? Nó giả định một giá trị mặc định là PATH?
muru

2
@muru: Từ mã nguồn (ít nhất là cho bản sao tro của nó), có vẻ như nó xử lý một PATH chưa được đặt giống như một chuỗi rỗng, vì vậy nó tìm kiếm thư mục hiện tại và chỉ có vậy.
Henning Makholm

@HenningMakholm Vâng, nhận xét của tôi đã được trả lời bởi câu trả lời của Gilles. Tuy nhiên, thật tốt khi biết rằng - tôi chỉ mong đợi các phần mềm hoạt động.
muru

Câu trả lời:


33

Theo mặc định, BusyBox không làm bất cứ điều gì đặc biệt liên quan đến các applet mà nó đã tích hợp (các lệnh được liệt kê cùng busybox --help).

Tuy nhiên, nếu các tùy chọn FEATURE_SH_STANDALONEFEATURE_PREFER_APPLETSđược bật vào thời gian biên dịch, thì khi BusyBox thực hiện một lệnh là tên applet đã biết, nó không thực hiện PATHtra cứu thông thường , mà thay vào đó, chạy các applet tích hợp của nó thông qua một phím tắt:

  • Các ứng dụng được khai báo là không có mã noexec trong mã nguồn được thực thi như các lệnh gọi hàm trong một quá trình rẽ nhánh. Tính đến BusyBox 1.22, các applet Sau đây là noexec: chgrp, chmod, chown, cksum, cp, cut, dd, dos2unix, env, fold, hd, head, hexdump, ln, ls, md5sum, mkfifo, mknod, sha1sum, sha256sum, sha3sum, sha512sum, sort, tac, unix2dos.
  • Các ứng dụng được khai báo là nofork, trong mã nguồn được thực thi như các lệnh gọi hàm trong cùng một quy trình. Tính đến BusyBox 1.22, các applet sau nofork: [[, [, basename, cat, dirname, echo, false, fsync, length, logname, mkdir, printenv, printf, pwd, rm, rmdir, seq, sync, test, true, usleep, whoami, yes.
  • Các applet khác thực sự được thực thi (có forkexecve), nhưng thay vì thực hiện PATHtra cứu, BusyBox sẽ thực thi /proc/self/exe, nếu có (thường là trường hợp trên Linux) và một đường dẫn được xác định theo thời gian biên dịch theo cách khác.

Điều này được ghi lại chi tiết hơn một chút trong docs/nofork_noexec.txt. Các khai báo applet nằm trong include/applets.src.hmã nguồn.

Hầu hết các cấu hình mặc định đều tắt các tính năng này, để BusyBox thực thi các lệnh bên ngoài như mọi shell khác. Debian bật các tính năng này trong cả gói busyboxbusybox-staticgói.

Vì vậy, nếu bạn có một BusyBox thực thi biên soạn với FEATURE_SH_STANDALONEFEATURE_PREFER_APPLETS, sau đó bạn có thể thực hiện tất cả các lệnh BusyBox từ một vỏ BusyBox ngay cả khi thực thi sẽ bị xóa (trừ các applet không được liệt kê ở trên, nếu /proc/self/exekhông có sẵn).

¹ Thực tế, có hai hiện thực của "sh" trong BusyBox - tro và im lặng - nhưng họ cư xử theo cùng một cách trong lĩnh vực này.


1
@Wildcard FEATURE_PREFER_APPLETSFEATURE_SH_STANDALONElà các cờ thời gian biên dịch, bật hoặc tắt các tính năng. Các applet được đánh dấu noforknoexeckhông phân biệt cờ nào được sử dụng. Việc đánh dấu như vậy có ảnh hưởng gì hay không phụ thuộc vào FEATURE_PREFER_APPLETSviệc được kích hoạt. Do đó, có ba hành vi có thể xảy ra: 1. FEATURE_PREFER_APPLETSbị vô hiệu hóa, 2. FEATURE_PREFER_APPLETSđược kích hoạt và applet là nofork, 3. FEATURE_PREFER_APPLETSđược kích hoạt và applet là noexec. Các para thứ ba trong các tài liệu giải thích nó độc đáo. Và phần cuối cùng cho thấy các trường hợp có thể.
muru

1
@Wildcard FEATURE_SH_STANDALONE(yêu cầu FEATURE_PREFER_APPLETS). noforkkhông cần thiết Với FEATURE_SH_STANDALONE, /proc/self/exeđược sử dụng khi áp dụng, vì vậy nó sẽ hoạt động ngay cả khi BB bị xóa . Bạn có thể kiểm tra điều này ra với rủi ro khá tối thiểu trên bất kỳ systm Debian hoặc Arch Linux, chạy busybox ash, unset PATH, làm lệnh lưu vực của. Nó hoạt động tốt.
muru

3
Trên hệ thống Ubuntu 14.04.1 LTS, Busybox được cấu hình để thích các applet. Kể từ khi không phải catvà cũng không chmodđòi hỏi exec-ing một tên đường dẫn, bạn có thể khôi phục lại thực thi thusly: cat /proc/self/exe > busybox; chmod 755 busybox.
Bare chân IO

1
@forest Có một sự khác biệt rất lớn: tacyêu cầu một tệp đầu vào có thể tìm kiếm không phải lúc nào cũng có sẵn hoặc đọc toàn bộ đầu vào vào bộ nhớ. catcó thể đọc đầu vào của nó từ đầu đến cuối, loại bỏ những gì nó đã được xử lý. Nó dễ thực hiện hơn nhiều và nó cũng được sử dụng phổ biến hơn nhiều, vì vậy nó có ý nghĩa hơn để tối ưu hóa cái đó.
hvd

1
@Wildcard Nofork và noexec là những chỉ dẫn được đặt trên mỗi applet. FEATURE_xxxlà một tùy chọn biên dịch thời gian cho BusyBox nói chung. Các chỉ dẫn nofork và noexec chỉ quan trọng nếu FEATURE_PREFER_APPLETSđược kích hoạt (ít nhất là cho mục đích thực thi một lệnh trong shell, chúng cũng được sử dụng trong một số bối cảnh khác).
Gilles 'SO- ngừng trở nên xấu xa'

8

is there a way to safely test it? Với hình ảnh openwrt x86 chung:

ảnh chụp màn hình vbox

Hầu hết các lệnh không được tích hợp sẵn, nhưng một số lệnh, như echoprintf. Một tệp nhị phân với nội dung tùy ý có thể được tạo bằng cách sử dụng printf, nhưng chmod +xsẽ là một vấn đề.


Hấp dẫn; bạn đang chạy nó từ bên trong BusyBox, hay một số shell khác?
Wildcard

4
(Ngoài ra, bạn có phiền dán văn bản chứ không phải ảnh chụp màn hình không?)
Wildcard

@ Thẻ con /bin/ash -> busybox.
lưu vực

1
Như trong câu trả lời của Gilles, nếu FEATURE_SH_STANDALONEđược bật, bạn sẽ không có hành vi này. Thứ hai mvsẽ hoạt động hoàn toàn tốt.
muru
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.