Top > Blog > Article > 【参加記】セキュリティ・ネクストキャンプ2023に参加しました

【参加記】セキュリティ・ネクストキャンプ2023に参加しました

終わり!?

2023/08/07〜2023/08/11に実施されたセキュリティ・キャンプ全国大会……と同時開催のセキュリティ・ネクストキャンプに受講生として参加していました。

昨年の全国大会2022(オンライン)でCPU自作に取り組んでいたのに引き続きです。昨年の感想は以下をご覧ください。

セキュリティ・キャンプ2022を終えて(感想とか)watasuke.net - the-end-of-security-camphttps://twitter.com/security_camp/status/1557994053794275328 終わり!? ということで、あっという間にセキュリティ・キャンプが終わってしまいました。8/8~12の5日で、自分が ...

去年も「あっという間に終わってしまいました」って書いてますが、今年の体感としてはそれ以上で、一瞬で時間が過ぎ去ってしまったように感じています。

というわけで、感想を述べようと思います。

「オフライン」の良さ

「今回のセキュキャンの感想」といえば、まずこれを述べないと始まらないですね。オフライン、すごかったです(こなみ)

昨年はオンラインのセキュキャンに参加しましたが、オフラインになるとここまで違うものなのかと衝撃を受けました。正直オンラインとオフラインの違いとして想定していた事としては、講師との(物理的な)近さくらいでした。そもそもそこまで違うと思ってなかったので、何が違うんだろうな〜みたいなこともあまり考えていませんでした。

僕は前泊1対象者のうちひとりだったのですが、夕食を食べに行ったときに目の前に人が居て!会話が発生する!!この時点で「あ、これはだいぶ違うぞ」と感じました。

オフラインの最も良かった点は、なんといっても「交流が発生する」ことではないかと思います。前述した食事中はもちろん、エレベーターとか、廊下ですれ違ったときとか。まあでも時間的な意味でも、食事中の交流は特に大きかったと思います。ネクスト受講生はグループワークに参加しないため、オンラインであれば全国大会の受講生と関わるのは難しかっただろうと思いますが、朝食などのタイミングで、お互いが何をしているのかについて話したり、趣味とか学校生活とか、そのあたりについて話したりすることが出来て非常に良かったです。

それと、「他のクラスを軽率に見学できる」こともだいぶ大きかったと思います。僕はYの内容に全体的に興味を持っていました。去年Y4(RISC-V CPU自作)に参加していて、今年も全国大会に応募するならY4(CPU・コンパイラ自作)とY1(OS自作)、あとL3(コンパイラ自作)に応募しようと思っていたほどです。

オンラインだと、せいぜいDiscord上のチャットから状況を伺うとか、成果報告を見るくらいしか出来なかったのですが、今回は違います。部屋に直接行って、進捗をこの目で見れば良いのです!!すごい!

僕は主にY・Xの部屋を見学してきました。目の前で動くCPUやらルーターやらは壮観でした。それから、NOC2にも行ってきました。ネットワークは無知ですが、いかにもUbuntu Serverっぽいフォントで文字を出力しているサーバーとかがあっておもしろいなあと思いました。

Lももう少し見学したかったのですが、時間の都合上10分にも満たないくらいの時間しか見れなくて悲しかったです……。L3(Cコンパイラ自作ゼミ)の机の上に、僕が興味を持っている本がたくさん置いてあってとても良かったです。例えば「作って学ぶコンピュータアーキテクチャ」など。RISC-VもLLVMも興味のある分野なので、いつか読みたいなあとずっと思っています。以下はL3の机(など)の様子です。

名刺交換

オフラインならではの名刺交換についても言及する必要があるでしょう。僕は200枚ほど持っていきましたが、おおよそ130枚近くを交換したのではないでしょうか。本当に色々な人と交換できました。名刺交換の何が良いかというと、これが会話の起点になることです。デザイン良いですねとかキャラ可愛いですねみたいな会話もさながら、〇〇やってるんですかみたいな質問とかも出来て良かったです。

