Làm cách nào để kiểm toán một tệp thực thi để đảm bảo nó không độc hại?


10

Tôi đã tự hỏi nếu có một công cụ hoặc một kỹ thuật để chạy một thực thi trong một môi trường bị cô lập, có thể trong một máy ảo. Trong khi chương trình đang chạy, tôi muốn có thể kiểm tra ứng dụng, tức là xem mọi thứ mà tệp thực thi đang thực hiện (truy cập tệp và mạng).

Bằng cách làm như vậy tôi muốn có thể kiểm tra xem tệp thực thi có độc hại hay không, tức là thực hiện các thao tác không nên (đọc / ghi vào tệp, nghe / kết nối với cổng mạng, ...).

Tôi sẽ không nhớ một cái gì đó với một giao diện đồ họa.


2
@EliahKagan: Nếu tôi hiểu đúng câu hỏi, OP yêu cầu "a (công cụ) nơi tôi có thể thấy mọi thứ mà thực thi đang làm" - hãy tưởng tượng nếu bạn có thể chạy sandbox somebinarysandboxchương trình tưởng tượng sẽ ghi lại tất cả các tệp somebinaryđược đọc hoặc ghi vào IP / cổng được kết nối, truyền dữ liệu, v.v. Đó sẽ là một điều hữu ích, tôi cũng muốn biết nếu một cái gì đó như thế này tồn tại (và, thực sự, nếu không có công cụ như vậy quan sát một chương trình chạy trong VM sẽ là vô nghĩa như bạn Không thể nói những gì nó làm ở đó dù thế nào). Câu hỏi hay.
Serge

2
Câu hỏi liên quan trên UL.SE tôi đã hỏi trước đây: Làm cách nào để theo dõi các tệp đã mở của một quy trình trong thời gian thực? (không chỉ về các tệp, cũng như mạng) Hãy nhớ rằng một khi bạn thấy nó xảy ra, thiệt hại đã xảy ra.
gertvdijk

2
Tôi đã hỏi một câu hỏi về meta liên quan đến việc đóng câu hỏi này: meta.askubfox.com/questions/5871/ - Tôi không tin rằng nó nên bị đóng.
Serge

Câu trả lời:


10

là một công cụ hoặc có thể là một máy ảo để chạy một thực thi bên trong nó

Vâng, đây được gọi là ảo hóa ứng dụng .

LXC (Linux Container) là một công cụ thường được sử dụng để thiết lập điều này. Nó cho phép bạn thiết lập mạng tách biệt hoàn toàn cho ứng dụng này và nó "hộp cát" nó thành một loại máy ảo, giống như một chiếc chroot. Điều này chủ yếu là cho mục đích bảo mật (một "nhà tù"), không thực sự để kiểm toán.

Tôi nghĩ rằng đó là một chút ngoài phạm vi của câu hỏi để giải thích các container LXC hoàn chỉnh cũng như làm thế nào để kiểm toán chính xác. Dưới đây là một chút về cách bắt đầu, mặc dù.

Trong khi chương trình đang chạy, tôi muốn có thể thấy mọi thứ mà tệp thực thi đang thực hiện (truy cập tệp và mạng).

Điều này có thể được thực hiện bằng cách sử dụng stracevà tôi đã hỏi cùng một câu hỏi trên Unix & Linux:

Như đã trả lời , về cơ bản nó đi xuống

strace -t -e trace=open,close,read,getdents,write,connect,accept command-here

Quan trọng: một khi bạn thấy nó xảy ra, thiệt hại đã xảy ra.


Container ứng dụng LXC

Từ bài viết này . Nó đi xuống:

  1. lxc-macvlan.conf tập tin cấu hình:

    # example as found on /usr/share/doc/lxc/examples/lxc-macvlan.conf
    # Container with network virtualized using the macvlan device driver
    lxc.utsname = alpha
    lxc.network.type = macvlan
    lxc.network.flags = up
    lxc.network.link = eth0 # or eth2 or any of your NICs
    lxc.network.hwaddr = 4a:49:43:49:79:bd
    lxc.network.ipv4 = 0.0.0.0/24
    
  2. Bắt đầu bằng cách sử dụng lxc-execute:

    sudo lxc-execute -n bash-test2 -f lxc-macvlan.conf /bin/bash
    

Lưu ý rằng LXC cung cấp cả hệ thống và loại ứng dụng của container. Bạn đang tìm kiếm các thùng chứa ứng dụng ở đây.


1
LXC chưa sẵn sàng và hiện không an toàn. Ví dụ, /syskhông được ảo hóa và các thay đổi được thực hiện /systừ vùng chứa được thực hiện cho /sysmáy chủ lưu trữ. Thực hiện tìm kiếm nhanh trên Web, có một số bài viết ghi lại cách "thoát" khỏi một container. LXC sẽ là một giải pháp tốt cho vấn đề này, nhưng hiện tại thì không, và không nên được sử dụng như một công cụ bảo mật.
Andrea Corbellini

