Sero のページ

  • OS-Wikiの住人
  • 高校受験もあるのにPCばかりやってていいのだろうか…
  • 予定(結果)としては、この本で基礎を学んだ後、自力でOSを作る
  • 本のほうは3日で読み終わって製作に3週間強
  • 連絡先は、Sero*yahoo.co.jp (*を@にする)
  • ホームページ(実質的な中身は何もない)は、http://sero.tm.land.to
  • Lightsのダウンロードは、http://sero.tm.land.to/Lights_0_0_26.zip から
    • QEMU上でしかテストしてません。何か不具合があっても保障はできません。
    • ドキュメントは…すみません。まだ作ってないんです。
      • いい加減な使い方説明 : キーボードのみ対応のOSです。起動すると、コンソールのスクリーンが出てきます。コマンドははりぼてOSのものをすべて入れましたが、アプリはあまり作ってません。スクリーンは、画面の上でタブになってます。タブキーで切り替えてください。ncstコマンドを使ったときに少しおかしくなりますが、一度コンソールに切り替えると直るようです。

いいこと発見

  • Lights0.0.26をコンパイルした後、system.img(haribote.sys相当)をバイナリエディタで見ると、後半に0が10KB近くもあるのを見つけました。mapファイルを見て、タイマ関係と分かったので修正しました。
  • まず、bootpack.cのメモリマネージャの初期化を最初にやるようにして、memmanをinit_pitに渡す。タイマ管理側では、timerctlをポインタにして、init_pitの中で動的に確保する。あとは、timerctl.〜となっているところを、timerctl->〜とかえる。これだけで(作業時間約5分)、システム全体を10KBも小さくできました。めでたしめでたし。欠点は、タイマルーチン全体が、機械語数語分増えてしまうこと(確認はしていない。推測)。

これは?

  • Lightsをまた最初から作ってます。そのときに発見したことを。
  • はりぼてをあちこち変えて、3日目の終わりまで来たところで動かなくなりました(QEMUがフリーズ)。HLTのところです。適当な関数にhltをする処理を用意して(呼び出さない)、リンクはさせました。どうやらhltしなければ問題ないようですが、これでは、アセンブラの関数を呼び出せそうにありません。QEMUを0.8.1にしたら直ったので、まあよしとします。[make run]はtolsetのQEMU、「make run2」は0.8.1になってます。Lightsに問題があるのかもしれないので、とりあえず、http://sero.tm.land.to/Lights0100.zipを見てください(重くてすみません)。

Lights最新情報

はりぼてOSのセキュリティ問題について

  • 元祖はりぼてOSおよびOSASK-HB/AT Ver.0.00に重大なセキュリティ問題を発見しました。悪意を持ったアプリケーションは、例外を発生させずに任意のメモリへのリード・ライトを実行できます。
  • これはOS本体およびアプリケーション実行環境に重大な障害をもたらす可能性があります。OSASK-HB/AT Ver.0.01にて、早急に対処するべきです。
  • サンプルソース crack7.c crack8.c(crack7は後ろのほうの章に存在していました)
    #include "apilib.h"
    
    void HariMain(void) {
    	int i;
    
    	i = api_fsize(0x00102600 - 4, 0);	// メモリの0x00102600番地をリード
    
    	if(i != 0) {
    		api_putstr0("Crack!\n");
    		api_fseek(0x00102600 - 8, 0, 0);	// メモリの0x00102600番地にライト
    	}
    
    	api_end();
    }
  • 問題発生のメカニズム
    • リード
      • 1.api_fsize(apilib.lib)が呼ばれる
      • 2.int 0x40を実行
      • 3.hrb_api(console.c)のif(edx == 24)節を実行
      • 4.fhはリードされるアドレスの4番地前を指す
      • 5.reg[7] = fh->size;により、eaxに任意のメモリがリードされる
  • ライト
    • 1.api_fseek(apilib.lib)が呼ばれる
    • 2.int 0x40を実行
    • 3.hrb_api(console.c)のif(edx == 23)節を実行
    • 4.fhはライトされるアドレスの8番地前を指す
    • 5.fh->pos = ebx;により、任意のメモリにebxがライトされる
  • 解決策の一例
    • ここでは、節の中の節を、"."でつないで示します。
    • hrb_api(console.c)
    • if(edx == 21).if(i < 8).if(finfo != 0)節の1行目をreg[7] = i + 1;に変更する
    • if(edx == 22)節の1行目、if(edx == 23)節の1行目、およびif(edx == 24)節の1行目をそれぞれif((unsigned int)eax < 8) { fh = task->fhandle + eax - 1; } else { return 0; }に変更する
  • この問題から分かったこと
    • はりぼてOSはアプリをユーザモードで起動しているため、はりぼてOSに対する攻撃はAPIの脆弱性を突くしかない。
    • (はりぼてOSではアプリはHLTもCLIもIN/OUTもできないし、OSや他のアプリのメモリを読み書きすることもできない。ユーザモードで起動されたアプリが、OSを攻撃する方法は他にありうるのだろうか?ご教授願います>>知っている方)
    • ということは、APIさえ完璧にできれば守りは完全になるわけだ(少なくともOSの動作に影響を与えることはなくなる)。プログラムにバグがないことは証明できないが…
    • 分かる範囲で今回のような問題をふせぐ方法を考えてみた。
    • アプリにメモリをリードさせないためには…アプリのレジスタの内容をメモリのアドレスと解釈せずに、テーブルへのインデックスなどとする。範囲チェックは怠らない。アプリのレジスタに書き込むときはOSが管理するポインタはわたさない。
    • アプリにメモリをライトさせないためには…アプリのレジスタの扱いは同様。メモリに何か書き込むなら、アプリがそのアドレスを操作することができるかよく見直す。
    • こんなところかな。何か思いついたら書き足します。

