セキュリティ・キャンプ全国大会2023 参加記

8/7-11にクロスウェーブ府中で行われたセキュリティ・キャンプ2023全国大会に参加してきました。 えんじにゃみならいのキャリアの中でも非常に有意義な5日間となりました。

選考・事前学習含めてのスケジュールは以下のような感じでした。

日程 内容
4月後半 セキュキャンへ興味を持つ
5月上旬 WaniHackaseへ入部
5/13 エントリー
5/14-5/18 応募課題に取り組む
6/5 通過の通知を受ける
6/14-8/6 L2ゼミ内で事前講義を受ける
8/7-8/11 現地でイベントに参加

エントリーまで

去年の冬コミの交通費をICPCで得たことに味をしめ、今年の夏コミはセキュキャンで補えないかと考え始めました(結局夏コミはやめました)。 夏コミに参加するかは考え中でしたが、セキュキャン自体は高校の頃からXで名前を目にしていて興味を持っていたので参加してみたいと考えました。

ゴールデンウィーク中にWaniCTFに参加して感銘を受け、弊学CTFチームのWani Hackaseに加入しました。 Wani Hackaseの中でもセキュキャンに応募しそうな方が何人かいたので特攻することにしました。

興味があったのは

  • A(IoTセキュリティクラス)
  • C(脅威解析クラス)
  • L1(暗号化通信ゼミ)
  • L2(暗号のままで計算しようゼミ)
  • L3(Cコンパイラゼミ)
  • Y1(OS自作ゼミ)
  • Y4(CPU+コンパイラ自作ゼミ)
  • Z2(Rust製Linux向けアンチウィルス実装ゼミ)

などでした。 エントリー当初は専門コースと開発コースの違いすら知らないレベルでしたが

  • 自作OSはみかん本を積んでいるので(それで満足するかはわからないが)自分でやる手立てがある
  • CPUとコンパイラは後期の授業でちょっとしたものを作ると聞いているので(それで満足するかはわからないが)もうすぐやる
  • Rustは興味はあるけどまだそれほど得意ではなくてボロが出そう

という理由で暗号に絞りました。 準同型暗号は他で見たことなくて珍しかったのでL2を第1希望としてエントリーしました。

応募課題

応募課題は準同型暗号について調査するレポート課題と、基礎的なプログラミング能力を見る実装課題の2つに分かれていました。 課題内容はここから閲覧できます。 去年の応募課題と全く同一だったことから来年の応募課題で登用されるリスクを回避することを考え具体的なコードや詳細な解説は開示しないでおきます。

応募時はセキュキャン選考を舐めていたので正直通る気満々だったんですが、どちらにしろ講義内容の準備として、また自分の理解とコーディング能力がどの程度に到達しているかを講師に見てもらう必要があったので全力で取り組みました。

レポート課題は、課題内容に書かれている文献を始めとしてたくさんのWebサイトやインターネット上の解説論文を読んで概要を掴み、比較的信頼度の高そうなソースから引っ張って書きました。 こういうのは自由に調べてほしそうに見えて採点者が調査テーマの何に深い信頼をおいているかが異なるものだと思っていて、また「余計なことを書いて減点されることはありません。」とあったので言葉の定義・技術の詳細・現在の実現可能性・将来の利用先などできるだけ網羅できるように書きました。

プログラミングは流石に黄コーダーにとっては余裕だと思っていましたが、一般暖色コーダーが書くコードは題意の直訳ではない謎のコードになっていがちである(と言われる)ため、なぜそうなったのかを数式を含めてコメントにたくさん書いた上で自分の中で洗練されているであろうコードを書きました。 この課題は後に実装するTFHEの一部になるもので、講義を受ければ自分の実装は最適なものではないことに気づいて驚きましたが、結局会期中にも最適化された実装をすることは叶いませんでした。 応募課題の提出がテキスト方式の統一されたフォームになっていてファイルの添付などはなかったため、GistにPrivateで投稿してURLを共有しました。

結果として予定以上の時間を用意し、大学の課題を先延ばしにしてしまいました(なんとかなりました)。

選考通知

通過のメールが届きました。 宛名の名前が違う人になっていましたが手違いだったようでドキッとしました。

TLの多くの人が落選していてここでやっとセキュキャン選考の厳しさを認識しました。 丁寧にやっといてよかったー。 L2ゼミが2人だけなのも知らなかったです。 超強い人2人と被ったら確定落選なので怖いですね…

