はじめに
セキュリティ・キャンプ2026全国大会Y2ゼミに参加しました、まーたと申します。現在慶應義塾大学理工学部情報工学科の4年生です。忘れないうちにキャンプの参加記を残しておきます。
2025年
実は私は昨年の2025年もセキュリティ・キャンプ(主にCコンパイラゼミ)に応募していましたが、残念ながらその時は不合格でした。今思い返せば応募課題で頓珍漢なことばかり書いていたので当然の結果だったと思えます。
それでもやはり悔しくて、その後も独学で Rui Ueyama 氏の本(https://www.sigbus.info/compilerbook)をやったり、C言語のマイナーな仕様についていろいろ調べたりしていました。思えばキャンプ自体は不合格でしたが応募課題を行う中で実践した、「きちんとした資料(ISOの技術書など)から厳密な仕様を調べること」や「なんでも手元で実験してみて、資料と違う結果になったらその理由をさらに調べてみること」といった経験は、2026年の応募課題の回答やキャンプ本番を含め非常にためになったと感じています。
応募期間
B4となりシステムソフトウェア系の研究室に配属されました。
当初は去年のCコンパイラゼミにリベンジしようと考えていましたが、4月ごろに公開されたゼミのリストを見て今年はCコンパイラゼミが開講されないことを知りました。そのため第一志望としてレイヤが近い Y2「デバッグツール自作ゼミ」、第二志望として L2「プロセッサゼミ」を選びました。正直なところこの2つ以外興味のあるゼミがあまりなく、応募課題を3つも取り組む余裕もなかったので、第三志望は最初から設定しませんでした。
応募課題への回答は 5/5-5/18 あたりにわたってちまちま書き上げていきました。回答自体は以下の記事で公開しています。
なお、第二志望のプロセッサゼミの応募課題についても途中までは書いていましたが、はじめから余裕がなく後半はすべて空欄、前半の内容も非常に薄いという具合でした。執筆にかけた労力でいえば Y2:L2 = 10:1 ほどです。それでもこのように労力に差を設けたのは意図的なもので、中途半端な応募課題を2つ提出するよりは1つに集中したほうがよいだろうという考えがありました。私の考えですが、開発コースで第二志望以下に配属される可能性というのはあまりないように思われるので、今後キャンプを目指す方は単願も視野に入れると良いかもしれません。
応募課題の回答内容自体については、これも個人的な感覚ですが「実際に実験してみてその結果について考察する」というのが特に有効な気がします。いろいろ論じるネタが生えますし、今の時代 LLM に丸投げしていないというアピールにもなります。例えば私の場合は CVE を1つ取り上げるという設問に対して ImageMagick のフォーマット文字列の悪用(CVE-2025-55298)を取り上げましたが、ImageMagick を clone して当該バージョンでビルドし、報告書に記載されていた PoC を実際に試してみるということを行いました。
合格発表-キャンプ直前
応募課題締切後は去年辛酸を嘗めた経験もあり、「どうせ見込みはあまりない」と言い聞かせて期待しないようにしている自分がいました。それでも合格発表が予定されてた5月末にはかなりそわそわして、毎日 IPA のサイトを見に行ったりしていました。そうしたら合格発表が6月頭に延期されるという発表があり、さらに焦れったい思いを味わうことになりました。
6月3日、ようやく選考発表があり、合格していました。インターネットや現実世界の「つよつよ」な学生たちの輪に入れ、さらに自分自身も成長できるということに大いに喜びを感じました。ほどなくして Discord に招待されましたが、他の受講生の自己紹介を読んだだけで周囲のハイレベルさに若干怖気付いていました。
Y2ゼミでは週に1回、約30-45分ほど事前学習の時間が設けられており、キャンプ前からある程度開発を進めておくというスタイルでした。そのため6月頭から7月末までは個人で作業しながら週1の事前学習 MTG で進捗共有・次の作業を決めるという流れでした。
ところが私はその期間ちょうど論文の輪講準備(私の学科ではB4春学期に教授数人の前で読んできた論文を発表する「輪講発表」が必修単位として定められています。)で忙しくしていました。さらに、AddressSanitizer を自作すると決めたのはいいものの、私が独自性のあるアイディアをほとんど思いつけず、ほぼ講師の考えに従っているだけとなっていました。その劣等感もあり、正直なところ7月ごろにはキャンプへのモチベーションは低下気味でした。
キャンプ参加までには、次のような作品ができていました。
単純な C のヘッダライブラリとして、void *asan_malloc(size_t size); と void asan_free(void *p); を作成しました。これは GWP-ASan(https://llvm.org/docs/GwpAsan.html)の要領で、asan_malloc では mmap システムコールによりメモリページを ceil(size / PAGE_SIZE) + 2 枚確保し、以下の図のように mprotect システムコールで両端をアクセス禁止にします。
そして asan_free では実際には free せず中央のアクセス許可ページを mprotect によりアクセス禁止にします。この上で SIGSEGV をシグナルハンドラによりハンドルすることで
- 右端のページを踏んだ場合: 過大なほうの heap-buffer-overflow
- 左端のページを踏んだ場合: 過小なほうの heap-buffer-overflow
- 中央のページを踏んだ場合: use-after-free
と判別します。(詳しくは下の公開リポジトリの過去コミットをご覧ください。)
尤もここまででの実装量はわずか130 loc 程度で、その動作も現実の ASan や GWP-ASan の下位互換にすぎず、後れをとっている自覚がありました。ちなみに、今回の開発で Codex 等コーディングエージェントを使うかはかなり迷いましたが、Yゼミのテーマが「○○自作」である以上成果物自体を早く楽に作り上げるよりも開発で試行錯誤する過程で学びを得たいと考え、結果的には後述の fancy な表示の実装とどうしてもバグが取れない場合のデバッグ以外では基本的に使いませんでした。
セキュリティ・キャンプ本番が近づくとノベルティが届いたり、キャンプ当日の案内が送られてきたりしました。ノベルティについては箱いっぱいに詰まっていて驚きました。

一方で当日の案内については 8:30 から 21:00 まで予定がぎっしり詰まっていることや、自由にコンビニすら行けないことを知り、不安と若干の不満を抱いていました。
1日目
そんな中キャンプ本番を迎えました。横浜線で橋本まで行ったあと京王相模原線に乗り換え京王多摩センターまで向かうという経路でした。ジャンクフードもしばらくお預けかと思い昼食はマクドナルドにしました。
多摩センター駅から会場の LINK FOREST まではペデストリアンデッキを使えば簡単に行けますが、ルートを調べなかった結果地上の歩道を歩いてしまい少し迷ってしまいました。


会場に入ると開講式会場に通され、そこでは早速受講生同士が名刺交換などして交流していました。同じ班になった受講生が早速話しかけてくれて、私も名刺を交換したり雑談したりしていました。不安の中早速打ち解けることができたのは非常にありがたかったです。
その後開講式が行われ、関係者のスピーチ等を聞きました。開講式後はそのまま共通講義 K1, K2 を受講しました。特に K1 の話がまるで小説のようで興味深く、夢中で聞いていました。
時間はすぐに過ぎチェックインの時間になりました。部屋は一人部屋で広く清潔で、とても満足でした。

夕食も期待以上の美味しさで、生活面での心配は杞憂となりました。夕食後はしばらく休憩時間だったので部屋にいましたが、想像以上に疲れていたのかベッドから動けませんでした。

その後交流会企画があり、10人ほどの受講生・チューターと名刺交換をしました。疲れが想像以上にきており、そこまで十分に話せなかったのが心残りです。
交流会企画終了後は入浴してなるべく 23:00 ごろには寝ました。夜食として持ち込んだカップ麺を食べようとしたら箸を忘れたことに気づき断念していました。
2日目
6:30 ごろ起床。朝食で同席になった人とは初対面でしたがいろいろ話せました。この時に限りませんが、受講生同士は初対面であることが大半なので逆に話しかけやすく、終始よい雰囲気だと感じました。
7:45 に案内通りコンビニに寄りました。昨日書い忘れた割り箸とともに、施設内がかなり乾燥していたのでオールインワンのスキンケアクリームを買いました。
8:30 に作業部屋に向かい作業を開始しました。講師の mikit さんと同じゼミのもう一人の受講生とはそこで初めて顔を合わせました。
午前中は主にヘッダライブラリから DSO への切り出しと、コンパイラ側で識別子を置換することにより malloc / free でそれぞれ asan_malloc / asan_free を呼び出すようにする変更を行いました。なおそのまま malloc / free という識別子を定義すると、printf 等が内部で malloc を呼ぶことにより無限再帰に陥るためこのような実装に落ち着きました。おそらくリンカをうまく設定することでもっと行儀良く解決可能だとも思えます。この時点で unmodified なソースコードに自作 ASan を適用するところまで成功しました。

昼食後は毎回の dereference をトレースして SIGSEGV 時にアクセスのログを出力するところまで実装しました。この時点でメタデータの管理に OpenBSD の平衡二分木を使っていましたが(アドレス p から prev(tree.upper_bound(p)) の要領でバッファに対応するメタデータの「唯一の候補」が取得できます。)、実はその時点でページ単位で管理する必要はなくなり、単に asan_malloc の中で通常の malloc によりバッファを大きめに取り両端を redzone として、各アクセスの際にメタデータに記録されている先頭アドレスやサイズの情報から有効なアクセスかどうかを調べるのみで ASan の機能を実現できることを教えていただきました。それに基づき実装を見直したところ、生のシステムコールの操作やシグナルハンドラすらいらなくなり、良く言えばロジックがシンプルに、裏返すと以前よりしょぼい感じの見た目になってしまいました。

午後にはY2ゼミの3人で Network Operations Center (NOC) の見学にも行きました。このような機材が学生であるチューターの方々によって運営されていることに対して敬服の念がわきました。そう思っていたら間瀬bbさんが電話やファクシミリでお遊びを始めて笑ってしまいました。

そうこうしているうちに夕食 + LT会まで休憩。ほんの少し休んだつもりでもすぐ時間になってしまいました。LT会は特に Ryoga_exe さんのドイツの電話機の話が技術的にもユーモア的にも面白かったです。私は発表しませんでしたが、今思えばC言語の非自明な仕様などの話を発表してもよかったと思っています。
LT会後は部屋に戻って寝るだけのはずがインキーしてしまったり講義室に鞄を忘れてしまうなど随所で疲れが現れていました。
せっかくだからと思い、朝買った割り箸で夜食のカップ麺を食べました。
3日目
6:45 ごろに起床。朝食では同じように偶然同席した受講生と雑談していました。
午前中の開発では昨日に引き続き GWP-ASan 方式 → ASan 方式への実装の切り替えに加え、今までは free を呼んでも実際にはメモリ解放せず意図的にメモリリークさせていたのを、free 後のバッファを queue(リングバッファ)に入れ一定期間 quarantine するように変更したりしていました。また mikit さん含めた3人で Z, L ゼミの見学に行ったりしていました。
午後は現実世界の CVE として libpng の CVE-2026-33416 を試していたら、試行錯誤の末確かに巧妙な入力で use-after-free が起きることを再現できました。以下の画像はその時の様子ですが、libpng に付属していたサンプルなど通常の画像では正常に終了するのに対し、細工された画像(poc.png)では use-after-free と出力され異常終了しています。

現実世界の脆弱性を検証できたときは大きな達成感を得ました。そして、これはキャンプ開始前は想像していなかった成果でした。
その後応募課題で ImageMagick を取り上げたこともあり、同様に clone してビルドしようとしたところ、オリジナルの chibicc が int f(int), g(int); のような記法の関数宣言に対応しておらずビルドできませんでした。これは chibicc の open issue となっているようです。私も mikit さんもこの文法は初めて知るものでした。
開発の休憩時間に今度は X1 と X3 の見学に行きました。Xゼミは物理的な事象を相手にしなければいけないのでYとはまた違った難しさがあると感じました。
また午後に専門 C3 の講師の方が見学に来られてかなり長く話していましたが、C3 のテーマがまさしく heap に対する攻撃であるらしく、その講師にお墨付きをもらえたようでした。
気付かぬ間に mikit さんと hikalium さんが NOC に「コーヒーの注文パケット」を数万件送り、実際に NOC からコーヒーが来るという出来事があり非常に楽しかったです。画像左では Brainux を祀る神社も建立されつつありました。

夕食後はこの日は部屋に戻らず講義室に戻って実行時間ベンチマークを書いていました。 の行列積を書いたところ、以下のようにオリジナルの 83 倍実行時間が増加するという結果になりましたが、ポインタの dereference ごとに
時間(
:
malloc を呼んだ回数)かけてメタデータを検索しているのでオーバーヘッドの大きさは予想通りでした。
- chibicc-ASan(自作): 87762 ms
- オリジナル chibicc: 1052 ms
- (参考)
gcc -O0: 305 ms
共通講義 K3 がありましたが、申し訳ないのですが疲れもありあまり内容は入ってきませんでした。
4日目
4日目ともなると疲れも相当蓄積してきて、7:15まで起きられませんでした。この日は午後からYトラック内の発表があるため実質午前中しか使えません。最初は global 領域や stack 領域にも対応させようとしましたが、手で書くには残り時間が中途半端かつ本質的な機能をバイブコーディングで実装するのも気が乗らなかったため、結局以下の図のように、出力に模式図を含めるところを Codex に実装させる程度にとどめました。会員企業の見学者の方も複数来ていたので、いろいろと説明しているうちに時間が過ぎました。


午後はスライドを作り、Yトラック内で発表しました。自分の発表は問題なく終えられましたし、他の受講生もみなさん特色ある作品を作っていて、楽しみながら発表を聞いていました。
片付けと夕食後は CTF 大会がありましたが、疲労が最高潮に達して虚ろな頭で参加していました。それでも一時期 Daily AlpacaHack に取り組んでいたこともあり、5分問題のほとんどと10分問題の半分ほどは解くことができました。
5日目
7:30 ごろ起床。朝食後は成果発表会と閉講式がありました。成果発表会では1分だけ発表しましたが、然程緊張することもなくきちんと要点を伝えられたと思います。他の人の発表も聞きましたが、専門コースや他の見学できなかったゼミがどのようなことをしたのか非常に参考になりました。閉講式後、無事に修了証書を授与されました。
昼食は班の4人で食べました。皆の学生生活などの話などで盛り上がり、思い出に残る昼食でした。
昼食後は企業との交流会の時間で、事前に希望と抽選で選ばれた4社を廻った上で自由時間に好きな企業を訪れるという時間でした。事前に選ばれた4社のうち1社は大学の研究内容にもセキュリティ・キャンプのゼミ内容にも近く非常に興味深い会社でした。逆に、残りの3社は話がサイバーセキュリティに寄っており、正直なところ私の分野と食い違っているという印象でした。
例の如く5日分の疲れが蓄積していたことと、企業の方と話すのは若干気疲れしてしまうこともあり、自由時間は3-4社程度廻っただけでした。これについてはもう少し頑張っておけばよかったと悔やんでいます。
夕食の立食パーティーでは OS 自作ゼミの masui さんとたくさん話していました。私の研究室がシステムソフトウェアであることもあり、OS の踏み込んだ話から進路まで充実したお話ができました。
食事の後は私の持参したボードゲームで遊んでいました。主にニムトをプレーしましたが、最初3人だったのが徐々に人が増えていき、最終的に9人にまで増えたりもしました。初対面の人ともすぐ仲良くなれたので、ボードゲームを持参したのは本当に正解でした。(来年以降キャンプに参加される方もぜひ!)
キャンプを乗り切った開放感から部屋で結構夜更かしをして、1:00 くらいに就寝しました。
6日目
7:30 ほどに起床。この日は朝食だけ摂ったら解散の日でした。朝食会場で同じ班の受講生と出会い2人で食事をしました。8:15ぐらいにチェックアウトしたら受講生が誰もロビーにおらず、なんとなく外に出てしまいましたが、その後同じ班の受講生がロビーに集まっていると聞き戻ったりしていました。
同じ班の4人 + 新たに出会った人でボドゲカフェに行ってボードゲームで遊んだ後解散しました。
おわりに
記事を読んでいただいたらわかるとおり、セキュリティ・キャンプの本番前は正直なところあまり前向きな気分ではありませんでした。しかし、共通講義の班の受講生、同じゼミの受講生、講師の方をはじめとする参加者と出会い、いろいろな刺激を受け、いろいろな知見を得ることで、最終的には自作 AddressSanitizer で現実世界の脆弱性の検証に成功するという、予想を超える成果を収めることができました。さらに、技術から趣味の話までできて一緒に遊びに行くほどの友達ができたことも他では代え難い機会となりました。
今後もネクストやチューター等の形でぜひセキュリティ・キャンプに関わっていきたいと思っています。またこの記事を読んでいる方も応募資格さえあればぜひセキュリティ・キャンプに挑戦していただければと思います。










