* Kの開発メモ #0000 -(by [[K]], 2012.09.09) -ここは川合の開発の進捗などをレポートするところです。 --当初はその予定だったが、今ではむしろ主たる目的は[[K]]の備忘録になってしまっている(苦笑)。 ** 2012.09.07 Fri -OSC2012東京秋の1日目の帰り道で、KOZOSの坂井さんといろいろ話をして、OSECPUを作ろうと思い立つ。基本設計を完了する。 --KOZOSの坂井さん: http://kozos.jp/ ** 2012.09.09 Sun -wikiページを立ち上げた。[[FrontPage]]と[[memo0000]]と[[page0000]]を書いた。 -この「おせくぷ」という名前は、もちろんOS+SEC+CPUに由来する。 -OSECPUは、寄生型OSとして出発する。これは第二世代OSASKのefg01方式と同じである。 --なぜそうするのかというと、この方法ではじめれば、OSのブートとかデバイスドライバとかシェルとかマルチタスクなどについて悩む必要がなく、APIの開発に集中できるからだ。僕はセキュアなAPIとはこういうものだと示したい。 --OSそのものの開発については、もう「はりぼてOS」で十分に例を示せていると僕は思う。そんなことをもう一度やり直しても面白くはない。 --なんとなれば、いつでも「はりぼてOS」のAPIだけをOSECPUに置き換えることができるだろうし、そうすれば普通のOSにもなるだろう。 ** 2012.09.10 Mon -このwikiのページ名だけど、僕が書くものについては、memo系はログっぽいもの、page系はまとめっぽいものを書き溜める。他の人はこの名前を使わないでください。 -[[page0001]]と[[page0002]]を書いた。 ** 2012.09.11 Tue -&color(#FF0000,#FFFFFF){aaa}; -&color(#FF0000,#FFFFFF){[注意]この内容はややこしいだけで価値がないので読み飛ばしてください!}; -[[page0003]]と[[page0004]]を書いた。 -想定しているクラック手法も書くべきだよなあ。OSECPUはセキュリティ対策みたいなものなので、対策だけ書いても分かりにくいと思う。 -以下、自分用の備忘録。 --ポインタをOSASKでいうところのスロット番号化すれば、一箇所に集めやすい。その代わり、間接参照が増えるのでアクセスは遅くなる。 --オンメモリ化を保証するシステムコールがあれば、ページングもどきもできる。 ---malloc時に、同時にオンメモリ化するかのフラグがある。 ---オフメモリ化も必要。しかしオフメモリ化APIを呼んでもそれで直ちにオフメモリ化されるわけではない。 --その意味では、そもそもメモリ上に載っている活きたポインタはそう多くないのか。 --じゃあスロット番号化はやめて、ポインタのありかの一覧を作らせようか。 --いやこれは没。 --ゾーン式のリンクカウント方式を思いつく。レジスタもしくはメモリにポインタを代入するたびにこのリンクカウントを更新させる。これだとGCができそうだ。でもオーバーヘッドが大きすぎると思ったので没とする。 --freeするときに、該当メモリにアクセスできるすべてのポインタを見つけ出して、それをNULLにする。性能優先モードのときはこの走査をしないでいい。なぜなら残ったポインタを使わないから。 --この方法だとセキュア優先モードが結構遅い。そこでオブジェクトグループという概念を考えた。オブジェクトグループは階層になっていて、所属しているオブジェクトグループよりも上のオブジェクト内のポインタからは参照されない。参照もしない。つまり閉じている感じ。これなら探しに行く範囲を限定できる。オブジェクトはn個のオブジェクトグループに所属できる。nは1に固定すべきだろうか。ここは要検討。 ---malloc時にオブジェクトグループハンドルを渡す。 ---オブジェクトグループハンドルから、サブオブジェクトグループハンドルも作れる(子階層)。 --関数のスタックフレームもオブジェクトグループに属する。そのときのレジスタ値も同じオブジェクトグループとする。 ---あれでも関数のリターンアドレスはどうする? --オブジェクトグループのルールが守られないと意味がないから、ポインタ更新時にはチェックを受ける。このとき、オブジェクトグループの変更を伴うようなMOVとそれ以外のMOVは別の命令になっているべき。そうすれば性能優先モードのときにチェックを省略できる。 ** 2012.09.12 Wed -&color(#FF0000,#FFFFFF){[注意]この内容はややこしいだけで価値がないので読み飛ばしてください!}; -なんかオブジェクトグループはいまいちな気がする。とりあえず名前をオブジェクトドメインとでもしようか。 --いまいちなのはもちろん名前ではなくて、仕組みのほう。 -こうすればいいかな: --オブジェクトは何らかのドメインハンドルに属させる。 --それぞれのオブジェクトには参照先ドメインというのがある。各メンバーはいずれもこのドメインの外はさせない。 --なんかここがいまいちなんだよなあ。 -こうすればいいかな: --ドメインとか全部やめる。その代わりセキュア優先モードではfreeされても同型でしか再利用しない。また値は全てinvalidにして、リードされたら強制終了にする。 --というかmalloc域やスタック域にはヘッダをつけておけばいいだけなのでは?ヘッダに状況が書いてある。セキュア優先モードではヘッダを見て動作する。「freeされても同型でしか再利用しない」は同じ。 --シグネチャを乱数で書いておいて、一致しなかったら終了。シグネチャはfreeしない限り変わらない。 ** 2012.09.13 Thu -[[page0002]]を修正した。SYSCALL命令の廃止。Pxxレジスタへのラベル定数MOVの追加。 ** 2012.09.18 Tue ~ -09.18火: とりあえず、ver.0.0仕様でアセンブラを書いてしまいたいのだけど、時間がない。困った・・・ -09.19水: このOSECPUはよくできていると自分でも思うけど、この設計にいたったのは実はセキュリティをよく考えたからではなくて、ページングもセグメンテーションもない組み込みCPU向けに、どうやったら仮想記憶を実現できるかを何年も考えていたからだと思う。それが実はセキュリティのためにも役立っていたというだけのこと。 -09.21金: さてこの週末に少しでもコードが書けるだろうか・・・書きたい。 -09.24月: 少しだけ書けた。でもまだまだだ。世間では「use-after-free脆弱性」というものが話題になっているらしいけど、09.12のアルゴリズムがあれば、この攻撃もOSECPUは検出&阻止できる。 -09.22火: [[page0005]]を書いた。 -10.02火: Javaにはポインタがないし、freeもない。おかげで「use-after-free脆弱性」みたいなものはないんじゃないかな?それともバイトコードレベルではあるんだろうか?・・・ただ、Javaはガーベージコレクトがあるのが気に入らない。自分の好きなタイミングでメモリ開放ができないなんて!・・・しかしとにかく、JavaはJavaでよく考えられているなとは思う。 ** こめんと欄 #comment