セキュリティキャンプ2017用の特設ページ
セキュアなCPUを自作しよう!〜OSECPU-VMゼミ〜 の基本情報
- セキュリティ・キャンプ全国大会2017の公式ページ: https://www.ipa.go.jp/jinzai/camp/2017/zenkoku2017.html
- 時間帯: 3日間連続
- 概要:
- 講義「セキュアなCPUを自作しよう」では、2つのゼミがあります。
- ひとつは「OSECPU-VMゼミ」で、OSECPU-VMをFPGAに移植します。(このページで説明します。)
- もうひとつは「オリジナルCPUゼミ」で、自分で設計したCPUをFPGA上に実装します。(今岡さんが担当します。このページでは説明しません。)
- 必要機材: PCのみ
- FPGAボードは事前学習時に配布する予定です。キャンプ当日も忘れずに持ってきてください!
- PCに関しては、Quartus Prime Lite Edition v16.1 が動作するスペックのものが必要です。不安な方は、事前に以下のリンクから動作要件を確認しておいてください。
- http://dl.altera.com/requirements/16.1/
- OSはWindowsもしくはLinuxであれば問題ありませんが、Macの方は仮想マシン上のLinuxにインストールする必要がありますので、注意してください。
- 事前学習: あり
- このゼミは、事前学習を非常に重視しています。
- というのも、キャンプ当日の3日間だけでは、とてもCPUを移植するには時間が足りないからです。
- 事前学習では、一般的なCPUを構成する各回路の設計を学んでから、OSECPUの基本的な実装までを終わらせる予定でいます。
- ですから、事前学習に十分に時間を割ける自信があり、かつ十分なやる気がある人を募集します。
- キャンプ当日は、実装済みのOSECPUで自作のアプリを走らせたり、機能追加などの改造を行いたいと思います。
(0)そもそもOSECPU-VMとは?
- OSECPU-VMは、圧倒的なバイトコード密度と、セキュリティを考慮した設計が特徴の仮想マシンです。
- 「30日でできる!OS自作入門」で有名な川合秀実氏(通称Kさん)が設計・開発しました。
- ここOSECPU-Wikiは、その名の通り、OSECPUの情報がまとまったWikiです。
- しかし、ほとんどの情報は古くなってしまっているので、ここで2017年現在の最新情報をまとめます。とにかくまずはこのページを読んで下さい。
圧倒的なバイトコード密度
- HelloWorldというプログラムを書いたことはありますか?そうです。入門書でよく出てくる、あれです。
- みなさんは、HelloWorldのプログラムをどれだけ小さくできると思いますか?
- ちなみに何も考えずにCで書いてMacでコンパイルしたら8KB程度でした。
- たぶん、"Hello, world"で12文字だから、12バイトよりは大きいでしょう。
- 大抵のみなさんは、小さくても100バイト程度かな、と思うでしょう。
- 100バイトにするのだって非常に困難です。
- ちなみに、Linux(x86)では、58バイトで実現できるようです。
- ここで、OSECPU-VMの場合を見てみましょう。
- 「いやいや、きっと文字列表示に特化したCPUなんだろう。他の作業は苦手に違いない。」
- そんなことはありません!
- マンデルブロ集合:49バイト
- インベーダーゲーム:430バイト
- ちなみに他のOSでは:はりぼてOS: 1509バイト, win32: 2560バイト
- もっと例を知りたいひとは、page0103を読むと良いでしょう。
- ちなみに、マンデルブロ集合のプログラムは表示されるまですごく長い時間がかかります!
- 試す際は辛抱強く待ちましょう。
なぜこんなに高密度なアプリが書けるのか
- それは、コード体系を多層化し、フロントエンドコードではサイズだけを重視したからです。
- OSECPU-VMのバイナリには、バックエンドコードとフロントエンドコードの2種類があります。
- フロントエンドコードは、サイズをとにかく重視した設計になっています。
- 可変長の命令体系なのはもちろん、よく使う整数や命令は短く表現できるようになっています。
- hh4エンコードの説明: page0106
- フロントエンドコードの説明: page0107
- バックエンドコードは、シンプルさを追求した設計になっています。
OSECPU-VMとセキュリティ
- OSECPU-VMでは、セキュリティについてもバイトコードレベルで考慮されています。
- まずメモリアドレスを指定してジャンプすることができません!
- つまり、あらかじめ決められた位置にしか飛ぶことができないのです。
- これにより、誤ってデータを実行してしまったり、中途半端な位置からコードを実行してしまうことを防げます。
- さらにすべてのメモリアクセスで型チェックと範囲チェックが強制されます!
- そもそも、メモリ上の任意のアドレスを読み込む命令自体が存在しません!
- プログラムは「ポインタ」を介してのみメモリにアクセスでき、異なる型としてアクセスしようとしたり、範囲外の領域にアクセスすることはできません。
- 悪さをしようとすると即座に「セキュリティ例外」が発生して実行が止められてしまいます!
- これらの機能は、セキュリティだけでなくバグの発見にも非常に有効です。
(1)講義の概要
講師について
- このゼミを主に担当する講師はhikaliumです。
- 併設される「オリジナルCPUゼミ」を主に担当する今岡通博(@imaoca)さんと一緒に、「セキュアなCPUを自作しよう」という講義を担当します。
- 私は2013年からOSECPU-VMに関わっており、これまでVMのJavaScript向け移植や、OSECPU-VMバイナリを出力するコンパイラを開発してきました。
- 今や、OSECPU-VMの開発者であるKさんに「OSECPUのことはhikaliumさんに聞いてください。」と言われるほどになりました。
- なのでみなさん、OSECPU-VMのことは私に任せてください!質問していただければ、すぐに答えます!笑
- また、FPGAの実装に関しては、私以外にも今岡さんがサポートしてくださいます。
- 今岡さんは、FPGAスタートアップというイベントを主催されている方です。私もスタッフをやっています。
- 今岡さんはFPGAだけでなく低レイヤ全般について経験豊富な方なので、低レイヤの話題で質問があればぜひ今岡さんに聞いてみてください!
- というわけで、受講するみなさんは、サポート体制に関して不安に思う必要は特にありません。
- いちばん大事なのは、「OSECPUをFPGAに移植したい!」という熱意です!
OSECPU-VMとセキュリティ・キャンプについて
過去の特集ページは以下のとおりです。(かなり情報が古くなってしまった上に、今回の講義とは内容が異なるので、読まなくてOKです。)
(2)キャンプでは何をするのか
- このゼミの目標はただ一つ。「OSECPU-VMをFPGAに移植する!」
- つまり「OSECPU」をつくる!ということです。(もはやVMではない!)
- これ以降「OSECPU」と書かれているときには、FPGA上に実装されたOSECPUであると考えてください。
- なお、事前学習の比率がそれなりに大きいことだけは覚悟してください。
事前学習ですること
- 事前学習では、まずFPGAに慣れるために、かんたんな組み合わせ回路や順序回路を構成するところから始めます。
- 次に、CPUを構成する上で必要となる各回路(命令デコーダ、ALU、レジスタ)の構成方法を学びます。
- 事前学習の終わりには、こちらの用意したFPGA版OSECPUを実際にFPGAに書き込んで実行してもらいます。
- このFPGA版OSECPUには、最低限の機能しか実装されていません。これをみなさんが改造して、よりよいOSECPUを開発するのがこの講義の目的の一つです。
キャンプ当日にすること
- キャンプ本番では、みなさんが自分の手で書き込んだFPGA版OSECPUを用いて、好きなように遊んでください。改造も大歓迎です!
- 例(ほんの一例なのでこれに従う必要は一切ありません!OSECPUを使うならなんでもありです!):
- 簡単なアプリを書いてOSECPU上で実行させてみる
- OSECPUからGPIOを操作できるようにして、OSECPUを用いてLチカを実行する
- 浮動小数点命令に対応してみる
- VGA出力を追加して描画APIを実装する
- パイプラインを実装して実行を高速化する
(3)セキュリティの話は?
- OSECPU-VMはセキュリティを非常に重視した設計になっています。それを命令セットを通して学んでもらえれば十分です。
- こんな脆弱性があるよ!とか、ここはもっとこうした方がいいのでは?という意見も大歓迎です。ぜひ、自分の手でOSECPUを改造して組み込んでみてください!
- ちなみに、キャンプには設計者のKさんも別の授業の講師として参加されますので、仕様に関して「ここはおかしい!こうしたほうがもっといいのに!」という意見があれば直接ぶつけてみることもできます(笑)
- ただし、この講義は「ものづくりトラック」の一部ですから、セキュリティよりも「ものづくり」を重視しています。
- なので、セキュリティなんてわからないけれどCPUを作りたいんだ!という学生でも全くかまいません!
- たとえそうだとしても、OSECPUの命令セットに触れることで、セキュリティを意識した命令の設計とはどんなものか、わかっていただけると思います。
(4)どんな学生に受講してほしいのか
- 一生に1度くらいはCPUを作りたいと思っていた学生
- 事前学習に時間が取れる学生
- 試験期間(の前後)や修学旅行などの時期は事前学習を完全にお休みしていただいて構いませんが、それ以外は1週間あたり5時間くらいは事前学習に費やしてほしいです。ですからたくさんの塾を掛け持ちしていて忙しくてたまらない、アルバイトが大変すぎる、部活動が大変すぎて時間がない、という人は、申し訳ありませんが他の講義を選択してください。
- 手持ちのPCがない人は残念ながら事前学習に取り組めないため、この講義には参加できません。ごめんなさい。また、この講義で使用するソフトウエアはそれなりにCPUパワーとメモリ容量を要求します。ですから、自分のPCの性能に不安がある方は再検討をおすすめします。
- 優秀な学生じゃないとだめですか?
- もちろん優秀な学生は大歓迎ですが、まだ技術が足りないなあ…と感じている方にもぜひ参加していただきたいです。もしかすると、初心者だからこそ気付けるバグや直したい点がみつかるかもしれませんよ。もちろん、初心者だからといって、こちらも特別扱いはできませんが、自分で解決していける意欲がある方なら誰でも歓迎します!
- ただCPUをFPGA上に実装するなんてつまらない!
- せっかくCPUをつくれるのだから、これまでにない命令セットのCPUを実装してみたいんだ!
こめんと欄