キャンプ開始前に「この人とは絶対に物理的に顔を合わせて名刺を交換するんだ」と思っていた人と全員名刺交換が出来てとても嬉しかったです。僕が個人的にめちゃくちゃ尊敬している人たちが、目の前で動いていて、しかも僕と会話してくれて、名刺交換までしてくれるなんて最高すぎませんか……?これで言うと、さっきの「オフラインで良かったこと」の一つは、人と顔を合わせることが出来ることかもしれないですね。

僕の名刺を見たときに一番多かった気がする反応は「Twitterで見たことがある」です。本当にありがたい……Twitterやっててよかった……。台湾留学の体験記でも書きましたが、他人に認知されるのはとても嬉しいです。承認欲求の塊だから。

あと、アイコンについても言及してくれる人が多かったです。中学生の時にBlenderを勉強してたらできたみたいな話を何度か出来ました。あと、SoundCloudに言及してくれる人が2人くらい居て嬉しかったです。最近まったく曲作ってないですけどね。おや、そういえば今年の目標って……

LT大会

今回もLT大会がありました。今回も登壇させていただきました。前回は自作サービスTAGetherの紹介で、今回は「watasuke.netを支える技術」というタイトルで、このサイト watasuke.netの紹介をしました。あと「技術」だしエディタの話してもええやろ……と思ってVSCodeの設定についても話しました。2回連続でWeb系になってしまった……。後に他の人と話していて思い出したんですが、つい最近自作OSに実装したシステムコールとかそのあたりの話をしても良かったのかもなあと思いました。

LTは何回かしていますが、物理会場で、聴衆の前でLTをするのは何気に初めてだった気がします3。といってもそこまで緊張していた記憶はなくて、むしろ発表順を忘れかけていたり、i3wmでプロジェクター側にワークスペースを移動させるのに手こずってしまったりというやらかしによる焦りが少しありました。このせいで発表時間を少しオーバーしてしまいました。愚か……。なんか総じて面白みのない発表になってしまった気がします。反省はしています。

発表資料は以下からアクセスできます。

【seccamp'23 LT】watasuke.netを支える技術 - Google スライド

社会見学

独立行政法人情報処理推進機構(IPA)のオフィスを見に行きました。ありがとうIPA〜〜〜!昨年よりお世話になっております。マジで。

登さんのお話を聞くことが出来ました。たびたびその話を耳に挟んではいましたが、いざ対面すると感動しますね。~~上から目線で怒られそうですがすごい好青年って感じで良かったです。~~生で「いんちき」とか「けしからん」みたいなワードを聞くことが出来ました。これらのワードが当然のように口から出てくるのが面白かったです。発表内容としては、登さんは本当に日本の将来を考えているなあと改めて感じさせられるようなものでした。

それから、サイバー技術研究室の見学もさせていただきました。ネットワークの知識がないので、見てもよくわかりませんでした。おしまい。ゲームキューブやN64があってなんだかとても良かったです。

あと、これは社会見学と直接関係あることではないのですが、行きのバスでは隣になった人とずっと話していました。商業高校の人で、正直実績になるかなと思って参加したら周りがガチプロすぎてヤバい〜みたいなことを言ってました。簡単なテストなのに周りの意欲がなさすぎて平均点が低すぎみたいな話をしていたのを覚えています。まあこんな事言ったら怒られそうですが、大多数の人は卒業できれば良いみたいな精神で学校に通ってる節がだいぶありそうだと(高専に通ってる身としては特に)思っていて、その中でセキュキャンに応募するレベルで意欲のある貴方がすごいんですよという感想を抱きました。あと、資格勉強にあたってオブジェクト指向の問題が出たら捨てろと先生に言われたらしく、まあオブジェクト指向とかいうやつX(旧Twitter)でさんざん燃えてるしなあと思いながら、そのことを伝えた上で雑にオブジェクト指向の解説をしたりもしていました。

成果報告では初めてパワポを使ったと言いながら発表し、「言語化できるのすごい」「立派すぎる」との感想が実況所(Discordチャンネル)で飛び交っていました。そうでしょそうでしょ(後方腕組み)となりながらそれを見ていました。何様?

