晴耕雨読

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

seccamp2021チュータ参加記

セキュリティ・キャンプ全国大会2021 オンラインにチュータとして参加しましたので、今回で3回目となりますが、参加記を書いていこうと思います。 今年は去年とは別でLトラックのゼミである「暗号の脆弱性や攻撃手法を理解して説明しようゼミ」のチュータとして参加しました。

チューター応募

5/6にチュータ募集が開始したのですが、去年のセキュリティキャンプ2020が12月に終了したこともあり、あまり時間が経っていない状況での募集でした。 去年は自分の実力不足であまり受講生の方をサポートできなかったのと、まだ去年の内容の技術検証が済んでおらずに消化不良気味であったこと、私自身が何回もチュータをすることで若い芽を摘んでいるのではないかという不安から、今回は応募しないことに決めました。

しかし、応募締め切りの6/10になると、募集期間の延長が発表されました。 理由としてはチュータが必要数集まらなかったようです。 暗号のLトラックは全体的に人が足りないという話を聞いたので、サポート可能範囲を「L(暗号)トラック全般」とし、サポート可能内容は去年提出したものに「マイナンバーカードに関する技術検証をしました」という感じの文言を追加して提出しました。

6/18に合否の結果がメールされて、無事チュータとしてLトラックに参加することになりました。 しばらく(数週間)経つと、どのゼミの担当かが発表されました。

チューター事前説明会

去年と同様にチュータ説明会がありました。 さらに、ハラスメント講習が録画した動画を視聴する形式で1時間ありました。 去年のキャンプではハラスメントに関する問題があったそうなのですが詳細はわかりません。 ハラスメントの加害者にならないためには、以下の事が重要だと個人的には思っています。 来年チュータやる人とかは参考にしてください。

  1. 相手が望んでいないことを強要しない
  2. 指導するときは客観的な視点のみで行うこと(主観的な意見を混ぜないこと)1
  3. 教育するときは前提知識を知らなくても責めないこと(知らない≠やる気がない)

開講式・LT大会

8/9に開講式があり、18:00〜はLT大会が開催されました。 LT大会はチュータは発表必須なので、技術的にニッチな部分を責めすぎた去年のLTの発表の反省を踏まえて、今年は知らない人にもわかるように写真やイラスト多めの優しい感じにして、年末年始の休日で技術調査したマイナンバーカードに関する簡単なまとめを「マイナンバーカードで署名する - Speaker Deck」で発表しました。 LT大会後にスライドを一般公開すると、すぐにTwitterのリプで「ASN.1 が ANS.1 になっています」というタイポの報告を受けて、大変助かりました。

グループワーク

今年が去年と違うところは、ミーティングにoViceやDiscordを使う点でした。去年のGoogle Meetでグループごとに分かれてお通夜ムードが流れるみたいな事態は少なかったと思います。 oVice初めて使ったのですが、全員が会場に集まっている感じがあってとても良かったです。 今年は受講生の皆さんが主導的にグループワークを進めていたのでチュータの出番はほぼありませんでした。 oViceのルームの下の方で野良チュータが集まって、それぞれが自己紹介したりキャンプ修了後に取り組むことについて話始めたときは楽しかったです。 後ろでこっそり聞いていた講師?の人にグループワークで集まっていると誤解させたくだりも面白かったです。

ゼミ講義

L-IVの「暗号の脆弱性や攻撃手法を理解して説明しようゼミ」は講師の kurenaif (@fwarashi) さんが過去に動画で説明した内容を元に講義が作られていました。 受講生は2人いて、それぞれが別のテーマを選んで取り組むという形式で、1人はPOODLE Attack、もう1人は乱数予測でした。 講義の流れは Gist で公開されています。 実際にどんな講義が行われたかは受講生がブログなどで書いてくれることを期待して、ここで詳細は書きません。 私の知らないことが知らないところで進捗生んでいて、ただただすごいと思っていました。

