セキュリティキャンプ2024 ネクスト 参加記
2024年8月12日~8月17日に開催されたセキュリティキャンプ2024にネクスト受講生として参加してきました。 今年のネクストは応募倍率14倍だったらしく、拾ってもらったからにはと気を引き締めて頑張りました。 本ブログでは、いくつか受講した講義をピックアップして内容および感想を紹介します。
共通講義
K1『ゲームセキュリティの歴史』
本講義では、ゲームにおける不正の歴史と現状を振り返り、どのような技術的対策が行われ、どのように法律が変化してきたかについて解説いただきました。スーパーファミコン、ニンテンドーDSなど多くのゲーム機では、マジックコンピュータ(通称マジコン)という、ゲームソフトを複製する、あるいは公式に提供されていない機能を実現するハードウェア装置が多く出回りました。不正コピーの被害はゲームだけでなく商用ソフトウェアも受けており、「一太郎の解説本が一太郎の10倍売れた」というエピソードはなかなか強烈でした。歴史を通して不正コピーとチートとの攻防はどこまでいってもいたちごっこだなぁという印象でした。防御側の技術的な対策としては、認証や暗号化、難読化により複製をしにくくする方法、複製されたら環境が壊れるようにする方法(私的制裁なので開発者倫理として疑問)などの対策が紹介されました。ただ、攻撃側は、機器が手元にある分いくらでも解析できるため有利です。そのため、技術だけではなく法律で対応しようとしていて、例えば、著作権法や不正競争防止法でコピーガード回避を禁止しています。ググってみると、実際に2011年頃にマジコン販売が不正競争防止法の改正により刑事罰対象になっていました。最近では、FPSなどのオンラインゲームでのチートも被害が拡大しています。私の研究室では、オンラインゲームのチート対策に関する研究が行われています。TEEや準同型暗号といった暗号化技術で防ごうという手法にはなりますが、オーバーヘッドが大きくてFPSなどのリアルタイム性が必要なゲームへの適用はまだ現実的ではありません。このように、ユーザビリティを損なうという意味でも技術的な対策には限界があります。そのため、マジコン販売が法改正により禁止されたように、オンラインチートも法改正により刑事罰対象にならないのか疑問に思っています。と、思って調べてみたら、電子計算機損壊等業務妨害罪に問われた事例があるみたいでした。さいごに、ゲームセキュリティの分野の課題として、刑法罰になる境界や倫理上問題ない境界、合法である境界があいまいであるが故に「技術的にできる⇒やっていい」思われてしまっているのではと思いました。
T1『日本発のサイバー技術の造り方』
本講義では登大遊先生から、日本が世界に通用する高品質なサイバー技術を生み出す方法について解説いただきました。その方法論について登先生が重要視されているなと感じたのは、①実験的で自由な試行錯誤を許容する環境を設けること、②システムソフトウェア領域とネットワークシステム領域において知見のあるICT技術者を育成することでした。②に関して、クラウド人材がクラウドを作る人ではなくクラウドを使う人というのはいかがなものか、というご指摘はWeb屋の私自身とても刺さるものがありました。。。
そんな中、今回のセキュリティキャンプ ネクストのテーマは「基盤技術の魅力」とある通り、社会基盤〜アプリケーション基盤〜物理基盤といった基盤技術に触れられました。
ネクスト専門講義
N2『C++ ライブラリ開発』
本講義では、Siv3Dの開発者である鈴木さんから、可読性とユーザーフレンドリーな設計を兼ね備えた高性能ライブラリを、C++23を使って開発する方法について学びました。具体的には、二次元座標を表すPoint class、RGBで色を表すColor class、ファイルへの読み書きを行うBinaryFileReader/Writer class、これらを利用して画像を表すImage class、Image classをさらに拡張してビットマップを表すBMP classを実装しました。普段C++を書いていてバグの原因特定が非常に難しいという感触があって、なんとかならないものかと感じていましたが、C++23の構文や設計パターンを用いることで、堅牢で可読性のあるプログラムが作れることが実感できました。例えば、pImplパターン(pointer to implementation)やconstexpr構文、はかなり印象的でした。C++の言語仕様は後方互換性を保ちつつ、新たに構文を追加することで、より堅牢な記述を可能にすることを目指ししています。だからこそ、こういった新しい構文を継続的に学んでいくことが大切だと感じました。
N3『DNSの運用における潜在的リスクと対処について』
本講義では、MyDNS.JPの開発者である鏑木さんから、昔話編としてアマチュア無線機の話題、本編としてダイナミックDNSを運営する上での苦労や、ダイナミックDNSの技術的知見について解説いただきました。昔話編で印象的だったのは、組込みシステムではよく使われている「状態遷移表を用いた設計手法」でした。具体的には、横軸に示した状態で 縦軸に示した事象が起こったときに、セルに示した処理が実行される、という表現方法です。何が嬉しいかというと、状態遷移が複雑になった際に、単にif文条件分岐で実装しようとするとプログラムが非常に複雑になる一方、状態遷移表だと設計段階で品質を担保することができます。そんな昔話も交えつつ、MyDNSの運用編では、時代の流れに合わせてIPv4/IPv6デュアルスタック対応したり、サーバメンテナンスのためにマネタイズをしたりなどのお話をお伺いし、サービスを独自運用する魅力や苦労を知ることができました。
N4『Content Delivery Network を自作してみよう』
本講義では、前半で仮想環境内でのCDN構築、後半で実機を用いたネットワーク構築演習を行いました。前半講義がとても印象的で、GSLBの動作原理を学んだのち、GSLBのクエリ処理ロジックを実装する演習を行いました。 地域から一番RTTが最も短いPoPのIPアドレスを返すクエリや、GeoIPによる地理的に最も近いIPアドレスを返すクエリを実装した人がいました。ちなみに私は、IP Hashに基づいたルーティングクエリを実装してみました。これは、同じユーザを常に同じPoPにルーティングさせることで、セッションに一貫性を持たせたい、という意図で実装しました。この実装に対し講師の上野さんからは、DoS攻撃に対する対策としても有効で、DoS攻撃によってPoPを全滅させられる危険性を軽減できるというフィードバックをいただき、大変勉強になりました。
N6『TCP/IPプロトコルスタック自作入門』
本講義ではまず事前課題として、KLab Expert Camp「TCP/IPプロトコルスタック自作開発」を参照しながら、教育用のプロトコルスタック「microps」を実装しました。具体的には、ネットワークデバイスの登録→Ethernetフレームの組み立てと送受信→ARP→IP/ICMP/UDP/TCPを処理するプログラムを実装しました。ただし、この段階ではカーネル空間ではなくユーザ空間で動作する実装となります。講義では、実装したプロトコルスタックを教育用OSのxv6のカーネル空間で動作するよう移植しました。私の動作環境について補足すると、事前課題はMacOS > Ubuntu DevContainer (Docker) > microps、講義ではMacOS > Ubuntu DevContainer (Docker) > QEMU > xv6 > micropsという環境で作業を進めました。事前課題のmicropsの実装では、コード量が大きくなるにつれて各コンポーネントの構成や呼び出し関係のフローを把握するのが難しく感じたので、個人的に以下のような図を書いて整理していました。
実際に手を動かすことで感じた面白かった点として、ICMPの実装は印象的でした。IPとICMPはどちらもインターネット層で同階層のプロトコルで、プロトコルスタックとしても同階層として別々に実装するのかなと予想して読み進めてみると、そうではなく、ICMPをIPの上位プロトコルとして見立てて実装していました。ICMPヘッダのパケット構造は「MACアドレス>IPヘッダ>ICMPヘッダ>データ」なので言われてみればそらそうなんですが、実際に実装しようとしてみないと気づかなかった点でした。また、実装で難しかったのはTCPの状態遷移あたりの処理でした。これはTCPがややこしいというよりかは、状態遷移によってif文条件分岐が複雑化したことが混乱の要因でした。今回はC言語での手続型な実装でしたが、これが例えば前述した状態遷移表や、デザインパターンでいうところのState patternで実装してみるとどうなるのかも気になっています。
- micropsリポジトリ:https://github.com/pandax381/microps
- KLab Expert Camp講義資料:https://drive.google.com/drive/folders/1k2vymbC3vUk5CTJbay4LLEdZ9HemIpZe
- ネクスト講義資料:https://github.com/pandax381/seccamp2024
謝辞
セキュリティキャンプ開催にあたりご尽力いただいた運営関係者のみなさまに心より感謝申し上げます。 このような貴重な機会をいただき誠にありがとうございました。