page0005
の編集
http://osecpu.osask.jp/wiki/?page0005
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
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
* OSECPUが検出できる脆弱性 -(by [[K]], 2012.09.25) ** 一覧 -(以下の記述は仕様に基づいている。実装にバグがあって抜け穴ができている可能性はある。) --もしそんなものがあったら、それはもちろん直さなければいけない。 -任意のx86コードを実行できるか? --アプリにはできない。特権レベル3の命令も含めてできない。OSにはできる。 --試みてOSに検出されて止まるのではなく、そもそも方法がない。 ---以下これくらいにできないことを単に「できない」と書く。 --なお、任意のOSECPU命令を実行することはできる。しかしもちろん不正な命令については害を及ぼす前に実行を差し止められる。 -任意のアドレスに分岐できるか?(jmpやcallやretなど) --できない。これも試みてOSに検出されて止まるのではなく、そもそも方法がない。 --原理を説明すると、まずOSECPUではラベルにしかjmpできない。 --callやret命令はない。 ---callに相当することをしたいときは、リターンアドレスを自分でスタックなどに積んだ上で、jmpすればよい。このリターンアドレスは当然ラベルになっていなければいけないので(そうでないと値が取れない)、OSECPUアプリはかなりたくさんのラベル文が必要になる。 ---retについても、スタックから値を持ってきてそこにjmpすることで代用できる。 ---[2014.06.20追記] 結局リターンアドレスはP30で渡すことになりました。したがってret命令の代わりにJMP(P30);を実行しています。 --ラベルはポインタ型のレジスタもしくはポインタ型のメモリ上にしか代入できない。ポインタ型に対してできる演算は非常に限定されていて、任意の値を入れることができない。C言語の常識とは異なり、ラベル(コードのアドレス)が格納されているポインタ型レジスタに対してはインクリメントもデクリメントも加算も減算もできない。メモリに対してはどのみち同型のレジスタへの読み書きしかできず、値を変化させるような演算の命令は命令セット上に存在しない。 ---ちなみに、データの配列をポイントしている場合も、配列の外に出るようなポインタ操作をすれば(そのポインタを使わなくても)即座に脆弱性検出例外になる。この例外はアプリで例外処理することができず、必ずOSによって停止処分か強制終了にされる。 ---[2014.06.20追記] 結局ポインタは自由に加算も減算もできるようになりました。しかし不正な場所を指した状態でアクセスしようとすれば、その時点でセキュリティ例外になります。 -freeした後でそのオブジェクトにアクセスしたらどうなるか? --脆弱性検出例外になる。 --これは試みることができるタイプ。そういうことをしようとするコードを書くことはできる。しかしこれをやろうとすると即座に脆弱性検出例外になる。 -32bit整数のメモリ域を8bit整数で読み書きしたらどうなるか?(エンディアンは?) --読み書きできない。直ちに脆弱性検出例外になる。 --したがってOSECPUにおいてエンディアンが問題になることはない。上位8bitの値が知りたいのなら、32bitでメモリアクセスしてレジスタに格納した後で、24bitの右シフトをすればいいだろう。下位8bitの値がほしいのであればリードした後にマスクすればいい。 --要するに分割不能なオブジェクトの一部だけを読み書きすることはできない。unionに相当する機能もない。 ** こめんと欄 -このページにこめんと欄はありません。このページの内容にコメントしたいときは[[impressions]]にお願いします。
タイムスタンプを変更しない
* OSECPUが検出できる脆弱性 -(by [[K]], 2012.09.25) ** 一覧 -(以下の記述は仕様に基づいている。実装にバグがあって抜け穴ができている可能性はある。) --もしそんなものがあったら、それはもちろん直さなければいけない。 -任意のx86コードを実行できるか? --アプリにはできない。特権レベル3の命令も含めてできない。OSにはできる。 --試みてOSに検出されて止まるのではなく、そもそも方法がない。 ---以下これくらいにできないことを単に「できない」と書く。 --なお、任意のOSECPU命令を実行することはできる。しかしもちろん不正な命令については害を及ぼす前に実行を差し止められる。 -任意のアドレスに分岐できるか?(jmpやcallやretなど) --できない。これも試みてOSに検出されて止まるのではなく、そもそも方法がない。 --原理を説明すると、まずOSECPUではラベルにしかjmpできない。 --callやret命令はない。 ---callに相当することをしたいときは、リターンアドレスを自分でスタックなどに積んだ上で、jmpすればよい。このリターンアドレスは当然ラベルになっていなければいけないので(そうでないと値が取れない)、OSECPUアプリはかなりたくさんのラベル文が必要になる。 ---retについても、スタックから値を持ってきてそこにjmpすることで代用できる。 ---[2014.06.20追記] 結局リターンアドレスはP30で渡すことになりました。したがってret命令の代わりにJMP(P30);を実行しています。 --ラベルはポインタ型のレジスタもしくはポインタ型のメモリ上にしか代入できない。ポインタ型に対してできる演算は非常に限定されていて、任意の値を入れることができない。C言語の常識とは異なり、ラベル(コードのアドレス)が格納されているポインタ型レジスタに対してはインクリメントもデクリメントも加算も減算もできない。メモリに対してはどのみち同型のレジスタへの読み書きしかできず、値を変化させるような演算の命令は命令セット上に存在しない。 ---ちなみに、データの配列をポイントしている場合も、配列の外に出るようなポインタ操作をすれば(そのポインタを使わなくても)即座に脆弱性検出例外になる。この例外はアプリで例外処理することができず、必ずOSによって停止処分か強制終了にされる。 ---[2014.06.20追記] 結局ポインタは自由に加算も減算もできるようになりました。しかし不正な場所を指した状態でアクセスしようとすれば、その時点でセキュリティ例外になります。 -freeした後でそのオブジェクトにアクセスしたらどうなるか? --脆弱性検出例外になる。 --これは試みることができるタイプ。そういうことをしようとするコードを書くことはできる。しかしこれをやろうとすると即座に脆弱性検出例外になる。 -32bit整数のメモリ域を8bit整数で読み書きしたらどうなるか?(エンディアンは?) --読み書きできない。直ちに脆弱性検出例外になる。 --したがってOSECPUにおいてエンディアンが問題になることはない。上位8bitの値が知りたいのなら、32bitでメモリアクセスしてレジスタに格納した後で、24bitの右シフトをすればいいだろう。下位8bitの値がほしいのであればリードした後にマスクすればいい。 --要するに分割不能なオブジェクトの一部だけを読み書きすることはできない。unionに相当する機能もない。 ** こめんと欄 -このページにこめんと欄はありません。このページの内容にコメントしたいときは[[impressions]]にお願いします。
テキスト整形のルールを表示する