-
Notifications
You must be signed in to change notification settings - Fork 4
安全相关
CountStarlight edited this page Nov 5, 2016
·
2 revisions
确保你为 C/C++ 开启了沙箱,并且为java开启了java安全管理(Java Policy)。在这里你可以了解更多关于沙箱。
Shield 不是一款真正的保护工具,但总比没有的好!确保你为 C, C++ 和 Python 开启了Shield。你可以在这里了解更多关于Shield。
用非个人的用户运行提交的代码非常重要,非个人的用户是指对网络没有权限,不能改变任何文件,并且不能创建大量进程的用户。
PHP 运行的时候用户名为 www-data
。
创建一个新用户名为 restricted_user
并且为它设置一个密码
在终端里运行 sudo visudo
并且把下面这一行添加到文件 sudoers
的底部:
www-data ALL=(restricted_user) NOPASSWD: ALL
在 tester/runcode.sh
文件里做相应改动
if $TIMEOUT_EXISTS; then
timeout -s9 $((TIMELIMITINT*2)) $CMD <$IN >out 2>err
else
$CMD <$IN >out 2>err
fi
to
if $TIMEOUT_EXISTS; then
sudo -u restricted_user timeout -s9 $((TIMELIMITINT*2)) $CMD <$IN >out 2>err
else
sudo -u restricted_user $CMD <$IN >out 2>err
fi
并且去掉这一行的注释:
sudo -u restricted_user pkill -9 -u restricted_user
用户restricted_user
不能使用网络,你可以在linux里通过使用 iptables
来关闭一个用户的网络。
想了解更多请点击 这里 and here.
关闭网络之后,以restricted_user
身份来运行 ping
,测试是否能够访问网络。
确保没有哪个目录或文件是用户 restricted_user
可写的,检查你的目录或文件的权限。
限制用户 restricted_user
的进程数量。
打开 /etc/security/limits.conf
,添加下面这几行:
restricted_user soft nproc 3
restricted_user hard nproc 5
我使用 3,5,你可以使用不同的软件和硬件限制。
使用一个服务器放置网页,另一个服务器用来运行提交的代码,来减小运行提交的代码的风险。你需要改变Online Judge的代码来实现这个功能,也许我之后会加入这个功能。