top of page

昔からOSや有名ソフトの不具合によって、無駄な経費や時間を無駄にさせられてきました。たぶん一般人が受けたこともないような被害です。今回、Win8にアップグレードしてからVistaよりも更に不具合だらけでどうにもならない状態です。ハッキリと言いますと日本の某ウイルス対策ソフト自体の不可思議な挙動で「集団ストーカー」に関する告知についての妨害が多くあり、セキュリティの本質について考えるようになりました。ネットで調べると「都市伝説的に一部ウイルスメーカーがウイルスを作っているのではないか」といった文章を目にすることがあります。以前でしたら私もそのようなことは思わなかったのですが、最近では確実に不自然なことが続くのであながち完全に嘘とは言えないのではないかと思うようになりました。その根拠を少し述べて、実際のセキュリティについて少し考えてみたいと思います。

理由。日本制の某ウイルスソフトをお試しでインストールすると、「今まで使用していたソフト(集スト関連告知に使う)がウイルスに感染と表示され隔離されて起動できない」、「旧ソフトを保存エリアに移動し、新しいバージョンのソフトを探すが、(国内大手ダウンロードサイト2社)からダウンロードできない」、「そのソフトを念のために何度も落として(一度ウイルスソフトを停止してダウンロード。またソフト名を検索に掛けて調べると、海外のマイナーなよく分からないダウンロードサイトが見つかるが、そこからは落とせたこともある)個別に落とす、起動するとウイルスと隔離されるので、直接ウイルスチェックを掛けると感染0と表示」、「告知関連のファイルが一部消える」、「関連する調べものサイトが一部表示できなくなる」などが発生してアンインストールした経験があります。何度も色々な手順をやっていると急にダウンロードできたり、起動できたかと思うと突然にソフトが落ちたりと不自然な状況が色々と起きたことを覚えています。当時は個別に操作しているのではないかと思ったりもしていました。(当時の記憶を思い出して代替の順序で書きました。)このことと、以前そのHPサイトに「事件事故に関してはメディア関連のサイトをみて、その他の一般サイトは見ないようにしてください」などとハッキリと書いてありました。これは私のPDFなどを見て貰えると分かりますが、完全に言論封殺に繋がります。既存メディアの方が嘘偽り、偏向歪曲捏造が多いことは調べるとよく理解できることです。更に、私がPDFを配布し出すと、大手企業がメールウイルスに感染して大規模なデータが流出した事件が起こり、メディアでも良く報道されるようになりました。その中で報道の一部で問題のファイルの解説があり、隣にPDFファイルが堂々と置いてありました。キャスターの説明はこのようなファイルは不用意に開いてはいけませんでした。すべて繋がっています。彼らが遣りたいことは、どれも明らかに言論封殺の方向性でしょう。既存メディアと同じで、一部ウイルスメーカーは洗脳機関として動いている可能性が高いと感じます。それ以外に、趣味嗜好取得、行動監視、PC内情報の取得などの可能性もあります。私は、これからのネットの検閲や、透明性や健全性が脅かされる自体を危惧しています。

ただ、全くウイルスソフトは止めろと言うわけではありません。経験則ですが、まだ海外のメーカーのものをお勧めします。しかしそこにも日本支社が担当している以上は「工作員」が入り込み悪さをしているので完全とはいえません。(海外のソフトでも稀にタイミング良く宣伝フォームが出たり、更新が始まったりしたことがあります。)。また海外だからといって全てが真っ当だとも断言できません。私は海外有名どころのそれぞれ特化したソフト(ウイルス用、プロセスメモリチェック、ポートチェック、ファイヤーウォールなど)を複数入れて相互監視させることが良いのではないかと考えています。それと、それぞれが自己防衛意識を持って、「バックアップ」「重要情報の暗号化」「パスワードリセットディスクの作成と管理」「ウインドウズのシステム復元ポイント作成」などを小まめに心がける必要があると考えます。

ただ、これについても現在のシグネチャコードやデータベース方式だけだと限界だと考えます。既存の分かり切ったものしか検出できないですので、大きな被害が出るような亜種などは、大きな被害を狙って単発で使用されるようなものには効果が無いと思います。また、OSのシステムファイルや他のウイルスソフト自体はチェックサムが違うもの以外はスルーでしょうから、基本的な信頼性が謳われているソフトのバックドアや論理バグには効果が薄いと感じます。現代の世の中はコンピュータなしには成立しない構造になっているので、これからの未来の子供たちのためにもセキュリティについて、もっと世界的に研究議論するべきだと心底願っています。

ちなみに、総務省発言一部抜粋。「かつては、電子メールで実行形式のファイル(ファイルの拡張子が.exe のファイル)が送られてきたときには特に注意するように言われていましたが、最近はファイル名を巧妙に偽装し、文書形式のファイルに見せかけて悪意のあるプログラムを実行させ、ウイルスに感染させる事例もあります。また、文書形式のファイルであっても、文書を閲覧するソフトウェアの脆弱性を狙った攻撃も増加していることから、メールに添付されてきたファイルを安易に開くのは危険な行為です。」とあります。
これだとあらゆる文章ファイルまでが恐怖で縛られることになります。よく調べるとdoc形式のファイルだそうですが、説明不足でtext形式やrtf形式などまで危険であるかのような印象を故意に与えてしまいます。危険を煽ることだけするワリには、その一方で根本的な対策を講じようとはしません。例えば、私の提唱している基本的なタグやコマンドしか存在しないセキュアなテキストやHTML規格などを作ろうともしません。初心が大事であって、現在では必要もないような機能をこれ見よがしに増やし、暗に複雑に難しくブラックボックス化しようとしている意図が感じられます。それで脆弱性がどうのと一般市民に恐怖を植え付けて、既存メディアや大手企業などの情報以外は危ないと言論封殺に利用しようとする意図が見え見えですので、国民を挙げて考える必要性があります。後でPC構造についても触れていきますが、PCにはそれほど多様性もないですし、安全設計機能が幾十にも作られています。本当に安全に作ろうとするとできることだと分かります。


