KCS AdventCalendar2020 10日目の記事です。
こんにちはyapattaです。
今回SecurityCamp2020に参加してきたのでそれの感想をつらつらと書いていきたいと思います。
SecurityCampとは?
毎年夏に開催される合宿形式のセキュリティ勉強会で、その分野の第一線で活躍する講師と共に学生が力を育む/交流する場みたいな感じです。
今年はコロナの関係で10月末から12月序盤まで2ヶ月間毎週末を使ってゼミや講義、その他イベントを実施しました。
動機
動機は結構適当だったと思います。
- 高校の友人が去年行っていて楽しそうだった
- 界隈の技術が本当に好きな人たちに憧れていた
- セキュリティへの関心が低いので意識を高めたかった
- 欲張りなので情報系の特権的なイベントに片っ端から参加したかった(年齢制限で申し込みが今年までだったのでせっかくなら受けておきたい)
- 春学期正規表現エンジンの仕組みに興味を持ってちょうどそれ関係のゼミがあったから
みたいな感じでした。
あとこの記事に随分モチベーションを頂いた気がします(ハナホジ)。
次はゼミについて、私はZトラックのReDoSの検出プログラムの作成とOSSへの適用を受講しました。
まず選択か集中かコースを選べたと思うのですが、 選択コースだと色んな分野をつまみ食いみたいな感じになってしまう気がして、それならば腰を据えて学んである特定の技能を持ち帰りたいと思い集中コースを選びました。
次に集中コースの中で講義一覧を見たときに正規表現に関する話ならそれなりに知っているし(今年の6月頃に正規表現エンジンをある記事をもとに作ってみた)、申し込み当時計算理論に興味を持っていたためこのゼミを受講したいなと思いました(他のゼミの内容を知らなすぎてついて行けないと思った)。
事前課題
事前課題を解きました。 同じゼミ参加者のayuminさんの記事がうまくまとまっているのでそちらを参考にして下さい(他人のふんどしで相撲を取るスタイル)。
実は参考課題を提出期限当日まで解くことができず、その理由がブラウザのMarkdownビュワーが自動で働いていたせいでこのtxtファイルを自動変換してしまい、色々な文字をエスケープして消していたという理由でした。。。
「/^b*(ab*ab*)*$/
にマッチする文字列を3つ答えて下さい」という問題だったのですが、「/^b(abab)$/
にマッチする文字列を3つ答えて下さい」と表示されてしまっていました。 *
が完全に消えてますね。。。
セルフCryptをしてしまったぜ
賢明な諸君はブラウザのプラグインは完全オフにして問題文を読むんだぞ!!
まあとりあえず気づいて無事提出することができてよかったですね
キャンプ当日
キャンプと言ってもずっと家の中でパソコンと向き合っています。 定期的に休憩をとって肩こり、 眼精疲労を防ぎましょう。
初日
全体講義、 LT大会、 グループワークがメインでした。 全体講義は1ヶ月前であるため大分忘れています、 一文で簡潔に何を聞いたか書きます。
特別講演(倫理)では、 技術力がある自分たちは犯罪を起こせるほどの力を持っていることの自覚の促し、 自分を守るためにも法律理解の重要性の啓発をしていた気がします。
特別講(一般)では、 まだないものを始めるときに法律が現在どうなっているか、 目的に適した組織をどう作るかみたいな話をしていた気がします。
LT大会では強そうな人達が強そうなLTをしてました(小並感)。 DNS名前解決ができる自作OSとか作っている人がいました、 すごすぎてマジでよくわからない。
内容忘れないためにも聞いた日に記事の草稿書けばよかった(絶対書かないやつ)。
集中講義(ReDoSの検出プログラムの作成とOSSへの適用)
では次にメインの集中講義について。
ざっくり自分たちがやった内容はESLintを用いてOSSのソースコードを静的解析することでReDos脆弱性を持つ正規表現を検知するということです。 OSSにReDos脆弱性を伝えて貢献するところは後ほどやりたいですね。
下の発表資料を見て雰囲気を掴んでいただけたらありがたいです。これに大体やったことが書いてあります。
www2.slideshare.net
これがZトラック内での発表資料です。 上より少し詳しく書かれています(皆で急いで作ったので内容に粗さがあるかもです)。
www2.slideshare.net
では次に講座の流れを振り返ります。
まず初回の授業でReDos検出アルゴリズムの概要を講義してもらいました。 その後、受講生の興味に合わせてアルゴリズムチーム、Linterチームのどちらかに割り振られました。
私はアルゴリズムチームに割り振られたのでこれ以降は主にアルゴリズムチームでやったことについて話します。
実際にオートマトン(Epsilon-NFA)を各個人で実装し基本的なオートマトンの仕組みを学びました。
その後、一つのGitHubプロジェクトのもとそれぞれ役割分担をしてReDos検出アルゴリズムを実装していきました。
自分がメインで取り組んだ実装は強連結成分分解、直積グラフの構成、EDA構造の検出、枝切りあたりです。
講師、チームメイトが本当に優秀でわからないときその都度助けてもらいました。
最後にアルゴリズムチームが作ったReDos検知プログラムをESLint側に取り込み実際にOSSのReDos脆弱性を検知することを試しました。
また追加で必要な機能があったら戻って実装もしました。
最後に全体の感想を書くのでここでは軽い感想に留めますが、チームメイトの方々の実装が美しく常に学びでいっぱいでした。TypeScriptの型システム詳しくなりたい。
選択講義
選択講義も余分に受けられると聞いて、B3:クラウド時代における分散Webシステムの構成とスケーリング、B4:つくって学ぶ、インターネットのアーキテクチャと運用を追加受講しました。
Webとインフラが好きだったので受講しました。簡単に内容と感想を述べます。
B3はスケーリングというよりはAzureで作るサーバーレスアプリケーションという感じでした。 講義中割り振られたチームでスケーリングのための案を出し合い事前準備したアプリケーションの機能を追加して最後に発表しました( スケーリングの案を実装できたチームはほとんどなかったです)。 まあAzureでサーバーレスアプリケーションを作ったことがなかった中、お金を気にせずにそれを体験できて良かったです。
B4はDNS、BGPセキュリティなど実機にアクセスしながら試す講義でした。 ついていくので精一杯でした。DNS、BGP、RPKI周り詳しくなりたい。
集中講義+選択講義がある週は土日休む間もなく正直辛かったです(セキュキャン後の月曜実験が究極に虚無+だるかった)。
まあせっかく機会が与えられているわけですし、自信があったら積極的に取ってもいいのではないでしょうか。
感想
2ヶ月間常に頭の片隅にSecurityCampがあって常に実装しなきゃという気分になっていたのは辛かったです。 しかし、その道のプロにいつでも聞ける環境、また大学では出会えない仲間、まだ世の中に無いものを作る楽しさ、などなど挙げたらきりがない「こんなに味わっていいのか?」と思える恩恵を受けました。
同時にただ享受するだけでなく、講師の方々のように自分が周りに知恵を授けられる人間になりたいとも思いました。
精進したいですね。
最後に、忙しい自分の時間を削ってまで僕らのために時間を取ってくださった講師、チューターの方々、共に大変な実装を続けて最後までやりきった同じゼミの方々、この場を借りてお礼申し上げます。
ありがとうございました。