page0020
の編集
http://osecpu.osask.jp/wiki/?page0020
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
BracketName
FormattingRules
FrontPage
Fulyn
Fulyn-v2
Fulyn_Samples
Help
InterWiki
InterWikiName
InterWikiSandBox
K
KOR_PIT8254
KWVM.NET
Liva
MANA
MenuBar
OSECPU_FPGA
PG_MANA
PHP
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
RecentDeleted
SandBox
WikiEngines
WikiName
WikiWikiWeb
YukiWiki
hikalium
hikarupsp
hikarupsp_ELCHNOS
hikarupsp_ELCHNOS_IDE
hikarupsp_FrontEndCode
hikarupsp_WebCPU-VM
hikarupsp_WebCPU-VM_internal
hikarupsp_study_hh4
impressions
impressions0000
jpag0000
jpag0001
jpag0002
jpag0003
jpag0004
jpag0005
lambdalice
mandel59
members
memo0000
memo0001
memo0002
memo0003
memo0004
memo0005
memo0006
memo0007
memo0008
memo0009
memo0010
osask
osecpu4android
page0000
page0001
page0002
page0003
page0004
page0005
page0006
page0007
page0008
page0009
page0010
page0011
page0012
page0013
page0014
page0015
page0016
page0017
page0018
page0019
page0020
page0021
page0022
page0023
page0024
page0025
page0026
page0027
page0028
page0029
page0030
page0031
page0032
page0033
page0034
page0035
page0036
page0037
page0038
page0039
page0040
page0041
page0042
page0043
page0044
page0045
page0046
page0047
page0048
page0049
page0050
page0051
page0052
page0053
page0054
page0055
page0056
page0057
page0058
page0059
page0060
page0061
page0062
page0063
page0064
page0065
page0066
page0067
page0068
page0069
page0070
page0071
page0072
page0073
page0074
page0075
page0076
page0077
page0078
page0079
page0080
page0081
page0082
page0083
page0084
page0085
page0086
page0087
page0088
page0089
page0090
page0091
page0092
page0093
page0094
page0095
page0096
page0097
page0098
page0099
page0100
page0101
page0102
page0103
page0104
page0105
page0106
page0107
page0108
page0109
pagenames
populars
seccamp2013
seccamp2014
seccamp2017
ttwilb
ttwilb-asmi
yao
* アクセス権問題について -(by [[K]], 2013.04.01) ** 前提 -OSECPUのアプリは、持っているポインタ以外のところにはアクセスできない。 -システムコールをするとしても、システムは受け取った引数以外のところはアクセスできない。 --これを乗り越えるには、システムコールハンドラをOSECPUでは書かないか、もしくはシステムコールハンドラを書くために特権的な命令を作るしかない。 --しかしこのどちらの方法も受け入れがたい。システムコールハンドラをOSECPUで書けないということは、OSECPUでは書けないコードがあるということを意味して、それはつまり不完全なことの証ではないかと思う。それにOSECPUで書けないとなれば、機種依存するということにもなり、移植の妨げになる。 --特権命令を作るとなれば、また特権を与えるかどうかの判定基準が必要になり、その権限を巡って攻撃者との攻防をすることになる。それも気に入らない。そういうモデルから脱したいのだ。 -つまりシステムはアプリにできることを手伝っているだけの存在になってしまう。ただの便利ツールだ。 -しかしだからと言って、アプリにハードウェアリソースにアクセス可能なポインタを与えていいものだろうか。・・・いやそれはダメだ。それじゃあアプリのバグでOSごと死んでしまう。 --しかしアプリにポインタを与えなければ、アプリはシステムコール時にシステムにアクセス権を与えることができない。 ** アイデア -ここで僕はひらめいた。まずアクセス権がたくさんあるポインタ群を、一つの構造体にすべて書き込んでおいて、その構造体へのポインタを守ることだけを考える。そしてこの一つのポインタをハンドル形式でポインタレジスタに入れる。 --アクセス権がたくさんあるポインタ=いろいろなところにアクセスできちゃうポインタのこと --ハンドル形式になると、そのままではメモリアクセスには使えない。 -それで、ハンドル形式のポインタから元のポインタを読み取る命令を用意する。この命令は、基本的には誰でも実行できるが、しかしこの命令の実行が成功するのは、あらかじめ決められたプログラムだけだ。・・・ここに特権めいたものを感じるかもしれないが、少し違う。 -ハンドルからポインタを取り出せるのは、そのハンドルの作者だけだと理解してほしい。つまり情報に鍵をかけることができる。この鍵はかけた者だけが解除できる。鍵が解除できない者でも、鍵がかかった状態のままでよければ、ハンドルとして自由に他の者に渡すことはできる。 --これを少し拡張すれば、ハンドルの作者はハンドルの開錠者を指定できる、という形式も可能かと思われる。 -ちなみに開錠者をOSECPUがどうやって判定するかだけど、それは簡単で関数呼び出しのリターンポインタP1Eを見る。これが指定されていた範囲に収まっていれば開錠する。 --もちろんアプリがP1Eに偽りの値を入れて(=手持ちのシステムへのポインタを入れて)開錠を要求することはできる。開錠そのものはおそらく成功するだろう。しかし開錠後、プログラムはP1Eのアドレスへ分岐してしまうので、アプリは開錠された情報を取得できない。さらにシステムに入った後もP1Eのアドレスがシステムを指しているので、仮にリターン命令があってもアプリへ帰ることができない。 --そもそもアプリが取得できるシステムのポインタなんて、システムコール用の物くらいしかなく、だからシステムコールエントリのところだけしっかり対策すればいい。 -ということで、システムコールに際しては、アプリは起動時にシステムからもらったシステムコール用のハンドルを引数に積んで呼び出す。 ** 応用? -この仕組みの場合、システムはこうしてアプリに対して情報を隠せるが、しかし逆にアプリもシステムに対して情報を隠すことができる。アプリが作ったハンドルはシステムによって開錠することはできない。したがって、システムに知られずにアプリが情報を保持することは可能である。 --ということで、仕組みとしてはアプリとシステムは対等であって、システムの優位性は単にアプリよりも多くの情報を握っているだけでしかない。 -もっともどのようなオブジェクトであれ、最初にそのメモリはシステムの管理下にあったものなので、システムは(ポインタを捨ててなければ)いつでも中身を見ることはできるのではあるが。 ** スタックフレーム -関数の呼び出し: --アプリはベースポインタからハンドルを作る。 --そしてベースポインタより下をガードする(PLMT1命令を使う)。 -関数から戻ってきたら: --ハンドルからベースポインタを復元する。 --復元したベースポインタと現在のベースポインタは一致しているかをチェックしてやる。 -信用できる相手に対しては、上記の4ステップをすべて省略できる。 ** こめんと欄 -このページにこめんと欄はありません。このページの内容にコメントしたいときは[[impressions]]にお願いします。
タイムスタンプを変更しない
* アクセス権問題について -(by [[K]], 2013.04.01) ** 前提 -OSECPUのアプリは、持っているポインタ以外のところにはアクセスできない。 -システムコールをするとしても、システムは受け取った引数以外のところはアクセスできない。 --これを乗り越えるには、システムコールハンドラをOSECPUでは書かないか、もしくはシステムコールハンドラを書くために特権的な命令を作るしかない。 --しかしこのどちらの方法も受け入れがたい。システムコールハンドラをOSECPUで書けないということは、OSECPUでは書けないコードがあるということを意味して、それはつまり不完全なことの証ではないかと思う。それにOSECPUで書けないとなれば、機種依存するということにもなり、移植の妨げになる。 --特権命令を作るとなれば、また特権を与えるかどうかの判定基準が必要になり、その権限を巡って攻撃者との攻防をすることになる。それも気に入らない。そういうモデルから脱したいのだ。 -つまりシステムはアプリにできることを手伝っているだけの存在になってしまう。ただの便利ツールだ。 -しかしだからと言って、アプリにハードウェアリソースにアクセス可能なポインタを与えていいものだろうか。・・・いやそれはダメだ。それじゃあアプリのバグでOSごと死んでしまう。 --しかしアプリにポインタを与えなければ、アプリはシステムコール時にシステムにアクセス権を与えることができない。 ** アイデア -ここで僕はひらめいた。まずアクセス権がたくさんあるポインタ群を、一つの構造体にすべて書き込んでおいて、その構造体へのポインタを守ることだけを考える。そしてこの一つのポインタをハンドル形式でポインタレジスタに入れる。 --アクセス権がたくさんあるポインタ=いろいろなところにアクセスできちゃうポインタのこと --ハンドル形式になると、そのままではメモリアクセスには使えない。 -それで、ハンドル形式のポインタから元のポインタを読み取る命令を用意する。この命令は、基本的には誰でも実行できるが、しかしこの命令の実行が成功するのは、あらかじめ決められたプログラムだけだ。・・・ここに特権めいたものを感じるかもしれないが、少し違う。 -ハンドルからポインタを取り出せるのは、そのハンドルの作者だけだと理解してほしい。つまり情報に鍵をかけることができる。この鍵はかけた者だけが解除できる。鍵が解除できない者でも、鍵がかかった状態のままでよければ、ハンドルとして自由に他の者に渡すことはできる。 --これを少し拡張すれば、ハンドルの作者はハンドルの開錠者を指定できる、という形式も可能かと思われる。 -ちなみに開錠者をOSECPUがどうやって判定するかだけど、それは簡単で関数呼び出しのリターンポインタP1Eを見る。これが指定されていた範囲に収まっていれば開錠する。 --もちろんアプリがP1Eに偽りの値を入れて(=手持ちのシステムへのポインタを入れて)開錠を要求することはできる。開錠そのものはおそらく成功するだろう。しかし開錠後、プログラムはP1Eのアドレスへ分岐してしまうので、アプリは開錠された情報を取得できない。さらにシステムに入った後もP1Eのアドレスがシステムを指しているので、仮にリターン命令があってもアプリへ帰ることができない。 --そもそもアプリが取得できるシステムのポインタなんて、システムコール用の物くらいしかなく、だからシステムコールエントリのところだけしっかり対策すればいい。 -ということで、システムコールに際しては、アプリは起動時にシステムからもらったシステムコール用のハンドルを引数に積んで呼び出す。 ** 応用? -この仕組みの場合、システムはこうしてアプリに対して情報を隠せるが、しかし逆にアプリもシステムに対して情報を隠すことができる。アプリが作ったハンドルはシステムによって開錠することはできない。したがって、システムに知られずにアプリが情報を保持することは可能である。 --ということで、仕組みとしてはアプリとシステムは対等であって、システムの優位性は単にアプリよりも多くの情報を握っているだけでしかない。 -もっともどのようなオブジェクトであれ、最初にそのメモリはシステムの管理下にあったものなので、システムは(ポインタを捨ててなければ)いつでも中身を見ることはできるのではあるが。 ** スタックフレーム -関数の呼び出し: --アプリはベースポインタからハンドルを作る。 --そしてベースポインタより下をガードする(PLMT1命令を使う)。 -関数から戻ってきたら: --ハンドルからベースポインタを復元する。 --復元したベースポインタと現在のベースポインタは一致しているかをチェックしてやる。 -信用できる相手に対しては、上記の4ステップをすべて省略できる。 ** こめんと欄 -このページにこめんと欄はありません。このページの内容にコメントしたいときは[[impressions]]にお願いします。
テキスト整形のルールを表示する