晴耕雨読

working in the fields on fine days and reading books on rainy days

seccamp2019チュータ参加記

セキュリティ・キャンプ全国大会2019では初めてチュータとして参加させて頂いたので、チュータ業務はどんな感じなのかという話と、私の記憶がある限りの全ての出来事をここに書いていこうと思います。

チュータ概要

チュータには大きく分けて4つの役割があります。

  1. 講義のサポート … 担当講師のサポートです。参加者のサポートや事前学習の指導補助をします。
  2. 参加者のフォロー … 参加者同士の交流や、チュータや講師と参加者との交流を促進します。
  3. 運営のサポート … 運営に関する諸々の雑用をします。
  4. 成果報告プレゼンテーション … Day1のLT大会で成果のプレゼン発表をします。

会場までの移動費はIPAから出してくれます。チュータは黄緑色のネックストラップ名刺を首から下げています。あとは、参加者とは違って外出可能です(とはいえ外出すると体が溶けてしまうので外出していませんが)。

チュータ募集

参加者の応募課題の提出期限が近くになると、チュータの募集がセキュリティ・キャンプのSlackのほうで告知されました。 実装が大好きな私は、2018の集中開発コース X-II 「TLS 1.3/暗号ゼミ」に参加したので、同じ X-II のゼミ名が変わって「暗号化通信ゼミ」を第一希望にして提出しました。 フォームの内容は次の質問に答えるというものでした。

  1. サポートすることのできるトラック、講義名、ゼミ名と、サポートできる理由を実績などをつけてなるべく詳細に教えてください。
  2. チューターの役割(講義のサポート、参加者のフォロー、運営のサポート、成果報告プレゼンテーション)のそれぞれの観点において、ご自身の可能な貢献とその裏付けとなるご自身の実績について、詳細に教えてください

XXXにおいてXXXした実績があり、XXXの部分をサポートできると考えます、というように自分がサポートできる理由を、これまでの経験なども書きながら説明していく感じでした。 受講生の何人かとお話して、来年はチュータになりたいという方もいたので、そういう方はチュータとして参加する理由付けとなる経験をたくさん積んでおくとよいかもしれません。 チュータ募集の締め切りは6/14で、結果が通知されたのが一週間後くらいでした。

事前学習 (のための学習)

暗号化通信ゼミなので暗号に関連することをやるのですが、去年とは違って今年のゼミは自由にテーマを持ち込む形式だったので、参加者がseccampの書類審査に通過して、初めて内容が決まる流れでした。 そして、やることになったテーマがと「WPA3のDrangonfly Key Exchangeの実装」と「ルービックキューブに基づく暗号プリミティブの提案・実装」でした。

とりあえず、Dragonfly Key Exchangeが書かれてあるRFC 7664を読んでみて、共有鍵の導出方法が楕円曲線と有限体の2通りあったので、とりあえず有限体の方を使って全体の流れを理解しようと思ったら、RFCの擬似コードに誤りと思われるものを発見したので、Errataに報告しました。 メールでのやりとりによると、私のErattaはIRSG (Internet Research Steering Group) という研究実務機関を通してKennyさんが読み、良さそうなのでRFC作成者のDanさんに何かコメントがあるか確認していました。Danさんは「良さそうです。Verifyする権限はないけどね」という内容を返していました。そしたら実はKennyさんもVerifyする権限がなく、Colinさんに助けを求めているところでやりとりは止まっています。セキュリティ・キャンプが始まるまでにはVerifyされるだろうと思っていたけど、結局キャンプが終わってもVerifyされず、悲しいというお気持ちです。

ルービックキューブに基づく暗号のほうは、チュータになることが決まった時点でルービックキューブ暗号の論文「The Rubik’s Crypto-Cube: a Trans-Composite Cipher (2010)」が緑川さんから渡されたので、読んでみたらPythonのnumpy使って実装できるのではないかと思い、tex2e/rubiks-crypto-cube/main.pyをGitHub上に公開しました。結局、提案手法はこの論文に書かれてある手法と似て非なるものだったので、作りっぱなしになってしまいましたが…

