it-swarm-vi.com

Giám sát các cuộc gọi hệ thống (một cách đáng tin cậy và an toàn)

Có một phương pháp đáng tin cậy nào để theo dõi các cuộc gọi hệ thống của Sony trong Linux?

strace ví dụ để giám sát các cuộc gọi và tín hiệu hệ thống. Có cách nào để một quá trình tránh khỏi strace không? Nếu có, có một phương pháp "giám sát" cuộc gọi hệ thống an toàn, đáng tin cậy nào khác (và, có thể nhận tín hiệu), rằng một quy trình không thể thoát khỏi (giả sử triển khai Linux đúng cách)?

15
Grzegorz Wierzowiecki

Trên Linux, bạn có thể theo dõi một cách đáng tin cậy một lựa chọn các cuộc gọi hệ thống hoặc truy cập tệp với hệ thống con kiểm toán . Đảm bảo auditd daemon đang chạy, sau đó định cấu hình những gì bạn muốn đăng nhập với auditctl . Mỗi thao tác được ghi lại được ghi lại trong /var/log/audit/audit.log (trên các cấu hình điển hình).

Bạn sẽ tìm thấy các ví dụ đơn giản về auditctl cách sử dụng trên trang web này , trên Lỗi máy chủ và trên nix Stack Exchange .

strace hoặc các chương trình liên quan sử dụng ptrace là những cách đáng tin cậy để theo dõi các cuộc gọi hệ thống, nhưng tôi sẽ cảnh giác khi sử dụng chúng trên một chương trình độc hại. Tôi không thể nói cho bạn biết làm thế nào ngoài đỉnh đầu của tôi, nhưng một chương trình được giám sát có thể thực hiện các cuộc gọi ptrace đúng để trốn tránh giám sát.

Lưu ý rằng một chương trình độc hại có thể sinh ra một quy trình không được kiểm toán và có thể thực thi mã sẽ không được ghi lại. Ví dụ: nó có thể sử dụng mmap để ghi vào tệp mà không có nội dung tệp xuất hiện dưới dạng đối số của các cuộc gọi hệ thống, làm cho tệp này có thể thực thi được và tạo ra một quy trình thực thi nó. Quá trình sinh sản thường có thể phá vỡ cây quy trình bằng một cái gì đó như ssh localhost. Nếu bạn kiểm toán tất cả các quy trình được thực hiện bởi một người dùng nhất định (trái ngược với chỉ một quy trình duy nhất và hậu duệ của nó), bạn sẽ có thể ghi nhật ký mọi thứ.

12

Nếu có, Có một phương pháp "giám sát" cuộc gọi hệ thống an toàn, đáng tin cậy nào khác (và, có thể nhận tín hiệu), quá trình đó không thể phá vỡ (giả sử triển khai Linux đúng cách)?

Để lặp lại theo một cách hơi khác những gì D.W. đã nói, ptrace là một cuộc gọi hệ thống mà strace, gdb và tương tự thực hiện để giám sát các hành động của một quy trình. Có hai vấn đề với cách tiếp cận này:

  1. Như bạn có thể biết, các cuộc gọi hệ thống hooking là một kỹ thuật yêu thích của các tác giả rootkit. Hoàn toàn có thể thay thế ptrace, cung cấp cho bạn đầu ra của một quá trình khác hoặc một số sự cố khác như vậy.
  2. Các quy trình không phải lúc nào cũng được viết để sẵn sàng gửi trình gỡ lỗi. Bạn có thể muốn đọc bộ thử thách này (tập trung vào win32 - xem mục đầu tiên và tiếp tục đọc để gây khó khăn) từ một công ty ứng dụng (tôi không có liên kết với họ). Trong khi tập trung vào cơ chế IsDebuggerPresent(), tương tự giải pháp tồn tại cho ptrace . Nếu bạn muốn thấy điều này trong tự nhiên và cài đặt skype trên hộp Linux, hãy thử gỡ lỗi nó.

    Lặp đi lặp lại những kỹ thuật ở đây, có hai cơ chế chống ptrace rõ ràng:

    if (ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) {
        printf("being ptraced\n");
        exit(1);
    }
    

    Phương pháp này dựa trên thực tế một quá trình không thể được truy tìm hai lần. Nếu bạn không thể tự tìm kiếm chính mình, bạn đang bị tấn công.

    struct timespec spec;
    
    signal(SIGALRM, SIG_IGN);
    alarm(1);
    spec.tv_sec = 2;
    spec.tv_nsec = 0;
    if (nanosleep(&spec, NULL) < 0) {
        /* EINTR */
        printf("being ptraced\n");
        exit(1);
    }
    

    Để giải thích điều này, hãy xem nanosleep() và đọc bài viết gốc. Nói một cách đơn giản, nanosleep() là một cuộc gọi hệ thống không thể khởi động lại và sẽ quay lại sớm khi tín hiệu được xử lý bởi quá trình. Quá trình cụ thể này, khi không được gỡ lỗi, sẽ không xử lý tín hiệu cụ thể đó và do đó sẽ không được đánh thức. Tuy nhiên, một quy trình ptraced sẽ xử lý nó, khiến nanosleep trở về sớm. Một ví dụ khác khi điều này xảy ra là cuộc gọi hệ thống select().