食事

食事は全て会場であるクロスウェーブ府中でとりました。「研修施設の食事」ってなんか文面が微妙ですが、提供された食事はだいぶ豪華ですごかったです。肉焼いたりしてました。

前泊も含め3食全てインスタのストーリーに上げたはずなので、ぜひそちらもご覧ください。いろいろ食べましたが、個人的には刺身とメロンが一番美味しかったです(?)

(なんだこのツイート……)

講義の感想

ということで、ここからは講義の感想です。基本的に各講義はそれぞれ2回に分けて行われました。

学んだ技術の本質から魅力や価値を引き出そう

技術を学んでいるとき、自分の中で浮かんだり他人から聞かれたりする「なぜそれをするのか」という質問に対して自分なりの答えを持っておくことで、モチベや自信につながるよという話を聞きました。「腑に落ちる」が一番大事、とのことです。なぜするのかわかってないとやりたくないよね、みたいな話を聞いて本当にそのとおりだと思いました。省略しても良さそうだと思って写経をサボったらそこは大事な行で、デバッグに数時間吸われるみたいな経験があるので……。

講義を聞いた後、実際に今まで学んできたこと・研究してきたことを列挙し、なぜそれをしたのか・なぜそれが好きなのかについてまとめました。それから、その列挙した中でも特に掘り下げたいと思っていることを決めて、それを選んだ基準や、それを学ぶことで得られる自己的な・社会的な価値について考えました。僕は好きだけどまだ理解が浅かったり、それらしき作品がまだ一つもないようなものとしてRust・自作OS・GPUを挙げました。

そして、「エレベーターピッチ」を用いて、それらの知識に基づいたプロダクトのアイデアを考えました。僕は昨年の未踏ジュニア応募時点、下手したらそれ以前よりずっと「OSレベルでキーボード操作が出来るような機能を備えているOS」があればいいんじゃないかなあとぼんやり思っていて、それを発表しました。ちょうどRustと自作OSですからね。これに関して質問を受けて、より自分の中での考えが深まったような気がします。

低レベルGPUプログラミング

Raspberry Piに搭載されているGPUで計算をするみたいなやつです。即ちGPGPUですね。1回目で講義を受け、iGPUとdGPUとか、SIMDとSIMTとかそのあたりの話を聞きました。そして、2回目は実際にコードを書いて、SGEMM(Single precision GEneral Matrix Multiply)、つまり行列積の高速化について考えました。

Raspberry Piに搭載されているGPUはVideocore VI(VC6)といって、なんとアーキテクチャリファレンスが公開されていません。同じシリーズのVC4はリファレンスがあるらしく、これをもとにいろいろな仕様を推測している、とのことでした。

GPU制御のためにpy-videocore6 というライブラリを使いました。これはPython用ライブラリですが、Pythonらしく書けるというより普通にアセンブリを書くような感じでした。まあfor文とか使えるんですけどね。

py-videocore6を使ったプログラミングはだいぶ難しかったです。「この命令を使ったら3回nopを挟まないといけない」とか、「命令と一緒にシグナルを発行できる」とか……知らない概念ばかりで新鮮でした。さながら去年System Verilogを書いてたときみたいな気持ちになりました。

SGEMMの高速化についてはあまり的確なアイデアを出せませんでした。講師の人が考えた高速化のアイデアはかなり的確ですごかったです。

オリジナルCPUを創る

DL166という4ビットCPUを題材にした講義でした。

1回目はCPUの命令セットやレジスタ一覧について触れ、実際に命令を書いて機械語に翻訳する人力アセンブラみたいなことをしていました。例えば「出力ポート(r6)に接続された7セグメントLEDの値を1ずつ増加させていくプログラム」というお題が与えられ、これはただ単にr6をインクリメントする命令をjmpによって無限に繰り返せば良いので、命令を2つ並べてそれに対応する2進数を書く、という感じにやっていました。