受講者との事前交流(1)

なんと驚いたことに、暗号化通信ゼミの受講生の一方は弊学の学生でした。お話してみたいな〜と思っていたらDMが飛んできて弊研究室でお話する流れとなりました。 応募課題の話を聞いたり、少しだけ有限体の群とか体の話をしたり、RFCの読み方について教えました。 私がセキュリティ・キャンプのポスターを弊学の情報科の人が見えるところに貼るようにお願いしたのが活きたのかはわかりませんが、ポスターを取り寄せておいてよかったな〜と感じていました。

セキュリティキャンプへの準備

セキュリティキャンプでは沢山の人に出会うので、名刺が必須です。「ラクスル」というところで名刺を発注するのがベターみたいです。ですが、私は去年と同様にA-oneのマルチカードで名刺を刷りました。「ラベル屋さん」で検索すると、マルチカードの品番を入力してデザインを決めるとPDFを作るサイトがあるので、色合いとか文字の大きさを確認しながら刷っていました。 ちなみに、使用したマルチカードは、A-one 品番 51291、白無地、上質紙、厚み0.28mm、10シート/100枚で、700円くらいです。半日くらいで完成しました。名刺にPGPを入れたのは個人的によかったと思います。

他にもチュータはLT大会での発表が必須なので、LT大会用のスライドとして「N日でできる! TLS 1.3入門」というタイトルでTLS 1.3の概要とQUIC(HTTP/3)について少しだけ説明するスライドを作りました。

受講者との事前交流(2)

暗号化通信ゼミでは事前学習のやりとりにSlackを使っていました。Slackでのやりとりや、GitHub上に公開されているDragonfly Key Exchangeの実装を読むと、あまり思うように進んでいないみたいだったので、唯一時間があいている、テスト期間中の間の金曜日の午後に「ちょっと実装について1時間くらいお話しませんか〜」と聞いたら、再び弊研究室でお話することになりました。テスト期間中だしあまり長くお話するのも悪いかな、と思っていましたが、いろいろ実装見たりしたら4、5時間くらい使っていて、体感としてはあっという間という感じでした。

キャンプ前日

チュータは前日にホテルに入ります。 去年と同様に北陸新幹線で長野から大宮(1時間)、埼京線で武蔵浦和(10分)、武蔵野線で北府中(30分)という経路で行きました。昼ご飯は適当にコンビニで買って済ませました。 全く関係ないですが、ホテルの部屋に入ったら蚊が2匹出てきて、つくづく蚊に愛されているなと思いました。

前日に何をするかというと、スポンサ企業からのノベルティグッズを袋に詰めたり、講師の方の準備のお手伝いをしたりします。 貸与するPCに3つのスポンサ企業のロゴが入っているラベルを貼り付けたりもしました。 ノベルティグッズの袋詰めをした後に自分の分も貰うことができるので楽しかったです。 講師の方の準備では、Hyper-V上で動くルータなどの仮想マシンが入ったUSBを渡されたので、対象の講義を受講する受講者のPCにインストールしていました。 あと、これは反省なのですが、この時にトランシーバの使い方を実際に使って覚えておくと良いです。音量調整の方法や喋り方などを確認しておきましょう。


Day1

1日目は大雑把にいうと全体講義とLT大会があります。 全体講義の1つ目は冨士﨑さんによる「転ばぬ先の法律入門 (サイバー空間編)」で、どのような行為が犯罪になるのかを具体的な例をあげて紹介され、なぜダメなのか、どうしてそうなったのか、などの議論を交えながら話が進んでいました。例えば、作ったものを自慢したかったためにウイルス作成罪が適用されたり、脱獄したiPhoneの販売は商標法違反になったり、ゲームの裏技やチートを行う行為は運営に損害を与えるから犯罪になる、などという話です。何れにせよ自分の利益と他人の利益を天秤に掛けて、自分の利益を優先してはいけないよね、という倫理観を持つことが大事とも仰っていました。 インターネットなどのサイバー空間は法律違反の実感に乏しいので、倫理的な行動に基づいて行動していきたいものです。 なお、法律は2000個あり、刑法38条3項 には「法律を知らなくても罪になる」という記述があるので、セキュリティ関係者が捕まらずに生きていくのはほぼ無理ゲーですが、それでも倫理的な行動を心がけることで落とし穴を回避できるよ、というお話でした。

