ドッタンバッタン大騒ぎして結局今までろくにまとめられなかったセキュリティキャンプの参加記。
セキュリティキャンプ2017参加記
感想も交えて詳しく書けたらいいなと思っています。
あれから7年、時が経つのも早いものです。今年も講師として参加させていただきました。
クロスウェーブ府中での開催は今年で最後とのことで、図らずもクロスウェーブ府中開催の最初と最後に参加することになりました。
今年は去年までとは異なり、「OS自作ゼミ」から「ハイパーバイザ自作ゼミ」を受け持つこととなりました。レイヤが1段下がった感じです。最近はずっとハイパーバイザを作っていたのでそこで得た知見や仮想化技術の使い方について理解を深めてもらおうというと考えて提案したゼミです。とてもやる気のある受講生の2人に支えられて無事にやり遂げることが出来ました。
これまでの記録
セキュリティキャンプ2017参加記
セキュリティキャンプ2019参加記(チューター)
セキュリティ・ネクストキャンプ2020参加記(チューター)
セキュリティキャンプ2023 参加記(講師)
事前学習
当ゼミでは事前学習を行いました。セキュリティキャンプでは概ね事前学習が行われており、キャンプ中に効率よく学習できるように事前に必要な知識を講義資料等を通じて理解してもらうようにしています。特に開発コースは、週一回で定例会を行って進捗確認をしたり講義を行ったりします。その中でもハイパーバイザ自作ゼミはOS自作ゼミと1位2位を争うくらいには定例会を開いていたと思います。そんな中でも熱心に参加してくださった受講生には頭が上がりません。
ハイパーバイザ然りOS然り、セキュリティキャンプ期間中に何もわからない所から進めて動くものは到底できないので、事前学習で基礎知識や関連技術についての理解を確認していきました。ハイパーバイザを作るためにはCPUの挙動やOSの処理内容について理解する必要が有ります。特に仮想化支援機能についての理解が曖昧だと後々の実装に詰まるため、受講生が理解できてなかったところは時間をかけて解説しました。疑問点の追求などは受講生の方々が的確に行ってくれたのでこの点において、大変助かりました。
少し話はそれますが、「分からない」という点を洗い出して問題を細分化していくのは、とても大切で難しくもある能力です。低レイヤーの部分は様々な技術が組み合わさっている中で、うまく行かない部分を特定するのは難しいものです。これができないと、大きい問題が存在したまま立ちすくむことしかできません。
応募課題でも明記していましたが、分からない点を細分化して調べ上げた上で解決できるところは解決し、できないことを明確化する(記述する)能力がこの講義では必要となります。講義には多くの応募をいただきましたが、今回選考を通過された方はしっかりと考察と問題の洗い出しができていました。このような技術は開発コース全般に役立つと思うので、来年以降参加を希望される方は磨いておいて損はないと思います。簡単には身につかない技術ですが、コードを一文節単位で追いかけてみる、理解できない処理があったらその処理を抜いて動かしてみるなどをやってみると少しずつ身についていくと思います。
話を戻すと、事前課題までで受講生の方々はThin Hypervisor方式でゲストOSが動く一歩手前まで実装することができました。
1日目
またも変なルートで向かいました。
今年は昼食がありませんでした。宿泊が一日多くなった影響ですかね。
開会式が行われ、特別講義が始まりました。講師陣は特別講義を聞くか講師控室で過ごすことになっているので講義を聞いたり講義控室に行ったりをしていたら、チェックイン可能な15:00になっていたのでチェックインしました。944室で、9階のMAX Numberでした。
部屋は相変わらず広くてきれいでした。なくなってしまうと思うと悲しいですね…
夜ご飯はお弁当形式でした。今年はご飯は弁当形式が多くなったみたいですね。
夜ご飯を食べ終えたら、ホームルームです。ホームルームでは受講生2人と顔合わせを行い、セキュリティキャンプ期間中にやりたいことや不安点について確認を行いました。
とりあえずは、ハイパーバイザの上でAlpine Linuxが動作するようにすることにしました。
部屋からの夜景を取っておきたかったのですが、一眼レフを持ち歩いておらず、スマホで撮ったのですがブレブレでした…
2日目
朝一番乗りでした。
早く来すぎたせいか一部食材が準備されてなくてサラダばっかり食べてました。
ご飯食べたら早速開発コースの講義が始まります。
まずは、ハイパーバイザの上でLinuxが起動して動くことを目指しました。
受講生の2人はThin Hypervisor形式を採用していたため、デバイスは実デバイスをパススルで見せるために必要な機能を色々実装しました。私は余計なことをホワイトボードに書きながら、受講生の方のデバッグを手伝っていました。途中、隣のOS自作ゼミの様子も見たり、謎のレイヤバトル(?)でOSとハイパーバイザの関係性について話したりしました。
お昼ご飯は例年通り選択制でとても美味しい食事でした。日頃から適当なものを食べているので味が身にしみて良かったです。
午後も開発が続きます。無事にAlpine Linuxが動作するようになって、それぞれの実装したい機能に取り掛かっていきました。
1人はゲストOSが”Password”と出力したら入力内容を記録して、改行した瞬間にタイプしたパスワードを出力するハイパーバイザレベルでのキーロガーをパラパススルデバイスを通じて実装し、Raspberry Pi 5で動作させてみることにしました。
もうひと方はVirtio-networkに興味があったためVirtio-networkデバイスの挙動を解析し、表示する方向で進むことにしました。
パスワード取得は”Password”の文字列の出力の検知がうまく行かず、デバッグしていたところで夕食の時間となりました。
二日目の夜ご飯もお弁当形式でした。
食事の後は、特別講義です。昨年は夜も開発コースの講義がありましたが、今年はないようです。講義控室で講師陣の方と近況報告をしたり、グループワークに顔を出したりしていました。
そうこうしているうちに、ホームルームになり、他の講義の方が見学に来られたので説明したり、受講生の方たちと明日の方針を確認して解散となりました。
3日目
結構疲れていたみたいで、7:30近くに朝食会場に向かいました。賑わっていましたし、食材も揃っていました。
朝食を終えた後は開発を続行します。
“Password”の検出にうまく行かずに、ゲストOSの出力をダンプしていったところ、ESC(0x1B)の後に色々なASCIIコードが出力されていることが判明。これは”ANSI escape code”と呼ばれる端末にて文字の色を変えたり、出力を調整するためのコードでした。これを回避しながら画面に表示される文字だけを追うようにしたところ、無事”Password”の文字列を検出できるようになり、キーロガーの発動タイミングを決定できるようになりました。
Virtio-networkの方はゲストOSの設定したVirtQueueのアドレスを取り出すことに成功しました。
そうこうしているうちに、あっという間に昼食時間になりました。
午後も開発は続きます。パスワードの取得がうまく行かなかったり、確率的に動かなかったり唸っていると、「もしかしてマルチコアで起動しているがハイパーバイザが稼働しているコアは1つだけなので機能不全を起こしているのでは?」というひらめきが降ってきて、Application Processor(2つ目以降のコア)の起動をブロックするようにしてみると見事動きました。Raspberry Pi 5で動くようにしてみます。
Virtio-Networkの方もVirtQueueの内容を取り出せるようになり、Ethernet Frameの解析に取り組んでいました。ネットワーク構造について調べているのは昔の自分を見ているようで懐かしい気分になりながら進捗を見守ります。セキュリティキャンプ中は時間がすぎるのが早いもので、夕食の時間になります。
食事の後は特別講義がありました。「けしからん」「インチキ」で有名の登さんの講義です。私はこの時間の間に隣のOS自作ゼミの受講生の方が、”__builtin_memcpy
“がmacOSのclangでは最適化なしの状態でも勝手に”memcpy”の呼び出しに置き換えられてしまって、memcpyを実装していないがためにリンク時にエラーになるという問題があったのでその調査をしていました。GCCでは再現しない(GCCの用意した自前のコードに展開される)ので、LLVMでドツボにはまったことのある自分はSimplifyLibCallsとかいう野蛮な最適化が走ってないかや、コンパイラのバグで無いかを調べていました。
結果として、Clang Language Extensions — Clang 20.0.0git documentationに「__builtin_memcpy_inline
を使えばmemcpyに展開されないよ」と書いてあるのを見つけました。龍の仕様はヨクワカラン…
ホームルームでは受講生の方に他の講義を見に行ってもらったり、やってこられた受講生の方に講義内容の紹介などをして終了しました。
4日目
朝は段々と遅くなりましたが、遅刻はしていないのでセーフ
いよいよ、開発講義も最終日です。OS自作ゼミの時は機能の実装を頑張ろうと必死になっていた気がしますが、今回はゴールをステップ毎に区切ったことによって、最低限のゴールは達成していたため、焦ることなく開発できているようでした。
Raspberry Pi 5で動作させた方は、私が突貫工事で作ったブートローダが動かないと言われて、エスパーデバッグと修正で動くようになりました。(メモリバリアとTLBフラッシュ不足だった…)
Raspberry Pi 5でも動いたとのことで、受講生の方がさんざん苦しまされたANSI Escape Codeを今度はハイパーバイザが強制的に注入してやろうということになって、OSの文字出力がカラフルになるGamingVisor(仮称)を開発していました。この頃から「インチキデバイスゼミ」という怪しいゼミになります。
Virtio-Networkの方も、DHCPのパケットやPingのパケットが見えてきて通信内容が見えてきて、ゲストOSがどのように通信しているかが流れていくようになりました。インチキデバイスゼミなので「このパケットも書き換えてみたら?」という流れになっていきpingのパケットの宛先を1.1.1.1に強制的に書き換えることに。ただし宛先だけ書き換えてもIPパケットにはChecksumなどがあるため、これの再計算が必要なため頑張って実装していきます。
そうこうしているとお昼の時間に…
午後も開発がすすみ、GamingVisorもOSが治安悪くゲーミングするようになり、Virtio-Networkの方もPingの送り先が勝手に変わるようになりました。動かしてわかりましたが、Linuxのpingは返信元のIPアドレスが違っても何も言わないんですね。
その後は成果報告用の資料と、翌日の発表用のスライドを作っていただきました。
そして、開発タイムは終了です。
夜ご飯の後はLT大会があり、私は恒例の(?)ACPI被害者の会をやりました。ピッタリ5分クオリティ。
ホームルームではLT時間中にコメントした受講生2人の成果資料や発表資料について少し直してもらいました。発表時間がかなり短いので内容を圧縮せざるを得ず…
その後は、他の講義を見に行ってもらったり、受講生の方には見学に来た方と交流してもらったりして、終了しました。
5日目
今年もなんとかやらかさずに済んだようです。
朝食後は、グループワークと専門講義の成果発表がありました。去年は詳細に記録してましたが、今年は講師自身がはしゃぎすぎたこともあって疲れて記録する余力がなく…
皆さん生き生きと成果報告していて「発表時間が足りない…」と苦笑いしながら次の方にバトンタッチしていました。
次に開発コースの成果発表です。3分に収めるべく、スライドを圧縮して講義概要を私が説明し、Evilなゼミではない事を前置きした上で受講生の方のユーモアたっぷりなハイパーバイザを説明していただきました。本当はもっといっぱい話したいことがあったと思うのですが、時間の都合上できなかったので是非他の場で披露してほしいと思います。
その後は写真撮影です。後ろのダブルピース野郎です。
その後は昼食です。最後の昼食です。
午後はジュニアコースの成果発表と閉講式がありましたが、疲れ果ててメモを取ることはできませんでした…体力の衰えを感じる…ですが、ジュニアの方も完成度の高い作品を作り上げられていました。
講師陣は本当はここで退散予定だったのですが、台風の影響もあり自費で延泊できるようになりました。というわけで、夕食です。
企業説明会の予定だった枠では、急遽セキュリティキャンプ卒業生の方が参加後の軌跡について語っていました。部屋の後方では怪しいゼミが開催されていたり、私は私自身の経歴について受講生の方々に話していました。かなり盛り上がっていたと思います。
6日目
ほとんど食材がなく、パンを貪ることに…
受講生の方々と挨拶をしたり、今後について心がけてほしいことに語ってお別れしました。
慣れ親しんだクロスウェーブ府中もこれで最後です。
感想
今回は全く新しい講義ということで受講生の方に楽しんでもらえて身につくような講義ができるか不安でしたが、お二人にとても良かったと言ってもらえてガッツポーズをしてます。
ハイパーバイザのレイヤは透過的であることが多く、中身がどうなっているかは意識されないことが多いですが、開発の大変さやその権限によるゲストOSのハックについての危険性について理解していただけたと思います。一方で今回のVirtio-Networkのパケット改変のようにソフトウェアの挙動をブラックボックスで解析するための技術としてこのレイヤはとても役立ちます。是非とも、お二人には今後とも活躍して行ってほしいと思います。
来年度も開催できるかはわかりませんが、このレイヤに興味のある人が増えると嬉しいなと思っています。