2010-02-14 12 views
15

Tôi là nhà phát triển của động cơ Robocode. Chúng tôi muốn làm cho Robocode đa ngôn ngữ và Scala có vẻ phù hợp. Chúng tôi có plugin Scala prototype here.Bảo mật của thời gian chạy scala

Vấn đề: Bởi vì người dùng là các lập trình viên sáng tạo, họ có thể cố gắng để giành chiến thắng trận chiến cách khác nhau. Các rô bốt cũng được tải xuống từ cơ sở dữ liệu trực tuyến nơi mọi người có thể tải lên một. Vì vậy, khoảng cách về an ninh có thể dẫn đến lỗ hổng bảo mật vào máy tính của người dùng. Các robot được viết bằng Java đang chạy trong sandbox bị hạn chế. Hầu hết mọi thứ đều bị cấm [mạng, GUI, đĩa (giới hạn), chủ đề (giới hạn), trình nạp lớp và phản chiếu]. Hộp cát tương tự như applet trình duyệt. Chúng tôi sử dụng SecurityManager, tùy chỉnh ClassLoader mỗi robot, etc ...

Có hai cách làm thế nào để tổ chức Scala runtime trong Robocode:

1) tải nó cùng với con robot bên trong sandbox. Khá an toàn cho chúng tôi, giải pháp ưu tiên. Nhưng nó sẽ làm hỏng khả năng thời gian chạy của Scala vì thời gian chạy sử dụng sự phản chiếu. Có thể tạo ra các lớp trong thời gian chạy? Sử dụng các chủ đề để làm một số dọn dẹp nội bộ? Truy cập vào JVM/internals? (Tôi không muốn giới hạn khả năng ngôn ngữ)

2) sử dụng thời gian chạy Scala dưới dạng mã đáng tin cậy, bên ngoài hộp, bảo mật trên cùng cấp với JDK. Hiển thị đối với (độc hại) rô bốt. API thời gian chạy Scala có an toàn không? Các phương pháp có bảo vệ an ninh không? Có chế độ an toàn nào không? Có bất kỳ singleton trong thời gian chạy Scala, có thể bị lạm dụng để giao tiếp giữa các robot không? Bất kỳ concurency/threadpool/nhắn tin mà có thể mô phỏng các chủ đề? (Có bất kỳ kiểm tra bảo mật nào cho thời gian chạy của Scala không?)

3) Một số thứ ở giữa, một số loại thời gian chạy trong và một số. Lớp học/gói nào phải hiển thị với rô bốt/đó chỉ là triển khai riêng tư? (Điều này có vẻ là giải pháp trong tương lai)

Câu hỏi đặt ra: Có thể liệt kê và cô lập các bộ phận của thời gian chạy mà phải chạy trong phạm vi tin cậy từ phần còn lại? Các gói và lớp học cụ thể? Hoặc ý tưởng tốt hơn?

Tôi đang tìm câu trả lời cụ thể, điều này sẽ dẫn đến giải pháp an toàn. Suy nghĩ ngẫu nhiên chào đón, nhưng không được trao. Có cuộc thảo luận đang diễn ra tại scala email group. Chưa có câu trả lời cụ thể.

Trả lời

3

Tôi nghĩ rằng # 1 là đặt cược tốt nhất của bạn và thậm chí đó là mục tiêu di chuyển. Khi được đưa lên danh sách gửi thư, các kiểu cấu trúc sử dụng sự phản chiếu. Tôi không nghĩ rằng các kiểu cấu trúc là phổ biến trong thư viện chuẩn, nhưng tôi không nghĩ có ai theo dõi chúng ở đâu.

Cũng luôn có khả năng có các tính năng khác sử dụng phản chiếu đằng sau hậu trường. Ví dụ, trong một thời gian trong nhánh 2.8 một số chức năng mảng đã sử dụng sự phản chiếu. Tôi nghĩ rằng điều đó đã được thay đổi sau khi điểm chuẩn, nhưng luôn có khả năng có một số vấn đề mà ai đó nói "Aha! Tôi sẽ sử dụng sự phản chiếu để giải quyết vấn đề này".

Thư viện chuẩn Scala được làm đầy với các tệp đơn.Hầu hết chúng đều không thay đổi, nhưng tôi biết rằng đối tượng Scheduler trong thư viện tác nhân có thể bị lạm dụng vì giao tiếp vì nó thực chất là một proxy cho một bộ lập lịch thực để bạn có thể cắm lịch trình tùy chỉnh của riêng bạn vào nó. Tại thời điểm này, tôi không nghĩ rằng Scala yêu cầu sử dụng bộ nạp lớp tùy chỉnh và tất cả các lớp của nó được tạo ra tại thời gian biên dịch thay vì thời gian chạy, nhưng sau đó lại có thể là mục tiêu di chuyển. Scala tạo ra rất nhiều tập tin lớp, và luôn luôn có nói chuyện về làm cho nó tạo ra một số người trong số họ trong thời gian chạy khi họ là cần thiết thay vì tại thời gian biên dịch. Vì vậy, trong ngắn hạn, tôi không nghĩ rằng nó có thể (trong những hạn chế hợp lý về nỗ lực) để liệt kê và cô lập các mảnh Scala có thể (và nên) được tin cậy.

+0

Liên kết tới chuỗi về phản ánh và mảng: http://thread.gmane.org/gmane.comp.lang.scala.internals/2590 –

+1

Một số điểm tốt ở đây. Về mục tiêu di chuyển, u r right, tôi rất vui khi khóa phiên bản scala đơn lẻ. Về "Aha! Tôi sẽ sử dụng sự phản chiếu để giải quyết vấn đề này." đó là hành động tội phạm. Tôi không muốn thấy người dùng/người mới của tôi phàn nàn ở nhóm hỗ trợ của chúng tôi về thời gian chạy bị hỏng mà chúng tôi không sở hữu. Nó không rõ ràng với tôi nếu thời gian chạy ít nhất sẽ quấn/chuyển đổi ngoại lệ cho một cái gì đó phù hợp. Có ít nhất AccessController.doPrivileged() cho các hành động như vậy không? –

+1

Bạn phải xem xét các mục tiêu thị trường Scala. Sự phản chiếu khá phổ biến trong các khung công tác web Java và các ngôn ngữ động dựa trên JVM. Nó khá nhỏ so với thao tác bytecode thời gian chạy, nó cũng khá phổ biến. Cũng xin lưu ý rằng việc sử dụng phản chiếu không nhất thiết bị giới hạn trong thời gian chạy hoặc thư viện, mà là trình biên dịch đơn giản phát ra các cuộc gọi trong mã người dùng thông thường. Tôi không thể tìm thấy một cá thể duy nhất của AccessController trong nguồn Scala, vì vậy tôi không nghĩ rằng đó là tất cả nhận thức được những điều như vậy. –

0

Khi bạn đề cập đến các triển khai ngôn ngữ J * khác mà tất cả có thể sử dụng phản xạ, nó sẽ là lệnh cấm cho tất cả các ngôn ngữ đó miễn là sự phản chiếu không phải là một phần của trò chơi. Tôi đoán đó sẽ là vấn đề của JVM không có cách nào để phân chia phạm vi của API phản chiếu, sao cho bạn có thể sắp xếp "sandbox" một phần mã có thể được phản ánh bên trong.

+0

Vâng, tôi nghĩ bạn hướng đến hướng tương tự như bình luận GAE ở trên. –

+0

Tôi nghĩ rằng tôi đã viết bình luận, nhưng thực ra tôi không có quyền bình luận về câu trả lời được đăng bởi những người khác. – itsnotvalid