また、某大手ウイルスソフト会社のHP発言の一部抜粋。 Q4,「事件や事故に関する最新情報をインターネットで調べるとき、検索サイトにキーワードを入力して検索し、検索結果の上位にあるサイトをむやみにクリックするのは避けるべきである。」A4,「解説】大きな事件や事故が起きたとき、インターネットで詳しい情報を調べたいと思ったことがあるでしょう。しかしこの場合、検索サイトを利用するのはあまりおすすめできません。SEOの手法を用いてサイトを制作すれば、多くのユーザをサイトに導くことができますが、これを利用する犯罪者もいます。例えば大きな事故や事件が起きると、それに関連するキーワードで検索するユーザが増えることを悪用して、犯罪目的のWebサイトに誘導してしまうのです。ウイルスの配布やフィッシング詐欺などの悪質なWebサイトが検索結果の上位に来るようにしておき、ユーザがクリックしてしまうように仕組むのです。事件や事故に関するニュースを調べたいときは、信頼のおけるニュースサイトや新聞のサイトなどを利用するようにしましょう。」とあります。
これも暗に大手サイトや既存メディアに誘導するための詭弁ですし、洗脳です。SEOは他の大手サイトも一般人ですら多くが利用していますので、犯罪者だけが上位にくることは考え難いです。更によく閲覧されるサイトが上位にくるようになっているので、可笑しなことが発生するサイトに人が集まり上位にくることは考えられませんし、掲示板等で話題になるでしょう。現在ではむしろ彼ら工作員によって検索内容が捏造されている事実が発覚しています。多くの工作員を導入してカウント数を増やす方法です。寧ろ既存メディアが事件事故を誤魔化そうと動いていることはPDFなどで説明しています。現在のメディアは偏向歪曲捏造が多く嘘偽りが多いことは周知の如くです。ここを推薦すること自体が意識誘導です。なぜ、セキュアなHTML規格などを提唱しないのか、根本的な対策は取らないのかが疑問で懐疑的です。体制側がよる行う危険を煽り人間行動学に基づいた情報操作に利用される危険性があります。

 

PCの構造をご存知の方でしたらある程度理解できるかと思いますが、PCには、その侵入経路など根本的な部分に、生命体ウイルスほどの多様性はありません。テキストを表示するソフト程度に何万通りもの侵入手口があるとはとても思えません。もう2016年にもなるのに、いつまでテキスト表示ソフト程度に手こずっているのかが理解に苦しむところです。あと、こういったソフトは別のSEやプログラマーが陥りやすい脆弱性があるということなので、後進のソフト開発のためにもどうやって脆弱性ができるのか「いままでの手口パターン」を公開するのが妥当な選択です。にも拘らず、詳細は一切触れません。分かっている手口は既に封鎖できているので何も問題はありません。寧ろ同じ轍を踏むベンダーが続出する方が恐ろしい問題なのです。基本的対策もしない、公開もしない。全ての行動が矛盾しています。私はそれほどの根本的な多様性は本当なないのだと思っています。これから少しづつ詳しく扱って行ければと思います。(20160926)

 

 

 

〇ソフトウエアの実行可能ファイルが扱える範囲を、基本的に自分のあるフォルダとそれ以下とする。「直接続物理的操作ハードウエア(キーボードとマウス)による」ユーザー許可設定があるフォルダーは可能。これらは、OSのクリティカルカーネルとセキュコアで完全に管理。※全てセキュUIからいつでも直接に設定できる。


〇特定フォルダーに「直接続物理的操作ハードウエアによる」ユーザー設定で、「直接続物理的操作ハードウエアによる」ユーザー操作以外の読み書きを禁止するマークを付けられる。これは、このフォルダー内のファイルは「直接続物理的操作ハードウエアによる」操作以外では開けない。開くとファイルヘッダIDと拡張子が同じ場合は登録してある対象ソフトウエアで開ける。それ以外では、明示的にユーザーが「直接続物理的操作ハードウエアによる」操作で設定しているソフト以外からのアクセスを禁止する。これらは、OSのクリティカルカーネルとセキュコアで完全に管理。※全てセキュUIからいつでも直接に設定できる。

別の場所に纏めたい場合は、ショートカットのみをまとめてそこからアクセスできるようにする。ただし、ショートカットからフォルダへの移動は「直接続物理的操作ハードウエアによる」操作からしか行えない。ショートカットが禁止フォルダに存在しているファイルを表している場合も、許可があるソフトウエアか、「直接続物理的操作ハードウエアによる」操作からしか起動できない。

 

以上2つがあれば、ウイルスによってHDD内の暗号化によるランサムウエアが回避できました。(20160927)

 

 

〇レジストリの登録はソフトインストール時にOSが登録場所を決定(登録ソフト名とUUID、GUIDや立体チェックサムなどから)するのみ。それより下は勝手に操作できる。レジストリーの他の場所は操作できない。各レジストリーは自分のソフトから以外は基本的に操作(読み書き)できない。UUIDやGUIDは暗号化しベンダーとOS以外からは見えないようにする。
「UUID(≒GUID)は、インターネットドメインのように管理団体が管理することなしに、ネットワーク上で必ず一意であることが保障される128ビットの数値として設計」(20160927)

 

〇パスワード入力や根幹機能部操作などの許可フォームについて。「OK」「拒否」など。操作の表示内容と操作自体をOSが把握し完全に一致するようにする規格化する。文字種類やデザインは考慮できるような構造で、意味と操作は一致させる。少なくともチップ表示は義務付けてその意味を表示する。OS保障付き許可フォームは、そのAPI手続きをきちんと行っているという意味で、その保証マークをOS自体が表示する。セキュUIには確実に保証されていることが明記される。(20160927)

 

〇各プロセスのメッセージを他のプロセスがフックすることを明示的に禁止できる。これらの関係はセキュUIのアナライジング&プロファイリングで起動時またはオンタイムに動的に把握。(20160927)

 