2回目はDL166に追加する機能について考えました。僕が提案したのはzero flagです。このCPUが持っているフラグはcarry flagしかなかったのですが、zero flagとこの値に応じてジャンプするかどうかを決めるjnzみたいな命令があれば、XORと組み合わせて2つのレジスタの値が等しいかどうかの比較が可能になると思ったからです。他の人は左右シフト命令などを提案していた気がします。そういえば、なんでshiftじゃなくてrotateが実装されていたんでしょうかね。空いたビットをどうすべきか考えなくて良いからでしょうか。

僕は成果報告においてここを担当しました。去年に引き続きCPUの発表になってしまいましたね。

TDD+モブプログラミング

この講義だけ1回しかありませんでしたが、事前講義と合わせると2回でした。事前講義ではそもそもTDDとモブプログラミング(以下モブプロ)とは何なのかという話をして、それから実際にやってみるということをしていました。キャンプ中は講義がなく、最初から実践という形でした。一応軽く説明しておくと、TDD(Test-Driven Development)はテストを先に書き、その後で実装をするという開発手法で、モブプロはコードを書く人(ドライバー)ひとりと指示を出す人(ナビゲーター)複数人に分かれて、ドライバーがナビゲーターに従ってコードを書いていくというものです。

事前講義では、我々のグループはBFSの実装を行いました。アルゴリズムの実装が良いとのアドバイスを受けていて、ならBFSで迷路のゴールに到着できるか判定するプログラムはどうだろう?となったことからです。ナビゲーターのルールとして、「ドライバーに伝わる “最も抽象度の高い伝え方“ で伝える」というものがあったのですが、これがかなり難しかったです。これは「こういうコードを書いて」と具体的にコードの中身をしゃべるのではなく「こういうことをして」とぼかして伝えることにより、ドライバーに裁量を与えるというものですが、どうしても設計を考えると同時にコードが浮かんできてしまい、それを口に出してしまうことが多発していました。

キャンプ中において、我々のグループはToDoアプリの開発を行いました。事前講義から1ヶ月以上が経過していて、僕を含めみんなTDDのことを忘れてしまっていました。抽象度の意識もあまりできていませんでした。

という感じで、全体的にあんまりうまくできなかったなあという感じです。多分試行回数を重ねていけば上達していきそうだなという感じはしたので、今後もし機会があればやってみたいなと思います。

SimHでPDP-7ベアメタルプログラミング

UNIX発祥のマシンことPDP-7のシミュレータ、SimHを用いてベアメタルプログラミングを行いました。アドレスを指定して機械語を直接書き込むことでプログラミングを進めていきました。文字の出力から始まって、入力もして、それからPDP-7がもっていたベクタースキャンディスプレイもシミュレーションされていたため、このあたりも触りました。

講義の最後に、「新たな価値を生み出すOS」について考えました。僕含め3人がGUIに関して言及していて面白かったです。しかも「CUI要素を完全に撤廃し、GUIだけで構成されるOS」という僕と真逆の意見や、「音声や触覚によるインターフェースを備えたOS」のような意見まで、それぞれ出発点が同じでも結論が全く違って面白かったです。他にも、「ディレクトリの概念がないOS」という、僕がしばらく前にツイートしたりしていた事と少し似たことを考えていた人や、「メモリ管理やスケジューラにAIが搭載されているOS」のような興味深い意見も出てきて、面白かったです。

CanSatをはじめよう

CanSat(カンサット4)という空き缶サイズの模擬人工衛星を制御するプログラムを作成し、目的地へ移動させることを目標とした講義です。

ヨー・ピッチ・ロールという未だに理解していない回転の概念が出てきたり、GPSで誤差が発生したりして大変でした。というかそもそも、僕はあまりコードを書いていません。チームの1人にほとんど任せてしまいました。申し訳ない……。

本番直前ではかなり良い感じにゴールへと向かってくれたCanSatが、本番になった途端に意味不明な方向に向かっていってしまって大変でした。まあこれは直前でコード変えたのが原因かな〜と思って、変更箇所をもとに戻して再挑戦したものの、結局うまくいかないまま終わってしまいました。

競技自作入門

