この文章はセキュリティキャンプ2019 Y-I OS開発ゼミ用に書かれたものです。
セキュリティキャンプが終了次第公開する予定です。主にOS自作のネタを提供するのが目的な文章ですので、参加者の皆様が強い目標をお持ちなら、ぜひそれを実現させてください。(全員そうだったらこの文章は無駄になるわけですが…それはそれで)
そうでなくとも、セキュリティキャンプに応募する際に何らかの目標を持って応募はされているとは思いますが、+αという感じや、より目標が具体的になるように役立ててもらえると幸いです。
RustでOS自作
これは自分がセキュリティキャンプ2017に参加したときの目標です。
Rustは安全性、速度、並行性の3つのゴールにフォーカスしたシステムプログラミング言語です。 ガーベジコレクタなしにこれらのゴールを実現していて、他の言語への埋め込み、要求された空間や時間内での動作、 デバイスドライバやオペレーティングシステムのような低レベルなコードなど他の言語が苦手とする多数のユースケースを得意とします。
https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/
とあるように、Rustは低レイヤを得意とする言語で安全性に重きを置いています。おかげで最初は「エェ…そんくらい許してくれや…」というエラーがガツガツ出ます。しかしながら、これらを丁寧に潰していけばほぼ100%期待通りに動いてくれます。セキュリティキャンプ2017では割り込みのバグを潰すのに時間がかかったわけですが(参照:セキュリティキャンプ2017参加記)、Rustが原因であることは少なかったです。
RustでのOS自作で参考になりそうなサイトは以下の通りです。
- https://github.com/PG-MANA/Methylenix (セキュリティキャンプ2017で作成したもの)
- https://github.com/PG-MANA/RusBoot (UEFIからブートする例)
- https://www.redox-os.org/ (Rustで書かれたOS)
- https://os.phil-opp.com/ (RustでOSを書くチュートリアル付きブログ)
NimでOS自作
Nim (旧称Nimrod) とは命令型、マルチパラダイム、コンパイル言語という特徴を持つプログラミング言語であり、アンドレアス・ランプフにより設計・開発された。Nimは「効率的で表現豊かで優雅」であるように設計されている。
https://ja.wikipedia.org/wiki/Nim
NimはRustより少し早めに出てきた言語で、Python風に優美にコードがかける…らしいです。よく言語比較サイトでRustと喧嘩してます。
NimはCのコードを吐けるのでこれを利用してOSを自作することも可能のようです。ただRustに対してネットでの情報が少なく難航するかもしれません。でも折角のセキュリティキャンプなので挑戦してみるのも良いかと思います。(自分も気になります。)
NimでのOS自作で参考になりそうなサイトは以下の通りです。
- http://sksat.hatenablog.com/entry/2017/12/12/213528 (sksat氏のNimでのOS自作に関する情報)
- https://github.com/dom96/nimkernel (Nimでのマルチブート)
ZigでOS自作
Zig is a general-purpose programming language designed for robustness, optimality, and maintainability.
https://ziglang.org/
かなり新しい言語のようですが、低レイヤも扱えるようです。が、日本語の情報がほとんどありません。どうしたもんでしょう…Nim同様挑戦してみるのも良いかと思います。
はりぼてOSを64bit対応してセキュアにしてみる
言わずとしれた30日OS自作本のはりぼてOSですが、今や時代遅れのOSと言われるようになりました…悲しい。
昨今のOSは64bit対応でページングを採用していますので、32bitOSでセグメンテーションなはりぼてOSとは大違いです。
しかしながらはりぼてOSはGUIもしっかりしてますし初心者向けにわかりやすくできているので、これを参考にしてUEFIブートなどに対応するのも良いかなと思います。
また30日OS自作本では、LDTなどを使ってメモリ保護などを行っていますが、全然セキュアではないのです。例えば
void HariMain(void){
api_boxfilwin(0, 8, 36, 141, 43, 3);
api_putstrwin(10000, 28, 28, 0, 12, "hello, world");
api_end();
}
というアプリでも作ろうもんならたちまちOSがぶっ壊れてしまいます。第一引数のwinをOS側で検証してませんから、適当な値を打ち込めばすぐやられます。これらを改善するにはどうしたらいいか考えるのもセキュリティらしいネタかもしれません。
別アーキテクチャでのOS自作
(もしx86環境という条件付きのキャンプでしたら以下のネタは利用できません)
世の中にはx86-64なCPUだけではなく、様々なISAがあります。
身近なものでは、スマートフォンでよく採用されているARMアーキテクチャや話題沸騰中のRISC-Vなど様々なものがあります。
QEMUでも実装されているCPUも多くありますので、実機では動かせなくともエミュレータで動くOSも作れます。
他のISAと比較することでx86-64がどのような性質を持って、セキュリティ的にどうかがわかるかもしれません。(自分はRISC-Vをいじって少しわかった…気がする…多分)
https://github.com/PG-MANA/RuscV RustでRISC-Vベアメタルをやったときのコードですが役に立つかもしれません。
終わりに
少ない量でしたが、何か役に立てたなら幸いです。これをみて全く別のことを思いついてもらっても構いません。
OS自作の分野は日本語の情報が(他に比べて)少ないですが、テーマは色々あると思うので、有意義なテーマを見つけて、頑張ってみてください。