Риски безопасности веб-интерфейса gnuplot

Мне нужно сделать своего рода веб-интерфейс gnuplot, который получает список команд или файл, сохраняет его на диск и говорит gnuplot преобразовать его в png ("установить терминал png; установить вывод...").

Какие неприятные или глупые вещи может делать пользователь (например, перегрузка процессора или оперативной памяти, доступ к файловой системе...)? Как я могу избежать их? Какие потенциально вредоносные строки я должен удалить перед передачей кода в gnuplot?

Я запускаю gnuplot через subprocess.Popen из джанго.

3 ответа

Решение

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ - ЭТОТ СПИСОК ОБЯЗАН БЫТЬ НЕПОЛНЫМ

Есть несколько вещей, которые вы хотите отключить (как минимум).

в gnuplot, посмотрите на help shell - Они позволяют пользователю создавать интерактивную оболочку (что угодно между shell а также logout нужно будет выбросить) Также вы захотите удалить все строки, начинающиеся с ! или же system (и любые продолжения строки), так как они вызывают команды оболочки. Следующим в моем списке потенциально опасных вещей является использование обратной замены.

#homeless1.gp
mysring="`rm -rf ~`"

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

Еще одна мысль - gnuplot позволяет вызывать программы с использованием каналов - например,

plot "<awk -F, '{print $0}' mydata.txt" #runs system command awk

Вам нужно будет в значительной степени отключить любую строку, которая начинается с пробела, а затем < или | - возможно, также с escape-последовательностями, поскольку gnuplot может просто молча выбросить их, если они ничего не избегают.

#homeless2.gp
MYSTRING="<rm -rf ~"
plot MYSTRING  #removes $HOME -- And doesn't even give you a plot :-(

и другой...

#homeless3.gp
set output "| rm -rf ~"

Вы также можете легко завести скрипт в бесконечный цикл, используя reread - Этот скрипт всего одна строка:

#inifite_loop.gp
reread   #Suckers!!!

Это тот, который вы, вероятно, захотите отключить, даже если вы создадите chroot-джейл для запуска ваших скриптов (что-то, о чем я ничего не знаю, я выучил только термин, пока гуглял, как безопасно запустить скрипт в unix...) - - Хотя я полагаю, что используя вышеописанные методы, пользователь все еще может привязать одно ядро ​​вашего ЦП, создав бесконечный цикл на другом языке программирования и выполнив его из gnuplot. - То же самое касается памяти, я думаю...

#infinite_mem.gp
!python -c "a=[]; while True: a.append('Suckers!!! '*10000000))" #You'll probably hit swap pretty fast with this...

Чем больше я думаю об этом, чтобы сделать это безопасно, тем больше вам придется переписывать анализатор gnuplot с нуля и проверять все (или изолированную программную среду и мониторинг - устанавливая осторожные ограничения на потребляемые ресурсы).

(извините, я уверен, что это не то, что вы хотите услышать).

Мне кажется, что вам лучше всего создать свой собственный мини-язык, который принимает только небольшое (но полезное) подмножество команд gnuplot и строит скрипт gnuplot из этого набора команд...

ПРОГРЕСС РЕДАКТИРОВАТЬ

Немного поиграв, вы можете отключить конвейер в gnuplot -

./configure --program-suffix=safer

Теперь вам нужно отредактировать config.h это было сгенерировано при конфигурировании... закомментируйте строки:

#define HAVE_PCLOSE 1

а также

#define HAVE_POPEN 1

а также

#define PIPES 1

(например /*#define HAVE_PCLOSE 1*/ если вы не знакомы с комментариями C).

затем make; [sudo] make install - с суффиксом, как я его установил, ваша "более безопасная" версия gnuplot может быть вызвана как gnuplotsafer,

Это отключает ненадежность, возникающую в каналах (проблемы со строками, которые имеют |, <и даже задники теперь в безопасности). оболочка, система и ! все еще небезопасны, вам придется отключить их, анализируя скрипт по-прежнему - но это ОЧЕНЬ проще, чем пытаться убедиться, что пользователь не устанавливает вредоносные каналы.

Я бы также посоветовал вам проверить, чтобы убедиться, что вы ничего не можете сделать с трубами / backtics и т. Д., Прежде чем перевести систему в оперативный режим, и я все равно постараюсь как можно больше поместить в песочницу все это.

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

Взгляните на http://www.plotshare.com/. Они были здесь некоторое время, поэтому, должно быть, они нашли способ сделать это безопасно. Может быть, вы могли бы поговорить с ними.

Я являюсь автором http://www.plotshare.com/, и я только что натолкнулся на эту запись сегодня.

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

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

@ Ли Филлипс: Спасибо, что включили plotshare в свою книгу. Сейчас я нахожусь в процессе добавления некоторых полезных функций (улучшенная справочная система, html canvas и т. Д.), Чтобы сделать процесс онлайн-построения графиков действительно лучше простого использования gnuplot из оболочки.

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

Другие вопросы по тегам