自分のXはほとんど競プロ界隈にあるのでセキュキャン通過者の多くを認知できていませんでしたが、ほかの通過者からフォローが飛んできて確認したり検索したりしてたらものすごく強そうな人ばっかりで緊張感が高まってきました。

事前学習 & 共通講義

L2ゼミ講師のNimda先生から事前に毎週講義を行うとの連絡を受け、毎週決まった曜日の夜にDiscordのVCで講義が行われることとなりました。 実装内容が多く講義と実装を会期中に終わらせるのは困難なため事前に講義をして実装を始めておいてほしいとのことでした。 講義スライドは先生のgithub.ioに公開されています。 1:2の講義であるため質問がしやすい環境ではありましたが、内容が結構難しいためその場で完全理解するのが厳しかったです。

日々の競プロ精進を続けながら大学のレポートや期末テストの対策をやっていたら実装に取り掛かる時間がどうしてもなくなってしまい、7月の後半からの実装になって今いました。 多項式やベクトルのCRTPクラスを作っていたらC++の罠にたくさんかかって想像以上に時間がかかってしまい焦りました。 TRGSWのExternal Productで案の定理解不足が生じていましたが、質問をすると親切に対応していただけました。 会期まではExternal Productまでしか実装できませんでしたが、ベースの構造などは作りきったつもりでいたので会期の最初の2日くらいでHomNANDまでやりきってあとはスレッド並列やSIMDによる高速化を頑張るつもりでいました。

L2の事前学習以外にも共通講義K1,K2,K3が行われました。 応募時からのスケジュール管理不足でK1の講義とICPC国内予選がバッティングしてしまい焦りました。

授業の方もセキュキャン事務局の方も機転を利かせて公的な欠席を承認していただいたためICPC国内予選に集中することができ、無事そちらも通過しました。 色々な方に応援されているのを実感しました。

オンラインで行われたK2とK3に参加しました。 講義時間中やその後にもDiscordのチャンネルで多くの人が授業実況をしていて受講生のモチベの高さや自由なコミュニケーションの雰囲気を得て暖かくなりました。

1日目

朝6:30くらいに自宅を出発して会場に向かいました。 最初のバスに乗ってすぐに名刺を忘れたことに気づいて悲しみました。 このときは悲しいだけだったんですが、始まってからこのことの重大さに気が付きました。 セキュキャンは名刺文化なのでないとマジで困ります。

会場に到着しました。 研修施設というともっと無骨な建物をイメージしていましたが、ホテルのようなおしゃれできれいな建物でした。

食事を取りました。セキュキャンの食事は朝はビュッフェ、昼はA、Bの2つの昼食から選ぶ形式、夜は予め席においてあってご飯や味噌汁だけ席につき次第受け取るという形式でした。

ご飯、めっちゃ豪華です。最初だけじゃなくてずっと豪華です。 無償の飯なので学食くらいのシンプルなものを想像していたのですが、晩ごはんも一泊1万円以上のそこそこのホテルのような品数が多くて料理人による工夫が凝らされた美味しいごはんがでてきてびっくりしました。 期待されてるんだなと感じます。

昼食は程々にして共通講義のお部屋に行き、人々と対面します。 正面にCryptoの猛者mitsuさんがいてびっくりです。 L1に応募したら勝てなかったので危なかった。 人々と名刺交換をしていました。 技育博用に作ってあまり使わなかったEightのオンライン名刺があったので自分はそれで対応しましたが、紙を持っていないので手間をかけました。 本当にすみません。 セキュキャンに来ている人は層が幅広いのでもともと繋がっていない人たちばかりでしたが、話してみるとおもしろい! 世界の広さを実感しました。

共通講義K4を受けました。ハッカーの倫理という堅苦しいタイトルでしたがおもしろい検事さんがいい感じに飽きないように講義をしてくれたので面白かったです。

第1回LTがありました。 自宅サーバー勢が多い。 本格的なネットワーク機器やサーバーマシンを皆さん設置しておられますが何に使うんですか?? セキュキャン勢の変態性を感じます。 CTFなどの初心者コミュニティがいくつか紹介されたのでとりあえず入っておきました。

グループワークがありました。 セキュリティに関するコンテンツ作りということで非常にざっくりとしたテーマで話し合いが始まりました。 学校内のグループ活動でで重役を請け負ってしまうような偉い人が全員集まったような感じ。 正直どういうことを決めて取り組めばいいのかよくわかりませんでしたが、とりあえずmitsuさんが進行してくれるので話は白熱しました。 白熱しすぎてテーマが決まりませんでした。

