ビーコンの創出

なんか作ったり報告したり。

これがセキュリティ・ネクストキャンプ2019【参加記】

2019年の8月13日(火)から8月17日(土)にわたって開催されたセキュリティ・ネクストキャンプに参加してきました。 その様子を時系列に沿って書いていきます。

目次


ネクストキャンプとは

セキュリティ・キャンプ全国大会の次の教育機会を提供
遠慮も容赦もない超ハイレベルな講義の5日間!

セキュリティ・ネクストキャンプ2019 ホームより引用

セキュリティ・キャンプ全国大会の次のステップとして今年から始まったプログラムです。 年齢制限が25歳以下であり、全国大会行きたいけど行けない!という人でも、参加できます。

ネクストキャンプ2019参加者は6名、うち全国大会修了生は2人でした。

参加者Tシャツ2019(左)と2017(右)参加者Tシャツ
参加者Tシャツ2019(左)と2017(右)

自分は2年前に全国大会2017に修了した身としての参加となります。参加者Tシャツ2枚所持は、なかなかのレアです。

当時の様子:セキュリティ・キャンプ全国大会2017に行ってきました - ビーコンの創出


ネクストは、本当に容赦ない濃いぃ〜5日間でした...。


応募課題

応募課題は、以下の4項目について記述しました。

  1. 今までどのようなことをやってきたか
  2. 課題解決に関する問い
  3. 興味のある講義について
  4. アピールしたい点

2の課題解決に関する問いについてですが、「自身で何らかの疑問・課題・問題を設定し、それについて取り組み、その過程を示すことで、自身の技術力や課題に取り組むやりかたを説明してください。」 とのことでした。

設定する課題は何でも構わないとのことだったので、直近で一番頑張った出来事である「一週間後にみんなが集まれる場所(都内)であまりお金をかけずに本物の竹で流しそうめんを実施する」企画について、竹の伐採や下見・試作など全12工程について詳細に記述しました。

この課題、今振り返るととってもネクストキャンプらしさを感じます。詳細な手順など知らん、自分で定めて、自分で調べて、自分で解決しろ!というあたりが。


1日目

ネクストのみんなとのご対面。

ロバストプロトコルどうですか?」

キャンプ中はこの話題で持ちきりです。


会場のWi-Fiのパスワードの雰囲気で「あ、再びセキュリティ・キャンプに帰ってこれたんだ」と実感しました。


全国大会の皆さんがグループワークをしている初日、いきなり講義がスタート。


講義1 俺のTPM/TEEスキルで転生後も無敵です

耐タンパー性などの、厳密なアクセス制御のもとに鍵を保存する機能を持ったものをセキュアエレメントと言います。 身近なところだと、VISAのICチップやSuicaなどの決済系のデバイスにはセキュアエレメントが付いています。

TPM/TEEとはこのセキュアエレメントを実装するための仕様のことです。

この講義では、その実装のミスや脆弱性により引き起こる危険性について学びました。


宿題

ホームルーム・宿題時間という枠が毎日1~2時間ほど設けられていて、てっきり事前学習ができる時間だと思っていました。

ホームルームの時間には講師の方がやってきて、宿題というものが出されます。

  • 講義1「講義で出題した宿題を翌朝までに提出して」
  • 講義2「貸与PCでPythonの環境構築しておいて」
  • 講義3「VMから本番の環境にsshで接続できるか確認しておいて」
  • 講義4「明日の講義までに講義資料読んでおいて」
  • 講義6「本番で使うLANケーブル配布したよ、レギュレーション考えて、そのプロトコルも作って」

ボク「▂▅▇█▓▒ (’ω’) ▒▓█▇▅▂うわああああああ 」


VirtualBoxでホストOSからゲストOSにssh接続するところから詰まっていました。助けてくれたネクストのみんな、ありがとう。


2日目

講義2-1 攻撃検知エンジンの開発

XSS文字列と正常文字列を分類する機械学習モデルを作成するという講義です。

事前学習では、以下のようなレベル1のデータに対して、XSSか正常かを分類するモデルを作ってくるとのことでした。

レベル2以降は講義が始まってから順次解禁されていきます。

レベル 特徴
1 比較的単純な文字列 ></iframe><script>alert(1);</script> (XSS)
2 複雑なXSS文字列 "><script>eval("al"+"ert(1)");</script>(XSS)
3 教師なしデータ <strong><em>Doubleclick</em></strong> (ラベルなし)
4 XSSのような正常文字列 This alert is for the malicious script. (正常)

このような文字列を分類するには以下のような流れで行います。

入力文字列→前処理→ベクトル化→最後にモデルで学習して出力する


前半の講義では、レベル1で作ったモデルと結果・考察を発表し、講師の方からフィードバックをもらい、改善点を踏まえて次のレベル2のモデルを作成し発表をしました。

