CTFで、プログラミング/システム管理に関するクイズを出題しました。一見すると「え?そんなの不可能では?」と思われる内容の詰め合わせです。公開されていますので、興味のある方はお試しください。形式の攻防戦ということで、できるだけ制限の緩い環境で遊んでもらうことにしました。制限するモジュールも併用しました。denyさて、1日目の競技が終了した時点で、チームDCUAから「問題サーバにバグがある」という指摘がありました。実行することにより、任意のチームとしてログインできてしまうという指摘でした。なりすましログインにより他チームが解いたクイズの答えを盗み見たり、自チーム以外はじゃんけんに参加しないようにしたりすることができてしまうため、事実上サーバ5を占拠し続けることができてしまうバグです。ユーザになれるということを見落としていたのです。エントリ部分の追加)を行いました。攻防戦としては「気づいたもの勝ち」という点で、なりすましができるままにしておいたほうが面白かったかもしれませんが。リリースされたことで、ようやく肩の荷が下りました。メインライン化するための活動を開始しました。機能を用いて実現しました。どのようなルールを使っていたのかを、ここで紹介します。ドメインへ遷移するという指定です。ドメインに遷移するという動作に対応します。ドメインに遷移し、それ以外の場合には、ドメインを遷移せずにプログラムを実行するという指定です。へは進めないという動作に対応します。普通のアクセス制御では許可する場合を列挙したら残りは全て拒否するものですが、ここでは意図的に全てを許可するように指定しています。これにより、正解でも不正解でもシェルが実行できるため、総当たり攻撃による突破を困難にしています。ドメインに遷移するという指定を行っています。次に、それぞれのドメインでどのファイルを読めるかについての指定を行います。パス名ベースのアクセス制御の弱点である、パス名が変化するとアクセスの可否も変化してしまうという問題を回避するため、ファイルの所有者IDをキーとして許可を与えるようにしています。この方法なら、細かくリネームやハードリンクなどの作成を制限する必要がありません。利点が生かせる指定です。あるプロセスからのみ読み出すことができるという指定を行っています。あるプロセスからのみ読み出すことができるという指定を行っています。何れか1個だけを読み出すことができるという動作に対応します。読み出す許可だけは、少し異なる方法で指定しています。ある場合のみ読み出すことができるという指定を行っています。その他、他のサーバへの攻撃に使われないようにするために、ネットワークの制限も行っています。具体的には、ユーザIDが0ではないプロセスは外向きのTCP接続を全面的に禁止しています。内向きのTCP接続はポート23のみを許可しています。ポート53のみを許可しています。以上が、今回の出題で使われたルールです。複雑なルールを指定することもできますが、エスパー問題化を回避するために、簡単なルールを指定しながら、ヒントも与えるようにしています。ヒントを削ってしまうと、攻略不可能なケロちゃんチェック問題になってしまいますからねぇ。ディレクトリを割り当てていたためです。シェルログインさせておいて、スパムメールの発射台にされないの?→上述した通り、ネットワーク制限が掛かっているので発射台にはできないでしょう。ハードディスクが見つからなかったのですが?→すべてオンメモリで動作しています。より一通りの機能は提供されていました。