Xác minh các nhị phân lệnh trước khi thực hiện


13

Có bất kỳ phương pháp nào để kiểm tra những gì bạn đang thực sự thực hiện từ một tập lệnh bash không?

Nói kịch bản bash của bạn đang kêu gọi một số lệnh (ví dụ: tar, mail, scp, mysqldump) và bạn sẵn sàng để đảm bảo rằng tarlà thực tế, thực tar, đó là xác định được bởi rootngười sử dụng là các tập tin và thư mục cha chủ sở hữu và người duy nhất có quyền ghi và không phải là một số /tmp/surprise/tarvới www-datahoặc apache2là chủ sở hữu.

Chắc chắn tôi biết về PATHvà môi trường, tôi tò mò muốn biết liệu điều này có thể được kiểm tra bổ sung từ tập lệnh bash đang chạy hay không và nếu có thì chính xác như thế nào?

Ví dụ: (mã giả)

tarfile=$(which tar)
isroot=$(ls -l "$tarfile") | grep "root root"
#and so on...

2
Nếu bạn quá hoang tưởng, thì hãy sử dụng nhị phân của riêng bạn!
Ipor Sircer

8
Ngoài việc whichkhông nói chính xác những gì tarsẽ làm, như được trả lời bởi xhienne, lscó thể bị hack để trả lại thông tin sai lệch về (các) tệp, nếu có. Cũng grepcó thể bị hack để trả lại thông tin sai lệch; điều đó có thể tránh được bằng cách sử dụng kết hợp shell thay vào đó, nhưng sau đó shell có thể bị hack. Và shell có thể bị hack để đưa ra kết quả sai ngay từ typeđầu - hoặc thay thế hoàn toàn vì khả năng thay thế của shell là một sự đổi mới quan trọng của Unix so với các HĐH 50 tuổi. Xem địa chỉ Turing 1984 của Ken Thompson. Đó là tất cả các con rùa xuống.
dave_thndry_085

