Блокировать потенциально вредоносные R звонки - PullRequest
8 голосов
/ 26 октября 2010

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

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

Ответы [ 8 ]

11 голосов
/ 26 октября 2010

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

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

8 голосов
/ 26 октября 2010

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

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

5 голосов
/ 26 октября 2010

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

3 голосов
/ 05 февраля 2012

Один из моих любимых за все время.Вы даже не должны быть R00T.

library(multicore);
forkbomb <- function(){
  repeat{
    parallel(forkbomb());
  }
}
forkbomb();
3 голосов
/ 26 октября 2010

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

  • Потенциально невозможно сделать полностью.
  • Beтрудно сделать, не тратя много времени на написание сложных (то есть уродливых) хаков.
  • Снимите язык, убрав кучу функциональных возможностей, которые делают R настолько гибким.Не требуется изменять / переписывать большие части языка R, чтобы запустить R внутри тюрьмы, используя что-то вроде BSD Jails , Jailkit или Solaris Zones .

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

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

3 голосов
/ 26 октября 2010

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

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

2 голосов
/ 26 октября 2010

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

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

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

1 голос
/ 26 октября 2010

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

...