2012-04-03 28 views
5

Tôi hiện đang làm việc ở mặt sau của hệ thống cuộc thi lập trình công cộng giống như ACM. Trong hệ thống như vậy, bất kỳ người dùng nào cũng có thể gửi mã nguồn, sẽ được biên dịch và chạy tự động (có nghĩa là không có kiểm duyệt trước mắt người) được thực hiện để giải quyết một số vấn đề về tính toán.Làm thế nào để cấm các cuộc gọi hệ thống, GNU/Linux

Back-end là một máy chuyên dụng GNU/Linux, nơi người dùng sẽ được tạo cho từng thí sinh, tất cả những người dùng đó là một phần của nhóm người dùng. Các nguồn được gửi bởi bất kỳ người dùng cụ thể nào sẽ được lưu trữ tại thư mục chính của người dùng, sau đó được biên dịch và thực hiện để được xác minh đối với các trường hợp thử nghiệm khác nhau.

Điều tôi muốn là cấm sử dụng các cuộc gọi hệ thống Linux cho các nguồn. Đó là bởi vì các vấn đề đòi hỏi các giải pháp độc lập nền tảng, trong khi cho phép các cuộc gọi hệ thống cho nguồn không an toàn là một vi phạm an ninh tiềm ẩn. Các nguồn như vậy có thể được đặt thành công trong FS, thậm chí được biên dịch, nhưng không bao giờ chạy. Tôi cũng muốn được thông báo bất cứ khi nào có chứa các cuộc gọi hệ thống đã được gửi.

Bởi bây giờ, tôi thấy các địa điểm sau khi kiểm tra như vậy có thể được đặt: Phân tích

  • Front-end/pre-biên soạn - nguồn đã kiểm tra trong hệ thống, nhưng chưa được biên dịch. Kiểm tra văn bản đơn giản đối với tên cuộc gọi hệ thống. Giải pháp phụ thuộc vào ngôn ngữ, phụ thuộc vào trình biên dịch, độc lập.
  • Vá biên dịch - sự cố GCC (hoặc bất kỳ trình biên dịch nào khác được bao gồm trong chuỗi công cụ) bất cứ khi nào cuộc gọi hệ thống gặp phải. Giải pháp dựa trên nền tảng, phụ thuộc vào trình biên dịch, độc lập ngôn ngữ (nếu chúng ta đặt trình kiểm tra "đủ xa"). Khả năng tương thích cũng có thể bị mất. Trong thực tế, tôi không thích điều này thay thế nhiều nhất.
  • Trình kiểm tra thời gian chạy - bất cứ khi nào cuộc gọi hệ thống được gọi từ quy trình, hãy chấm dứt quá trình này và báo cáo. Giải pháp này là trình biên dịch và ngôn ngữ độc lập, nhưng phụ thuộc vào nền tảng - Tôi đồng ý với điều đó, vì tôi sẽ triển khai back-end trên các nền tảng tương tự trong ngắn hạn và trung hạn.

Vì vậy, câu hỏi đặt ra là: GNU/Linux có cung cấp cơ hội cho quản trị viên cấm sử dụng cuộc gọi hệ thống cho nhóm người dùng, người dùng hoặc quy trình cụ thể không? Nó có thể là một chính sách bảo mật hoặc một tiện ích GNU nhẹ.

Tôi đã cố gắng sử dụng Google, nhưng Google không thích tôi hôm nay.

+0

_Front-end/pre-compilation analysis_ ← thủ thuật tiền xử lý có thể tránh được điều này một cách dễ dàng. Có 'seccomp' là một chế độ mà trong đó một quá trình chỉ có thể đọc/ghi vào một ống được mở trước. Nó được kích hoạt thông qua một cuộc gọi 'prctl()'. Có những câu hỏi tương tự ở đây trên SO: http://www.google.com/search?q=seccomp+site%3Astackoverflow.com&btnG=Buscar&oe=utf-8 – ninjalj

+0

@ninjalj đã thử nhưng không tìm thấy. Tâm trí để chia sẻ một liên kết? – iehrlich

+0

Chỉ cần thêm liên kết vào nhận xét trước của tôi. – ninjalj

Trả lời

7

chế độ 1 seccomp cho phép quá trình giới hạn chính xác đến bốn syscalls: read, write, sigreturn_exit. Điều này có thể được sử dụng để mã sandbox nghiêm trọng, như seccomp-nurse.

mode 2 seccomp (tại thời điểm viết, được tìm thấy trong Ubuntu 12.04 hoặc vá hạt nhân của riêng bạn) cung cấp tính linh hoạt hơn trong việc lọc syscalls.Ví dụ: bạn có thể thiết lập bộ lọc đầu tiên, sau đó exec chương trình đang được thử nghiệm. Việc sử dụng thích hợp chroot hoặc unshare có thể được sử dụng để ngăn không cho việc này trở lại "exec".

+1

@suddnely_me Tôi chỉ nghĩ đến một giải pháp thay thế khác, nếu seccomp không giải quyết: một hộp cát dựa trên [NaCL] (https://developers.google.com/native-client/) như [ZeroVM] (http://zerovm.org/). – ephemient

3

Tôi nghĩ bạn cần xác định cuộc gọi hệ thống tốt hơn. Ý tôi là,

cat <<EOF > hello.c 
#include <stdio.h> 
int main(int argc,char** argv) { 
    fprintf(stdout,"Hello world!\n"); 
    return 0; 
} 
EOF 
gcc hello.c 
strace -q ./a.out 

chứng tỏ rằng ngay cả một chương trình tầm thường cũng tạo ra ~ 27 cuộc gọi hệ thống. Bạn (tôi giả định) muốn cho phép các cuộc gọi đến "thư viện C chuẩn", nhưng những thay đổi đó sẽ được thực hiện theo các cuộc gọi hệ thống. Tôi đoán những gì tôi đang cố gắng để nói là kiểm tra thời gian chạy là ít khả thi hơn bạn có thể nghĩ (sử dụng strace hoặc tương tự anyway).

Các vấn đề liên quan