セキュリティ・ミニキャンプ in 山梨 2019 専門講座 参加記

2019/9/29(日)に開催された、セキュリティ・ミニキャンプ in 山梨 2019 専門講座 に参加してきました。これから、応募するまでの流れと選考課題に対する僕なりの回答、参加して僕がどう変化したのかという話を書きます。技術的な内容は薄く、気持ちの話がメインになります。
以下の結論が言いたいことで、後は自分の備忘録みたいなものです。
結論: 22歳未満の方はセキュリティ・キャンプ全国へ、25歳以下の方はセキュリティ・ミニキャンプ地方へ行きましょう。

セキュリティ・キャンプとは

よく「セキュキャン」と略されます。Twitterの検索で「#seccamp」を見ると様々なセキュキャン、ミニキャンのツイートが見られます。
セキュリティ・キャンプの公式から「全国大会」(セキュキャン)、「地方大会」(ミニキャン)に飛ぶと、全国大会は年に1回開催で22歳以下の人が応募可能、地方大会は月1くらいの頻度で全国各地で開催されていて、一般講座(年齢制限なし)と専門講座(25歳まで)に分かれています。
年齢制限があるのがつらいところですが、10万円を払ってセキュリティキャンプ会員プログラムの個人メンバーになると、どの年齢でも全国大会、地方大会の見学(事前学習や講義中の質問はできない)を行うことができます。
個人的な思いとしては、セキュキャンの存在を知ったときにはもう応募できない年齢になっていたのでもっと多くの人、特にセキュキャンが対象とする「熱意を持って行動している人(知識の多さやいわゆる強さとは関係ない)」の元に情報が届いてほしいなと思っています。

参加2ヶ月前

このあたりで山梨ミニキャンプの募集がはじまったと思います。内容を見て、講師が以前から知っていた うーちゃんさん(@uchan_nos) だったのであー!この人の講義受けてみたかったんだ!!!という気持ちになりました。それに、もう一人の講師の Yuka Takahashiさん(@00_) は、知り合いではないのですが、僕がプログラミングに興味を持ち始めた頃に東大のCPU実験の記事がバズっているのを見て一方的に尊敬していて、LLVMとかGSoCとか、そもそも海外にインターンに行く選択肢があって、同世代の人がそれをやっているんだということをこの方の発信している情報から知りました。僕は強い人を見ると「この人の強さはどこから来るんだろう」「この人の興味関心や、人間を突き動かす原動力はなんなんだろう」ということをよく考えるのですが、この方の講義を受ければ何か自分が強くなるヒントが得られるかもしれないという思いで、絶対に参加してやると気合を入れました。
気合を入れた割に何をすればよいかわからず、とりあえずC言語の経験がそんなにないので低レイヤを知りたい人のためのCコンパイラ作成入門をしました。分割コンパイルとリンクを終了して、四則演算くらいしかできない状態で定期テストが入り、夏休みに入りいろいろ他の勉強をしていたら時間が過ぎていきました。

参加1ヶ月前

応募課題の締切が迫っていました。タイガー本を少し読んだりはしましたが、応募課題の技術的なところはかなりしょぼいことになると思ったので、割と素直にできないことはできない、僕ができるのはこういうことだ、ということを書きました。応募した内容の全文はこちらです。
僕はプログラミングの世界に入ってまだ1年半くらい(記事執筆時点)なのでずっとTwitterのTLに流れてくる情報駆動で成長してきました。多くの人から影響を受けてきた中で、低レイヤではuint256_tさん(@uint256_t)からかなり影響を受けました。彼はこれまでブラウザやJavaScript Engine, JVMや.NET処理系をRustで自作しています。僕はNaglfarのコードを読んだり、そこから興味が広がってservo(firefoxのブラウザエンジン)のコードを読んでいくうちに、普段当たり前と思っているレイヤが自分の手で作れる可能性があることに感動しました。たぶんここからOS自作とかCコンパイラ自作といった分野に興味が湧いたんだと思います。

参加前、事前課題