Cuối cùng, bạn có thể giảm thiểu các tác động của 1 bằng cách đảm bảo tính toàn vẹn của hệ thống trước khi bắt đầu và áp dụng các biện pháp bảo mật đầy đủ và hạt nhân được cấu hình phù hợp.

Bạn có thể làm gì đáng tin cậy về 2? Không có nhiều mà không sửa đổi mã nhị phân ban đầu, vì bất kỳ kỹ thuật để gỡ lỗi sẽ giới thiệu sự không nhất quán quan sát được hoặc các vấn đề triển khai ở đâu đó.

tl; dr ptrace sẽ giúp bạn nếu quy trình đích không được viết với trình gỡ lỗi trong tâm trí.

10
user2213

Khung kiểm toán Linux hỗ trợ giám sát tòa nhà - tôi tin rằng đó là những gì bạn đang tìm kiếm.

5
john

Đúng. strace là một cách hợp lý để giám sát các cuộc gọi hệ thống và các đối số của chúng, miễn là quá trình được theo dõi không phải là độc hại. Nếu quá trình đang được theo dõi là độc hại và được viết để trốn tránh bước đi, tôi hy vọng rằng nó có thể làm như vậy. strace không được viết như một công cụ bảo mật và tôi có thể đưa ra giả thuyết về một số cách mà quy trình có thể đánh bại nó. Xem, ví dụ, Robert Watson, Khai thác lỗ hổng đồng thời trong Trình bao bọc cuộc gọi hệ thống hoặc Tal Garfinkel, Bẫy và cạm bẫy: Các vấn đề thực tế trong Công cụ bảo mật dựa trên cuộc gọi hệ thống .

Nếu bạn lo lắng về mã độc, bạn sẽ muốn sử dụng hộp cát được thiết kế để bảo mật, thay vì một công cụ như strace không được thiết kế để bảo mật. Cách tiếp cận chung để xây dựng một hộp cát như vậy là sử dụng cả sự can thiệp của cuộc gọi hệ thống để chứa quá trình được giám sát và giám sát các hành động của nó. Một phương pháp di động là sử dụng ptrace, mặc dù điều này có thể giới thiệu một chi phí hiệu năng không tầm thường vì nó buộc phải chuyển đổi ngữ cảnh trên mỗi cuộc gọi hệ thống. Trên Solaris, bạn có thể sử dụng/Proc;/Proc cho phép bạn chỉ định tập hợp con của các cuộc gọi hệ thống mà bạn quan tâm đến việc gói, điều này cho phép bạn đạt được hiệu suất tốt hơn với chi phí tương thích.

Hãy xem Plash, Systrace và Subterfugue, để xem một số hệ thống hoạt động sử dụng các loại phương thức này. Đồng thời nhìn vào hộp cát của Chrome, sử dụng nhiều cơ chế khác nhau (bao gồm cả seccomp trên Linux).

4
D.W.

Điều gì về việc giám sát các cuộc gọi hệ thống ở phía bên của hạt nhân bằng cách sử dụng một thể hiện gdb bên ngoài.

Điều này có thể được thực hiện bằng cách thiết lập một máy ảo được cấu hình để chạy mã quan tâm. Sau đó, QEMU và KVM (theo hiểu biết của tôi) phải được cấu hình để mở một cổng để gỡ lỗi gdb của kernel. (Xem hướng dẫn thổi.)

Nếu điều này VM được bắt đầu, gdb có thể được gắn vào kernel của nó trong khi khởi động.

Bước tiếp theo là đặt các thuộc tính gdb và các điểm dừng để kích hoạt bất kỳ lệnh thực thi (và phối hợp) nào đặt mã quan tâm là chương trình mới. Sau đó, để gdb chạy cho đến khi nó đạt đến điểm dừng này. Tại thời điểm này trong quá trình thực thi chương trình, pid của quá trình đang chạy mã quan tâm có thể được trích xuất và các điểm dừng có thể được đặt trong gdb được nhấn (trong mã kernel) trên bất kỳ lệnh gọi hệ thống nào của quy trình này (bao gồm cả fork và thực thi các cuộc gọi có thể dẫn đến các quá trình bổ sung để quan sát).

Về lý thuyết, đây có thể là một giải pháp tốt khó thực hiện.

Một vấn đề là mọi thứ trong hệ thống khách trở nên chậm khủng khiếp và bạn có thể nhận được một lượng lớn các cuộc gọi không mong muốn dưới dạng bù trừ (bạn phải lọc bằng gdb ...). Gdb bổ sung có thể phải được mở rộng bằng cách sử dụng python để có được các điểm dừng có điều kiện làm việc với các điều kiện bắt buộc (đặc biệt đối với phát hiện quy trình con tự động).

Hướng dẫn cách kết nối gdb với khách: Whamcloud Wiki , ReadHat Helpdesk , Stackoverflow

(Tôi đã không thử các hướng dẫn này. Tôi đã sử dụng gdb vài năm trước để gỡ lỗi một số chi tiết về kernel cho dự án sinh viên. Ở đó tôi đã sử dụng một điều kiện đơn giản trên một điểm dừng để phát hiện các cuộc gọi rẽ nhánh của một quy trình cụ thể.)

Trên đầu trang này có một số kỹ thuật khác để gỡ lỗi kernel .

PS: Lưu ý rằng có nhiều cách để thoát khỏi máy ảo (một ví dụ cũ ).

0
msebas