# TEEビルド&スクラップゼミ応募課題 * 本応募課題では、各問難易度を高めに設定しており、(コード実装含め)完答を前提としてはおりません。 同時に、ゼミの主題であるTEEへの(スタンス的な)適性や、解答までのプロセス、熱意を測る意味合いを多分に含めています。 完答が難しい場合、途中までの調査結果や思考内容、自らの意見等を記述していただければ、そちらも大きく加点対象といたします。 * 文字数が多い事により採点に有利になることはありません。 * フォームの文字数制限を超過する場合は、外部サービスを利用し限定共有の形で共有いただいて構いません。 * この応募課題のテキストは、Markdown形式で記述しているため、Markdownとして表示する事ができます。 * 解答を作成する上で、各種参考文献やサービス(LLM等)を参照するのは全く減点要素にはならず、寧ろ大歓迎です。 ただし、文献やサービスを参照した際には必ず参考文献を記載してください。 LLMで解答を導出し、論拠となるサイトや文献の特定に失敗した場合、使用したLLM名(サービス、モデル)も必ず明記してください。 (DeepResearch等による助力含め、LLMの回答の論拠を特定できた場合は不要です) TEEやその実装例の1つであるSGXについての基本的な前提知識については、例として以下の文献を参考にしてください(勿論以下の文献に限りません)。 * https://www.ieice.org/~dpf/wp-content/uploads/2021/08/DFS研究会産総研須崎.pdf * http://www.ipsj.or.jp/sig/os/index.php?plugin=attach&refer=ComSys2020&openfile=ComSys2020-Suzaki.pdf * https://acompany.tech/privacytechlab/author/ao-sakurai * https://qiita.com/Cliffford/items/2f155f40a1c3eec288cf * https://qliphoth.io/seccamp/ # 簡易的な前提知識 TEEとは、ハードウェア(主にCPU)により厳重に隔離された領域にデータを保持し、その状態で隔離保護領域用に定義された コードを実行する事で、終始データを保護しながらそのデータを利用した処理を可能とする技術です。 特に、Intel SGXにおいてはこの隔離保護領域を「Enclave」と呼びます。SGXのEnclaveは、CPUの極めて特権的な制御により 隔離されている上、その全域がAESベースで暗号学的に保護(暗号化)されているという特長を有しています。 # 問題 ## Q1. あなたがTEEを使用して実現してみたいプロダクト(アプリケーションやシステムなど)を、理由と共に紹介してください。 セキュリティに対する興味を交えて紹介いただけるとベターです。 その上で、本ゼミでメインとして取り上げるIntel SGXは、その利用・開発の際にC/C++に強く依存するため、最低限のC/C++のスキルがないと 一切の開発を行う事ができません。 そこで、C/C++(特にC++)を使用して行ったものや開発したものがあればそれについても説明してください。 GitHub等に自作のコードがあれば、そのリンクも共有してください。 もし経験がない場合は、ゼミ本番までのC++の習得に関する計画を述べてください。経験の有無自体が採点に影響する事はありません。 ## Q2. Intel SGXにおいては、それがいかに重要な機能であっても、比較的唐突かつ十分な猶予無しに廃止を宣告される事があります。 例えば、種々の信頼可能な機能を提供していた、Intel製の特別なEnclaveであるPSE(Platform Service Enclave)がこれに該当します。 また、リモートに存在するEnclaveやそのSGXマシンの正当性(信頼可能か)と完全性(コードが改竄されていないか)を検証するために、 Remote Attestation(RA)という手続きが必要ですが、今まで主流であったEPID-RAという方式のRAが、突如サービス終了を宣告され、 2025年4月にはもう完全に使えない代物となってしまいます。 さらに言えば、クライアント向けCPUであるCoreシリーズでも第6~10世代でSGXに対応していましたが、第11世代以降突如SGXが削除され、 現行のCPUとしてはXeonプロセッサでのみSGXを使用可能です。 あなたは、これらの機能やSGX自体をヘビーに使用している状態で、もしこのような唐突な廃止を宣告された場合どのように思いますか。 また、上記のIntelによる運用は褒められたものでは無いと考えられますが、それでもIntelがそうせざるを得なかった理由と、 本来取るべきであった理想的な運用についても考察(あるいは調査)して回答してください。 ## Q3. TEEには、通常のOSすら信頼不可能と見なして特定のコードのみを信頼可能とする「部分隔離型」と、 VMを丸ごと隔離保護する(つまりはOSも丸ごと内包し信頼する)「VM型」の2種類が存在します。 部分隔離型には、本ゼミでメインとして扱うIntel SGXに加え、ARM TrustZoneやRISC-V Keystoneが存在します。 一方、VM型としては、Intel TDX、AMD SEV、ARM CCAが主なものとして存在します。 ここで、SGXのような部分隔離型では対処できるものの、TDXのようなVM型では対策できない攻撃シナリオを考察し説明してください。 攻撃シナリオについての説明は、具体的なあるサービスにTEEを使用する想定での説明でも、より一般化した議論としての説明でも どちらでも構いません。 ## Q4. この大問Q4は、属する小問Q4-1~Q4-2から自由に選択し解答する選択問題の形を取っています。各大問での指示に従い、 問題を選択して解答してください。 余力があれば指定された選択数よりも多くの問題に解答しても構いません。 ### Q4-1. C++において、文字列"Hello, TEE."(または、お好みの文字列やバイト列があればそちらでも可)に対する、 単一の128bit AES-CMAC値を算出するプログラムのソースコードを書いてください。 結果のMAC値を16進数表現で出力するようにし、実行結果の 鍵は、128bitの鍵を毎回乱数的に動的生成して使用してください。 OpenSSLで実装するのが比較的楽であると思いますが、その場合はOpenSSL公式GitHubリポジトリのサンプルコードも参考になります。 https://github.com/openssl/openssl/tree/openssl-3.4.1/demos/mac ただし、システムコール(例:system, fork+exec)によりopensslコマンド等を呼び出すような実装は不可とし、 C/C++コードから直接OpenSSL等の暗号ライブラリを用いて実装するものとします。 実装の上で必要な前提知識については、例えば以下の文献を参考にしてください。 * https://edn.itmedia.co.jp/edn/articles/1810/10/news012_3.html * https://tex2e.github.io/rfc-translater/html/rfc4493.html * https://ja.wikipedia.org/wiki/CMAC ### Q4-2. お好きなコンピュータにおいて、以下に示す特定のモデル固有レジスタ(MSR)を読み取り、得られたビット列が意味する内容を解説してください。 ただし、MacではこのようなMSRの読み書きが難しいため、Mac以外のマシンで実行するものとします。 ビット列が意味する内容を解説する際に出てくる専門用語(例:IBRS、MDS)についても、可能な範囲で調査し軽く解説してみてください(必須ではありません)。 MSR自体の基礎知識については、例えば以下のサイトを参照してください。 https://mcn.oops.jp/wiki/index.php?CPU%2FMSR #### Intel CPUのマシンである場合 IA32_ARCH_CAPABILITIES(MSRアドレス:0x10A)を読み取り、返ってきた値をビット表現し、各bitが何を意味しているかを解説してください。 つまり、各bitが何を示すビットフィールドであり、あなたのマシンで出力されたそのbitがどのような状態を示しているかを説明してください。 例えば0x02Fと返ってきた場合、0b000000101111のようにビット表現し、各bitが何を意味しているかの説明をする形となります。 #### AMD CPUマシンである場合 SPEC_CTRL(MSRアドレス:048h)を読み取り、返ってきた値をビット表現し、各bitが何を意味しているかを解説してください。 解答方法に関しては上記のIntel CPUマシンの場合と同様とします。 情報源については、AMD64 Architecture Programmer’s Manualを見ると正確です。 #### 上記MSRを読み取れない環境の場合 手元にMacしか無い、あまりにも古いマシンしか無い等の理由により、上記MSRを読み取れない場合、任意の他のMSRを選んで読み取り、 その内容について説明してください。 Macであれば、カーネル拡張(kext)を用いると間接的にMSRを読み取れる場合があります。 https://larry1301.wordpress.com/2015/12/14/macbook-cpu-throttling-motherboard-thermal-sensor-and-bd-prochot-msr/ それでも読み取りが難しい場合は、そのマシンにおいてMSRを読み取れない理由について考察してください。 さらに、Intel CPUマシンの場合の部分で取り上げているIA32_ARCH_CAPABILITIESについて、各bitフィールドが何を表すためのものなのかを それぞれ説明してください(実際のbit値を出す必要はありません)。 #### MSRの読み取り方法 原則として、ホストOSでしか読み取れない(VMからの読み取りは難しい)点に注意してください。 ##### Linuxの場合 msr-toolsをapt等でインストールすると使用できるようになる、rdmsrコマンドにより簡単に読み取れます。 ##### Windowsの場合 [RWEveryThing](https://rweverything.com/)というツールを用いると、GUIベースで目当てのMSRを読み取れます(閲覧できます)。 以下リンク先の「Example #3: MSRs」で説明されている手順に従い、当該MSRの値を取得してください。 https://www.basicinputoutput.com/2017/08/rweverything-yes-everything.html