TF-IDFでのベクトル化は精度が高く、Word2Vecでのベクトル化はうまくいかないなど、6人全員がそれぞれ違ったアプローチを共有できたため、効率良く勉強になりました。

レベル3については、6人で1つクラスタリングで分類せよという宿題が出ました。


講義3-1 エミュレータによるCPU特殊命令の追加の実験

この講義では、SECCON CTF 2018 国際大会に出題された問題を、作問された坂井先生直々に解き方を学ぶことができます。

アーキテクチャの実行ファイルは、独自の特殊命令を利用しているため、普通に実行するとprogram stopped with signal 4 (Illegal instruction).のようになり実行できません。

これらの実行ファイルに対して、特殊命令が実装されていない手元のデバッガで静的解析したり、特殊命令が実装されたエミュレータ上で動的解析しながら、特殊命令を推測します。

アーキテクチャは全部で10種類あり、割り振られたアーキテクチャで特殊命令を推測して再実装するという宿題が出ました。


講義4-1/4-2 だまされないGPS

この講義では、GPSの仕組みを理解しながら、GPSをだませば何ができるか、だまされないためにどうすれば良いかを考えました。

改ざんされたGPSデータに対して手を動かしながら、異常な航法メッセージを特定したり、偽装された位置情報の推定をしていきます。 実際にスプーフィングを行うデモもありました。

GPSのセキュリティ脅威として以下が挙げられます。

  • ジャミング
  • ミーコニング
  • スプーフィング
  • 位置情報の偽装

これらの対策として、航法メッセージなどが正常かをチェックしたり、指向性アンテナを使用してGPS衛星が存在する方向から来る電波だけを受信するなどがあることを学びました。


宿題

今日出た新たな宿題です。

ロバストプロトコル未実装ボク「▂▅▇█▓▒ (’ω’) ▒▓█▇▅▂うわああああああ 」


3日目

講義2-2 攻撃検知エンジンの開発

昨日の食事の休み時間等を使って、我々が完成させた方法は、TF-IDFでベクトル化し、K-meansでクラスタリングするというものでした。

ラベルが分かっているレベル1, 2のデータで、ベクトル化、クラスタリングも様々な手法を試した結果この2つを採用したのですが、講師の方からダメ出しをされます。

講師「パラメータは調整しましたか?」

我々「い、いいえ」

講師「Grid Searchしないとダメでしょ」

データの分布とクラスタリング手法
データの分布とクラスタリング手法

どのクラスタリング手法を使うかは、まずベクトル化した特徴量をプロットして、大まかに判断できます。

その後それぞれのアルゴリズムでパラメータをGrid Searchをするものです。

クラスタ数がわからないときは、シルエット分析を使ってまだ分割できそうかを判断できます。


今までのフィードバックを踏まえてレベル4を作成して、発表しました。

また、講義として機械学習脆弱性について、Adversarial Examples、Model Extraction、Decision boundary manipulation、Neural trojanの4つ教わりました。中でもNeural trojanは、モデルにバックドアを仕込むという手法で、他人の作ったモデルが信頼できなくなるなあという印象を受けました。


講義5-1 暗号アルゴリズムFPGA実装

この講義では、AESの仕様書を読んで、FPGAで実装します。

事前学習でのAESのアルゴリズムc言語での実装、Verilogコードについて復習し、まだどこか高速化できないかを探しました。

Model Simでシミュレーションして、正しく動作しているかを確認します。

ModelSimでAESのVerilogコードをシミュレーション
ModelSimでAESのVerilogコードをシミュレーション

明日の講義ではこれを実機のFPGAで動作させます。


夕食をわずか30分で食べ終えたみんな「やった、1時間も宿題できんじゃん」


宿題

最終日に10分間成果発表をするということで、1人ずつ印象に残った講義について話すことにしました。

しかし、最終日の午前中まで講義がぎっしり詰まって、その課題に追われています。

一体いつ準備すればいいんだー!?


4日目

講義6-1 ロバストプロトコルを考案せよ

LANケーブルに物理的にノイズを入れた状態でも、ファイルをたくさん送信できるようなプロトコルを作りなさいという講義です。

最も多くファイルを転送できた人が優勝というコンペ形式でした。

この大会のレギュレーションもタイムスケジュールも全て自分たちで決めさせていただけるという、我々の自主性を発揮できる素晴らしい授業でした。


ノイズを注入するLANケーブルを作るところから事前学習で始まっていました。できたとは言っていない。

被膜を剥がすのですが、ダイソーのLANケーブルは極細なヨリ線のためちぎれやすくて無理でした。

ノイズを注入するためのLANケーブルを作る
ノイズを注入するためのLANケーブルを作る

最終日の大会に向けてレギュレーションとタイムスケジュールを話し合って決めました。