diff作りました

  • 30日OS本の読者に、「バージョン管理があるといいかも」とかおっしゃっていた方がいたかと思いますが、その意見に賛成です。
  • 一つ一つのフォルダの内容を比較して、どのソースに変更があったかを確認しつつ読み進めるほうが、理解に役立ちそうだと思います。
  • そんなこんなでバージョン管理について少し調べてみて、「インストールして使わなきゃいけないのか、(tolsetに組み込むため)ポータブルなものは無いものか」と思い、「使えるものが無いなら、自分で作ればいいじゃない」と、「誰の車輪の再発明だ!?」というツッコミどころ満載の悪魔の声を聞き、diffを作ってしまいました。
  • とりあえず、ひととおりのデバッグはやったつもりですが、どなたか、使いながらテストをしてくれる方はいないでしょうか?
  • ソースの半分くらいは人のコードのパクリ移植なのでその部分はKL-01になっていないのですが、オープンソースで公開します。煮るなり焼くなり好きにしてください。こちらからどうぞ。http://sero.tm.land.to/Archives/diff.zip
  • バグ報告、改善要求、意見など、なんでも受け付けます。下のコメント欄へどうぞ。

コメント欄

  • ページを作ってみました。 -- Sero 2006-08-06 (日) 01:26:32
  • OSについて。TABキーで画面を切り替えるという発想が面白いです。起動したアプリの終了方法が分かりませんでした。 -- uchan 2006-08-06 (日) 06:47:34
  • ありがとうございます。エディタは、Mkediterを使っているので、そこからタブ型を思いつきました。はりぼてと同じで、シフトF1で強制終了のほか、アプリごとに終了方法が用意されています。基本的にはりぼてのアプリを表示部だけ変えて移植したものなので、tviewはQキー、など、そのままです。 -- Sero 2006-08-06 (日) 20:32:27
  • 使いました。ncstコマンドのバグを直したりするといいですね。0.8.1の問題はぼくもありましたが、たぶんtolsetのQEMUはバージョンが古くてバグがあったやつで、0.8.1だと修正されたと考えられますね。今後ともお頑張りください。 -- Alpha 2006-08-16 (水) 07:25:42
  • Lights Ver 0.3.1は過去のバージョンより機能的には劣りますが、極力ソースはきれいに書くように努力しています。 -- Sero 2007-08-03 (金) 09:41:39
  • (何者かによって予告なくこのページが削除されていたので管理者権限で元に戻しました。) -- K 2007-10-17 (水) 19:56:56
  • おおー。非常に面白いです。油断していると不注意でセキュリティーホールができてしまうという好例です。どうもありがとうございます。「重大なセキュリティ問題」「早急に対処するべき」というほどの信頼性が最初から「はりぼてOS」にも「OSASK-HB」にも(まだ)ないので、この見出しは大げさ過ぎる気はしますが、でも報告内容は完璧です。 -- K 2008-05-21 (水) 22:45:09
  • 多少大げさとは思いましたが、はりぼてOSをベースにしつつファイルAPIは独自に作った、という人は少ないでしょうから、同じ攻撃がはりぼてベースの自作OS群に通用してしまうならば、これは危険だと思ったわけでこんな書き方をしたわけです。 -- Sero 2008-05-23 (金) 20:08:28
  • tatsuです。またまた凄い発見ですね。今回適応させてもらったところ、fhandleの0番目を確保した場合、typeなどのアプリケーション側でのチェックのfh != 0のところでエラーになってしまいます。説明しにくいのですが、typeを実行してみれば分かると思います。もしかしたら、こちらの誤解かもしれませんが・・・。 -- tatsu 2008-06-09 (月) 20:05:45
  • サンプルソースを修正しました。確かにapi_fopenの戻り値0はエラーの意味でした。tatsuさん検証ありがとうございます。 -- Sero 2008-06-12 (木) 17:36:07

コメントお名前NameLink

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2010-03-08 (月) 12:17:58 (3395d)