(この記事は,セキュリティ・キャンプ2020の(A1)ロバストプロコル・オープンチャレンジ運営会議と,(A8)ロバストプロコル・オープンチャレンジ大会の参加記です.)

どーも75u2uです.

今回,ロバストなプロトコルを競う大会の運営をしてみました.
大会の内容をザックリいうと,競技参加者が大会までに『運営側で用意した物理的な通信障害が発生するLANを通してデータ転送する時により高速に,誤りが少なく転送できるプロトコルを自作して競おうZE!!』っていう大会です.
なんかめっちゃ楽しそうですね!!

ちなみに”ロバストプロトコル”ではなく,”ロバストプロコル“です.

“ロバストプロトコル”ではなく,”ロバストプロコル“です.(大事なことなのでry)

(A1)ロバストプロコル・オープンチャレンジ運営会議

A1では,A8の大会のレギュレーション策定や,実行委員としての役割決めなどを行いました.
予めレギュレーションや環境構築等は事前に個人的にやっていたため会議はスムーズに進みました.

大まかには図のような流れで競技をすることに決めました.(図はTaro->Hanakoの場合)

TaroとHanakoは,それぞれRaspberry Piのホスト名を表していて,競技はTaro->Hanakoを2回,Hanako->Taroを2回のデータ転送を行い,評価します.
評価方法は,破損無しデータ1個につき10pts,破損データ1個につき-10ptsという具合で,データ破損には厳しいペナルティを設けました.

これにはワケがあり,去年のネクストキャンプでデータ破損にはペナルティを設けなかったため,とある人物UDPでデータを連射して2位を取った事例があるからです.

これはこれでレギュレーションの穴を突いたエレガントな戦略ですが,今年も同様のペナルティ無しにすると同じような戦略を取ってくる方が出てきそうだったため,今年はあえて大きなペナルティを設けたというワケです.
ちなみに,このとある人物は,このA1,A8講義の講師です.

(A8)ロバストプロコル・オープンチャレンジ大会

大会は個人戦・団体戦の2構成で行いました.
実は大会開催前に受講生のレベルを問うアンケートを行いました.
個人で実装できる方がA8受講生全体の1/3程度しかおらず,時間を持て余してしまうことから団体戦を行い,団体戦のみ120minのチーム開発時間を設けました.
チームを3チームに分け,1チームあたり4人に割当てました.また,チームリーダーを個人戦参加者でネクストキャンプ生にお任せすることでスムーズに開発が進むよう手筈しました.
チーム割り当ては大会前から公表しており,slackに各チームのプライベートチャンネルも作ることで大会当日のチーム開発時間を有意義に使えるように誘導しました.
競技者の協力もあって,割り当ててから間もなく,開発方針や言語,プロトコルのデザインなどの議論が各チーム,活発に議論され,大会当日はコーディング&テストだけで済んだチームが多かった印象でした.

タイムテーブルはこんな感じ.

  • [4hour = 240min]
  • [10min] オープニング & 個人戦競技説明
  • [11min / 1人] 個人戦(4人)
    • [2min] オペレータ準備
    • [4min] 競技開始
    • [5min] アルゴリズムの紹介 (裏でランキング更新 & オペレータ後始末)
  • [5min] 結果発表 & 表彰式
  • [5min] 団体戦競技説明
  • [120min] チーム開発
  • [11min / 1チーム] 団体戦(3チーム)
    • [2min] オペレータ準備
    • [4min] 競技開始
    • [5min] アルゴリズムの紹介 (裏でランキング更新 & オペレータ後始末)
  • [20min] 結果発表 & 表彰式 & 講師・チューターの総評

大会の設計・環境構築が大まかできて時間が空いた私は,可視化システム実装に取り組みました.

可視化システムを動かした図です. 可視化できるのは,
  • 流れるパケット
  • パケットの流れる方向
  • プロトコル

ぐらいです.
突貫工事で作ったということもあり,機能が少ないのとバグだらけなのはご了承を.
コードはここです.

PHPでサーバを建ててるんですが,可視化の処理をほぼほぼJavaScriptで書いてます.
オブジェクト生成や動きの表現にはThree.jsというライブラリを使いました.webGLを素直に書くよりめっちゃラクなのでおすすめ.

実は競技者の中でEthernetフレームを使ってくる方がいたので,次使うまでには改善したいですね….

大会中のYouTubeLive配信ではこんな感じでした.

ちなみに,Live配信には,実行委員の1人であり,同じSecHack365坂井ゼミ修了生が引き受けてくれました.
右側が私の可視化システムで,左側が彼の作ってくれた可視化システムです.

彼の作ったものは,時間軸でパケットサイズが見れるというものです.(恐らく,横軸:時間[ms],縦軸:パケットサイズ[byte])
各競技者の作ったプロトコルにより,パケットサイズが均等だったり,乱雑に変動したりしてプロトコルの個性が一目でわかるというものでした.

名前を伏せて個人戦の結果だけを載せておきます.

なんと,個人戦競技者の皆さん,データ破損(failed)の数0&送信データ数3桁というとても優秀な結果でした.(100KBの乱数データを1000個送信するというレギュレーション)
その中でもDさんがダントツでポイントが高いです.最終得点5215ptsで,Hanako->Taroの1回目が1000個中,驚異の709個!

(各競技者の自作プロトコルの紹介もしたいところですが,ここでは割愛させていただきます.)
競技者の方で参加記や自作プロトコルの紹介をブログなどに公開している方はぜひこの記事のコメントでURLを載せてほしいです.

↓ 今岡講師,麻生講師,可視化システムのスリーショット

まとめ

とにかく大会までの準備と大会当日の進行がすごい大変でした!
しかし自作プロトコルの楽しさと奥深さを共有するため,外部イベントや勉強会などで開催できたらいいなと思います:-)