夕食!焼肉でした。 先にも示した通り副菜も色々ついていて豪華でした。 この頃は受講生同士あまり雰囲気が掴めていたいので少し慣れていない感じでしたが食事を楽しみました。 共通講義やグループワークのときに「夕食の後のデザートタイムでたくさん交流して名刺交換してくださいね」と言われていたのに夕食とデザートタイムに当てられた時間は1時間きり!デザートの時間を10分しか充てられず、1人の講師としか話せませんでした。 デザート美味しいのにたくさん余っていたんですが、20時くらいに食べに戻っていた人々がいたらしいです。 私も食べに行けばよかったかな?

夜はLトラックのおへやに行ってひたすら開発です。 CMUXのテストが通らなくて焦っていました。 20時半まで講義、21時までホームルームということでしたがLトラックの人々はみな開発にお熱で21時半くらいまでひたすら開発タイムが続きました。 自室に戻って少し追加実装をして、やっとCMUXのテストが通った(ように見えました)。

自室はビジネスホテルっぽい感じ。 シャワーを浴びて寝るだけなので特に不自由はありませんでした。 私は電車に乗ると疲れるのですが興奮状態にあったのでいますぐ寝たい!という感じにはなりませんでした(23時までに寝ました)。

2日目

いつも通りの6時起床。 ちゃんと休めました。 この5日間日付変更前に毎日寝れたので睡眠習慣はきれいになりました。

この日の朝は社会見学以外で唯一の外出の機会であるコンビニツアーがあったので嬉々として参加しました。 毎日眠くなったらすぐにお昼寝をしている私がお昼寝休憩なしのフルタイムプログラムに耐えられるのか不安だったため、普段は飲まないエナジードリンクを買ってカバンに忍ばせておきました。 あと飲み物が水しかなさそうだったので糖分補給のためにグミを買いました(結果として眠くなることもなかったしお菓子もいろいろ供給されたので不要でした)。 外に出ないと体調がおかしくなるみたいな人は散歩のためにも行くといいのかもしれません。

この日は夕食までひたすらLのおへやにこもりきりで開発です。 CMUXのテストが正常に行われていないところから基本型の定義のミスにたくさん気づき、大変なことになっていました。 焦りが出てきます。 時間はたくさん用意してもらっていたのでラインレベルまで不整合ポイントを突き止め、修正しました。 ポインタ位置のズレでした。 黄色コーダーになっても知らない概念を実装すると未だにこういう小さなミスをしてしまうのはよくないですね… この時点でまだGateBootStrappingTLWEtoTLWEのテストが通っていないのでやばいです。 会期中にSIMDなどまで進めるのが困難そうで悲しくなってきました。

ところで、普段Pythonを使っていながらも今回C++での実装に挑戦していた同じL2の駆け出し理性チャンネルさんもたくさんC++の罠にかかっていそうで辛そうでした。 特に僕もNimda先生も少しマニアックなC++の書き方をしていたので僕のコードを参考にして苦しまれていたのは申し訳ない… Pythonに切り替えて走り出したようです。がんばれー。

夜は協賛企業イベントということで、気になっていた4社にお話を聞きに行きました。 セキュリティ以外の文脈で気になっていた企業も主にセキュリティ事業についての説明を受けて、それはそれでいい仕事だなーと興味を持つことができました。 某社にkurenaifさんの代理人がいて驚きました。 時間が押していたので個人的な会話などをしている暇はありませんでしたが、いつもお世話になっておりますとここで述べておきます。

某社の説明会場にもいたNOCチューターの方にぜひNOCの見学に来てくださいと言われたのでLのみんなでホームルームの時間に見学に行きました。 クソデカネットワーク機器を管理しててかっこよかったです(小並感)。

3日目

午前中はわくわく社会見学。 どこに行ったか言っていいんだっけ。 ダメだったらやばいので伏せておきます。 とてもおもしろいものをみました。 時間が短かったですが楽しかったです。 行き帰りのバスでmitsuさん、かっしーさんとCTFのお話をしたりLufeさんのキャリアや研究について聞いたりしていました。 みんなそれぞれにめちゃくちゃ努力していて自分の知らない技術を身に着けていてすごい。 刺激を受けました。