2
Tôi không thể trả lời câu hỏi này cho Linux - chỉ AIX - có thành phần gọi là Thực thi tin cậy ( TE) - có cơ sở dữ liệu có chữ ký (nghĩa là rộng hơn tổng kiểm tra MD5. Khi TE hoạt động VÀ một tệp trong cơ sở dữ liệu bạn có thể chọn cho dù chương trình chạy - hay chỉ cảnh báo rằng nó không khớp với cơ sở dữ liệu. Ngoài ra, có hai cài đặt khác: TEP(thực thi PATH đáng tin cậy) và TLP(LIBrary PATH đáng tin cậy). Chỉ các chương trình trong TEP có thể được thực thi và các thư viện chỉ có thể được tải với thư mục được bao gồm trong TLP. Trong Linux tôi có một thứ gọi là 'AppArmor' có thể giúp bạn.
Michael Feel

1
Bạn có thể có loại an toàn này, nhưng không phải từ một tập lệnh - vào thời điểm tập lệnh của bạn được thực thi trong một môi trường không được kiểm soát, thì đã quá muộn. Đối với tất cả những gì bạn biết tất cả mọi thứ bạn có thể thấy là một chroot được thiết lập bởi một kẻ tấn công.
Charles Duffy

2
... Nếu bạn muốn có một hệ thống đáng tin cậy suốt đời, bạn cần thực hiện phương pháp ChromeOS: Yêu cầu chương trình cơ sở của bạn ký với một khóa được nhúng trong phần cứng của bạn; bootloader / kernel của bạn được xác minh bởi firmware; phân vùng hệ điều hành gốc của bạn chỉ đọc bằng cách sử dụng chữ ký cấp khối để xác minh; v.v. Cũng có những cách tiếp cận tương tự như những gì @MichaelFelt thảo luận có sẵn - xem Kiến trúc đo lường toàn vẹn - nhưng tác động hiệu suất cao hơn và mức độ toàn vẹn giảm (vì việc kiểm tra chữ ký nhị phân không giúp bạn tấn công thông qua việc không thể thực thi Nội dung).
Charles Duffy

Câu trả lời:


24

Thay vì xác thực các nhị phân bạn sẽ thực thi, bạn có thể thực thi các nhị phân đúng từ đầu. Ví dụ: nếu bạn muốn chắc chắn rằng bạn sẽ không chạy /tmp/surprise/tar, chỉ cần chạy /usr/bin/tartrong tập lệnh của bạn. Hoặc, đặt $PATHgiá trị của bạn trước khi chạy bất cứ thứ gì.

Nếu bạn không tin tưởng các tập tin trong /usr/bin/và các thư mục hệ thống khác, không có cách nào để lấy lại sự tự tin. Trong ví dụ của bạn, bạn đang kiểm tra chủ sở hữu ls, nhưng làm thế nào để bạn biết bạn có thể tin tưởng ls? Lập luận tương tự áp dụng cho các giải pháp khác như md5sumstrace.

Khi cần độ tin cậy cao về tính toàn vẹn của hệ thống, các giải pháp chuyên dụng như IMA được sử dụng. Nhưng đây không phải là thứ bạn có thể sử dụng từ một tập lệnh: toàn bộ hệ thống phải được thiết lập theo một cách đặc biệt, với khái niệm các tập tin bất biến được đặt ra.


Mà phá vỡ khi phân phối khác nhau chọn để đặt nhị phân /binthay vì /usr/bin.
Damian Yerrick

IMA là một trong hai cách tiếp cận sẵn sàng sản xuất cho vấn đề này - cách khác là cách tiếp cận thực tế được ChromeOS thực hiện để thực hiện xác thực cấp khối của rootfs.
Charles Duffy

@DamianYerrick Nhận xét công bằng. Đặt $PATHcả hai đường dẫn sau đó, nếu cần nhiều hỗ trợ phân phối.
Dmitry Grigoryev

AIX TE (có hoặc không có RBAC) sẽ là một phần mềm xây dựng hạt nhân "sẵn sàng sản xuất" thứ ba sẽ thực hiện điều này - có thể hơn thế nữa. TE, một khi được kích hoạt nhiều hơn thụ động - sẽ ngăn các tệp được mở và / hoặc các chương trình được thực thi. Ngoài ra, các ứng dụng và sử dụng thư viện có thể được đặt riêng trên TEP (đường dẫn thực thi tin cậy) hoặc TLP (đường dẫn thư viện tin cậy). Xem ibm.com/support/ledgeledgecenter/en/ssw_aix_61/ cho thông tin cơ bản
Michael Feel

6

Nếu kẻ xâm nhập đã giành được quyền truy cập vào hệ thống của bạn và có thể sửa đổi $PATH(không nên bao gồm /tmptrong mọi trường hợp), thì đã quá muộn để bắt đầu lo lắng về quyền sở hữu của các thực thi.

Thay vào đó bạn nên đọc về cách đối phó với một sự xâm nhập .

Tốt hơn để tập trung vào việc tránh xâm nhập hoàn toàn.

Nếu bạn có một hệ thống mà những thứ này quan trọng, thì có lẽ nên cách ly các phần của nó cần được công khai khỏi các phần cần riêng tư, cũng như thực hiện kiểm toán các phương thức giao tiếp giữa những điều này.


4

Ở một mức độ nào đó có thể bằng cách xác minh md5sumtệp. Do đó, trên các hệ thống sử dụng aptquản lý gói - trong trường hợp cụ thể của tôi, Ubuntu 16.04 - có tệp /var/lib/dpkg/info/tar.md5sums, lưu trữ tổng md5 của tất cả các tệp xuất phát tartrong quá trình cài đặt. Vì vậy, bạn có thể viết một câu lệnh if đơn giản để kiểm tra xem đầu ra của md5sum /bin/tarkhớp có khớp với những gì trong tệp đó không.

Điều đó tất nhiên giả định rằng chính tập tin đã không bị giả mạo. Điều này tất nhiên chỉ có thể xảy ra khi kẻ tấn công đã nhận được quyền truy cập root / sudo, tại thời điểm đó tất cả các cược đã tắt.


8
Nhưng làm thế nào để bạn xác nhận /usr/bin/md5sum?
Dmitry Grigoryev

Nếu kẻ tấn công có thể thay thế /bin/tarhoặc /usr/bin/tar, rất có khả năng họ cũng có thể chỉ cần thay thế md5sumhoặc /var/lib/dpkg/info/tar.md5sums. Hoặc $SHELL.
Jonas Schäfer

1
Tôi nghĩ rằng tôi đã đề cập trong đoạn trước, rằng để điều đó xảy ra, kẻ tấn công sẽ cần có quyền truy cập root vào hệ thống, và tại thời điểm đó, mọi thứ đều có thể. Trong trường hợp, nơi kẻ tấn công không có quyền truy cập root, nhưng có thể thay đổi biến PATH cho người dùng hoặc tạo bí danh trong đó tartrỏ đến các nhị phân khác nhau, sẽ hoạt động. Khi một hệ thống bị xâm phạm ở cấp độ gốc, bạn có một tùy chọn sau đó - nuke nó từ quỹ đạo
Sergiy Kolodyazhnyy

3

Vâng, có một phương pháp: nội dung type. Trái ngược với whichlệnh chỉ tìm kiếm trong PATH của bạn, typesẽ cho bạn biết tên lệnh có thực sự là từ khóa dành riêng, nội dung, bí danh, hàm hoặc tệp đĩa hay không.

$ type -t foobar || echo "Not found"
Not found

$ type -t echo
builtin

$ enable -n echo; type -t echo; type -p echo
file
/usr/bin/echo

$ echo() { printf "(echoing) %s\n" "$*"; }; type -t echo
function

$ alias echo="/bin/echo 'I say: ' "; type -t echo
alias

Ngoài ra, type -asẽ cung cấp cho bạn tất cả các ứng cử viên cho lệnh của bạn (từ lựa chọn đầu tiên đến lựa chọn cuối cùng):

$ type -a echo
echo is aliased to `/bin/echo 'I say: ' '
echo is a function
echo () 
{ 
    printf "(echoing) %s\n" "$*"
}
echo is a shell builtin
echo is /usr/local/bin/echo
echo is /bin/echo

Cuối cùng, nếu bạn chỉ quan tâm đến các tệp nhị phân trên đĩa của mình, bạn có thể sử dụng type -Pađể lấy tất cả các tệp nhị phân trong PATH của mình (theo thứ tự như trên):

$ type -Pa tar
/home/me/bin/tar                <= oh oh, is this normal?
/bin/tar

Điều đó nói rằng, typemột mình sẽ không cho bạn biết chính xác lệnh nào sẽ được gọi cuối cùng. Ví dụ: nếu tarbí danh của bạn gọi là nhị phân (ví dụ alias tar="/tmp/tar") thì typesẽ cho bạn biết đây là một alias.


type -abao gồm tất cả các hình thức (ví dụ: cả bí danh và chương trình bên ngoài)
dave_thndry_085

Cảm ơn bạn @dave, nó thực sự thú vị, tôi đã cập nhật câu trả lời của mình
xhienne

1
typesẽ cho bạn biết inasfar như bash biết, nhưng nếu chúng ta bị kiểm soát bởi kẻ tấn công độc hại, không có lý do gì để tin rằng những gì bash nghĩ rằng nó biết phản ánh sự thật. Đối với tất cả những gì bạn biết có một LD_PRELOADmô-đun chặn mọi cuộc gọi thư viện C duy nhất bạn thực hiện.
Charles Duffy

1
@CharlesDuffy Bạn đúng tất nhiên. Tôi không muốn trả lời về góc độ an ninh. Tôi chỉ đề xuất một câu trả lời cho câu hỏi ở trên cùng: "Có phương pháp nào để kiểm tra những gì bạn đang thực sự thực hiện từ một tập lệnh bash không" và đề xuất một phương án thay thế which.
xhienne

Tôi chưa bao giờ nhìn thấy enabletrước đây. Tôi đã sử dụng lời khuyên từ những câu trả lời này để chạy type enableđể tìm ra nó là một cái vỏ tích hợp và sau đó help enableđể xem nó làm gì.
Joe

3

Bạn có thể kiểm tra chính xác các lệnh đang được thực thi bởi tập lệnh bằng cách sử dụng strace. Ví dụ:

strace -f -e execve ./script.sh

Với đoạn script sau:

#!/bin/bash
touch testfile.txt
echo "Hello" >> testfile.txt
cat testfile.txt
rm testfile.txt

stracesẽ cho bạn biết đường dẫn chính xác đến các lệnh được thực thi khi được sử dụng với -e execvetham số:

execve("./script.sh", ["./script.sh"], [/* 69 vars */]) = 0 
Process 8524 attached
[pid  8524] execve("/usr/bin/touch", ["touch", "testfile.txt"], [/* 68 vars */]) = 0 
[pid  8524] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8524, si_status=0, si_utime=0, si_stime=0} --- 
Process 8525 attached [pid > 8525] execve("/bin/cat", ["cat", "testfile.txt"], [/* 68 vars */]) = 0
Hello [pid  8525] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8525, si_status=0, si_utime=0, si_stime=0} --- 
Process 8526 attached [pid > 8526] execve("/bin/rm", ["rm", "testfile.txt"], [/* 68 vars */]) = 0
[pid  8526] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8526, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 0 +++

Các thông số (từ strace man):

-f: Theo dõi các tiến trình con khi chúng được tạo bởi các tiến trình hiện tại là kết quả của các lệnh gọi hệ thống fork (2), vfork (2) và clone (2). Lưu ý rằng -p PID -fsẽ đính kèm tất cả các luồng của quá trình PID nếu nó là đa luồng, không chỉ luồng với thread_id = PID.

-e trace=file: Theo dõi tất cả các cuộc gọi hệ thống lấy tên tệp làm đối số. Bạn có thể coi đây là một từ viết tắt -e trace=open,stat,chmod,unlink,...hữu ích để xem các tệp mà quá trình đang tham chiếu. Hơn nữa, sử dụng chữ viết tắt sẽ đảm bảo rằng bạn không vô tình quên bao gồm một cuộc gọi như lstat trong danh sách.


3
Điều này không có nghĩa là có thể sử dụng được bởi một kịch bản để thực hiện kiểm tra tự động và không có lý do cụ thể nào để tin rằng stracebản thân nó đã không bị lật đổ.
Charles Duffy

0

Linux os dựa trên các tệp và nhiều lệnh được thực thi trên linux có thể sẽ giải quyết một số thay đổi trong các tệp nằm trên máy của bạn. Bởi vì đó có thể là giải pháp tốt nhất cho vấn đề của bạn. Bạn có thể kiểm tra các lệnh của mình cho bất kỳ thay đổi nào trên hệ thống tệp trước khi nó được thực thi.

nhập mô tả hình ảnh ở đây

Có lệnh 'strace' dịch ngược lệnh của bạn trong các phần ...

nhập mô tả hình ảnh ở đây

Nếu bạn thực sự muốn đi sâu, bạn muốn kiểm tra trình dịch ngược cho các tập lệnh mà nó sẽ được thực thi. Nói cách khác, bạn phải kiểm tra trình biên dịch của trình biên dịch lệnh đó. Cho bash đó objdump -d. Các kịch bản bin Linux chủ yếu được tạo bằng Cngôn ngữ lập trình nên sử dụng trình Cdịch ngược tốt .

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.