Tôi muốn nói là, khi bash là / bin / sh của bạn. Đây không phải là một tính năng của vỏ bourne, và tôi cá rằng đó cũng không phải là một tính năng của vỏ posix, thực tế họ có thể muốn cấm nó một cách rõ ràng.
Bash thực sự giống với vỏ phái sinh korn hơn là vỏ bourne, mặc dù tên của nó và vỏ giống như Korn duy nhất có tính năng, và theo tôi, đó là tính năng bếp không có đức tính thực tế. Các nhà phát triển tránh các tính năng bash cho các tiêu chuẩn, như vỏ bourne, vỏ posix hoặc tập hợp con ksh88 mà các shell hiện đại có điểm chung, hay nói cách khác, đã cam kết thực hành tốt và thành ngữ chuẩn, bị sốc khi phần mềm của họ được bật linux và mac và bây giờ có khả năng dễ bị tổn thương, vì các tác giả khai thác có thể tự do sử dụng 'bashism', bất chấp ý định của họ. Khả năng tương thích được cải thiện rất nhiều, khi được gọi là / bin / sh, so với các dẫn xuất vỏ korn khác, chỉ khi / bin / sh là vỏ đăng nhập của bạn hoặc vỏ tương tác, khi bash hoạt động giống như vỏ bourne, hơn là vỏ korn,
Tôi sẽ cố gắng thuyết phục bạn rằng đó là tính năng bồn rửa trong nhà bếp, với 2 trường hợp: bạn là một nhà phát triển nhúng, người tạo ra các thiết bị như bộ định tuyến, lưu trữ mạng lớn thứ 1 env, có nghĩa là nhiều hơn, bộ nhớ, vì vậy, chi phí cao hơn, Vì vậy, lợi nhuận ít hơn, vì vậy, nếu đây là một lý do để xem xét sử dụng tính năng này của bash, thay vào đó bạn không nên sử dụng các tính năng của FPATH và tự động tải, ksh88 chứ? thay vì chuyển toàn bộ byte chức năng cho byte trong môi trường? Bạn thậm chí có thể xem xét phân tích cú pháp và cắt tỉa bán buôn môi trường, trước khi nó chuyển sang một shellscript có thể hiểu sai một biến, như chỉ cần lọc ra ^ $ (. *) $, Và như ...
Điều đó không nhấn mạnh những gì độc đáo về điều này, không quan trọng biến đó là gì và tập lệnh không phải tham chiếu hoặc sử dụng biến, nó vẫn có thể bị tổn thương.
#!/bin/sh
exec /usr/local/myapp/support/someperlscript.pl
Đối với mọi thứ khác dưới ánh mặt trời, ở trên nên an toàn như tập lệnh perl, bạn không sử dụng bất kỳ biến nào để bạn có thể hiểu sai bất kỳ? Đổi sang
#!/bin/bash -norc
exec /usr/local/myapp/support/someperlscript.pl
Điều đó cũng không giúp được gì, điều này chẳng liên quan gì đến ENV hay bất cứ điều gì tương tự - mọi người đều bị đốt cháy vì bash cần phải là duy nhất. Thực tế là bash phiên bản 2 có vấn đề, để tôi chứng minh rằng không ai sử dụng tính năng này cho các ứng dụng của họ, bởi vì nếu không nó sẽ không đã lẩn quất quanh đây từ lâu. Và những gì tệ hơn về cơ bản là không tránh khỏi tính năng này . Đây là một ví dụ với: với 'su -', nếu bạn hỏi ai đó, lời giải thích sẽ là loại bỏ môi trường, kiểm tra trang man và bạn sẽ chỉ tìm thấy 99,9%. Tôi đã kiểm tra đúng cách, vì trên hệ thống này / bin / sh là vỏ đăng nhập của root và / bin / sh là bash BUT , trong ví dụ này tôi thửđể làm cứng .bash_profile của tôi. Tôi đã đổi tên cho root của mình (đã được bật), nhưng suy nghĩ của tôi là nếu su, sau đó có thể là sudo, dù sao, tôi đã thay đổi thành:
exec env -i TERM=vt102 LOGNAME=root USER=root HOME=/var/root /bin/ksh -i
Vì vậy, tôi thực sự ném môi trường hoàn toàn, và sử dụng một env tối thiểu, và sau đó chạy một trình bao không nên có vấn đề, thay cho quy trình hiện tại. Sau đó, thay cho ví dụ tiêu chuẩn, hãy thử:
%dock='() { echo -e "\e[2t\c"; echo dockshock;} ; dock' su
Điều này minh họa cách nó không liên quan gì đến việc phân tích bất kỳ chức năng cụ thể nào và việc khai thác có thể tham khảo và sử dụng chức năng đó. Bạn có thể tưởng tượng hàm có logic để kiểm tra nếu root, v.v. Trong trường hợp này, nó chỉ là một dạng được sửa đổi để biểu tượng hóa hoặc gắn một cửa sổ đầu cuối, sử dụng một chuỗi thoát, đó là tiêu chuẩn khá, vì vậy sau khi tôi nhấp vào để khử nhiễu, tôi xem dockshock - nhưng, vậy thì sao? Bây giờ hãy thử điều này:
%TERM='() { echo -e "\e[2t\c"; echo dockshock;} ; TERM' su -
Và đoán xem? Cửa sổ bị hút vào bến tàu. Đây là những gì nó trông giống như sau đó ..
%TERM='() { echo -e "\e[2t\c"; echo dockshock;} ; TERM' su -
Password:
dockshock
# env
_=/usr/bin/env
HOME=/var/root
LOGNAME=root
TERM=vt102
USER=root
# echo $0
/bin/ksh
#
Vì vậy, rất nhiều cho điều đó! Các chức năng xuất thực sự có ưu tiên hơn các tập lệnh RC. Bạn không thể né nó.