GRADUATION
「安全なはずの制限」の抜け道を、見つけられるようになりました。
禁止語リストと限定されたbuiltinsで守られたpyjailを、Pythonのオブジェクトモデルの奥(サブクラスの一覧からos.systemへ)をたどって突破しました。幾重にも重なったエンコードも、逆順に1枚ずつはがして復元しました。「禁止したつもり」が本当に安全かを、疑う目を持ちました。
おつかれさまでした。
持ち帰るもの
- 「一部のbuiltinsだけ許可」は、安全とは限らないgetattrのような一見無害な関数が、オブジェクトの内部(サブクラス一覧やグローバル変数)へたどり着く入口になりました。
- 禁止語リストは、文字列一致でしか守れない"os"という文字列を直接書かなくても、サブクラスの__init__.__globals__を経由すれば、osモジュールの関数に触れました。
- エンコードは、暗号ではないbase64やhex、rot13は「読みにくくする」だけで、鍵を必要としません。順番さえ分かれば、誰でも逆順にほどけます。
次にやるといいこと
- このコースで、CTFの主要カテゴリ(web/crypto/rev/pwn/forensics/misc)を一通り体験しました。次はmini-ctf-arenaで、実戦の進め方を学びます。
- 「制限したつもり」が抜け道を生む、という教訓はsec-injectionやsec-authzの「サーバー側が真実を持つ」原則と同じ根です。