講義3-2 エミュレータによるCPU特殊命令の追加の実験

各自が担当したアーキテクチャについて宿題でどこまでわかったか、実演を交えながら発表しました。

自分はMN10300というアーキテクチャを担当しました。Panasonicの32ビットマイコンです。

MN10300をgdbでデバッグして特殊命令を推測する様子
MN10300をgdbデバッグして特殊命令を推測する様子

乱数生成アルゴリズムがXorshiftというところまでわかったのですが、アルゴリズムの理解が甘くて、どのタイプのXorshiftなのかまで特定できませんでした。

xorshiftは8種類(実質4種類)ある
Xorshiftは8種類(実質4種類)ある

その先のエミュレータへの特殊命令の実装まで行きたかったですね。その後の課題となります。

ARMのアーキテクチャを担当した方は、エミュレータへの実装で詰まっていましたが、坂井先生が解決してFlagが表示されるという素晴らしい展開に。お見事でした!


まとめ

以下、講師の坂井先生によるまとめです。心に響きました。


いろんなアーキテクチャを触るのはいいことで、共通点相違点が見つかる。

共通点がCPUの本質であり、相違点が実装の違い。 どのアーキにもレジスタがある(本質)けれど、引数や返り値をどう扱うかはそれぞれ違う。

これはCPUに限らずOSなど他のことでも言えること。 いろんな実装を見ることで見つかるものがある。


また、エミュレータとは実機の代替ではなく、実装技術を示すことができるもの。

イデアがありますだけだと予算は出ないので、話を通すためにサンプルを実装できるというのがエミュレータの使い方でもある。


講義5-2 暗号アルゴリズムFPGA実装

2回目の講義では、QuartusでVerilogコンパイルし、実機Cycolone IVで動作させました。

ノンブロッキング代入でスワップできることを使って、Shift Rowsを並列処理で実装することに成功しました。やったー!

FPGAが暗号化で39と出力している様子
FPGAが暗号化の結果を39と出力している様子


最後の晩餐にて

「熱っ!!!」

3人が鍋に手を当てて火傷していました。


宿題

残された宿題はあと1つ。

ロバストプロトコルを作成せよ。

今朝決まったレギュレーションに対応したプロトコルを完成させるだけだ。


5日目

みなさんはどれくらい睡眠できたのでしょうか。

明け方5時半にもSlackの通知がありました。


講義7 モブプログラミング

モブプログラミングとは、 1 台のパソコンを複数人で使うプログラミング手法です。1人がコードを打ち込む人(ドライバー)、残りが指示を出す人(ナビゲーター)となって、わいわいがやがやとプログラミングを行います。 ペアプログラミングの複数人バージョンとも言えるでしょう。

講義では、cyber-dojoを使ってテスト駆動開発をしました。言語はみんなが書けるPythonです。

この講義、自分が一番楽しかったと思う講義です。その理由は、

  • みんなプログラミングがめちゃくちゃできる
  • みんなのスマートな記述が非常に参考になる
  • 書き方がわからなくても、誰かがコードを口で言うのでそれをそのまま書けばいい
  • カンマの後にスペースを入れないと野次が飛ぶ
  • インデントがスペース2つだと野次が飛ぶ
  • swapを自分の名前っぽくタイポすると野次が飛ぶ

出会って5日目ということで、口出ししやすい環境だったというのが大きいです。

みんなプログラミング強すぎて、「100 doors」という問題がたったの15分で終わり、2問目「Reversi」に突入しました。

実際に書いたReversiのテストコード
実際に書いたReversiのテストコード

あとちょっとで完成でした...。

この講義だけ1時間30分しか無くて、あっという間に終わってしまいました。 もっとやりたかったな。


講義6-2 ロバストプロトコルを考案せよ

ラスボスです。

各自作成したプロトコルで、1分間にいくつのファイルを転送できるかの勝負です。 送信側、受信側のそれぞれにノイズを注入して2回計測します。

結果はなんと2位でした!!!

自分が作ったプロトコル

自分は損失を気にしないプロトコルを作成しました。 github.com

UDPで送れる最大データサイズは約64Kbytesなので、100Kbytesのファイルは2つのUDPパケットで送ることができます。 この最大データサイズレベルのUDPでも、レギュレーションの最小ノイズ間隔(100ms)でも1~2個送れることが昨夜の実験により明らかになったのです。

じゃあ、余計な再送処理とかせずに、誤ってもいいから、片っ端からファイル送りまくろうぜという結論になりました。

しかも、このプロトコルレスポンスが一切ありません(受信側の線を使わない)。 ノイズは片方にしか注入されないため、受信側にノイズがある時は、実質ノイズ無し状態で送信することが可能です。

UDPにファイルを2分割させて送信、損失は気にしない
UDPにファイルを2分割させて送信、損失は気にしない