〇「UUID、GUID」などについて。記録は公開鍵暗号などのペア暗号とし、どちらも公開はしない。片方はセキュコアの管理領域に纏めて更に暗号化され保存される。プログラムはインストールされると第2IDが付与される。プログラムの方はそれぞれのフォルダにあるが、実行可能形式のプログラムは設定に関わらず外部からは読み書きできない。プログラムを別のフォルダに移動した段階で第2IDは無効となり、「直接続物理的操作ハードウエア信号」による再設定が必要で第2IDも変更(登録時の立体チェックサム同値か検証して)される。通常は指定フォルダーもしくは傘下以外からは、実行可能ファイルの読み書きできません。「直接続物理的操作ハードウエア信号」の操作はどのフォルダも見ることができるが、特権3プログラムからは通常できません。ウイルスソフトもOSのAPIを利用して間接的にチェックする。(20160927)

実行可能ファイルのフォルダ位置と立体チェックサム、UUIDなどはOSが管理するHDD内のシステム領域に記録される。この領域はOSのカーネルのクリティカルな部分でしか読み書きできない。起動中は全てのディスク操作機能を、OSが提供するAPIを経由しないとできない構造にするので。その中にはこの領域を読み書きするメソッドはありません。(システム領域は暗号化と立体チェックサムが付くので外部からの書き換え防止と検出もある程度可能。)ついでにそこに実行可能ファイルの書き込み日時も記録。実行可能ファイルが登録日時以外に変更されると詳しい調査が入る。それまでは毎回、立体チェックサム(大きなシステムオーバーヘッド)を掛ける必要はない。(20160927)

 

〇 USBからのウイルス感染について。これは、Autorun.infファイルを使ったAutoRunなどのOSの機能を使用し、OS付属のプログラムローダーを使って、実行可能形式のファイルを物理メモリにロードしてスタートするしかありません。OSを通さずにはできません。つまり、必ずOSのAPIが介在します。USBだとそれを挿入した時点でプラグアンドプレイで、それが外部UDBメモリであると認識します。つまり、USBを挿入したことを起点として、そのUSBからオート起動(ユーザーのハードウエア入力以外で)するプロセスが発生した段階で検知できることです。あとは、警告を出してユーザーに処理を任せる(起動するかしないか、するならどのプログラムを起動するかなど)だけです。何故このような基本的な対策をいつまで経ってもしないのか。理解に苦しみます。(20160928)

 

〇 基本的なことですが、対象のソフトウエア以外が他のソフトやシステムのレイアウトなどを変えられること自体が可笑しなことです。個人的には他のソフトウエアに設定(そのソフト以外の)を変更される必要性がありません。ハードウエア直付けの信号のみで変更が可能という設定をデフォルトにするべきです。(マザーボード直付けデバイスからの信号、USBなどの外部ハードウエアの信号、ソフトウエアからの信号、ネット接続を起因とする信号は、OSカーネルのクリティカルな部分で厳格に種別するべきです。)
ここの文章は企業のケースは対象にしていませんが、個人用のPCでは不必要な機能ばかりです。現在ではなぜかタスクマネージャの設定まで勝手に変更されます。
セキュリティUIでは、それぞれのプログラムごとに上記信号からの設定を登録できます。APIレベルから導入します。(20161008)

 

〇 パスワードフォームの場合。メッセージを受け取ったスレッドは、上記のシグナルを示す番号とメッセージID(128ビットほどで、時限性の一意のID)と発行タイムを受け取ります。そのIDを使ってOSカーネルの専用APIに直接問い合わせして「ハードウエアからのシグナルか」と「フォーカスが一度も外れていないか」と「入力モードが変更されていないか」を確認します。確認ができるだけです。パスワード入力に関しては、そのフォームは※入力と英数字に自動で切り替わる保障が必要。たまに英数字になっていないことがある。(20161009)

〇 今は存在するか知りませんが、IDとパスワード確認のメソッドにプログラムから接続できるものが存在するようですが、ユーザーが設定したものは「ハードウエア直付けシグナル」を確認するべきです。また、人間の入力を遥かに超える接続は警告するべきです。人間が一日に100回も間違えることはないはずなので回数の確認も基本です。そういった特殊な動態は管理ユーザーに報告し、適切な対応指示ができるようなシステムであるべきです。(20161009)

 

〇 デフォルトでは、HDDをトラックセクタ単位で読み込むAPIを提供しない。すべてファイルシステム上のAPIで提供するこれでセクタ0の書き込みを物理的に禁止する。システムフォルダーへの書き込みを物理的に禁止する。。BIOSのマッピングを停止する。

(追加。)BIOSはOSが専用の論理メモリ空間を作成し、そこにコピーする。ノートPCなど固有の機能(ファンクションキーなど)などはそこにマッピングする。BIOSの設計段階から、固有機能のみ分離するように規格する。OS起動時は、それ以外のBIOSファンクションは禁止する。


システム領域の純正OSの実行可能ファイルやDLLのファイルにサードパーティーのものを混ぜない。その中に検索用のフォルダを別個設定し、その中にサードパーティーなどのDLLが存在するフォルダーへの検索用ショートカットを集める。基本的にOS以外のいかなるプログラムもシステム領域には書き込み、追加、上書きなどできない。
サードパーティフォルダー内の検索用ショートカットは、そのフォルダー位置情報が組み込まれており、これを改変できるのはそのフォルダーにあるそれぞれのソフトウエアだけ。これらのフォルダーには特殊なフォルダであるというIDが入り、このフォルダーが移動されるときは逆リンクでサードパーティフォルダ内の検索用ショートカットも自動的に再設定される。これらのフォルダはその中にあるソフトウエアか「ハード認証」のユーザー操作以外では移動消去などできない。
OSが管理するHDD内システム領域は、リング3のプログラムからは直接的にはアクセスできない。他にリング1とリング2用のシステム領域は分離して管理する。リング1とリング2のデバイスドライバの各物理メモリは分離する。同じ特権命令レベル間でも、担当以外のIOポート、IRQはコードレベルで分離する。関係のないIOポートをアクセスするIN,OUT命令を禁止。
OSのクリティカルな実行可能ファイルやDLLはバージョンと書き込み時間、インストール時のハッシュを厳格に管理する。フォルダやファイルの作成時の時間などはシステム領域のデーターベースで厳格に管理し改変不可能。可能な限り一度は起動時や実行時前にハッシュをチェックする。(20161010)