全体講義の2つ目は園田さんによる「セキュリティ基礎」で、認証を取り巻く問題について具体例をあげて解説されていました。 良いパスワードとは、強いパスワードやパスワード管理が徹底されている状態のことをいうと思いますが、現実の問題として強いパスワードを作るには「長い」「複雑」「定期的な変更」などの要素があると思います。しかし、長い/複雑なパスワードは覚えにくいですし、定期的な変更は簡単なパスワードになりがちなので、sudoなどの強い権限で使うパスワードに関しては定期的な変更をして、それ以外は定期的な変更をしない方が良いみたいな話もありました。パスワード管理についてもパスワード管理サービスなどを使えば良いという話も聞きますが、LastPassは機密情報漏洩の疑いがあり、一概にパスワード管理サービスが安全だとは言えません。また、別の認証方法として指紋や虹彩を使う方法もありますが、これらを用いた鍵は危殆化しても変更することが困難なので、現在ではワンタイムパスワードや二段階認証を使うのがベターなのではないかというお話でした。

全体講義の2つ目は法林さんによる「ITの話ができる仲間を作ろう~IT業界とコミュニティ活動~」で、ここで使われたスライドがSlideShareにアップロードされているので、詳細はこちらをご覧ください。感想をざっくりいうと、どんなに優秀な人でも一人では守備範囲に限界があるので、それをお互いが助け合うような仲間をコミュニティ活動を通して作りましょう、という感じの内容です。

LT大会を終えたあとは、グループワークです。今年のテーマは同じ目標を持つ仲間を見つけてキャンプ終了後に何をするか決めましょう、みたいな内容でした。私はチュータなのでこの中に入ることはないと思っていたのですが、暗号技術の応用みたいなことをやるグループに入って国際的なセキュリティの観点や国防の観点から見た暗号技術について少しお話しました。


Day2

2日目は一日中、集中開発です。Xトラックのチュータになりましたが、結局私ができるのは暗号化通信ゼミのチュータなので、基本的にはそこにいました。

午前中はDrangonfly KEXに使われている平方剰余の解を求めるTonelli–Shanks algorithmや、楕円曲線を用いたECDHについてお話しました。 Tonelli–Shanks algorithmを実装しようと思ったけど、答えが合わずに結局Pythonのsympyの関数を使って実装していました。

午後は楕円曲線のスカラ倍をバイナリ法によって高速化し、楕円曲線のパラメータでNISTのものが使えるようにしました。 バイナリ法だと実行時間に差が出るのでサイドチャネル攻撃ができるので、モンゴメリ冪乗法のような方法でやるべきなのですが、とりあえずサイドチャネルは考えずに演算の理論だけを考える方針で実装を進めてもらってました。


Day3

3日目もほとんどXトラックで集中開発です。 この日は AES-GCM の話を主にしました。これは暗号ブロック $C_i$ と Auth Data (認証タグを求める時に使うデータ) を掛けたり足したりしてタグを求めることで、Hashを使ってハッシュ値を求めるよりも高速で、改ざん検知も可能というものです。

