Sero
の編集
http://hrb.osask.jp/wiki/?Sero
[
リロード
|
差分
|
単語検索
|
一覧
] [
編集
|
バックアップ
|
添付
]
-- 雛形とするページ --
A
Akkie
Athlon64X2
Clover
DAsoran
Falcon
FormatRule
FrontPage
Genesis
Help
I
InterWikiName
InterWikiSandBox
InterWikiテクニカル
Jormungand
K
Kebo
Kor_Lee_Hee_Rak
Leaf
Linux
Linux/wako_memo
MOIZ99
MW
MenuBar
OSC
PG_MANA
ReadersOS
RecentDeleted
SKYDASH
SandBox
Sero
Sigle
Source
Triangle_Ld.
Zxcvbnm
advance
advance/CPU
advance/FDC
advance/FPU
advance/NotHariMain
advance/QEMUVGA
advance/RTC
advance/blike
advance/cpu_reset
advance/driver
advance/driver/01
advance/driver/02
advance/families
advance/filesystem
advance/fwrite
advance/hddboot
advance/he86
advance/hints
advance/ipl
advance/kernel
advance/keycode
advance/osselect
advance/smaller1
advance/startup
advnace/smaller2
anzy
aotatsu
banbi-
bluedwarf
bo
bugs
challengers
cybozulabsyouth11
deskmanta
esb02b
faq
faq/advance
faq/asm
faq/c00-03
faq/c04-07
faq/c08-15
faq/c16-23
faq/c24-31
faq/make
faq/others
faq/qemu
guide
guide03
guide05
guide07
hikarupsp
imp_log/0000
imp_log/0001
imp_log/0002
imp_log/0003
impressions
index
k
killer_elf
kota
lea
lea/10_memory
lea/4_color
lea/idea
lea/terms
links
logs
logs/osa_hrb/comments0000
logs/osa_hrb/rumors0000
masa
members
message
mistakes
moge32
moppoi5168
notice
osdevjp
populars
prog_index
projects
q_and_a
q_and_a_2
qa_log/0000
qa_log/0001
qa_log/0002
qa_log/0003
qa_log/0004
qa_log/0005
qa_log/0006
qa_log/0007
qa_log/0008
qa_log/0009
quark
rankings
rule
sakamoto
sasaki
spc09
spcc_30min_os
tatsu
tools
tools/bim2hrb
tools/bin2obj
tools/cc1
tools/edimg
tools/gas2nask
tools/makefont
tools/nask
tools/obj2bim
tools/sjisconv
uchan
uho
updates
violations
wako
white
win64-bit
x
ytakano
ヘルプ
リックス
質問します
整形ルール
本は買ったぞ!持ってるぞ!
練習用ページ
* 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最新情報 -Lights Ver 0.3.1をリリースしました。こちらへどうぞ。http://sero.tm.land.to/ * はりぼて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'' SIZE(10){2006-08-06 (日) 01:26:32} -OSについて。TABキーで画面を切り替えるという発想が面白いです。起動したアプリの終了方法が分かりませんでした。 -- [[uchan]] SIZE(10){2006-08-06 (日) 06:47:34} -ありがとうございます。エディタは、Mkediterを使っているので、そこからタブ型を思いつきました。はりぼてと同じで、シフトF1で強制終了のほか、アプリごとに終了方法が用意されています。基本的にはりぼてのアプリを表示部だけ変えて移植したものなので、tviewはQキー、など、そのままです。 -- ''Sero'' SIZE(10){2006-08-06 (日) 20:32:27} -使いました。ncstコマンドのバグを直したりするといいですね。0.8.1の問題はぼくもありましたが、たぶんtolsetのQEMUはバージョンが古くてバグがあったやつで、0.8.1だと修正されたと考えられますね。今後ともお頑張りください。 -- ''Alpha'' SIZE(10){2006-08-16 (水) 07:25:42} -Lights Ver 0.3.1は過去のバージョンより機能的には劣りますが、極力ソースはきれいに書くように努力しています。 -- [[Sero]] SIZE(10){2007-08-03 (金) 09:41:39} -(何者かによって予告なくこのページが削除されていたので管理者権限で元に戻しました。) -- [[K]] SIZE(10){2007-10-17 (水) 19:56:56} -おおー。非常に面白いです。油断していると不注意でセキュリティーホールができてしまうという好例です。どうもありがとうございます。「重大なセキュリティ問題」「早急に対処するべき」というほどの信頼性が最初から「はりぼてOS」にも「OSASK-HB」にも(まだ)ないので、この見出しは大げさ過ぎる気はしますが、でも報告内容は完璧です。 -- ''K'' SIZE(10){2008-05-21 (水) 22:45:09} -多少大げさとは思いましたが、はりぼてOSをベースにしつつファイルAPIは独自に作った、という人は少ないでしょうから、同じ攻撃がはりぼてベースの自作OS群に通用してしまうならば、これは危険だと思ったわけでこんな書き方をしたわけです。 -- ''Sero'' SIZE(10){2008-05-23 (金) 20:08:28} -tatsuです。またまた凄い発見ですね。今回適応させてもらったところ、fhandleの0番目を確保した場合、typeなどのアプリケーション側でのチェックのfh != 0のところでエラーになってしまいます。説明しにくいのですが、typeを実行してみれば分かると思います。もしかしたら、こちらの誤解かもしれませんが・・・。 -- [[tatsu]] SIZE(10){2008-06-09 (月) 20:05:45} -サンプルソースを修正しました。確かにapi_fopenの戻り値0はエラーの意味でした。tatsuさん検証ありがとうございます。 -- ''Sero'' SIZE(10){2008-06-12 (木) 17:36:07} #comment
タイムスタンプを変更しない
* 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最新情報 -Lights Ver 0.3.1をリリースしました。こちらへどうぞ。http://sero.tm.land.to/ * はりぼて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'' SIZE(10){2006-08-06 (日) 01:26:32} -OSについて。TABキーで画面を切り替えるという発想が面白いです。起動したアプリの終了方法が分かりませんでした。 -- [[uchan]] SIZE(10){2006-08-06 (日) 06:47:34} -ありがとうございます。エディタは、Mkediterを使っているので、そこからタブ型を思いつきました。はりぼてと同じで、シフトF1で強制終了のほか、アプリごとに終了方法が用意されています。基本的にはりぼてのアプリを表示部だけ変えて移植したものなので、tviewはQキー、など、そのままです。 -- ''Sero'' SIZE(10){2006-08-06 (日) 20:32:27} -使いました。ncstコマンドのバグを直したりするといいですね。0.8.1の問題はぼくもありましたが、たぶんtolsetのQEMUはバージョンが古くてバグがあったやつで、0.8.1だと修正されたと考えられますね。今後ともお頑張りください。 -- ''Alpha'' SIZE(10){2006-08-16 (水) 07:25:42} -Lights Ver 0.3.1は過去のバージョンより機能的には劣りますが、極力ソースはきれいに書くように努力しています。 -- [[Sero]] SIZE(10){2007-08-03 (金) 09:41:39} -(何者かによって予告なくこのページが削除されていたので管理者権限で元に戻しました。) -- [[K]] SIZE(10){2007-10-17 (水) 19:56:56} -おおー。非常に面白いです。油断していると不注意でセキュリティーホールができてしまうという好例です。どうもありがとうございます。「重大なセキュリティ問題」「早急に対処するべき」というほどの信頼性が最初から「はりぼてOS」にも「OSASK-HB」にも(まだ)ないので、この見出しは大げさ過ぎる気はしますが、でも報告内容は完璧です。 -- ''K'' SIZE(10){2008-05-21 (水) 22:45:09} -多少大げさとは思いましたが、はりぼてOSをベースにしつつファイルAPIは独自に作った、という人は少ないでしょうから、同じ攻撃がはりぼてベースの自作OS群に通用してしまうならば、これは危険だと思ったわけでこんな書き方をしたわけです。 -- ''Sero'' SIZE(10){2008-05-23 (金) 20:08:28} -tatsuです。またまた凄い発見ですね。今回適応させてもらったところ、fhandleの0番目を確保した場合、typeなどのアプリケーション側でのチェックのfh != 0のところでエラーになってしまいます。説明しにくいのですが、typeを実行してみれば分かると思います。もしかしたら、こちらの誤解かもしれませんが・・・。 -- [[tatsu]] SIZE(10){2008-06-09 (月) 20:05:45} -サンプルソースを修正しました。確かにapi_fopenの戻り値0はエラーの意味でした。tatsuさん検証ありがとうございます。 -- ''Sero'' SIZE(10){2008-06-12 (木) 17:36:07} #comment
テキスト整形のルールを表示する