HDD内の読み書きについて。「クラスタ・トラック・セクタ」指定で読み書きできるのはHALを通してのみにする。デフォルトの指定では、セクタ0の読み込みはできてもOSカーネル以外に書き込みはできないなどHALでチェックする。もちろん、OSの管理するシステム領域もオブジェクト指向のAPIからのみで、それ以外のアクセスを禁止する。
HALでチェックし、ファイルの書き込み日時と更新日時などは変更不可能にする。実行可能ファイル(exe,dllなど)はそれらの情報をシステム領域内のデータベースに記録する。どのフォルダにいつ、どこのプログラムによってインストールされたか。UUID、バージョン情報、ハッシュなども記録する。OS関連のファイルはロード時に一度ハッシュチェックをするくらいがベスト。
実行可能ファイルのハッシュについて。コンパイル時以外に内部の情報が書き換えられる部分は分離する。その部分はハッシュに入らないようにする仕組みが必要。特に、コード部分と処理に関わる固定データ部分が明確に分離検証できる構造にするべき。コンパイル時以外で内部が書き換わらない設計をコンパイラ側で管理するべき。それぞれに個体識別情報が入る部分についても同じく。(20161018)



〇 アドオンなどの外部開発の機能で、システム設定やコアな表示デザインを変更した場合は、本体のプログラムは、変更リストを作成し、リカバリできるようにする。いつ、どこのアドオンが、どの部分を変更したか記録する。これらの変更は変更前にユーザー許可を求める設定ができるようにするべき。設定では「ハード認証」以外はできないようにも設定できるようにするべき。(20161010)

 

〇 パスワード入力フォームについて。パスワードやそれに準ずる入力指定されたフォームは特殊な扱いにするべき。メッセージのフックなどもできない。システム領域にある一時保存エリア(バッファ)を(ウイルスソフトでも)読み出すことすらできない。更に、外部要因によって、入力中にフォーカスが外れた場合は確認フォームが出る。「ハードウエア認証」付きの入力で確認ボタンが押されるまでの間の入力は全部捨てるようにする。※画面を見ないで入力している際にフォーカスが外れると打ち込んだ内容が画面に表示されることがある。(20161018)

〇 上記の考え方全てが使えない程の大きな問題がありました。デバイスドライバとそれに準ずるソフトウエア問題です。この脆弱性のために上記のような対策が全てできなくなっています。これらの問題が2016年の未だに性善説に立った考え方で捉えられています。根幹に関わる根本的な問題なので真面目に考える必要があります。
デバイスドライバ作成関連の公式のページにも書かれています。「デバイスドライバなどのカーネルモードで実行されるプログラムは、全ての特権命令が使用でき、カーネルと同じ論理メモリにあるので、節度をもって慎重にプログラムするように」のような文言があります。つまり、現在のデバイスドライバと特権命令で動くウイルスソフト自体がシステム上のあらゆる部分を操作できるようになっています。現在のモデルでは、IN、OUT命令からDMA操作、GDTの操作や読み込み、OSカーネル領域からシステム領域の読み書きなど全てが可能なようです。
そこで。デバイスドライバなどの特権モードのプログラムのインストールについて。これらのプログラムがインストールされるときは全て告知されるべき。特権モードで実行されているタスクは、特権モード表示と記録(一度でも使用した、DLL、API、IOポート、システム領域など)が必要。本来は正規のカーネル領域と分離するシステムが必要。第三者が作成したデバイスドライバとそれに準ずるソフトは論理メモリを分離し、許可がない特権命令は使えなくするべきです。できれば、リング1や2を使うべき。パフォーマンス依存の性善説に立った設計ではセキュリティは確保できないと考えます。(20161018)

 

〇インフォームドコンセントが大事。
書き込みなどを行った外部記憶のUSBを取り外すときは、「ハードウエアを安全に取り外してメディアを取り出す」を実行すると思います。
そこの段階で「USB大容量記憶装置の取り外し中にエラーが発生しました」のタイトルで、「プログラムが〇〇USBDeviceデバイスをまだ使用しているため、デバイスを停止できません。デバイスを使用していると思われるプログラムを閉じてから、再試行してください。」と出ることがあります。
タスクマネージャー以外に、フォルダも何も起動していないときにも出ることがある。これだと全くユーザーには意味不明。しかもファイルコピーなどの動作は終わっている。CPU使用率0%、メモリ30%ほど、ディスク使用率0%なのに、いつまで時間が経過しても同じエラーが出るといった意味不明な設計。そもそもUIの設計が不親切すぎる。もう2016年も終わろうと言うのに基本的な設計が全く進歩していない。もちろんセキュUIならどのプログラムが使用しているのかといった説明は基本的に出る。インフォームドコンセント設計が足りなさ過ぎると考えます。相変わらずの秘匿文化、ブラックBOX文化が腐敗に付け込まれ易いという世の常が理解されていない。(20161101)

 

同じ部類で、一部セキュリティソフトに、ウイルスの警告画面をフルスクリーンにして更に既存のスクリーンショットを使えないようにするものがあります。全くインフォームドになっていません。訳の分からないウイルス名とデータの羅列はあっても記録ボタンもログもない。これでは後からの検証のしようがありません。後ろめたいところは隠匿性が高くなるので注意する必要があります。数か月使用していた同じソフトが突然にウイルスと表示が出て隔離されることもあります。「集団ストーカーなど不正を暴くため」のソフトが多いです。

