2010-10-26 2 views
8

Предположим, что у вас есть R, работающий с правами root/admin. Какие звонки R вы считаете вредными, кроме system() и file.*()?Блокировать потенциально злонамеренные вызовы R

Это вопрос, связанный с платформой, я запускаю Linux, поэтому меня интересуют утечки безопасности для Linux. Я пойму, если вы заблокируете дискуссии о R, так как этот пост может легко появиться в «Как повредить систему с помощью R?»

+1

В чем причина запуска R как пользователя root? Возможно, решение лежит там, то есть вы должны задать себе вопрос: «Как мне разрешить пользователю делать xyz ** без ** предоставления ему привилегий root?». Другое дело, конечно, в том, что любому, кто может запускать программное обеспечение с привилегиями root, должно быть достаточно доверено, чтобы не беспокоиться о том, как он запутывает систему, иначе он или она не должны иметь привилегии root в первую очередь. – nico

+0

Это задавали несколько лет назад в списках R-Help или R-Devel. Я не помню подробностей, но то, что вы просили, было фактически невозможно; как только вы отключили все возможные возможности делать что-либо за пределами R, вы оказывали R бесполезным. Не запускайте его как root. –

+0

A (возможно, слишком) широкий список потенциально опасных функций можно найти в моем маленьком пакете: https://github.com/daroczig/sandboxR. Этот пакет запретил бы много вызовов R и разрешал бы загружать пакеты с «белыми», поэтому может быть недостаточно разрешительным, но запретит вашим пользователям компрометировать любые файлы и ресурсы в вашей системе. Конечно, эта изолированная среда должна использоваться в некотором приложении, которое обрабатывает, например, записывает на диск - вне R-кода пользователя. – daroczig

ответ

11

Не запускайте R с корневыми привилегиями. Таким образом, нет эффективного способа защиты R, поскольку язык включает в себя eval и reflection, что означает, что я могу создавать вызовы в систему, даже если вы не хотите меня.

Намного лучше запустить R таким образом, который не может повлиять на данные системы или пользователя, независимо от того, что он пытается сделать.

+4

Отличная точка в 'eval', и вы можете обмануть содержимое столько, сколько хотите. 'eval (parse (text = paste (rev (c (") "," any "," ("," m "," e "," t "," s "," y "," s ")) , sep = "", collapse = ""))) ' –

+0

Вы можете заблокировать' eval' в этом случае, но, конечно, мы доходим до такой степени, что многие из базовых функций R перестанут работать должным образом. – Shane

+0

@Shane, как вы можете блокировать eval? base :: eval неизменен. – mbq

8

Все, что вызывает внешний код также может быть внесение изменений системы, поэтому нужно будет блокировать определенные пакеты и такие вещи, как .Call(), .C(), .jcall() и т.д.

Достаточно сказать, что она будет в конечном итоге является практически невозможная задача, и вам лучше запускать ее в виртуализованной среде и т. д., если вам нужен root-доступ.

5

Вы не можете. Вы должны просто изменить вопрос: «Как запустить пользовательский R-код, чтобы не навредить пользователю или другим пользователям системы?» На самом деле это очень интересный вопрос, который можно решить с помощью небольшого количества облачных вычислений, айрор, магии chroot и т. Д.

+1

Ты абсолютно прав - я не могу. Я должен был спросить: «Какие звонки R могут быть потенциально вредными?» Во всяком случае, спасибо за предложения ... – aL3xa

3

Существует множество команд, которые можно использовать для нанесения вреда системе. Несколько примеров: Sys.chmod, Sys.umask, unlink, любой команды, которая позволяет считывать/записывать на соединение (есть много), .Internal, .External и т.д.

И если вы заблокировали пользователь из этих команд, нет ничего, что помешает им реализовать что-то в пакете, который вы не знаете, чтобы блокировать.

2

Чтобы адаптировать клише от людей с правами на оружие, система() не вредна - люди, которые называют system(), вредны ».

Никакие вызовы функций не являются вредными, но если вы позволяете людям свободно их использовать, эти люди могут причинить вред.

Кроме того, определение вреда будет зависеть от того, что вы считаете вредным.

3

Как было отмечено почти каждый ответ на эту тему, удаление «потенциально опасных» вызывает на языке R будет:

  • быть потенциально невозможно сделать полностью.
  • Сложно обойтись, не тратя значительное время на то, чтобы писать сложные (т. Е. Уродливые) хаки.
  • Kneecap язык, удалив тонну функциональности, которая делает R настолько гибкой.

Более безопасное решение, которое не требует модификации/перезаписи больших частей языка R будет запускать R внутри тюрьмы, используя что-то вроде BSD Jails, Jailkit или Solaris Zones.

Многие из этих решений позволяют процессу заключенных в тюрьму использовать привилегии root-like, но ограничивают области компьютера, на которых может работать процесс.

Одноразовая виртуальная машина - это еще один вариант. Если привилегированный пользователь разбивает виртуальную среду, просто удалите ее и загрузите другую копию.

1

В общем, R настолько сложна, что вы можете предположить, что есть способ обмануть его при выполнении данных с кажущимися безобидными функциями, например, через переполнение буфера.

3

Одно из моих любимых мест. Вам даже не нужно быть r00t.

library(multicore); 
forkbomb <- function(){ 
    repeat{ 
    parallel(forkbomb()); 
    } 
} 
forkbomb(); 
Смежные вопросы