セキュリティに関する競技を、レギュレーション含めゼロから自作するというコンセプトの講義です。事前講義において「競技とは何か」について知り、そこからアイデアを出しました。それから、1回目の講義で自分のアイデアを発表し、意見を交わして、そのうち一部を2回目の講義時間で実際に実施してみるという流れで実施しました。

2回目の講義時間では、僕が提案したものを含めた計3つの競技が実施されました。

1つは「英語禁止ChatGPTプログラミング」です。ChatGPTにほぼひらがなのみで構成されたプロンプトを投げ、AtCoderのABCにおけるA・B問題を解答してもらうという問題でした。一応プロンプトにアルファベットやカタカナを使うことも出来ましたが、使えば使うほど減点されていくシステムになっていました。

この競技はかなり難しかったです。というのも、例えば「Nが3で割り切れるならYES、そうでないならNOを出力しろ」という問題において、YESNOで減点されるのは良いとして、僕がこれをChatGPTに投げた時、標準入力から数字を受け取るときに「整数を入力してください」というプロンプトが勝手に付与されるのです。「入力を求める際に出力を行うな」としても出力されるコードが一切変わらず、「inputの引数を空にしろ」と言ったらそもそもinputを使わないコードを出してきて、「input以外の方法で整数を入力するようにあなたが書き換えてくださいね」みたいなことをほざいてきました。他の人のプロンプトを見ましたが、どうも「他の "文字" を出力するな」でどうにかなるらしいです。知らねえよ〜〜〜。ChatGPTが嫌いになりました。

あと1つの競技は「物理CTF」です。写真が与えられるので、その場所に行って、置いてある紙に書かれたflagを提出します。これもなかなか難しくて、自力で解けた問題は1つしかありませんでした。というのも、flagに人が集まってしまうので、自分で見つけなくてもflagの位置がわかってしまうんですよね……。ということで、ほとんど他力本願だったにもかかわらず、2位という結果になりました。やった〜。

そして、僕が提案したのは「人間ローダ」です。講師の人が過去に作成した競技の例として「人間Cコンパイラ」を挙げており、コンパイラがあるならローダもあっていいだろ5という思いで提案しました。あと、ELFについて最低限の知識を持っていたということ、CTFとかでもELFに埋め込まれた文字列解析とかやってそうだしセキュリティにも繋がりそう6という意図もあります。

2回目の講義で実際に実施することが決定してから、前日3時までレギュレーションや問題を考え、当日実施直前の準備時間にも他の受講生からアドバイスをもらって実施しました。20分で。短すぎる〜〜〜〜〜〜!!もっとも、合計3つの競技を90分で実施しなければならず、しかも事前準備時間が設けられていたことを考えると仕方ないことではあります。

学びたくなったこと

CPUの勉強をしたくなりました。そもそも去年からずっっっとやりたいと思ってそのままなんですが、今年も改めてそう感じました。ネクストの講義はもちろん、Yに2つもCPU自作のゼミがあったので刺激されました。CPUって面白いなあと思いますよね。

放り投げてる自作OSも再開したいと思いました。成果発表で現地デモを成功させて会場を沸かせた受講生や、LTで自作OSについて布教する人などの話を聞いたのもそうだし、名刺交換など色々な場面で他の人と自作OSの話をして、やっぱり自作OSは最高だぜという気持ちになりました。

