Tại sao khả năng xác định các chức năng trong một biến môi trường không phải là rủi ro bảo mật?


9

Theo tôi hiểu, nói chung nó được coi là an toàn khi cho phép bất cứ ai cung cấp thông tin sẽ được lưu trữ trong một biến môi trường. Lỗ hổng shellshock là một vấn đề ở đây vì điều đó có nghĩa là mã ở cuối định nghĩa hàm bên trong biến môi trường sẽ được thực thi khi một phiên bản bash mới khởi chạy và rõ ràng bạn không muốn ai chạy bất kỳ mã nào họ muốn trên máy chủ của bạn . Bản thân các định nghĩa hàm rõ ràng không phải là một rủi ro bảo mật và được cho phép bởi vì chúng phải được gọi một cách rõ ràng để mã của chúng được thực thi.

Câu hỏi của tôi là tại sao người dùng độc hại không thể chỉ định nghĩa một hàm, chứa mã độc của họ như một lệnh chung lsvà sau đó hy vọng rằng tập lệnh (hoặc bất cứ thứ gì đang được chạy) sẽ sử dụng lệnh này vào một lúc nào đó?

Một ví dụ về những gì tôi có trong tâm trí:

$ export ls='() { echo "doing bad things..."; }'
$ bash -c ls
doing bad things...

Câu trả lời:


10

Đó là một rủi ro bảo mật. Đó thường là lý do tại sao bạn không thể làm điều đó khi chuyển sang bối cảnh khác (điều khiển từ xa của hệ thống, thay đổi người dùng, v.v.).

Nếu bạn có khả năng tạo bất kỳ biến môi trường nào bạn muốn, có bất kỳ số cách tiềm năng nào bạn có thể thực thi mã tùy ý.
Lấy $LD_PRELOADmột ví dụ. Nếu bạn có khả năng đặt biến đó, bạn có thể thay thế các hàm thư viện và dán mã của mình vào đó. Bạn có thể đặt $DISPLAYbiến và chuyển hướng hiển thị X mà chương trình kết nối tới để bạn có quyền kiểm soát ứng dụng.

Đây là lý do tại sao những thứ như sudotước môi trường của tất cả các biến. sudochỉ cho phép một vài biến được chọn thông qua. Và trong số các biến đó, nó khử trùng chúng (nó đi qua $TERMbiến, nhưng sẽ không có nếu nó chứa các ký tự bất thường).


Wow, tôi đã luôn tự hỏi tại sao một số kịch bản lớn mà tôi làm trong BASH lại có những thất bại kỳ lạ khi bắt đầu với sudo, đặc biệt là xung quanh các đường dẫn, khiến tôi phải kiểm tra sudo bắt đầu và chặn chúng, nhưng tôi không bao giờ biết tại sao điều đó xảy ra và là một vấn đề, cảm ơn vì lời giải thích tốt tái sudo tước bỏ các biến môi trường.
Lizardx

3

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ó.


1
POSIX cho phép các chức năng có thể xuất khẩu trong dự thảo 2 và không cho phép chúng sau đó. Các tính năng là điên rồ.
mikeerv
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.