他にも暗号化通信ゼミでお話した内容を雑に列挙すると以下のような感じです(全てが3日目に会話した内容という訳ではないですが)。

  • 双子素数である 10007 と 10009 や、1000000007 と 1000000009 (10億7と10億9)は素数を用いたテストに使いやすい
  • PARI/GP on Browser という数論に関する様々な演算をブラウザで実行できるサイトがある
  • 実装屋さんならアセンブラで暗号実装したいね (AES-NI など)
  • SageMath使うと楕円曲線の計算が楽々できるけど、位数が素数になる楕円曲線のパラメータを決定するのは大変
  • バイナリ法は $O(\log N)$ なので、サイドチャネルは誤差
  • 実質無限、高々有限
  • 2020年 暗号と情報セキュリティシンポジウム の実行委員に木藤圭亮さん(リバースエンジニアリングゼミの講師)がいる!
  • 暗号利用モードOCBから派生したOCB2には脆弱性が存在する
  • AES-GCM のpdf「The Galois/Counter Mode of Operation (GCM)
  • AES-GCM でNonceが使い回されていると、差分解読法 (選択平文攻撃) で Auth Data が導出できる
  • 楕円曲線のグラフを描きたいときは GeoGebra

夜には企業紹介がありました。去年の最後の晩餐でお話したゲヒルン株式会社代表の石森さんのお話を聞きに行きました。 いろんな会社が認証局を始めたのでその流れに乗って認証局を始めたり(セキュリティキャンプ協議会のページの証明書は 組織 : Gehirn Inc. となっています)、気象庁との通信プロトコルを仕様書だけもらって自作したり、気象庁から予報業務許可をもらったり、最速の防災アプリを作ったりと、とても面白そうなことをしている会社だと改めて思いました。


Day4

4日目もほとんどXトラックで集中開発です。 この日はcubing暗号の方でお話していました。この暗号化手法ではマスクしてから転置するのですが、マスクをどうやって相手に渡すか、というところで暗号利用モードのCTRみたいにNonceだけを渡してランダムなバイト列を出せる仕組みがあれば〜ということを言ったら、暗号化は乱数の生成にも使われるので、事前共有鍵を使ったマスクの生成(感覚的には鍵付きハッシュ関数 : HMAC)でやりましょう、ということでそのような方針で実装が進められました。アルゴリズムの詳細は伏せるように言われているので、多くは書きません。

午後の4時からはXトラック内の発表会がありました。

夜には企業紹介がありました。 Cyber Defense研究所の方のお話を聞きに行きました。インターポールと協力して犯罪捜査をしたり、CTFのような演習でマルウェア解析を行ったりしているとのことでした。


Day5

5日目は全体発表です。基本的には発表聞くだけでした。 発表の中で印象に残ったのは、バイナリから特徴量を取り出してマルウェア判定をするというもので、マルウェアはPC起動時に実行するために /etc/profile を編集する可能性が高いことや、マルウェアは履歴を削除したいので /var/log などのログファイルを削除するようなコマンドが含まれている可能性が高いことなどの事実を元に、特徴量として抽出して機械学習させるとのことでした。実際にはフォールスポジティブやフォールスネガティブが 0.01% で製品化できるとのことで、機械学習を売り物にするのは大変だなと感じました。

Day4のラストナイトイベント(本のプレゼント会)の残り物として「Interface 2019/9 農業&自然センシング大研究」という本を頂きました。内容に関しては「動かしながら始める量子コンピュータ 第2回」というタイトルの4ページ記事くらいだけが面白そうでしたが、父はこういう本が好きなのでお土産として持って帰ることにしました。


まとめ

チュータはサポートがメインなので圧倒的な進捗を出した感じではありませんが、プロデューサの方も言っていたように、技術に対してキラキラした目でやってくる受講生をみて、そのやる気を吸わせてもらい、キャンプ中はもちろん、キャンプが終わった後にも切磋琢磨できるようにするために、セキュリティキャンプに来ているという心の側面があるように感じます。

また、キャンプを通してやりたいことがいっぱい湧き上がってきたのですが、やはり焦らずに一つ一つ着実にこなしていきたいと思いました。わからないことは恥ずかしくない、わからないことをわかったということの方が恥ずかしい という言葉を胸に刻み、RFCと暗号技術の本を片手に、これからも面白そうなところに足を突っ込んでいきたいなと思いました。

関係者の皆様、刺激的な5日間をありがとうございました!


おまけ

ホテルの部屋にいた2匹の蚊は駆逐しましたが、帰り道に、蚊に3箇所も刺されました。 私はつくづく蚊に愛されていると思います(涙)