私はウイルスの今まで全ての情報は公開するべきだと考えます。分かっているものはそのやり方が判明しているので根本的に対策が取られているハズなので問題ないと思います。一方で公開がないのは「本当は存在しない」「根本原理は同じでそれを解決せずに亜種を作り続けている」「明らかに昔から既知の方法をまた新たに作っている」「ワザと以外には考えられないミスをする」「通常では考えられないプログラミングでバックドアを作っている」などと穿った見方をしてしまいます。専門家ではないですが昔はアセンブラでCPUを弄っていた人間なので、私はこれらの重篤な問題は、数少ない根本的な部分以外では発生しないと考えています。既に、デバイスドライバなどカーネルモードで動くプログラムはOSなどを含むコアな論理空間で一緒に動いていることが分かっています。これではOSカーネル部分すら読み書き自由です。それはOSメーカー以外の第三者的な会社のソフトも多く含まれます。それらのソフトはOSと同じ特権レベルで動いているのでCPUの全ての特権命令も使用できます。これだとHALを通さないハードウエアコントロールが可能です。これらのソフトが「性善説」でルールを守るようにと言われるだけで制作されています。また正規のソフトなのでウイルスソフトにも引っかかりません。この国で性善説は通用すると思いますか。実際に一部のウイルスソフト自体が不具合を起こしているのを確認し、証拠も保存しています。後日まとめます。(20161101)

 

 

○ DLLやEXEなど実行可能ファイルについて。未だに亜種が何千種類も存在して確率論的に当たり外れを占っている状態。本来、「製造元、バージョン、コンパイルナンバー、コンパイル年月日、サイズ、インターフェイス数・位置・戻り引数型、チェックサム・ハッシュ」などによって同定し、その他は排除するべきものです。ウイルス以外の個体差としては、シリアルナンバーや使用状況データ、ファイルシステムのパディング的なものなどが考えられるが、コード部分はOOP型リエントランとなコードのように、静的データは外部の共通ヒープ領域、インスタンスはそれぞれのヒープ領域に押し出すようにコード部分に特定の可変部や記録部分を作らない構造にし、ファイルに個体差や記録部分を残さなければならないときは専用のチャンク規格を作ってそこに記録するべき。このチャンクはプログラム上においてクリティカルな部分は含まない。そして、チェックサムはその部分を例外として扱う。これでウイルス以外の亜種は生まれないと思うのですが、どうでしょうか。これをプログラミング規格として統合した概念が、セキュアプルーフ規格とコードタイプセーフ機構の一部となります。

セキュアプルーフ規格とコードタイプセーフ機構の概念についての、他の一部について。IMMC+IDMAに組み込まれた特権リングプロテクションのないLiteGate機構については後日。システム関数の呼び出し先の先頭にセキュリティプリフィックスコードを付ける。これがない場所(同じ特権レベルで同論理アドレスからでも)への飛び込みCALLは禁止される。もちろんシステム領域へのJUMPコードは禁止される。CPUにシステム関数呼び出し機構を内蔵。API呼び出しプロセス。システムコール用のスタックチャンクを作成。演算レジスタなどの引継ぎレジスタ以外はEXXのように瞬時に切り替えてバックヤードで同時並列に専用スタックに保存。また瞬時にリターンが起こってもバンクレジスタはそのままなので戻してキャッシュ動作停止で元のアドレスまでスタックポインタを戻すのみ。セキュリティプリフィックスがあるので助長になるが、CALLができた場合でもシステムコール呼び出し規格(一般プログラム領域内とは別規格)に必要のないレジスタは自動的にクリアされる。
CPU内部には大型のキャッシュが入るが、一緒にIMMCと同期のとれるICMCが入る。これはMMCのページングを簡略化させたようなもので、内部キャッシュをマネージメントする機構。ページング機構なので領域サイズ変更やアドレス変換も移動なしで瞬時に適合可能。そこにハードワイヤーやopコード専用のチャンクを作成。(20161106)

 

○ スマフォ・タブレット型のパスワード入力について。プチアイデア。ハスワード入力が指の太い人間には打ち込み憎い。キーボード表示が小さすぎるので、モード設定によっては二段階打ち込み方式にする。押した周囲の文字が拡大して出る。もしくは二点(人差し指と薬指)ポインティングで拡大して中指でプッシュ。もしくは二点でその領域を拡大固定させ文字を選んだら戻る。または、ガラケー方式で「あかさたな」子音と母音を分けて入力。あと、打ったか打っていないかが分かりにくいので、パスワードフォームのアスタリスクや点入力の色を、7色で順番に変えていく。バックグラウンドの色が最初から表示さてていてもよい。赤青の交互でもできるが、7色の方が入力済み文字数が直観的に分かり易い。(20161106)

 

 

 

 

 

 

<ハードウエア認証のための極論妄想>


CPUはCPUキャッシュ内を実行し、直属の他のハードウエアのコントロールのみを行う。CPUキャッシュ←→物理メモリ←→HDD、ペリフェラルキャッシュ、ペリフェラル←→ペリフェラルなどの転送はすべてインテリジェンスDMAが行う。IDMAとインテリジェンスMMCは融合される。IDMAにはインタラプト用のチャンネルがあり、割り込み時はプロセス用のバースト転送の中にハードウエア的に特殊な処理なく割り込める。このIDMAはサブセットが物理メモリや周辺ペリフェラルを管轄するノースチップといった場所にもセットで入り同期している。つまりバスの使用はIDMAのみで行われる。転送時に簡単な圧縮も考えられる。キーボードの入力はすべてIDMAのバーストIN割り込み転送で行われ、IMMCがOSカーネルの管轄下であるとする物理メモリ(OSカーネルの論理メモリ範囲からしかアクセスできない)のバッファに直接送られる。ユーザープログラムからのハードウエア認証は前回書いた通り。(161027)


