コドモン Product Team Blog

株式会社コドモンの開発チームで運営しているブログです。エンジニアやPdMメンバーが、プロダクトや技術やチームについて発信します!

徳丸浩氏が見守る中、「攻撃者のロジック」をCTF形式で体感しました!!

こんにちは!プロダクト開発部の塚原です。

3月27日、開発チームで CTF形式のイベント「社内SECCON」 を開催しました。この記事では、企画の背景から当日の様子、振り返りまでをレポートします。


企画の背景:なぜ「攻撃者の視点」を学ぶのか

コドモンのプロダクトは、保育施設に通う子どもたちの記録や健康情報、保護者とのやり取りといった、生活に密着した大切なデータを預かっています 。私たちはこれらを単なるデータではなく、社会インフラを支える基盤であると捉え、日々開発に向き合っています。

セキュリティはこの基盤を維持するための「土台」です 。問題が起きてから対処するのではなく、日頃の実装やレビューにおいて「攻撃者の視点」を持ち、未然に防ぐ体制を強化したい 。そのような思いから、今回のイベントを企画しました。

今回のゴールの中心は、以下の2点です 。

  • 攻撃者のロジックを理解すること
  • 「明日からここを突かせない」という実装の勘所を持ち帰ること

使用した題材:Bad Todo と徳丸さんへの感謝

今回の競技に使用したのは、セキュリティ研究者・徳丸浩さん(@ockeghem、EGセキュアソリューションズ株式会社 代表取締役)が作成した 「Bad TodoGitHub)」です。

Bad TodoはPHPで書かれたTodoアプリで、IDOR・XSS・SQLインジェクション・パストラバーサルなど、実際のWebアプリに起こりうる脆弱性が意図的に仕込まれています。

Bad TodoのライセンスはCC BY-NC-NDのため、アプリのコードはそのまま使用しています。その上で、問題文・採点基準・ヒント集・難易度別の得点設定はコドモン運営チームで独自に作成しました。CTFとしての「競技感」と「教育目的」を両立するための工夫です。

利用にあたり徳丸さんへご連絡したところ、快くご承諾いただきました。

当日のサプライズ

競技当日は、オンラインで見学に来ていただき、参加者へ直接助言をいただける場面もありました。 クロージングでいただいたお言葉は、参加者にとって大変貴重な刺激となりました。 改めて、徳丸さんに心から感謝申し上げます。


イベント概要

  • 日時: 2026年3月27日(金)13:00〜17:00
  • 参加者: 21名(プロダクト開発部エンジニア・QA)
  • 形式: オフライン(東京オフィス)+ オンライン参加のハイブリッド

基本ルール

項目 内容
制限時間 1.5時間
チーム構成 3人1組のチーム対抗CTF
使えるツール 自由(ブラウザ・DevTools・ターミナル・生成AI)
回答提出 Googleフォームでフラグを随時提出
ヒント いつでも何度でもOK(Slack経由)

順位は合計得点で決定。同点の場合は難しい問題を多く正解したチームを上位としました。

当日の流れ

オープニング・ルール説明のあと、1.5時間の競技本番。時間終了後は各Missionの解説を行い、続けて結果発表・感想タイム。最後にクロージングというプログラムでした。


8つのMissionと、思わぬ連鎖

競技は難易度別に8つのMissionで構成されました。以下にそれぞれのレベルから1つずつ紹介します。

難易度 Mission 脆弱性の内容
★☆☆ 入門 他人の秘密のTodoを覗き見せよ 認可チェックの欠落
★★☆ 中級 XSSでCookie情報を抜き出せ セッションハイジャックの危険
★★★ 上級 アプリのソースコードからDB接続情報を盗め 情報漏洩からの侵害拡大

★☆☆ 入門:他人の秘密のTodoを覗き見せよ
TodoのURLには ?todo=6 のような数値パラメータがあります。この値を変えてみると…? サーバー側でアクセス制御が行われていないため、他のユーザーのTodoを誰でも閲覧できてしまいます。。「ログインチェック」だけでなく「それを見ていいのか」という認可のチェックが抜け落ちているケースです。

★★☆ 中級:XSSでCookie情報を抜き出せ
入力値がHTML上でエスケープされずに出力されているため、スクリプトを注入することでCookieが抜き取れてしまいます。Cookieにはセッション情報が含まれており、セッションハイジャックに直結する脆弱性です。

★★★ 上級:アプリのソースコードからDB接続情報を盗め
前のMissionで発見した脆弱性を応用すると、PHPのソースコードそのものが読み出せてしまいます。そこに書かれたDB接続情報を使えば、さらに深い侵害へ繋がっていきます。取得方法が複数あるためボーナス点も設定しました。

