Риски безопасности веб-интерфейса 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. Просто дайте мне знать, если вам что-то не нравится на странице или вы пропустили какую-то функцию.