INTCもIDMA+IMMCに入る。IDMAのチャンネルはプライマリ4つほとありそれぞれに優先順位がある。準備用を入れると16ほどあり、順次切り替えて使用。優先順位とバースト単位量から割り込みはいつでも可能。他のチャンネルは割り込み信号の後、送信側は停止し、受け取り側はその間を捨てるだけ。割り込み終了でバースト送信が復活するだけ。送信と受信が違うバースト送信の特定単位量での時分割混合送信も可能。I機能を使うとクロックは同じで24bitと8bitなどの一部分割送信に移行することと、クロックの上下で逆向きの転送なども可能(通常のバースト割り込みで良いが、ここにHAL←→物理ハードのコントロールを入れることが可能)。
IMMCについて。XDTテーブルとキャッシュMMC。階層DRAMによる1Gクラスキャッシュをコア毎にバング分離。キャッシュロードバランサと階層キャッシュスケジューリングとタスクスケジューリングとキャッシュメモリスピードを考慮したDMAプリローディング。IMMCには空き物理メモリの管理と検索がハード支援として入る。また起動時の一部リフレッシュ期間に不具合セルの検出を行い、それが入る最小セグメントを不使用として分離するハード支援も入る。通常はセレクタが示すディスクリプションテーブルに登録された論理メモリの範囲をページング機構が使用する時点で更に分割して物理メモリに配置してロードするが、制作中。(161027)

INTCもIDMA+IMMCに入る。IDMAのチャンネルはプライマリ4つほとありそれぞれに優先順位がある。準備用を入れると16ほどあり、順次切り替えて使用。優先順位とバースト単位量から割り込みはいつでも可能。他のチャンネルは割り込み信号の後、送信側は停止し、受け取り側はその間を捨てるだけ。割り込み終了でバースト送信が復活するだけ。送信と受信が違うバースト送信の特定単位量での時分割混合送信も可能。I機能を使うとクロックは同じで24bitと8bitなどの一部分割送信に移行することと、クロックの上下で逆向きの転送なども可能(通常のバースト割り込みで良いが、ここにHAL←→物理ハードのコントロールを入れることが可能)。

 

IMMCについて。XDTテーブルとキャッシュMMC。階層DRAMによる1Gクラスキャッシュをコア毎にバング分離。キャッシュロードバランサと階層キャッシュスケジューリングとタスクスケジューリングとキャッシュメモリスピードを考慮したDMAプリローディング。IMMCには空き物理メモリの管理と検索がハード支援として入る。また起動時の一部リフレッシュ期間に不具合セルの検出を行い、それが入る最小セグメントを不使用として分離するハード支援も入る。通常はセレクタが示すディスクリプションテーブルに登録された論理メモリの範囲をページング機構が使用する時点で更に分割して物理メモリに配置してロードするが、制作中。(161027)

 

上の説明のIDMAは、要はCPUを含めたハードに存在するキャッシュ間のデータ転送を一元的に行うための手法です。マザーボードの中央バスはそれ以外では使用されません。CPUの低速なバス使用になるIN,OUT命令や、キャッシュミスによるフォールトすらDMAの一元的管理の規格を通します。セキュリティ上やバスの効率使用において有効だからです。

システムクロック(タイマーも)もINTCに内臓されます。INTCには、スケジューリング支援用のハードも追加されます。INTC+IMMC+IDMAは有機的結合され一つのハードウエアモジュール(CPUサブシステムコントローラー)となります。この中にセキュリティ支援機構が融合されます。

 

途中になった、セグメント機構とページング機構について。本式の構想はかなりカオスなので、取りあえずの方式を書きます。

セグメント方式はオフできませんし、セグメントレジスタ方式は死滅していますし、現在のOSでページングを使ってないものはないでしょう。また、個別にページングを使える方式でもないので、セグメント機構とページング機構は融合します。その上で新たな機能を付け加えます。特権レベル(特権リング)は存在はしますが、リング3の一般プログラム以外にはあまり効果のある使われ方はしていないようです。現在は一般プログラムのゲートのために残しますが、本来は効率や完全なセキュリティのために無くして別の考え方にします。
OSカーネルから、それぞれのプロセスに与えられる論理メモリ空間を超える












 

 

 

 

【◆一般にも分かるように?、CPUのセキュリティ支援機構について説明します。アバウトな話ですが、これを踏まえて考えてみてください。◆】(20160928から)


プログラムは物理メモリから1つづつコードを読みだして解読し、実行しています。物理メモリは0から順番に番号が振られた形になっています。(実際には16進数)JMP命令はその番号に飛ぶ意味があり、次はその飛んだ先のコードを読みだして実行します。なので物理メモリが0から1000まであったとすると、300番にプログラムがあろうと、600番にプログラムがあろうと、どこからでもJMP900と書くと900番のコードを読み出して実行します。どこのプログラムであろうとも悪意だろうと偶然だろうと900番に飛んで実行できるということです。更に読み出しや書き込み命令も同じようにフラットな物理メモリのどこの部分でも読み出したり、書き込んだりができるということで、例えば900番からOSのシステムプログラムがあったとすると、どこからでも900番台のメモリを読み出したり書き換えたりできます。すると、システムは出鱈目なコードを実行するので暴走します。また、自分がどこかに置いたプログラムに実行権を移すことも簡単にできてしまいます。そこで、現代のペンティアム系の元となった386CPUにはいくつかのセキュリティ支援機構がCPU内部に元から内臓されています。流れを組む現在のペンティアム系列にも同じく内臓されています。


実際のCPUの簡単な動作。CPU外部にある低速な物理メモリ以外に、CPU内部にはレジスターという少数の箱(A箱、B箱、C箱、D箱など)があります。実際の動作はCPU外部物理メモリとCPU内部の箱(レジスタ)とのやり取りで行われます。HDDより物理メモリが格段に速いですが、更にCPU内部のレジスタは格段に速いからです。HDD(超大容量で超低速),外部メモリ、キャッシュ、内部レジスタ(超小容量で超高速)と容量とスピードが反比例する関係にあります。例えば、物理メモリ500番目にある数値をA箱に入れる。物理メモリ501番目にある数値をB箱に入れる。A箱の数値とB箱の数値を足してA箱に入れる。A箱の数値を物理メモリ502番目に書き戻す。350番目の命令でAの箱の内容が0になったら351番目に行かずに、380番目の命令に飛ぶ。などです。こういった流れでCPU上のプログラムは動いています。