LLVMでミニキャン言語を作ろう!の方は事前課題の内容が公開されています。
https://github.com/yamaguchi1024/mc-lang-1
https://github.com/yamaguchi1024/mc-lang-2
https://github.com/yamaguchi1024/mc-lang-3
Kaleidoscopeがベースなのでそちらを参考にすると進めやすいと思います。
UEFIでOSの力を借りずにELFを起動の方は公開されていません。EDK2でUEFIアプリケーションを作るをやってみるとよいと思います。
実際取り組んでみた感想です。
どちらも最初に3週間でこんな内容をやるよ、というロードマップを示されていたので気持ちとしては見通しを持ててよかったです。
LLVMの方は最初丁寧な誘導がついていたのでサクサク進みました。しかし、一回目の課題が終わったときに、これでは本質に迫れないまま次の課題が来て、苦戦してしまうことが想像できたのでKaleidoscopeを読んで誘導無しで第2回課題相当の内容を実装しました。これがとてもよかったようで、残りの2,3回課題はサクッと実装できました。
UEFIの方はかなり時間を費やして苦戦しました。低レイヤ特有の、「なぜか正常表示をしているのにクラッシュする」(いやコンパイル時に不審な挙動は極力ブロックしてくださいC言語さん…)とか、「うまくプログラムが終了するのにファイルに書き込まれない」などの謎挙動を様々な方法で原因特定しようとしたり、仕様書を読んでプログラミングする必要がある、といったことを体験しました。情報量が少ないので、高レイヤでの「ググったらいい例が載ってるブログがヒットしてコピペして終了!←よくない」ができないんですね。個人的にこのへんは体験したかったことなので満足です。

当日

当日は怒涛の勢いで時間が過ぎていったのでほとんど書くことがありません。LLVMの方は、発表が押して僕はお昼ご飯の時間に発表をしました。緊張で震えていたのでうまくできたか分かりませんが、もっともっと場数を踏みたいなと感じました。LTとかで経験を重ねたい。
うーちゃんさんの講義はポインタの理解を深めるもので、アセンブリから理解すると理解しやすいというのは本当にそうだなあと感じました。残り時間はもくもくと超発展課題をやっていましたが進捗は無でした…
後はチューター(というかサポートスタッフかな)の方で、僕のハンドルネームを知っている方がいたのが驚きでした。僕はその方の発信している情報、スライドとかで勉強していたのでうお〜なんで俺のこと知っとるんやなんで????嬉しいもっと強くなりてえええ、みたいな気持ちになりました。強くなりたいね。
本当はもっと講師の方やチューターの方、参加した方々とお話したかったのですが時間もなくそれは叶いませんでした。Yuka Takahashiさんともうちょっと話してみたかった…なんでLLVMに興味を持ったのか、現在の興味関心の移り変わりはどういう経緯なのか、これから先どういうところに興味があるのかとか、いろいろ聞きたいことがあったのですが…悲しい。でも講義を受けることができた事自体がとても幸運ですね。感謝。
終わった後何人か時間のある参加者でなんとなく集まってサイゼリヤに行きました。ここで進捗が生えて超発展課題が少し進みました。嬉しい。いろいろお話できて楽しかったです。やっぱり自分と違うことをしている人、自分より強い人とお話するのは楽しい。

次の日

フライトまで時間があったので新宿の紀伊国屋書店に行きました。コンパイラというコーナーがあって驚きました。蟻本とかドラゴンブックとか、あと驚いたのはラムダノート出版の本(IPv6)があったことですね。流石都会だ…
その後は新宿ピカデリーでViolet Evergarden外伝を見ました。ポロポロ泣いてしまったのですがそのまま電車に乗り羽田空港へ行き、帰宅しました。

参加して何が変わったか

