コンピュータウイルスに対する一般のおやじの提言。

旧石器時代のバファオーバラン問題を根本的に封鎖する方法。(追加2)


これからの第三者プログラムが動くCPUの設計はオブジェクト指向型CPUの設計に準拠するように策定する。現在ではCPUセキュリティ機構の設計当初とちがってメインメモリが32GBや64GB搭載が当たり前になってきていますので、もっとセキュリティにメモリを割くべきです。例えばセレクタの記述子データなどをもっと多機能にしても良いかと。
今のセキュリティはMMCのGDTとLDTでそれぞれのプロセス空間(論理アドレス空間と物理アドレス空間)は共に分離されています。本来は、それぞれのプロセスが他のプロセスの物理アドレス空間を扱うことはおろか、論理アドレス空間のプログラムやデータ内容も見ることもできません。また、ユーサーモードで動いているプロセスはこのGDTやLDTなどの特権命令を実行することもできません。
私が昔から言っているEMMC構想の初期の部分を言います。既にそうなっている部分があればすみません。
このMMCにプロセス内メモリの扱い方について追加します。現在はセレクタとして使われている昔はセグメントレジスタと呼ばれたものの機能を厳格にします。コンパイラアセンブラがこれに準拠すれば、素人のプログラマがミスしようが、故意に作ろうとしても事実上バッファオーバランはできないことになります。
CSに当たるレジスタをコード専用セレクタ用のレジスタ、DS,ESに当たるレジスタをコード専用レジスタ、SSに当たるレジスタをスタック専用レジスタとし、オプジェクト指向的にコードはCSが管轄する論理アドレス範囲のみで、特権命令やカーネルモード実行時のローダによる書き換え以外はできない。インスタンス領域やヒープ領域などのデータレジスタはDS,ESが管轄する論理アドレス範囲のみで、ここでは実行ができない。ユーザースタックはSSが管轄する論理アドレス範囲のみで、ここではPUSH/POPなどのスタック用の命令しか実行できない。
デフォルトの設定では、スタティックモードでこれらの専用のセレクタをいちいち指定しなくても規定の論理メモリ割り当てのものが使えます。例えば32ビット論理メモリ空間を四等分してCS、DSES、SS、OS窓に割り当てるとかです。モードでいくつかのタイプの割当があるでしょう。アクティブモードにすると上記のようにそれぞれのセレクタを容易して細かいアドレス範囲を設定できます。
追加として、BSレジスタの扱うセレクタに記述された物理メモリ範囲をバッファ専用にしてもよいかと。これとバッファ操作専用のマシン語コードを設定します。これにはバッファサイズで指定されたメモリをゼロかFFクリアなどを自動で行う機能です。更にこの時にバッファの最後に反転したFFかゼロを書き込みます。専用のマシン語コードでこのバッファに書き込んで行き、最後の反転がハード的に勝手にチェックされます。これで確実にバッファオーバランは防げます。
もう一つの機能は、バッファオーバーラン問題で取り上げましたが再現性の要素です。
バッファオーバランで故意のコードを実行するには、バッファの予定長以上のメモリに上書きしてそこにスタック領域があり、関数の戻り値を好きなアドレスに書き換えて関数が戻ったときに書き換えたアドレスがバッファ予定地とスタックの間にある上書きしたコードのアドレスにジャンプして実行させるといったものです。これだけでも大変なことで、これらの位置関係が事前に分かっていて更にその状態がこなければできない代物です。もともとそれほど簡単なことではないのです。
GHOST事件では、ヒープ領域を使用します。サーバプログラムで使用されるのでヒープ領域はユーザ依頼の状況で千差万別です。とても事前にアドレス体型が分かりその状態がくることが予測されるものではありません。これで実行できたら奇跡的な神がかり的なものです。しかも現在ではレアな関数です。これをネットでは「恰も直ぐに乗っ取れる」などと誇張表現されていました。15年も何も問題がなかったのはそのためでしょう。明らかにオープンソースに対する工作としか言えません。私が活動を始めた頃にです。
このことを逆に利用して、もっと確実に根本的にバッファオーバランを出来なくすることが出来ます。更に、どのような使い方でもヒープ領域やインスタンス領域の論理メモリをランダム的に配置する機能です。これはハード的にもOS的にもコンパイラ的にも可能です。こうすることで以下にバッファの後に書き込みができたとしてもアドレスが分からない、再現性がないので、上書きコードにジャンプすることはできません。この方法論はいくつかありますし、EMMC構想のAPIセキュリティ機能と被ってもいますので、今回は割愛します。また後日残りの方法論と一緒に提言するかもしれません。

上記2つでナインイレブン%解決します。残りは非常に確率論的に難しいので割愛しますが、残りのアイデアで200%解決するでしょう。