誤りなく送信できたファイル数で競うというレギュレーションとノイズの間隔が地味に広いことを踏まえて出来上がりました。

果たしてプロトコルと言えるのか疑問が残るところですが、1回目(163/347)、2回目(792/799)という驚異的な記録となりました。幸い、2回目は競技時間外での計測となり、参考記録となったため、1位は免れました。こんなんじゃ1位受けとれないよ。

なお、1位のかわしんくんがこの講義についての詳細をブログにしています。損失率0%は素晴らしい!ぜひご覧ください。

kawasin73.hatenablog.com


ネクストキャンプ全ての講義を終えてのランチは清々しいものでした。


部屋のスイッチを切るとコンセントが切れるという現象に対して、PC、iPhoneの充電音(フォ〜ン♪)で気づいたなどの部屋あるあるで盛り上がってました。


ボク「風呂沸くの速いよね」

「え?湯船つかってないが」

「「シャワーだが」」

「風呂入ってる余裕ある?」

ボク「!?!?」


宿題

おおっと、まだ宿題がありました。

成果報告会のスライド作成と発表が残っています。


直前にスライドを完成させて...



無事発表できました。


感想

ネクストキャンプ全体の感想として、非常に疲れました

講義中だけでなく、大会期間中は常に焦っていていました。ほとんどの講義は日をまたいで2回行われ、次の回までに宿題を課せられていたからです。

食事もネクストのみんなは30分で済ませ、残りの1時間くらい宿題事前学習に費やしていました。 食事中の会話も、どうやって実装すればいいかについて話し合っていました。

部屋に戻ったら1時過ぎまで宿題、翌朝6時から宿題をしていました。ここまで追い詰められるのは初めてで、何度も心が折れそうになりました。

しかし、ネクストのみんなはとっても勉強熱心で、「自分もみんなみたいになりたい」という一心で必死にしがみついて行きました。


そんなネクストキャンプを乗り越えた今の自分は、本当に成長したと胸を張って言うことができます。

現段階で得たことは大きく3つあります。


1つ目は、あらゆる分野にも抵抗なく取り組めるようになったことです。

自分はコンピュータビジョンを専攻しており、今回の講義の内容は専門外の領域でした。 未知の領域の課題を自分で解決することが求められていました。

全国大会とは違い、手取り足取りやり方を教えてはくれません。 それが大変な反面、一番の勉強になっています。

今後自分が取り組んでいくであろう課題は、未知の分野でしょう。 それに対応していく力が身についたことが得られたこととして大きいです。


2つ目は、ネクストのみんなと共に課題に取り組み、その取り組み方を学べたことです。

講義6「ロバストプロトコルを考案せよ」では、具体的にこうやって作るなどの指示はありません。 プロトコルなど作ったことないし、どう作ったらいいかわからない状態でした。

ネクストのみんなはこの課題に対し、TCP/IPの本を読んだり、QUICの論文を読むなどしていました。 そうやって取り組むべきだったのかと反省しました。

また、僕が仮想環境にsshするやり方を聞いた時に、その多くの手順を一瞬で教えてくれました。 事前課題でやったことをノートアプリ等できちんとまとめていて、同じことがあったらすぐに解決できるようにしてあるそうです。

こうした取り組み方を知ることが非常に参考になりました。


3つ目は、ネクストのみんなに出会えたことです。

ネクストのみんなは非常に優秀であり、話を聞けばものの本質まできちんと理解しているんだなあと感じます。 同じ課題を与えられ、同じ問題を乗り越えていく、その過程をみんなと共有できたのが非常に楽しく刺激的でした。 仲間たちと過ごした5日間はあっという間で、本当に貴重な時間です。 そんな仲間と出会えたことが一番の大きなことだと感じています。

今後もネクストのみんなと共に大会に参加するなどして、仲良くしていきたいです。


みんなのブログ

すでに他のネクストキャンプ参加者の人たちがブログを投稿しています。

かわしんくんは講義6「ロバストプロトコルを考案せよ」で栄冠を手にしました。この講義および彼が作成したRobustpについて詳しく書かれています。 kawasin73.hatenablog.com

さわだくんはモブプログラミングでswapをsawapとタイポしていました。各講義について深くまでまとまっています。 takuzoo3868.hatenablog.com


頂戴したもの

頂戴したもの
ネクストキャンプ2019で頂戴したもの

セキュリティ・ネクストキャンプは、講師・運営の皆様、お国の税金、協賛企業などの数多のご支援によって成り立っています。 貴重な経験をさせてくださった皆様にこの場で感謝を申し上げます。


最後に

この記事をご覧になって参加資格がある人はぜひセキュリティ・ネクストキャンプに参加して欲しいです。 本当に貴重な経験になることを保証します。