2012-11-12 58 views
9

Tôi đang viết một chương trình sinh ra các tiến trình con. Vì lý do bảo mật, tôi muốn giới hạn những quy trình này có thể làm gì. Tôi biết các biện pháp an ninh từ bên ngoài chương trình như chroot hoặc ulimit, nhưng tôi muốn làm điều gì đó hơn thế. Tôi muốn giới hạn các cuộc gọi hệ thống được thực hiện bởi quá trình con (ví dụ: ngăn chặn các cuộc gọi đến open(), fork() và những thứ như vậy). Có cách nào để làm điều đó? Tối ưu, các cuộc gọi hệ thống bị chặn sẽ trở lại với một lỗi nhưng nếu điều đó là không thể, sau đó giết chết quá trình cũng tốt.Ngăn chặn các quá trình thực thi các cuộc gọi hệ thống nhất định

Tôi đoán nó có thể được thực hiện wuth ptrace() nhưng từ trang người đàn ông tôi thực sự không hiểu làm thế nào để sử dụng nó cho mục đích này.

+3

Bạn có thể muốn SELinux http://en.wikipedia.org/wiki/Security-Enhanced_Linux Tôi không chắc chắn 100%, nhưng nó phải có API lập trình. –

+4

['prctl (PR_SET_SECCOMP, ...)'] (http://www.kernel.org/doc/man-pages/online/pages/man2/prctl.2.html) có thể là những gì bạn muốn. Đó là gần với "không cho phép syscalls" như bạn có thể nhận được. – Damon

+1

Vấn đề với 'prctl (PR_SET_SECCOMP, ...)' là nó cũng chặn cuộc gọi 'exec()', vì vậy nó không thể sử dụng được với tôi. – petersohn

Trả lời

5

Nếu bạn muốn thực hiện theo cách ptrace, bạn có một số tùy chọn (và một số thực sự đơn giản). Trước hết, tôi khuyên bạn nên làm theo hướng dẫn explained here. Với nó, bạn có thể tìm hiểu làm thế nào để biết những gì các cuộc gọi hệ thống đang được gọi, và cũng là kiến ​​thức cơ bản ptrace (đừng lo lắng, đó là một hướng dẫn rất ngắn). Các tùy chọn (mà tôi biết) bạn có như sau:

  • Cách dễ nhất là giết đứa trẻ, đó là this exact code here. Thứ hai, bạn có thể làm cho con thất bại, chỉ bằng cách thay đổi thanh ghi với PTRACE_SETREGS, đặt sai giá trị trong chúng, và bạn cũng có thể thay đổi giá trị trả về của cuộc gọi hệ thống nếu bạn muốn (một lần nữa, với PTRACE_SETREGS).
  • Cuối cùng, bạn có thể bỏ qua cuộc gọi hệ thống. Nhưng để biết rằng bạn nên biết địa chỉ sau cuộc gọi hệ thống, hãy đặt điểm đăng ký tham gia vào đó và đặt lại (một lần nữa, với PTRACE_SETREGS).
+2

Lưu ý rằng có một số [báo trước lớn] (http://stackoverflow.com/a/4421762/134633) sử dụng ptrace cho hộp cát. – caf

6

Có vẻ như SECCOMP_FILTER, được thêm vào phiên bản kernel 3.5, là những gì bạn đang theo dõi. libseccomp library cung cấp API dễ sử dụng cho chức năng này.

Bằng cách này, chroot()setrlimit() là cả hai cuộc gọi hệ thống có thể được gọi trong chương trình của bạn - bạn có thể muốn sử dụng một hoặc cả hai tùy chọn này ngoài lọc seccomp.

+0

Nghe hay, nhưng tôi đang sử dụng hạt nhân 2.6.32. – petersohn

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