1
Bằng cách cấu hình ví dụ được đăng không sử dụng các lxc.mounttùy chọn. Điều này có nghĩa là toàn bộ hệ thống tập tin của người dùng có thể truy cập được bằng cách chạy thực thi.
Andrea Corbellini

10

Những gì bạn đang tìm kiếm là một công cụ cho thấy cách một chương trình tương tác với hệ thống (cụ thể hơn, với kernel). Các chương trình tương tác với hệ thống bằng cách sử dụng các tòa nhà chọc trời. Ví dụ về các tòa nhà cao tầng là:

  • open - được sử dụng để mở một tập tin;
  • readwrite- được sử dụng để đọc / ghi từ / đến một bộ mô tả tệp;
  • connect - được sử dụng để kết nối một ổ cắm với một đồng đẳng;
  • nhiều, nhiều người khác (xem man syscalls).

Vấn đề là: các tòa nhà chọc trời có thể được truy tìm bằng cách sử dụng ptrace(2). Vì vậy, về cơ bản, bạn đang tìm kiếm các công cụ được xây dựng xung quanh ptrace. Một trong những công cụ như vậy là strace(1), một ứng dụng đầu cuối lấy lệnh làm đối số và xuất ra:

  • hệ thống gọi chương trình đang gọi;
  • các đối số được sử dụng để làm cho các tòa nhà cao tầng;
  • kết quả của các tòa nhà cao tầng.

Đầu ra là theo kiểu C. Đây là một ví dụ:

$ strace cat test
execve("/bin/cat", ["cat", "test"], [/* 55 vars */]) = 0
/* ... */
open("test", O_RDONLY)                 = 3
/* ... */
read(3, "hello\n", 32768)               = 6
write(1, "hello\n", 6)                  = 6
read(3, "", 32768)                      = 0
/* ... */

Ở đó bạn thấy rằng cat testđang mở một tệp có tên test, đọc nội dung của nó ( hello) và đặt nó trên đầu ra tiêu chuẩn.

stracecó thể tạo ra nhiều đầu ra, vì vậy hãy chắc chắn đọc trang man của nó ( man strace), đặc biệt là tài liệu về -eđầu ra sẽ cho phép bạn chỉ nhìn thấy các tòa nhà bạn quan tâm.

Thật không may, tôi không biết về các lựa chọn thay thế đồ họa hoặc dễ sử dụng. Nếu bạn muốn tìm kiếm chúng, ptracenên là một trong những từ khóa tìm kiếm của bạn.


Về sự cô lập, có rất nhiều công nghệ ra khỏi đó. Chroots, các thùng chứa Linux (hiện đang được phát triển và chưa hoàn thiện), ảo hóa phần mềm và paravirtualization được sử dụng nhiều nhất. Tuy nhiên đây là một chủ đề quá lớn để thảo luận. Tôi khuyên bạn nên mở một câu hỏi mới nếu bạn muốn có thêm chi tiết.


5

Hãy xem AppArmor . Bạn có thể thêm một hồ sơ giới hạn cho một thực thi và đưa nó vào chế độ "khiếu nại", trong đó các hành động sẽ được cho phép nhưng được ghi lại, mà tôi nghĩ đáp ứng yêu cầu của bạn.

Nhưng lưu ý rằng điều này không thực sự đủ. Một nhị phân độc hại thông minh có thể có thể phát hiện ra rằng nó đang được quan sát và không thực hiện các hành động độc hại trừ khi nó không được quan sát.

AppArmor đi xa hơn thế này và cho phép một ứng dụng mãi mãi bị hạn chế đối với chỉ các hoạt động được phê duyệt. Các ứng dụng kết thúc trong Trung tâm phần mềm Ubuntu có cấu hình AppArmor.


5

Như bạn đã xác định, một máy ảo sẽ tốt hơn để cung cấp sự cô lập, đặc biệt nếu bạn có lý do để tin rằng một thực thi là độc hại ngay từ đầu. Nhưng ngay cả điều này không hoàn hảo, vì các lỗ hổng trong nền tảng ảo hóa (cả phần cứng và phần mềm) có thể bị khai thác bởi mã độc hại để thoát ra. Dưới đây là một ví dụ về lỗ hổng ảo hóa thế giới thực: http://www.kb.cert.org/vuls/id/649219


1

Bạn có thể tạo một snap .

Snaps được "giới hạn từ HĐH và các ứng dụng khác thông qua các cơ chế bảo mật, nhưng có thể trao đổi nội dung và chức năng với các snaps khác theo các chính sách chi tiết được kiểm soát bởi người dùng và mặc định của HĐH." (từ http://snapcraft.io/docs/snaps/intro )

Những thứ này cung cấp sự cách ly hơn nữa ngoài AppArmor, ví dụ như sử dụng seccomp .

Ngoài ra, một snap có thể được khép kín để dễ dàng phân phối và cập nhật nguyên tử trên hệ thống của bạn.


0

Cảm ơn bạn, câu trả lời rất hữu ích ...

Tôi cũng tìm thấy cái này: https://doads.cuckoosandbox.org/docs/

Đây là một công cụ rất thú vị để phân tích phần mềm độc hại trong khi nó nằm trong VM

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.