ネットワークについて勉強するべきだと再確認しました。IPA見学のとき、前に居たX3受講生の人たちがすごい専門的なこと(たぶん)を話していて、へ〜これすごいんだ(こなみ)となることしかできませんでした。知識があればもっと楽しかったんだろうなあと思っています。ネットワークに関する知識がないことはしばらく前からコンプレックスじみたものを感じていて、それにこのあたりについて知らないせいで不便を感じることは少なくないので、どうにかして知識を付けていきたいと思います。

  • 今年になってスマホをPixelに買い替えたこともあって、モバイルSuicaを導入したんですが、これ本当の本当に快適ですね。もはや日本とは思えないレベルで便利でした。なぜ去年の時点で物理Suicaを買わなかったのか不思議です。全く買おうとしていなかったのも不思議です。
  • 睡眠時間はポケモンスリープによると06:06 / 04:34 / 05:19 / 04:41 / 04:11です。寝付くまでにかかった時間は08 / 12 / 12 / 11 / 10(分)と、慣れない環境にもかかわらず非常に良好でした。
  • 今回も日記を書いていました。1日目から順に、2,400 + 2,800 + 2,000 + 4,400 + 2,000 == 13,600(すべて大体の文字数)でした。原稿用紙34枚相当かあ……
  • これも日記の話ですが、1日の密度があまりにも高すぎて、午後になった頃にはもう午前のことあんまり覚えてないみたいなことがよく発生していました。日記の情報量が少なくなってしまい、悲しい……まあ時間がなかったので結果オーライという見方もできますが
  • 部屋は普通でしたが、やけに暗かったです。ずっと卓上ライトを点けていたので致命的ではありませんが、部屋の照明で十分明るくなる方が好みなので……
  • 前泊したからわざわざ自腹切って後泊する必要ねえだろと思ってましたが、時間に余裕を持たせるためにも後泊はすべきでした。愚かすぎるマジで……今回最大の失敗はこれです

終わりに

応募の決め手の一部であった「講義における低レイヤ成分の多さ」についてはかなり満足しています。講義の全てが本当に楽しくて、学びも非常に多かったです。また、講義に限らず、オフラインならではの様々な交流もかなり充実したものになったと思っています。それもこれもチューターや講師の方々をはじめ、関わってくれた受講生も含めた皆さんのおかげであると考えています。ありがとうございました。

ところで、キャンプ終了後にこのようなツイートをしました。

ちょっとネタっぽい文面ですが割とマジだと思っています。いやセキュキャンそれ自体に限れば終わりではあるんですが、セキュキャンの終わりは新しい自分の始まり……みたいな、そんな感じの気持ちは間違いなく自分の中にあります。これからもネクストキャンプで学んだことを活かして、キャンプ期間中に受けた刺激を忘れないように、自己研鑽の日々を送っていきたいなあと強く感じています。

それと改めて、人間同士の関わりは大事だなあと感じました。僕は今まで(コミュニケーションが苦手すぎるあまり)これを軽視してきた傾向にあると思っていましたが、オフラインという場で色々なタイミングで色々な人と話したり、名刺を交換したりすることが出来たのは、とても得難い体験だったのではないかと考えています。X(旧Twitter)のフォロワーもめちゃくちゃ増えてありがたい限りです。

加えて、今年初めのGCCで会った様々な人と再開して、色々な話が出来たことが印象に残っています。ぜひ今後も、セキュリティ・キャンプという大きな枠組みに継続的に関わっていきたいなあと改めて思いました。

色々書きましたが、とりあえず僕がやるべきことは受験勉強なので頑張ります……。今後、大学生としてセキュリティ・キャンプに関わっていけるように努力します……。

Footnotes

  1. 08/06に飛行機で東京にいってクロスウェーブ府中に泊まりました。17:30までにチェックイン、食事は夕食から提供。

  2. Network Operations Center?ネットワークに関する設備がたくさんあるところ

  3. もちろんLTじゃなければ何度かあります。例えば台湾留学の成果発表とか。

  4. ずっと呼称が安定しなくて面白かったです。ずっとサンカットと呼んでる人も居たし、キャンサットと呼ばれることも多かった印象です。僕も安定して呼べませんでした

  5. 人間アセンブラや人間リンカがあっても良いと思います

  6. CTF未経験の人間なので間違ったこと言ってたらごめんなさい

icon

わたすけ

高専生 プログラミングでツールを作ったりLinux触ったりゲームしたりしてる
プロフィール詳細はこちら

タグ
「オフライン」の良さ名刺交換LT大会社会見学食事講義の感想学んだ技術の本質から魅力や価値を引き出そう低レベルGPUプログラミングオリジナルCPUを創るTDD+モブプログラミングSimHでPDP-7ベアメタルプログラミングCanSatをはじめよう競技自作入門学びたくなったこと終わりに