2010-10-26 32 views
8

Hãy giả sử rằng bạn có R chạy với quyền root/admin. Bạn cho rằng những cuộc gọi R nào có hại, ngoài system()file.*()?Chặn các cuộc gọi R có khả năng gây nguy hiểm

Đây là câu hỏi dành riêng cho nền tảng, tôi đang chạy Linux, vì vậy, tôi quan tâm đến rò rỉ bảo mật dành riêng cho Linux. Tôi sẽ hiểu nếu bạn chặn các cuộc thảo luận về R, vì bài đăng này có thể dễ dàng xuất hiện trong "Làm thế nào để làm rối loạn hệ thống với R?"

+1

Lý do để chạy R làm gốc là gì? Có lẽ giải pháp nằm trong đó, tức là bạn nên tự hỏi mình câu hỏi: "làm cách nào để cho phép người dùng thực hiện xyz ** mà không cần phải cấp cho anh ta quyền root?". Điểm khác, tất nhiên, là bất cứ ai có thể chạy phần mềm với các đặc quyền root nên được tin cậy, đủ để không lo lắng về anh ta/cô ấy rối tung lên hệ thống, nếu không anh/cô ấy không nên có quyền root ở nơi đầu tiên. – nico

+0

Điều này đã được hỏi một vài năm trước đây trong danh sách R-Help hoặc R-Devel. Tôi không nhớ chi tiết, nhưng những gì bạn hỏi là không thể thực hiện được; một khi bạn đã tắt tất cả các con đường có thể làm bất cứ điều gì bên ngoài R, bạn đã khiến R vô dụng. Không chạy dưới dạng root. –

+0

Có thể tìm thấy một danh sách rộng các chức năng có thể gây hại trong gói nhỏ của tôi: https://github.com/daroczig/sandboxR. Gói này sẽ cấm nhiều cuộc gọi R và chỉ cho phép tải các gói "danh sách trắng", vì vậy có thể không đủ cho phép, nhưng sẽ cấm người dùng của bạn xâm phạm bất kỳ tệp và tài nguyên nào trên hệ thống của bạn. Tất nhiên môi trường hộp cát này nên được sử dụng trong một số ứng dụng xử lý ví dụ: ghi vào đĩa - bên ngoài mã R của người dùng. – daroczig

Trả lời

11

Không chạy R với quyền sở hữu gốc. Không có cách nào hiệu quả để bảo mật R theo cách này, vì ngôn ngữ bao gồm eval và reflection, có nghĩa là tôi có thể xây dựng các lời gọi đến hệ thống ngay cả khi bạn không muốn tôi.

Tốt hơn hết là chạy R theo cách không thể ảnh hưởng đến hệ thống hoặc dữ liệu người dùng, bất kể nó cố gắng làm gì.

+4

Điểm tuyệt vời về 'eval', và bạn có thể làm xáo trộn nội dung nhiều như bạn muốn. 'eval (phân tích cú pháp (văn bản = dán (rev (c (") "," bất kỳ "," ("," m "," e "," t "," s "," y "," s ")) , sep = "", collapse = ""))) ' –

+0

Bạn có thể chặn' eval' trong trường hợp đó, nhưng tất nhiên chúng ta đang đi đến điểm mà nhiều hàm R cơ bản sẽ ngừng hoạt động đúng cách. – Shane

+0

@Shane cách bạn có thể chặn eval? base :: eval là không thay đổi. – mbq

8

Bất cứ điều gì mà các cuộc gọi mã bên ngoài cũng có thể làm thay đổi hệ thống, vì vậy bạn sẽ cần phải chặn các gói nhất định và những thứ như .Call(), .C(), .jcall() vv

Nó đủ để nói rằng nó sẽ kết thúc được một nhiệm vụ hầu như không thể, và bạn nên chạy nó trong môi trường ảo hóa, v.v. nếu bạn cần quyền truy cập root.

5

Bạn không thể. Bạn chỉ nên thay đổi câu hỏi: "Làm cách nào để chạy mã R do người dùng cung cấp để không làm hại người dùng hoặc người dùng khác của hệ thống?" Đó thực sự là một câu hỏi rất thú vị và một câu hỏi có thể được giải quyết bằng một chút điện toán đám mây, ứng dụng, ma thuật chroot, v.v.

+1

Bạn hoàn toàn đúng - tôi không thể. Tôi nên hỏi "Những gì R cuộc gọi có thể có khả năng gây hại?" Dù sao, nhờ lời đề nghị ... – aL3xa

3

Có rất nhiều lệnh bạn có thể sử dụng để gây hại cho hệ thống. Một số ví dụ: Sys.chmod, Sys.umask, unlink, bất kỳ lệnh cho phép bạn đọc/ghi vào một kết nối (có rất nhiều), .Internal, .External vv

Và nếu bạn đã chặn người dùng từ những lệnh, không có gì ngăn cản họ thực hiện điều gì đó trong một gói mà bạn không biết chặn.

2

Để thích ứng với một cliche từ những người có quyền súng, "hệ thống() không có hại - những người gọi hệ thống() có hại".

Không có cuộc gọi chức năng nào là bản chất có hại, nhưng nếu bạn cho phép mọi người sử dụng chúng một cách tự do thì những người đó có thể gây hại.

Ngoài ra, định nghĩa về tác hại sẽ tùy thuộc vào những gì bạn cho là có hại.

3

Theo ghi nhận của chỉ là về tất cả các câu trả lời vào chủ đề này, loại bỏ các "nguy hiểm tiềm tàng" gọi bằng ngôn ngữ R sẽ:

  • Hãy có khả năng không thể làm hoàn toàn.
  • Khó thực hiện mà không mất nhiều thời gian để viết các đoạn mã phức tạp (ví dụ: xấu xí).
  • Tách biệt ngôn ngữ bằng cách xóa hàng tấn chức năng giúp R ​​trở nên linh hoạt.

Một giải pháp an toàn hơn mà không yêu cầu chỉnh sửa/viết lại phần lớn các ngôn ngữ R sẽ được chạy R bên trong một nhà tù sử dụng một cái gì đó giống như BSD Jails, Jailkit hoặc Solaris Zones.

Nhiều giải pháp cho phép quy trình bỏ tù thực thi các đặc quyền giống như gốc nhưng hạn chế các khu vực của máy tính mà quy trình có thể hoạt động.

Máy ảo dùng một lần là một tùy chọn khác. Nếu một người sử dụng đặc quyền đập môi trường ảo, chỉ cần xóa nó và khởi động một bản sao khác.

1

Nói chung, R quá phức tạp đến mức bạn có thể giả định rằng có một cách để lừa nó trong việc thực thi dữ liệu với các chức năng dường như vô hại, ví dụ thông qua tràn bộ đệm.

3

Một trong những mục yêu thích của tôi. Bạn thậm chí không phải là r00t.

library(multicore); 
forkbomb <- function(){ 
    repeat{ 
    parallel(forkbomb()); 
    } 
} 
forkbomb(); 
Các vấn đề liên quan