2010-01-13 33 views
7

Tôi có một ứng dụng java sử dụng JNI ở một số phần để thực hiện một số công việc. Nó theo sau tải thông thường của DLL và sau đó gọi các phương thức native của DLL. Có cách nào chúng ta có thể hạn chế những phương thức gốc có thể làm gì từ ứng dụng java không? Ví dụ, chúng ta có thể hạn chế DLL không mở bất kỳ tập tin nào hay không để mở bất kỳ ổ cắm nào ngay cả khi nó có mã để làm điều đó? Nó chỉ có thể cấm các DLL mà nó tải để làm những việc nhất định, có thể là do một thứ gì đó hoặc ném một ngoại lệ.Hạn chế chức năng mã gốc từ Java

+0

Câu hỏi thú vị, nhưng cũng sẽ rất hay khi biết thêm về những gì bạn đang cố gắng làm. Bạn đang cố gắng cho phép tải các tệp DLL của bên thứ ba vào ứng dụng Java của mình, nhưng sợ chúng có thể hack nó? Đây là một mối đe dọa rất thực tế. Một DLL có thể đột nhập vào máy Java và lấy mọi thứ từ nó. –

+1

@Clark: Chính xác. Chúng tôi không thể nói bên thứ ba. Nhưng hãy nói rằng chúng tôi có ứng dụng java. Và chúng tôi định nghĩa một khuôn khổ sử dụng bất kỳ ai cũng có thể phát triển một DLL và sử dụng nó với ứng dụng của chúng tôi. Và tôi muốn hạn chế những gì họ có thể nhận được từ khung công tác. Tôi hy vọng bạn sẽ có được hình ảnh. – vpram86

Trả lời

7

Tôi thích Gregory Pakosz 'answer rất nhiều. Tuy nhiên, những gì bạn có thể làm là sandbox bản thân Java. Bắt đầu ứng dụng Java trong ngữ cảnh bị hạn chế.

Trong Windows hoặc Unix, bạn có thể tạo người dùng được giới hạn trong một thư mục nhất định và chỉ có quyền truy cập vào một số tệp DLL. Vì vậy, DLL được gọi từ JNI có thể làm bất cứ điều gì nó muốn, nhưng nó sẽ không nhận được rất xa, bởi vì người sử dụng Java chạy như không thể làm rất nhiều.

Nếu chương trình Java của bạn cần phải làm những điều đặc quyền, phía Java của nó sẽ phải nói chuyện với một chương trình khác (Java hay không) để làm những điều đặc quyền của nó cho nó.

Chỉ cần ghi nhớ rằng nếu bạn không thể tin tưởng DLL, bạn không còn có thể tin tưởng mã Java nữa, vì DLL có thể đã "tấn công" máy Java. Mặt khác, không có nội dung khó chịu nào có thể thoát khỏi giới hạn của người dùng mà họ chạy. (Chặn cấu hình sai hoặc lỗi trên hệ điều hành.)

+1

+1 - sắp viết một cái gì đó tương tự.Điều duy nhất tôi muốn thêm là nó có thể đáng giá để bọc DLL trong một số loại lớp dịch vụ được truy cập từ ứng dụng Java. Nhưng điều đó có thể giới thiệu chi phí không thể chấp nhận được. – kdgregory

+0

Đề xuất hay. Cảm ơn rất nhiều Clark và Gregory! – vpram86

1

Thông thường bạn sẽ chạy ứng dụng của mình trong Trình quản lý bảo mật Java nhưng tôi không tin rằng nó có bất kỳ ảnh hưởng nào đến mã chạy qua JNI.

+0

Cảm ơn. Tôi đã tự hỏi liệu chúng ta có thể restrcit atleast tạo ra hoặc xóa bằng cách thiết lập một số thuộc tính trong quản lý bảo mật liên quan đến tải DLL. – vpram86

8

Không, bạn không thể. Các DLL được nạp như một toàn bộ và sau đó phía Java không có kiểm soát về những gì mã nguồn gốc đang làm.

Một giải pháp có thể là loại người ở phương pháp tiếp cận trung gian. Điều này sẽ liên quan đến mã hóa một DLL "vỏ" có giao diện tương tự như DLL gốc. Bạn yêu cầu Java tải một DLL "shell" ví dụ bằng cách đặt nó vào một vị trí cụ thể và sử dụng thuộc tính java.library.path. Sau đó, vai trò của DLL "shell" là tải DLL "true" bằng cách sandboxing nó và chuyển hướng các hàm chuẩn. Điều này nghe có vẻ như rất nhiều đau đớn và điều này sẽ xảy ra ở phía bản địa trên mọi thứ, không phải từ Java.

+0

THanks. Tôi hiểu điều đó. Có cách nào mà chúng ta có thể nói với quá trình java để tải nó với loại tài sản hạn chế chính nó? – vpram86

+0

Thật tuyệt vời! Cảm ơn rất nhiều. Nhưng điều này liên kết vỏ với DLL gốc và nếu chúng ta có nhiều DLL, chúng ta có thể cần phải có các DLL shell correponding: (như bạn đã nói là rất nặng. Tôi đã suy nghĩ liệu điều này có thể thông qua một số thuộc tính trong khi tải hoặc khởi động JVM hay không. Nhưng cám ơn rất nhiều về sự thấu hiểu – vpram86

1

Bạn có thể thực hiện một số loại cài đặt mà mã JNI của bạn có thể nhận được. Ví dụ, trên một hệ thống UNIX, bạn có thể tạo các nhóm cho các kiểu đặc quyền đặc biệt và kiểm tra xem người dùng hiện tại có các đặc quyền cần thiết hay không, chỉ cần trả về 0 hoặc một cái gì đó.

+0

Chính xác. Cảm ơn rất nhiều!. Đây là cái đã được thảo luận trong câu trả lời của Clark. Chúng ta có thể sử dụng tương tự trong Unix. – vpram86

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