セキュリティネクストキャンプ2019 参加記
どうも,冷房大好き人間さわだです.
8月13〜17日に府中で実施された,セキュリティネクストキャンプ2019に参加してきました.
どんなものか気になっていた方のためにも書かなければと使命感に燃えながら綴ります.
はじめに
セキュリティネクストキャンプとは,セキュリティ・キャンプ全国大会と同時開催のキャンプ修了生に用意された次のステップのセキュキャンという位置付けです*1.しかし,全国大会が22歳までであったのに対して,ネクストは25歳まで,しかも,修了生でなくても「やぁやぁ我こそは」という学生なら応募できる素晴らしい合宿です(絶賛).4泊5日の間,全国と同様に受講料のほか交通費・宿泊費・食費無料で,期間中は一人一台のPCが貸与されます(大感謝🙏).
元々,地元北海道のミニキャンプには参加していましたが,気づいた時には22歳を過ぎていた為,ネクストキャンプの存在をTwitterで知りすぐ応募しました.応募用紙には今頑張ってることのアプローチとか,自分のやってきたことについて色々と書きました.あとは興味のある講義についてどう考えているか等を自由記述する形だったと思います.
府中へ収監
参加者として全国の地に向かうことはないだろうと思っていたので感慨深いものがあります.
遂に… #seccamp pic.twitter.com/nCddfkKTrJ
— さわだ.@Summer Intern (@takuzoo3868) August 13, 2019
会場のクロースウェーブ府中に入ると,基本的に外出は出来なくなります*2.
未成年の方も多いため,参加者は禁酒です.ぐぬぬ.
会場費含め一泊あたり全体で200~300万円位でしょうか...とにかく綺麗な会場です.
受付諸々を済ませて昼食の後は時間があったので,周りの方と名刺交換して過ごしました.久々にお会いする方やTwitter上で知り合った方と半分オフ会の様な感じでした.オンサイトでご挨拶できてよかったです.自分のTwitterのアイコンが割と認知されていたらしく驚きました.今度はもっとSNS感を強めた名刺にしたいですね...もう昔の画伯ムーミンアイコンへ変えることはできないや....
夜にはチューター,参加者,講師の方によるLT大会もありました.同じ部屋で5箇所同時開催というカオスっぷりで笑ってしまいました.聖徳太子の気分になりながらいろいろな話を聴くことができて面白かったです.
特別講演「転ばぬ先の法律入門(サイバー空間編)」
特別講演(倫理)は、冨士﨑 真治さんによる「転ばぬ先の法律入門(サイバー空間編)」です。セキュリティを学んでいく上で、しっかりとした倫理観は必須です。そのため、セキュリティ・キャンプでは毎年倫理についての講演があります。 #seccamp pic.twitter.com/yBEVrm5mHL
— セキュリティ・キャンプ (@security_camp) August 13, 2019
大阪地検の冨士﨑さんによる講演でした.内容は昨年のSecHack365福岡回に近いものだったと思います,それとなく覚えている内容もチラホラありました.検挙事例を元に何が法律面でアウトなのか,参加者と冨士﨑さんがやり取りしながら進行しました.法律の専門家ではないエンジニアや学生が,サイバー空間に関連する法律を改正含め把握し続ける事の難しさを踏まえて,捕まることのないように護身術として倫理観を育てようというものでした.主観的な正義感を振り翳すことなく,社会的影響を一度考える重要性を理解できたかなと思います.自分としては,サイバー犯罪事例集であったり,特定の法律をウォッチしておくような法改正通知botがあると,エンジニアの手助けにもなるのかなと考えたりした時間でした.
俺のTPM/TEEスキルで転生後も無敵です
全国と違いネクストは初日から専門講義がスタートします.容赦ないですねぇ,好きです.
ざっくりとした内容としては,Trusted Platform Module: TPMとTrusted Execution Environment: TEEの概念と設計を理解し,現在認知されているTEEの脆弱性から,その攻撃手法を学び,現状のセキュアエレメントの不完全さを体感するというものでした.物理的な攻撃やデバイスの改竄から端末内の鍵情報を守るために策定され,決済系デバイスやSIM,Apple T2等様々な製品に実装されています.
TPMはTrusted Computing Groupが策定し,現在は2.0が最新.1.2はRSAのみでしたが,2.0からAESやECDSAを含め様々な暗号化方式,ハッシュ演算に対応し,強固かつマルチ階層な鍵管理が可能になったようです*3.他にも,デジタル署名の生成・管理・検証,不揮発性ストレージ,乱数ジェネレーターなどなど,セキュリティチップとして重要なコンポーネントがまとまっています.このチップを搭載することで,
- OSやアプリケーションの改竄を検知
- 公開鍵証明書による端末識別,認証
- ストレージデータの安全な暗号化
等といったメリットがあり,コンピュータの信頼性と安全性を高めることが可能です.ただ,チップ自体のスペックは高くないので,大まかな役割ごとにRoot Key
があり,Root Key
自体はTPMへ保存されますが,子であるStorage Key
等はRoot Key
で暗号化し主記憶装置などへ保存する形式となっている模様.詳しく知りたい方は公式のドキュメントを読むのが一番正確です.
TEEはGlobalPlatformが仕様策定.この団体はクレジットカードや身分証明書など,スマートカード内のチップに関して業界標準を定めることを目的としているようです.話を聞く限りでは,SoCの中でVirtualな2nd Processorを設けるという概念に近い気がしました.TPMと違い物理的に専用ハードを設けない訳です.TPMは実装コストが大きいため,一部の製品では導入が難しいのも頷けます.TEEはプロセッサーに備わる機能を利用して実現しています.具体例として挙げられていたのが,ARM アーキテクチャの一部のProcessorに搭載されているARM TrustZoneです.調べてみた限りでは,セキュアモニターモードと呼ばれるプロセッサーモードを追加し,Appの実行に必要なメモリ空間や入出力装置等をNormal World
とSecure World
へ分離します.Normal World
では通常のOSやAppが稼働し,Secure World
では暗号化/復号,鍵生成などの処理を行うTrusted OS
が稼働します.Processorにより,Normal World
からSecure World
の環境には限られたアクセスのみ許可され,通常Normal World
からSecure World
は認識できないものとなっています.(この辺も図解が必要っぽいので後日追記します)
脆弱性に関してはこれらの論文等を含め色々と紹介されました.TPMもTEEもガバガバ仕様やんけ!
A Bad Dream: Subverting Trusted Platform Module While You Are Sleeping
BOOMERANG: Exploiting the Semantic Gap in Trusted Execution Environments
事後課題として,Qrio Lockのようなスマートロックシステムに,TPM/TEEが必要となるならば,どのコンポーネントに鍵ストアが必要になるか考察も行いました.結論から言うと無敵にはなれませんでしたが,新しい概念を獲得した講義でした.講義中は追いつくので大変でしたが,復習してみるとなるほど!といった感じです(改ざん検知や鍵階層などは後日仕組みを追記するかも).もしTPMを試したいなと思ったらラズパイを使ってみたり,KernelVM勉強会へ出没してみると良いそうです.私,興味あります!
攻撃検知エンジンの開発
この講義はXSS文字列と正常文字列を分類する機械学習モデルを作成する演習メインの講義でした.事前の段階でかなり楽しみにしていた講義であります.提供されたデータセットは紛らわしいものを含めて色々ありました.よっしゃ〜と意気込んで文字列のベクトル化を作り込んでいたら,RNNの構築が事前段階で後手になってしまいました.どうしてこうなった.期間中はどの手法が適切か,またハイパパラメータの探索など色々と,今自分が知りたかったなと思っていた内容に触れられ,学びの多い時間でした.pytorch
でscikit-learn
をいい感じに使いたい時,skorch
を用いてscikit-learn API
の恩恵に預かろうという知見も増えました.
最終的に演習は,HTTPリクエストのAnomaly Detectionまで進みました.精度の出なかったテストデータへの対応や,演習中で完成しなかったLSTMモデルの作り込みは事後学習として,この夏休み中にサッと作って,GIthubのrepoにまとめてupしようと思っています.頑張るぞ〜👊
エミュレータによるCPU特殊命令の追加の実験
SecHack365でもお世話になった坂井先生の講義で,何もわからんと嘆いていた一昨年の福岡に比べて,アセンブリ言語読めるようになってきたぞと実感できたことが嬉しかったです.CPUに追加されている特殊命令の仕様がクローズドになっている場合,デバッガを利用し命令の入出力から推測をすることで,どの程度仕様が露見してしまうのかを体感する演習だったと思います.Blackfin
,MSP430
,ARM
,RL78
など様々なアーキテクチャを取り扱うことで,エミュレータなら手軽にシステムコールなどの特殊命令へ対応できると改めて気付かされました.
特に自分はサーバから配布されたMSP430
用実行ファイルに取り組んでいましたが,seedに1を与えて乱数を得ると,1bit シフトするのね,なるほどと夜中にわかり「ΕΥΡΗΚΑ!」と部屋で叫びました.しかし,既に3:00 a.m.を回っていたので静的解析によるPassword取得は断念しました*4.エミュレータ改造までしっかり終えると,実行ファイルからPassword取得ができるようです.Blackfin
等は他の方が実装していて凄いなと思いました...講評によると,あとちょっとのところまでクローズドの仕様を推定できていたのがちょっと悔しかったです😭一応,競技ファイル一式はサイトにupされていますので,色んなアセンブリ言語読みたい方は試してみましょう!
だまされないGPS
GPS/GNSS: Global Navigation Satellite Systemの仕組みについて,詳細なData Frame
の設計から航法・位置計算の手法まで深く学びました*5.GPS衛星の航法メッセージは1 frame(5 sub frame)=1500bitで衛星の状態,クロック補正から軌道情報,電離層補正情報に至るまで,詳しく端末へ送信されることにちょっと驚きました.単純に緯度経度がわかるもの位の認識しかなかったので....実際にはクロック補正値と擬似距離をXORして複数の衛星による測位計算を元に位置情報がわかり,この時に受信機のクロック誤差もわかるので正確な時刻も算出できるそう,なるほど.そんなGPS信号ですが,
- 微弱な信号のため,同周波数の強力な電波により妨害の可能性
- 仕様公開により,誰でも信号を送信受信できるデバイスの作成
- 信号を検証する仕組みの欠如
が特徴から考えられる問題点として挙がっていました.実際にジャミングやスプーフィング,偽装も世の中では問題になっていますよね*6.今,GPS検証に向けた動きとして,航法メッセージからダイジェストを生成し,それを元にしたデジタル署名を認証に用いることはできないか?という取り組みがあるようです.鍵配送やリアルタイム性など問題点はありそうですが,興味深い対策だと思いました.他にも様々な観点から対策案があり,夜の座学で睡魔が襲ってきたりしましたが,どうやって実装していくのかとても気になる面白い講義だったと思います.
ネクストキャンプでは、午後と夜を使って坂井 丈泰さんより「だまされないGPS」の講義を行っています。GPSによる位置計算プログラムの改良を通して偽装(スプーフィング)対策を考えます。 #seccamp pic.twitter.com/PYstbgCaq2
— セキュリティ・キャンプ (@security_camp) August 14, 2019
実習の時間には,受信機サイドで行える検証として,受信した航法メッセージのチェック方法や測定データの推移から異常検知を試みる取り組みをしました.また,実機としてツイートの通りスプーフィングのデモがあり,航法メッセージ受信の様子も見ることができたのですが,Wiresharkとかで手軽に航法メッセージを収集できないのだろうかと考えていました.
暗号アルゴリズムのFPGA実装
FPGAを使ってAES実装を高速化あるいは省電力・省メモリ化する演習でした.事前学習の時点ではFPGAの開発環境に馴れておき,NISTのAES仕様書(がっつり)を読んでおき,講義中はその復習から始まりました.SubBytes
,ShiftRows
,MixColumns
,AddRoundKey
など重要な処理が記載されたcppとVerilogのソースコードが配布されたので,それを元に実装の理解を深めていきます.ソフトウェアの実装がHDL的にはどうやって記述されるのか理解できたと思います.自分はよくわからん所をネット上のVerilog文法書を見ながら進めました.
シュミレーションの結果通りにAES暗号化の処理が,FPGA上で行われている時はちょっと感動しました.32bitCPUにおいて高速化することをメインに並列化処理を実装しましたが,省メモリの観点もハード面では重要であり,ファミコン時代のゲーム実装の工夫など,昔のマイコンを使った実装からも得られる知見が多いように感じました.一方で,高性能化するアーキテクチャにおいて多数コア対応なども今後のAES実装では考える必要がありそうだなと感じました.今回使ったFPGAボードは中華通販で3k~4kくらいだそうで,お賃金が入ったら買おうかなと思っています.
ロバストなプロトコルを考案せよ
これもかなり楽しみにしていた講義です.10BASE-TのLAN ケーブルにおいて,1つのツイストペア上にノイズを発生させ,障害の発生している通信経路を擬似的に作り,その環境下でもファイル転送できるプロトコルを作ろうというものでした.レギュレーションや競技運営まで皆で決めながら開催できたので,とても楽しく運営としても勉強になりました.キャンプ終盤の講義にも関わらず,初日の昼食時間からみんなでどんなプロトコルを実装してきたか議論し,中日の宿題時間も,障害装置の環境設定やプロトコルの改良で,他の参加者と殆ど一緒にずっと議論していました.普段ならば疲れたから夜はもう寝たいなぁとなる事の多い自分ですが,皆の熱意に感化されてテンションも高めのまま(?)最終日まで迎えることができ*7,周りの環境にとても助けられたと思います.
プロトコルの実装に関して,高レイヤのプロトコルだってチューニングすればファイル転送できるぞという所を示したくて,ServerSideStreamingRPCとしてHTTP/2の実装に取り組みましたが,皆のQUICやTCP,UDPを組み合わせた設計思想もかなり勉強になりました*8.事前のノイズアルゴリズムでは180/200 files
程度だったのですが,大会中のノイズアルゴリズムではup 65/70 files | down 36/46 files
まで低下しちょっと残念.自分の実装は供養として此方へ置いておきます.Goで書きました.インターフェース定義は以下の通り.
syntax = "proto3"; //google.protobuf.Timestamp //import google_protobuf "github.com/golang/protobuf/ptypes/timestamp"; import "google/protobuf/timestamp.proto"; package proto; service FileTransferService { rpc ListFiles(ListRequestType) returns (stream ListResponseType) {}; rpc Download(DownloadRequestType) returns (stream DownloadResponseType) {}; } message ListRequestType { } message ListResponseType { string name = 1; int64 size = 2; uint32 mode = 3; google.protobuf.Timestamp modTime = 4; } message DownloadRequestType { string name = 1; } message DownloadResponseType { bytes data = 1; }
やはりTCPプロトコルスタックを自作し,フロー制御も頑張るべきだったかとキャンプ終了後はRFCを読み漁る毎日になっています.専門なのにまだまだ自分はフロー制御に詳しくないぞと気付かされました.そんな訳で,例の書籍をキャンプ後に買ったのですが,サーベイ論文以外で各種輻輳制御アルゴリズムにかなり言及しており驚きました.ええぞこの書籍!
TCP技術入門 ――進化を続ける基本プロトコル (WEB+DB PRESS plusシリーズ)
- 作者: 安永遼真,中山悠,丸田一輝
- 出版社/メーカー: 技術評論社
- 発売日: 2019/07/06
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
モブプログラミング
モブプログラミングはなんぞや?という方は以下の動画とサイトを見れば良いと思います.
実際に講義でやってる様子がこちらです.
ネクストキャンプでは5日目も講義が実施されます。最初の講義は、内田 公太さんによる「モブプログラミング」です。今回はモブプログラミングでテスト駆動開発を実践します。コードを書くドライバーを5分で交代しながら、周りのナビゲーターがどのように書くかについてドライバーに伝えます。 #seccamp pic.twitter.com/D17LWTIkeL
— セキュリティ・キャンプ (@security_camp) August 17, 2019
初日に内田さんと少しお話した際,TDDを取り入れてみようという方針になりました.普段がっつりコードテストを意識する方ではないので有り難いです.テストケースに関して知見がたくさん増えましたし,どの程度のコード長で関数化していくべきか感覚がつかめた気がします.また,様々な言語でTDDを試せる環境としてcyber-dojoというサイトがあることを知りました.入門として丁度よいそうです.みんなで取り組んだときはPythonを使いました.
講師の内田さんがタイムキーパーをしてくれましたが,実際の開発で導入する場合は,ナビゲーターのうち誰かがタイムキーパーになる必要がありそうだなと感じました.
おわりに
期間中は容赦ない課題の山と格闘しながら寝不足で過ごす日々でした.ですが,他の参加者と四六時中と意見交換しながら解決に向けて作業する毎日がとにかく楽しかったです.ネクストキャンプは,向上心の強いタフなキャンプ卒業生にはうってつけのプログラムだと自分は思います.最高なので,来年度もありましたらぜひ応募してみて下さい!
講師,チューターの方々をはじめ,支えてくださった運営事務局,協議会の皆様,本当にありがとうございました!!!.
「セキュリティ・キャンプ 全国大会 2019」「セキュリティ・ネクストキャンプ 2019」の全ての日程が無事に終了しました。また来年もよろしくお願いいたします! #seccamp pic.twitter.com/q4ymhy8D6Y
— セキュリティ・キャンプ (@security_camp) August 17, 2019
追伸:そういえばネクストの修了生はミニキャンプ等のチューターに応募できるのでしょうか?内容によっては地元北海道に恩返ししたいなと思ったり...