それではCPUのセキュリティ機構について話します。例えば、物理メモリ0~1000まであるとして、OSカーネルが800から1000まであるとします。そこで、何らかのユーザープログラムが200から300にロードされたとしてその中に悪意のあるプログラムがあり、OSカーネル900番目のプログラムコードを出鱈目に書き換えたとします。すると、定期的にOSに実行権が戻されたときに暴走する可能性が高いです。これはすべてのプログラムが搭載している物理メモリの全てを見たり書き換えたりできるからです。
そこで、CPUは「CPU内部Aの箱」の内容を物理メモリ500番目に書きこんでと命令が来たときに、500番目というアドレス情報を自動的に書き換えて別のアドレスに変換する操作を中間に入れました。これはハードウエアで処理するので一瞬で自動的に行われますし、プログラムの干渉を一切受けません。この機構をMMCといいます。前者を仮想的なメモリ空間を表す論理アドレスとします。後者を実際の物理メモリを表す物理アドレスとします。これで、どのプログラムも同じ仮想的なメモリ空間を表す方法でプログラムができるようになります。


例えば、OSカーネルが0から499番目までの範囲で動くプログラムとして作っていても、ユーザープログラムも同じく0から299番目までの範囲で動けるプログラムを作っても何の干渉もなく同時に動作します。この2つのプログラムをMMCはOSカーネル0から499番までを、物理メモリの0から499番までに割り当てます。そして、ユーザープログラムの0から299番までを、物理メモリの500番から799番までに割り当てます。ユーザープログラムが「CPU内部Aの箱」の内容を物理メモリ200番目に書きこんでと同じように命令したとしても、それは論理メモリの200番目として扱われ、瞬時に割り当てられた物理メモリの700番目に変換されて操作されます。なので、絶対にOSカーネルの物理メモリ0番目から499番目までを書き換えることはできません。また、JMP100としても飛ぶ先は自分の割り当てられた物理メモリ内の600番目に変換されて飛ぶだけなので、絶対にOSカーネルなど他の物理領域には飛ぶことができません。


こういったCPU内部の機構により、各プログラムが割り当てられた物理メモリ以外の他のプログラムが使用している物理メモリは「参照も書き換えもジャンプ」など一切できない構造になっています。そして、MMCを設定するコマンドなどは特権命令と言われ、特権レベル3で動く一般のプログラムでは動かすことができず、設定を変更することもできません。


MMCはそれ以外に、論理メモリ0から399と設定されたら、プログラム上で500に飛ぼうとしたり、600を読み書きしたときに例外エラーを起こして終了させます。設定した範囲以上の領域を指定することもできません。また、プログラムをコードを実行する部分とデータを保存する部分を分けて、それぞれを別の物理メモリに割り当てることができます。この場合、MMCはプログラムを置いた物理メモリ領域は「実行のみで書き換え禁止」にし、データを置いた物理メモリ領域は「書き換えはできるが、実行は禁止」するモードに設定します。テキストデータなどはデータ領域設定の物理メモリに置かれるので、そのままでは絶対に実行できません。また、テキストを表示するプログラム領域は書き換えることができないので、物理メモリ上ではプログラムの改変もできません。


要約すると、各プログラムの物理メモリはハード的に完全に独立しており、それぞれが他のプログラムの領域がどこにあるかも知り得ませんし、他の物理メモリを読み書きすることも実行を移動することもできないということです。更に、各プログラムのプログラム領域とデータ領域も分離されており、プログラムは改変できず、データが実行されることも有り得ません。それぞれの物理メモリを完全に独立させることと、それぞれの物理メモリの出来ることの種類、属性を設定することです。


プログラムが独自で感染し実行することはできず、必ずOSのAPIを利用したり、その上で動く既存の大手ソフトウエアの脆弱性を利用して、感染し実行しなければならないので、本気で対策を講じようと思えば、必ずその行動が把握できますし、対処できます。ウイルス感染がそれほど簡単ではないことを理解してください。もう既に2016年にもなるというのに、基本的な対策すら出来ていないように見えます。

 

 

 

 

 

 

「ハードディスク(HDD)、物理メモリ(DDRメモリ等)、CPU内部メモリ」は、それぞれに数値を入れるための同じ規格の入れ物(箱)が、順番に並んで入っています。一つの箱には白か黒の碁石が8つ入る構造になっていて、この8つの碁石の色と並び方で0から255の数値を表します。HDDには低速だが超大量に箱が並んで入っています。

物理メモリには、HDDの箱より高速だがHDDの100分の1程度の箱が並んで入っています。CPUには数十個程度の超高速の箱が入っています。CPU内部のメモリはレジスタと呼ぶ。HDD、物理メモリ、CPU内メモリ(レジスタ)は、スピードと容量の相反関係にあります。プログラムは使用するものからHDD→物理メモリ→CPUに箱の中身をコピーしていき、CPU内部で高速に実行するイメージです。


CPUの中には、数値を入れるための超高速に動く箱が入っていますが、数十個程度だと思ってください。CPU内部のレジスタは、HDDや物理メモリのように番号で順番に並んでいる訳でもなく、順番に使用される訳でもありません。なので、CPU内部の箱は番号ではなく、それぞれ固有の名前で呼ばれています。
そのCPU内レジスタ(箱)の一つにIP(インストラクションポインタ)という特殊な箱があります。このレジスタは基本単位の箱2つ分の大きさだと思ってください。箱1つ分では0から255までしか数えられません。なので説明のCPUは、2つの箱(合わせて16個の碁石を使用)を使って0から65535の数を表せるとします。これは物理メモリの現在どこの位置を指しているのか、その物理メモリの番号を表す箱です。今回説明のためのCPUは簡略化した架空のCPUだと思ってください。


