katsuhiro/refmon/clone
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[katsuhiro]] -> [[katsuhiro/refmon]] -> katsuhiro/refmon...
*sys_clone への書き換えによる sys_fork と sys_vfork の追...
ptrace を用いて sys_fork と sys_vfork を追跡する手法と、...
**子、孫プロセスのトレース [#o01a8544]
-strace では vfork を追うにはカーネルパッチが必要とのこと...
-この研究では 2.4系でも 2.6系でも fork や vfork を追いか...
--strace を作るのならば、sys_fork が発行されれば sys_fork...
--しかしリファレンスモニタには、その制約はない。このため ...
**clone に書き換える方式の欠点 [#jf500dcb]
-書き換えた vfork は本来の動きとは違う(子が終わるまで待...
--vfork の man を見る限り、vfork の動きに依存してはならず...
--親が vfork で生成した子を待つ、という動作に依存したプロ...
--親と子でメモリを共有している、という動作に依存した変態...
*sys_clone 書き換え方式の実装 [#v64806d7]
**sys_fork の書き換え [#gda8be49]
呼び出すシステムコール番号を sys_clone に書き換える。引数...
-なぜうまくいくか
--sys_fork と sys_vfork と sys_clone はどれもカーネル関数...
**sys_vfork の書き換え [#me7a5bbb]
基本的には sys_fork のときと同じ実装である。
***実装でつまづいた点 [#d1f0a602]
-その1)sys_fork と同じ気分で sys_vfork を書き換えるとシス...
--原因: glibc が ecx を使っているのに、sys_vfork -> sys_c...
---glibc のソースを見ると ecx にリターンアドレスを入れて...
--対策: sys_vfork から戻る時に ecx を復元する。
---将来別のレジスタが使われるかもしれないため、全レジスタ...
-その2)子プロセスが何も実行しないうちに死んで(SIGSEGV が...
--問題発生の流れ: sys_vfork -> sys_clone への書き換えはシ...
--原因: 子プロセス側の ecx を復元していない。
--解決: sys_clone に書き換えるとき CLONE_PTRACE を指定し...
---つまり sys_vfork は CLONE_PTRACE を指定して止めなけれ...
**sys_clone の書き換え [#i04debfe]
フラグに CLONE_PTRACE が指定されていなければ、フラグに追...
***実装でつまづいた点 [#u339b45a]
-スレッドにきたシグナルを調べに行くとリファレンスモニタが...
--問題発生の流れ: gimp の一部が追跡できなかった。ファイル...
--原因: waitpid のデフォルト動作は __WNOTHREAD(同じスレ...
--解決: waitpid のオプションに __WALL(clone で作成された...
--man によると、waitpid のデフォルト動作は __WNOTHREAD(...
終了行:
[[katsuhiro]] -> [[katsuhiro/refmon]] -> katsuhiro/refmon...
*sys_clone への書き換えによる sys_fork と sys_vfork の追...
ptrace を用いて sys_fork と sys_vfork を追跡する手法と、...
**子、孫プロセスのトレース [#o01a8544]
-strace では vfork を追うにはカーネルパッチが必要とのこと...
-この研究では 2.4系でも 2.6系でも fork や vfork を追いか...
--strace を作るのならば、sys_fork が発行されれば sys_fork...
--しかしリファレンスモニタには、その制約はない。このため ...
**clone に書き換える方式の欠点 [#jf500dcb]
-書き換えた vfork は本来の動きとは違う(子が終わるまで待...
--vfork の man を見る限り、vfork の動きに依存してはならず...
--親が vfork で生成した子を待つ、という動作に依存したプロ...
--親と子でメモリを共有している、という動作に依存した変態...
*sys_clone 書き換え方式の実装 [#v64806d7]
**sys_fork の書き換え [#gda8be49]
呼び出すシステムコール番号を sys_clone に書き換える。引数...
-なぜうまくいくか
--sys_fork と sys_vfork と sys_clone はどれもカーネル関数...
**sys_vfork の書き換え [#me7a5bbb]
基本的には sys_fork のときと同じ実装である。
***実装でつまづいた点 [#d1f0a602]
-その1)sys_fork と同じ気分で sys_vfork を書き換えるとシス...
--原因: glibc が ecx を使っているのに、sys_vfork -> sys_c...
---glibc のソースを見ると ecx にリターンアドレスを入れて...
--対策: sys_vfork から戻る時に ecx を復元する。
---将来別のレジスタが使われるかもしれないため、全レジスタ...
-その2)子プロセスが何も実行しないうちに死んで(SIGSEGV が...
--問題発生の流れ: sys_vfork -> sys_clone への書き換えはシ...
--原因: 子プロセス側の ecx を復元していない。
--解決: sys_clone に書き換えるとき CLONE_PTRACE を指定し...
---つまり sys_vfork は CLONE_PTRACE を指定して止めなけれ...
**sys_clone の書き換え [#i04debfe]
フラグに CLONE_PTRACE が指定されていなければ、フラグに追...
***実装でつまづいた点 [#u339b45a]
-スレッドにきたシグナルを調べに行くとリファレンスモニタが...
--問題発生の流れ: gimp の一部が追跡できなかった。ファイル...
--原因: waitpid のデフォルト動作は __WNOTHREAD(同じスレ...
--解決: waitpid のオプションに __WALL(clone で作成された...
--man によると、waitpid のデフォルト動作は __WNOTHREAD(...
ページ名: