注目★★★★★GitHub Advisory
RestrictedPython、引数でsandboxのガードを回避可能
30秒で把握
- 1RestrictedPython の guard hook を positional-only 引数で上書き可能
- 2`_getattr_` などの検証漏れで sandbox のアクセス制御を回避
- 3修正版は次回リリース提供、更新まで該当コードを拒否
要約
RestrictedPython の guard hook が positional-only 引数で上書きされ、sandbox のアクセス制御を回避できる脆弱性が判明した。`_getattr__`、`_getitem_`、`_write_`、`_print_` は通常の引数などでは禁止されるが、`/` より前の positional-only 引数の検証が抜けていた。攻撃者はローカル変数で hook を shadow し、属性・要素アクセスや書き込み、出力処理を独自関数に置き換えられる。未修正版では PoC が `shadowed` を出力し、本来の `_getattr_` は呼び出されない。修正版は `compile_restricted` で該当コードを拒否し、次回リリースで提供される。直ちに更新できない場合は、先頭が `_` の positional-only 引数を使う関数・lambda をコンパイル前に拒否する。
あなたへの影響
RestrictedPython を組み込む日本の開発チームは、次回リリースへの更新を近日中に行い、更新まで提出コードの positional-only 引数を検査してください。
推奨:sandbox 管理オブジェクトを安全でない形で pickle 化する実装では、追加のコード実行リスクにつながり得るため、関連処理も監査が必要です。