このように、Mission 1〜8はそれぞれ独立した脆弱性を扱っています。しかし興味深いのは、たった一つの脆弱性を突いただけで、意図せず他のMissionの答えに手が届いてしまうことがある点です。たとえばパストラバーサルでソースコードが読めてしまえば、そこにはDB接続情報も書かれている 。
つまり、一つの穴が「そこだけの問題」では済まないということを、身をもって体験できる構成になっています。


競技が始まると、すぐにブラウザに向かい問題を解き始めました

当日の様子

競技が始まると、すぐに「あ、これURL変えられるじゃん」「ちょっとDevTools確認してみよう」という声があちこちから聞こえてきました。

オフライン会場では各チームがPCを囲んで、「このURLのパラメータ変えてみようか」「エラーが出た、SQLインジェクション行けるかも」と熱心に議論を交わしています。

オンラインチームも同様に活発で、徳丸さんには競技中にオンラインチームの様子をご覧いただける場を設けていました。その中、ご厚意で行き詰まった参加者にさりげなくヒントを出してくださる場面もあり、オンライン参加組は思わぬサプライズに大いに盛り上がりました。

始めは向き合って座っていたのに、気づけば横並びで意見を出し合うくらいに熱中

印象的だったのは、生成AIを活用した参加者が

「構造を理解しきっていなくても、AIと対話するだけで攻撃クエリが書けてしまった。」

と語ったことです。 攻撃のハードルが下がる時代、防御側にはより一層の深い理解とスピードが求められることを痛感しました。

攻撃した直後に『なぜこれが脆弱なのか』を聞くと、学習効率がUP

競技終了後、各Missionについて「なぜこの実装が脆弱なのか」「どう直せばよいか」まで含めて解説しました。手を動かして攻撃した直後に解説を聞くことで、理解の染み込み方が変わってきます。

競技が終わったら、すぐさま問題の解説をスタート

クロージングでは徳丸さんのお言葉

結果発表のあと、徳丸さんから参加者へ向けて直接お言葉をいただきました。脆弱性において、防御する側と比較すると攻撃側の方が容易であり、生成AIの活躍によりそれはさらに顕著になっていること。そして脆弱性を防御する側の難しさや昨今のOSSサプライチェーン攻撃への対策など、とても参考になるお話をいただくことができました。 Bad Todoの作者本人から話を聞けるという体験は、参加者にとって得がたい時間になったと思います。

徳丸さんから感想をいただきました!


参加者アンケートより

イベント後に参加者からアンケートを取りました。

全員が「学びがあった」「業務に活かせそう」と答えてくれました。次回参加意向も大多数が「ぜひ参加したい」という結果でした。

コメントで特に多かったのは「脆弱性が連鎖する構造に気づいたことが大きな収穫だった」という声で、競技設計の意図が伝わったと感じています。また「生成AIを使ったら誰でも攻撃できてしまうとわかって怖くなった」「普段は防御側の視点しかなかったが、攻撃側のロジックを知ることで守り方が具体的に見えた」といった声も多く、それぞれの業務に引きつけた気づきになったようです。


やってみてどうだったか

運営としての手応え:『体験』を最大化するための工夫を

今回、Bad Todoをそのまま使うのではなく、独自のMissionと採点基準を設けたことで、限られた時間内での高い熱量を維持できました 。特に「手を動かして攻撃した直後に解説を聞く」というサイクルは、知識の定着に非常に有効で、参加者のほぼ全員が「業務に活かせそう」と感じる手応えにつながりました 。

次回の開催に向けたアップデート

初開催ゆえの改善点も見えてきました。チームごとの人数調整や、攻撃範囲の明確な定義など、設営面での課題は次回への宿題です 。また、回答形式を工夫することで、スコアのリアルタイム反映によるさらなる盛り上げも可能だと感じており、アンケートの声をもとに改善を続けていきます 。

プロダクトへの『信頼』を技術で支え続ける

今回の参加者の体験を通じて改めて実感したのは、「守る側は全てを守らなければならないが、攻める側は一つ突破口を見つければいい」という非対称性です。一つの脆弱性を防いでも、連鎖の起点が別の場所にあれば攻撃は成立します。これは、単点の修正だけでなく 多層防御の考え方 が実装に必要であることを示しています。

今日体験した脆弱性を一つずつ塞いでいくことは、単なる技術的な作業ではありません。それは、プロダクトの 「信頼」を積み上げる仕事 です。私たちのコードが、子どもを取り巻く環境への信頼を支えている。その実感を、チームで共有できたことが一番の成果でした。


さいごに

BadTodoの活用を快くご快諾いただいた徳丸さん、参加してくれた皆さん、改めてありがとうございました 🙏

コドモンの開発チームは、プロダクトを通じて保育施設・保護者・子どもたちに関わる全ての方の信頼に応えるために、技術とチームを日々磨いています。そんなチームに興味を持っていただけた方は、ぜひカジュアル面談でお話しましょう!

開発チームはあなたのエントリーをお待ちしています!