gnuplot web界面的安全风险

log*_*ord 2 security django gnuplot

我需要创建一种gnuplot web界面,它接收命令列表或文件,将其保存到光盘并告诉gnuplot将其呈现为png("set terminal png; set output ...").

用户可以做些什么讨厌或愚蠢的事情(例如重载cpu或RAM,访问文件系统......)?我该如何避免它们?在将代码传递给gnuplot之前,我应该删除哪些潜在的恶意行?

我正在subprocess.Popen从django 运行gnuplot .

mgi*_*son 5

免责声明 - 此列表被限制为不完整

有一些事情你想要禁用(至少).

在gnuplot中,看看help shell- 那些允许用户产生一个交互式shell(任何之间的东西shell,logout将需要被丢弃).此外,您将要删除以!system(以及任何行继续)开头的任何行作为调用shell命令.我的潜在危险事项清单上的下一步是使用背景替代.

#homeless1.gp
mysring="`rm -rf ~`"
Run Code Online (Sandbox Code Playgroud)

将清除您的主目录.当然,我没有声称,如果你做了所有这些事情,你的脚本将是完全安全的.如果您只允许用户上传一个要运行的文件,那么您也可以禁用load,call从那以后您就不必担心用户以某种方式上传另一个恶意脚本并从第一个加载它.

另一个想法 - gnuplot允许使用管道调用程序 - 例如

plot "<awk -F, '{print $0}' mydata.txt" #runs system command awk
Run Code Online (Sandbox Code Playgroud)

你需要几乎禁用任何以空格开头的字符串,后面跟着<或者|- 可能还有转义序列,因为如果它们没有逃避任何东西,gnuplot可能会默默地抛弃它们.

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

另一个......

#homeless3.gp
set output "| rm -rf ~"
Run Code Online (Sandbox Code Playgroud)

你也可以很容易地使用脚本卡在无限循环中reread- 这个脚本只有一行:

#inifite_loop.gp
reread   #Suckers!!!
Run Code Online (Sandbox Code Playgroud)

这是你可能想要禁用的一个,即使你构建一个chroot监狱来运行你的脚本(我一无所知的东西,我只是在谷歌上搜索如何在unix下安全地运行脚本...) - - 虽然我想使用上面的方法,但是用户仍然可以通过在不同的编程语言中构建一个无限循环并从gnuplot执行它来固定你的CPU的一个核心 - 我猜想内存也是如此...

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

我想的越多,为了安全地执行此操作,您几乎必须从头开始重新编写gnuplot解析器并检查所有内容(或沙盒和监视器 - 设置对消耗资源的仔细限制).

(对不起,我确定这不是你想听到的).

似乎(对我而言)最好的选择是创建自己的迷你语言,它只接受一小部分(但有用的)gnuplot命令子集,并从该组命令构造gnuplot脚本......

进展编辑

玩了一下后,你可以在gnuplot中禁用管道 -

./configure --program-suffix=safer
Run Code Online (Sandbox Code Playgroud)

现在,您需要编辑config.h由configure生成的...注释掉行:

#define HAVE_PCLOSE 1
Run Code Online (Sandbox Code Playgroud)

#define HAVE_POPEN 1
Run Code Online (Sandbox Code Playgroud)

#define PIPES 1
Run Code Online (Sandbox Code Playgroud)

(例如,/*#define HAVE_PCLOSE 1*/如果您不熟悉C评论).

然后make; [sudo] make install- 以我设置的方式使用后缀,可以调用你的"更安全"的gnuplot版本gnuplotsafer.

这将禁用从管道产生的不安全感(问题有串|,<甚至backtics现在是安全的).外壳,系统!仍然不安全,你必须通过解析脚本来禁用它们 - 但这比尝试确保用户不设置恶意管道要容易得多.

我还建议您在将系统置于在线之前检查以确保您无法对管道/靠背等做任何事情,我仍然会尝试尽可能多地对整个事物进行沙箱处理.