2012-07-06 27 views
7

Tôi hiện đang làm việc trên một khuôn khổ rất dựa trên mô-đun và dựa trên plugin cho luận án cử nhân của tôi. Ý tưởng chính là, có một thư mục bên trong cấu trúc ứng dụng của tôi có tên là plugins nơi bạn có thể thả các plugin được biên dịch (ví dụ: .dll -files), phù hợp với giao diện đặc biệt IPlugin. Ứng dụng sau đó thực hiện các tác vụ bằng cách sử dụng plugin mà người dùng chọn. Vì vậy, nếu tôi muốn thực hiện tác vụ một lần trong một tệp PDF, tôi sẽ chọn PdfPlugin và một lần trong tài liệu từ, tôi sẽ chọn DocPlugin cho tác phẩm.Làm thế nào để ngăn chặn các plugin thực thi mã độc hại

Kết quả cũng được xác định trong giao diện, vì vậy mọi plugin đều trả về cùng cấu trúc dữ liệu. Chỉ công việc thực tế khác nhau đối với mỗi thư viện.

Bây giờ, vì ứng dụng chỉ gọi các phương thức được xác định trong giao diện, ví dụ: ParseDocument() và như vậy, làm cách nào để ngăn các plugin (có thể đã được các bên thứ ba phát triển) thực thi mã độc hại?

Tôi đang làm việc trên .NET3.5 (có thể sẽ chuyển sang 4, chưa được quyết định) và C#.

Trả lời

8

tôi đang làm việc trên .NET3.5

Trong trường hợp đó, tôi sẽ cô lập Plugins của bạn để chạy trong một riêng biệt AppDomain, sử dụng Code Access Security và hạn chế các thiết lập cho phép của miền ứng dụng. "Sandboxes" của bạn hội đồng plugin của bạn. Ví dụ:

Ví dụ: bạn có thể lấy tất cả các quyền không được quản lý mã và Quyền IO tệp và sau đó plugin của bạn sẽ không bao giờ có thể ghi vào hệ thống tệp.

Điều này không dành cho những người yếu tim. AppDomains có thể khó khăn để làm việc với và yêu cầu serialization, đối tượng chính sách đời, vv Bạn có thể sử dụng MAF vì nó lấy đi rất nhiều hệ thống ống nước.

+0

Có thể truy vấn plugin cho quyền truy cập Code Security Security nào không? So với những thứ như ý định trên Android? I E. Tôi có thể muốn có một khuôn khổ plugin cho phép tôi để xác định những gì quyền truy cập một plugin được yêu cầu, vì vậy tôi có thể nhắc người dùng xác nhận trước khi tải các plugin. Hoặc là nó theo cách khác xung quanh, trong đó tôi thực thi quyền trong ứng dụng của tôi, và sau đó các plugin chỉ đơn giản là thất bại/ném ngoại lệ nếu nó cố gắng làm một cái gì đó bên ngoài các điều khoản cho phép? – AaronLS

+0

Không yêu cầu "làm thế nào để" như là loại ra khỏi phạm vi của câu hỏi, nhưng tò mò mà trong hai cách tiếp cận khác nhau CAS là thích hợp cho. – AaronLS

0

Tôi biết rằng có khá nhiều nghiên cứu được thực hiện trong lĩnh vực này. Một cách tiếp cận làm việc là kiểm tra mã IL và tìm kiếm các chữ ký bị cấm. Sau đó, bạn có thể chuyển hướng chúng đến một móc lỗi mà sẽ ngăn chặn các plugin nôn thực thi thêm mã.

Một ứng dụng là ví dụ: tăng cường bảo mật cho điện thoại thông minh, nơi bạn có thể kiểm tra mã IL từ các ứng dụng đã tải xuống để truy cập các phương thức vào mô-đun GPS, máy ảnh, micrô .... Ứng dụng bảo mật có thể vá các phương thức truy cập này và hỏi người dùng xem ứng dụng có thực sự được phép bật micrô.

Với .NET, bạn có thể sử dụng trình đọc IL như Mono.Cecil để kiểm tra mã IL cho chữ ký có hại. Nhưng luôn luôn có những cách xung quanh vấn đề này vì bạn vẫn có thể tạo mã động hoặc đơn giản là lưu trữ mã dưới dạng tài nguyên và tải mã đó tại thời điểm phát sóng từ tài nguyên. Đối với một bằng chứng về khái niệm phương pháp này là khá dễ dàng để làm.

Bạn thậm chí có thể viết quy tắc FXCop và sử dụng quy tắc này để kiểm tra tĩnh các plugin cho các cuộc gọi phương thức bị cấm.

+2

"Một cách tiếp cận làm việc là kiểm tra mã IL và tìm chữ ký bị cấm" ick. Điều gì về các cuộc gọi phương thức được thực hiện thông qua công văn động, chẳng hạn như DLR, phản ánh, v.v ...? – vcsjones

+0

Tôi không nói rằng tôi đã làm điều này. Tất cả tôi đã nói rằng các nhà nghiên cứu đã làm nó và đạt được khá một số báo chí echo (điện thoại thông minh an ninh là mát mẻ). Tôi đoán họ không chỉ là những người phát triển lõi cứng như những người truy cập Stackoverflow trung bình. Có lẽ họ nên hỏi về SO nếu ý tưởng của họ là một ý tưởng hay. –

-2

Bạn không thể.

Dll là mã nhị phân được thực hiện với các đặc quyền của chương trình gọi. Khi một phương thức từ một DLL được gọi, bạn không thể kiểm soát được nó.

Khi bạn muốn giới hạn những gì một plugin có thể thực hiện, bạn phải di chuyển thực hiện sang chương trình chính của mình.Cách tốt nhất để làm điều này là triển khai các plugin bằng ngôn ngữ kịch bản được phân tích và thực hiện bởi chương trình của bạn thay vì các thư viện nhị phân.

+0

* DLL là mã nhị phân * - không có trong .Net – DaveShaw

+1

"Bạn không thể." có bạn có thể. Đó chính xác là những gì CAS được thiết kế để làm. Hãy nhớ rằng, .NET Framework là một máy ảo, vì vậy nó có thể thực thi các quy tắc này khi chạy. – vcsjones

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