ここでは、応募用紙に書いたことを振り返って、今どう感じているかを書きます。
まず、技術的な内容を書いてミニキャンプ参加者以外の方に情報を届けたいという当初の思いは難しいことが分かりました。もっともっと強くなって自信と裏打ちされた知識がなければ語れないレベルのことを事前課題としてやったと思います。今でも正直すべてを理解している気がしません。でも何かを発信したいと思ったので、ツイキャスでスライド発表したり、大学の友人にミニキャン言語のバイナリをUEFIから動かす話をしたりしました。もう少し進めて自分オリジナルの成果を出して世に送り出したいという気持ちが強まっています。
次に、「低レイヤで何かひとつのものを作り上げるのはとても難しい」という気持ちですが、これは今も変わりません。しかし、今回の事前課題を通して、今の自分ならある程度何かを作ることができる、という自信がつきました。仕様書を読むことへの抵抗感がなくなり、手探りでも低レイヤ特有のデバッグの仕方が(雰囲気)分かるようになりました。今度はきっと挫折しないと思います。挫折は様々なことに時間を割くから生じるのであって、自分の自由な時間はとりあえずこれをやる、と決めてずっとそのことを考えればうまくいくということも知りました。また「成功体験を得たい」と書いたのですが、講師の方に褒められたり、発展課題をやりきったことによる喜び、自信が成功体験になったと思います。
役立てたいことについては、セキュリティキャンプの運営の方が言っていたことが心に残っていて、「講師を生み出すことも目標」というのがいいなあと思いました。僕も何か自分の知識の一部をまだそれを知らない人に届ける活動がしたいと思いました。
というわけで、具体的には次のようなことをやっていこうと思っています。
- 学内/学外で勉強会を開く: 今回の体験を通してやはり人間に会うことや、発表する、教えるために周辺知識を学ぶことの重要性を実感しました。今週から実際に学内で2つ、初心者向けWeb勉強会と、コンテストに向けての少人数での勉強会を始めます。
- 低レイヤのための~のCコンパイラを進める。: やりきった感じが味わえるのはきっとセルフホストとかなんでしょうけど、僕には難しそうです。でも少しずつやっていきます。
- LLVMなどの大規模なソースコードを読む: 大規模なプロジェクトに興味が湧きました。Servo, V8なども読んでみたいです。
- UEFI超発展課題をやる: 今は仕様書を読んでいるところです。ソースコードがきれいではないのでリファクタリングもしたいし、OpenProtocolを使っての実装もやりたいです。
- 海外のインターンに応募だけしてみる: GSoCなどもこれに含めます。Yuka Takahashiさんが「海外のインターンに応募してみましょう!」と言っていて、いや~俺には無理だと思っていましたが、よくよく考えてみると応募するだけなら準備は大変ですができそうです。僕は普段田舎民なのでこんなところにはIT企業への切符は落ちてないとよく嘆くのですが、海外ならきっと東京であろうが田舎であろうが実力で見てくれるはずです(想像ですが)。とりあえず募集を探してみようと思います。

最後に

自分は気づいたときにはセキュキャン全国に行ける年齢を通り過ぎていたので、今までTwitterで見かけるセキュキャン勢に対しうらやましさやコンプレックスを抱いていました。しかし、今回のミニキャンプは課題の量が多かったのもあり、全国のレベル感を想像することができました。全国はきっとこれより難しいのだろうけど、それでも僕にもできそう、みたいな気持ちが生まれて、そんなに全国の人と自分を比べて実力差とかにへこむ必要はないな、それよりコード書いて本読んで仕様書読んでの方が大事だという気持ちに切り替わりました。(これは驕りかもしれません)
全国に行ったこともないのに応募できるのかな、という見えない壁がなくなったので、SecHack365や未踏やGSoCといった自分が好きなことをやれる環境を手に入れるためのチャレンジに向き合えるようになりました。雲の上と思っていたことが現実味を持って立ち上がってきたので、それに合わせて自分も力をつけていきたい。もっともっと強くなりたい。特に研究が苦手なので深く掘り下げたり論文を読むところを強化したいという気持ちでいっぱいになっています。受かる受からないの問題ではなく、その前の低いところの話で申し訳ないのですが、それでも僕にとっては視界が開けた点ですごいことでした。
僕にとっては、セキュリティ・ミニキャンプは自分が成長したり、すごい人と会って視界を広げてくれるチャンスでした。それはチャンスでしかなくて、ミニキャンプに行ったという事実は自分を変えてはくれません。しかし、提供されるものをきちんとやって追加でできることを考える工夫をすれば、自分の実力をブーストしてくれる効果がありました。
これからも精進を続けていきます。講師の方、チューター、スタッフの方、山梨大学の方、ありがとうございました。