TFHEの実装はいよいよバグ発見バトルの佳境になってきました。 暗号の実装って平文がきれいなデータでも途中経過のものはぐちゃぐちゃなのでとてもプリントデバッグしにくいんですが呼び出された関数をトレースしたりしてたら、オーバーロードしてる関数が意図しないほうが呼ばれていて泣きました(具体的にはトーラスと整数の掛け算をしてほしいのに真理値との掛け算をする特殊化のほうが呼び出されていました)。 std::enable_ifの条件が逆になっていて涙目。 SFINAEでイキっていましたがSFINAEは闇の技術であることを再認識することができました。 講義時間中にはギリギリ終わりませんでしたが自室に戻って10分くらいの開発でHomNANDが完成しました(と思っていました)!

ところで、Lトラックの教室の中でLinux談義で盛り上がりました。 LinuxディストリビューションやWMの話で盛り上がるのはITイベントの定番になっていますね。 学部ではLinux勢はあまり見られないのにこういうところにいくと開発環境づくりにお熱な人がたくさんいて嬉しいです。 最近Fedoraを触っているのですがちょうど飽きたと思っていたので次はEndeavor OSを触ろうと思いました。 久々のArch系! i3以外のおもしろそうなタイル型WMもいろいろあるので夏休み中時間があるときに触ってみたいですね。

4日目

HomNANDのテストが正常に行われていないことを発見し、落ちました。 1時間位唸っていたらNimda先生にSampleExtractIndexの添字ミスを指摘されました。 お恥ずかしい。 このままでは明らかに遅いので多項式乗算をFFTで高速化します。 4基底や8基底のFFTなどの定数倍高速化をせっかく教わったのにすぐに実装できず、とりあえず応募課題のFFTを貼って終わってしまいました(かなしい)。 FFT実装後の1NANDのタイムはM1 Macシングルスレッドで350ms程度!遅い!!! 10msとかまで縮められるそうなのでまだまだ定数倍高速化が必要なんだなーとなりました(SIMDとか係数分解を加算機に任せるとかでそこまでいけるのかな。プロファイリングを取ろうとしましたがやりきれませんでした…)。 翌日は成果発表だけで終わっちゃうのでやばいです。 駆け出し理性さんは忙しそうなのでスライドを担当しました。 4分の発表でTFHEの講義を収めきれるわけがないので自分の中での超超概要的な図(↓)を作って足りない部分は口頭で補うことにしました。

夕食後は2回目のLTでした。 これも大きな転機でした。 2回目のLTは応募者が非常に多くて予定外の4ルーム並列開催だったのですが、レベルの高いLTが多くて楽しかったです。 皆さん短い時間で自分にしか話せないことを詰め込んでいておもしろいなーという感じでした。

UEFIの仕様書から読んでフルアセンブリでOSを書く人なんて普通いないでしょ。 狂気ゆえに興奮しました。 自作OSなんて直接的に活用できる業種はあまりないと思うのですが、それでも基礎の基礎から理解しようとする姿勢に感動しました。 私も自作OSをやりたいなと思いました。 ちょうどRustで真面目な開発をやりたいと思っていたところなのでみかん本のRust実装に挑戦してみようと思います。

あと、セキュリティ芸人のアスースン・オンラインさんのフリップ芸を生で見ることができました。 会場で見るとよりおもしろいものです。

なんとここで成果発表前最後のグループワークです。1回目と合わせて2時間しかないなんて聞いてない!!!(スケジュール把握不足) 直前になってもテーマだしが白熱してほとんどテーマを決めるだけで終わってしまいました。 他の人達は自分たちのゼミの成果発表の準備で忙しそうだったので僕が勝手に部屋でスライドを作っておくことになりました。 発表は駆け出し理性にお願いしました。

5日目

今日は成果発表のみです。 「巻きで!巻きで!」と言われながらも各ゼミ・グループワークの発表が流れていきました。 どこのゼミもめちゃくちゃおもしろそうなことをやっていて、できることなら来年も他のゼミで参加したいなーと思いました。 まあ全国大会はだめなので来年忙しくなければネクストに応募しようと思います。

特にネクストの人たちは5日間だけなのに色々なテーマをしっかりこなしていて超優秀!って感じがしました。 来年あの場に立ちたい、立ちたい… ジュニアの人も中学生でセキュキャンに興味を持って自主的にアプリ開発ができる、やばいです。 僕はプログラミングやってなかったですからね…

まだまだやり残したものを感じつつも会場にお別れ。 5日分食費が浮いたと決めつけて友人といい飯を食いました。

おわりに

めちゃくちゃ貴重な経験をしました。 講師・チューターの方々、IPAの方々、セキュキャン協議会の方々、協賛企業の方々、お国の偉い方々、ありがとうございました!