IPポインタは、その時点でCPUが読み取って実行している物理メモリの番号を指示します。その箱の実行が終わると自動的にIPを加算し次の箱を指示して、次の実行へと移って行きます。つまり、実行するとはIPが指し示した先の物理メモリの内容を読み込んだときだけのことを言います。IPがコマンドとして指し示しCPU内部のデコード用のレジスタにコピーされて解読されて初めて実行されるので、HDD内部やフラッシュメモリ内部のプログラムが自発的に動くことは有り得ません。


※飛ばし読み可『ちなみに、IPが使えるのは物理メモリだけなので、直接HDD内部やフラッシュメモリ内部をIPが指し示して実行することはできません。(以下蛇足)また、プログラム単位ごとに、環境状態と歩調を合わせて上手く繋がるように、OSカーネルがIPの流れをコントロールして初めて、IPは線路の上を歩き続けます。仮に突然に関係のないフラッシュ上のデータにIPが移ったとしても、周りの環境条件に歩調を合わせるように完全に同期できないので、全てのレジスタや環境変数などが整合性を保って戻ってこれず、昔のチクタクバンバンというおもちゃのように脱線してシステムがクラッシュします。』


CPUの簡単な動作説明。CPU外部にある低速な物理メモリ以外に、CPU内部にはレジスターという数十個程度の箱(A箱、B箱、C箱、D箱など)があります。実際の動作は、外部にある物理メモリ上の箱の内容を、CPU内部の箱(レジスタ)にコピーして、CPU内の箱同士で行われます。CPU内部の箱の処理が一番高速だからです。


例えば、今IPの内容が500だとすると。物理メモリ(物メ)500番目にある数値をCPU内部のプログラムレジスタにコピーし、それを解読実行し、実行内容がIPが指すコマンドの次の箱の内容をCPU内部A箱に入れろだったとき、次の物メ501番目にある数値をA箱にコピーします。この命令は自分と次の箱との2つの箱を使用するものだったので、IPを自動的2つ加算して、IPを502にし、次は物メ502番目の内容を同じように解読実行します。
次は、IPの内容が502なので、物メ502番目にある数値をCPU内部のプログラムレジスターにコピーして解読実行し、物メ503番目の内容をB箱にコピーします。次の命令も同じような流で、A箱の数値とB箱の数値を足してA箱に入れる。次が、A箱の数値を物理メモリ600番目に書き戻す(プログラムコード領域が500番目から599番目で、データ領域が600番目から699番目の設定)。
350番目の命令でAの箱の内容が0になったら351番目に行かずに、380番目の命令に飛ぶ。などです。こういった流れでCPU上のプログラムは動いています。


※飛ばし読み可『(一部完全RISCのCPUを除いて)普通のCPUは、1命令が箱1つ、箱2つ、箱3つとサイズが違うものが混ざっています。今回の簡略化CPUでは、最初の箱が「何をする」を表すオペコードで、次の箱は「これを使って」のオペランドを表し、1命令で、1つから3つまでの箱を使うとします。例えばオペコードをXとし、オペランドをYとすると、物理メモリ上には、XYXYYXXXYYXYなどと並んでいます。それぞれの命令は自分のサイズを知っているので、処理が終わると自分のサイズ分をIPに加算して、IPは必ずXであるオペコードを指し示すことになります。そして分岐命令がなければ順々に実行していきます。』


IPが指し示す物理メモリの数値(箱)がジャンプしろという番号だったら、ジャンプ命令が実行されます。この仮想PCでは物理番号は2つの箱で表すとしたので、IPの次と更に次の箱の内容をIPにコピーして、次はそのIPの物理メモリから解読実行するので、物理メモリをジャンプしたことになります。後は戻ることなく同じようにIPを加算しながら実行(また分岐命令がなければ)が続いていきます。
つまり、プログラムは物理メモリから1つづつコードを読み出して解読し実行することを意味します。コード用の箱の次に必要なデータ用の箱が続くことがあり、この仮想のCPUでは、一命令が1箱から3箱まで大きさが違うものが並びます。IPは実行が終わると命令の大きさ分だけ加算されて、次の命令の先頭を常に表します。


今回の仮想の設定では、物理メモリは0番から9999(10000-1)番まで箱が順番に並んでいるとします。物理メモリに並ぶ箱は順番に「通し番号」として0から9999番目と番号が付いていますが、その箱のある位置を指し示す「通し番号」のことをアドレスと呼びます。実際のアドレスは16進数(00からFFの組み合わせ)で表しますが、ここでは簡略化のために10進数で説明します。


※飛ばし読み可『このCPUはリセット直後に、マザーボード上のBIOSで初期化処理をして、HDDから先頭の0セクタにあるIPL(イニシャルプログラムローダー)を読み出して、そこの処理でHDDからOS本体を読み出し、物理メモリに構築します。』


今回は物理メモリの0番目から2999番目までにOSカーネルなどが構築され、OSカーネル(本体)の初期化が終わると、いつものOS画面が表示されて待機モードになると思ってください。

上記物理メモリの状態で、ユーザーの指示によってあるプログラムAをOSが物理メモリの3000番目から4999番目までに読み込んでIPを3000にセットしてプログラムAに実行を移したとします。この部分にプログラムミスや悪意あるコードがあった場合、フラットな物理メモリ形式では、物理メモリのどこでもすべてに移動でき、読み書きできます。
OSカーネルの1000番を書き換えるとOS自体(実行が戻ると)が暴走するでしょう。もし8000番目から8999番目に個人情報が記録されていれば、プログラムAから読み出して盗み出すこともできます。プログラムAの中に新たなプログラムを作るコードが入っていて、5000番目から5999番目に別のプログラムBを作ってJMP5000とすれば、得体の知れないプログラムBに実行権を移すことも簡単に出来てしまいます。


そこで、現代のペンティアム系列の原型となった「386」CPUには、いくつかのセキュリティ支援機構がCPU内部に元から内臓されています。流れを組む現在のペンティアム系列にも同じく内臓されています。これから、そのハードウエア支援機構について、簡略化して説明します。その他に、プリエンプティブとイベントドリブン、オブジェクト指向モデルについて考える必要があります。

 

 

 

集団ストーカー被害者@広島県福山市

 

bottom of page