私は Poodle Attack の講義で TLS 1.3 を実装した経験を活かすことができたので、少なくとも去年よりはサポートができたかなと思っています。 Poodle Attack で復号の成功失敗を判定する際に TLSPlaintext の ContentType を見て判断するのですが、受信したデータが 0x16 から始まっているものは Handshake データ、0x17 からのものは Application データ、0x15 からのものは Alert であることを、出力結果を眺めながら昔の記憶から思い出せたのは、TLSInnerPlaintext という TLS 1.3 で暗号化する前にパディングを追加する処理で [データ] + [ContentType] + [パディング0x00…0x00] という形のバイト列を作るときにアプリケーションプロトコルで ContentType を 0x17 に変えないといけないのに 0x16 のまま使って復号に失敗するエラーと、当時2018年のキャンプの時に戦っていたからでした。色々当時の大変だった記憶が思い出されました。

講義内ではSSL 3.0でアプリケーションデータを送る前に空のアプリケーションデータを送るというOpenSSLの謎の挙動が見つかったのですが、kurenaif さんの調査により理由がここに書いてあることがわかったので、私も読んで簡単にまとめました。以下にその内容を書いておきます。 プログラムのわずかな修正だけで、脆弱性に対応するこのやり方は示唆に富むものでした。

  • SSL 3.0 と TLS 1.0 では、1つ目のデータの暗号化はハンドシェイクで求めたIVを使うが、2つ目以降のデータは、1つ前で送信したデータの最後の暗号文ブロックをIVとして使って暗号化するため、適応的選択平文攻撃に対して弱い
  • 空のアプリケーションデータを暗号化するとパディングによって最低16バイトになる
  • 1つ前で送信したデータの最後の暗号文ブロックをIVとして空のアプリケーションデータを暗号化し、その最後の暗号文ブロックをIVとして使うことで、IVが暗号化処理を通るのでランダム化したと見なせるため、IVが1つ前で送信したデータの影響を受けなくなる
  • 攻撃への対策として、アプリケーションデータを暗号化して送信する前に、空文字を暗号化したデータを送信するように修正した
  • 上位レイヤーは「空文字」と「アプリケーションデータ」を受信したように見えるので上位に影響なし
  • ただし、0バイトのアプリケーションデータを受け取ったときにエラーになってしまう実装のSSL/TLSクライアント・サーバへの考慮が必要

講義でその他に意識したことは、休憩後の再開時刻や開始時刻をチャット欄に貼り付けることでした。 去年は、例えば今日の作業の発表を〇〇時から開始します〜と口頭で言った後に、そのままミュートで作業に入ってしまったので、自分は作業しながら本当に〇〇時だったっけ?みたいな疑心暗鬼状態が続いて心理的な負担になっていたので、今回は再開する際の時刻をしっかりチャットに貼り付けるようにしました。

また、講義中は基本的にマイクつけっぱなしで講義する形式が良かったと思います。 雑音などが入ってもいいので、マイクはつけっぱなしにするという運用は、人数が少ないからできることではありますが、気づいた時にすぐに質問とかコメントができる感じはとても良かったです (普通だと発言権を持っている人以外は基本的にミュートにするので)。 チームビルディングのときの参考にしたいと思います。

講義の3日目の一週間前に談話室&もくもく会がoViceで突然開催されたので、定期面談みたいな意味合いで受講生にお話しませんかとお誘いしてoViceの談話室で1時間程度お話していました。 仕事だと頻度はそれぞれですが定期的に面談みたいなのがあり、チャットだけでは汲み取れない部分を拾うためにも声で会話することを定期的にやるべきなのですが、まぁキャンプなのでそこまで厳密にやらなくてもいいかな、けど生存確認のためにもやって良かったかな、という感じです。

最終日は受講生が互いに相手に学んだことを教え合う形式だったのも良かったと思います。 繰り返しになってしまいますが、やはり人数が少ないからこそできるスタイルだと思いました。 誰かに教えることで自分のわからなかった部分が見えてくることもあるので、受講生同士がお互いに教え合うのはとてもいいと思いました。

最後に、講師の kurenaif さんの教え方が、道を外れないようにヒントを出しつつ重要なポイントは自分で気づかせる感じのスタイルでとても勉強になりました(時間の制約上、答えを出す場合もありましたが)。曰く、マウスカーソルの動きからも理解度を把握しているとのことで、オンライン慣れしている感がありました。 やはり学びは自らの手で解決して得られるものなので、理解度や状況に応じて誘導する教え方は見習いたいと思いました。 (ちなみに私自身はフルオープンのプレイスタイルです…)

その他

セキュリティキャンプが始まるのに合わせて、肩こりに悩まされた有線イヤホンを新しくワイヤレスイヤホンに買い替えました。 そしたら肩こりは無くなったのですが、4時間という長時間の講義に対してマイクONの状態のイヤホンのバッテリーは2時間くらいしか持たず、講義中にどうしようか焦っていました。が、ワイヤレスイヤホンは片方だけでも使用できることに気づいたので、バッテリーが減ってきたら片方だけで使ってもう片方は充電するという運用で乗り切っていました。

キャンプの後半の方で、担当外のL-IゼミからOpenSSLの特定のバージョンでバグが発生する原因を何かご存知ですか?という連絡をDiscordで受けたので、最近OpenSSLの脆弱性情報が出ていたからそれ関連かなと思って、JPCERT/CCの OpenSSLの脆弱性(CVE-2021-3711、CVE-2021-3712)に関する注意喚起 を共有したけど関係なく、問題確認のためのOpenSSLコンパイルなら任せろ!ということで例のtex2e/openssl-playground - GitHubで公開しているOpenSSLをバージョン別でビルドするDockerコンテナを使って確認をしたのですが、問題は再現しませんでした。という報告をしていました。 仕事だと工数管理の入力が面倒になってしまう場面ですが、もちろんここではそんなこと気にしなくてもいいのが、キャンプのいいところです。

あとは、同じL-Iゼミ修了生の @softbeear さんが今年はチュータとして参加されていたので、他の人たちがスポンサー企業の紹介などをしている裏の隅っこで2人でお話していました。 会話自体は数ヶ月ぶりでしたが、結局3-4時間くらい話していて話が止まらなかったです。 また機会があればお話したいな〜と思いました。

最終発表・閉講式

最終日の10/3はグループワークの発表と集中コースの全体発表を聞きました。 グループワークについては、個人的にはグループMのセキュリティ学習カードゲームの制作・販売がどんな形になるのか楽しみです。 集中コースの全体発表は、発表は短い時間でしたがどんなことをやったのかが伝わる発表で良かったです。 今後の活動に期待しております。

おわりに

暗号トラックのチュータをやっていると毎回扱うテーマが変わるので、今まで3回チュータとして参加しましたが、3回とも違う感じでとても面白かったです。 次回も参加する機会があれば、今回の反省を踏まえて参加したいと思います。 キャンプ関係各位の皆様には大変お世話になりました。ありがとうございます。

私自身の今後としては実社会(リアルワールド)における暗号技術の実装や運用という面から、暗号技術やプロトコルへの切り口を見つけられたらと思っており、CTFプレイヤーとは違った観点から、今後とも面白そうなところに足を突っ込んでいきたいなと思っております。しばらくはQUICプロトコルの自作を頑張りたいと思います。

最後に「Docendo discimus(教えることによって私たちは学ぶ)」という言葉でこの参加記を締めたいと思います。



  1. ハラスメントについて、特に主観的な発言には気をつけてください。客観と主観を混ぜないでください。遅刻したという事実、他の人に迷惑がかかるという客観的な意見、遅刻する行為は人としてダメという主観的な意見 など、様々なシチュエーションで考えてみてください。パッションだけで物事は解決しません。なぜその問題が発生するのか原因を考えて考察を伸ばしてください。