髙山 献 セコム(株)IS研究所 研究職 |
キーワード
オペレーティングシステム(OS) | ソフトウェアバグ | 信頼性 |
[背景]OSクラッシュでアプリケーションが停止し実行状態を失う
[問題]クラッシュ後のOS・アプリケーションの実行状態は信用できない
[貢献]OSの機能に依存しないアプリケーション実行状態の取得と保護
プログラムに不具合はつきもので.それはコンピュータの根幹を管理しているオペレーティングシステム(OS)も同じである.たとえばオープンソースOSのLinuxでは,プログラムの修正を行うパッチというものが1時間に数個という速さで生成されている.パッチの適用をせず放置すると,バグを含んだコードを実行してOSがクラッシュしたり,脆弱性をついた攻撃を受けてコンピュータが乗っ取られたりといったことが起こり,コンピュータを安心して使うことができなくなる.パッチを適用することでOSの中で発見されたバグを修正することができるが,OSにアップデートを適用するためにはコンピュータ全体を再起動することが一般的で,再起動中は稼働させていたアプリケーション(App)が停止してしまうというジレンマがある.この2つの問題を同時に解決するために,本研究では3つの手法を提案する.
1つ目の手法で,OSがAppの実行状態を破壊してしまうこと,失ってしまうことを防ぐ.OSよりも高いハードウェアの特権を持ち,ソースコードも短くOSよりも信頼しやすい仮想マシンモニタ(VMM)を導入し,Appの実行状態をVMMから保護する.本来OSはAppのメモリにも直接アクセスすることができるため,不具合によってプログラマが意図しない挙動をしてしまったOSがAppのメモリ内容を破壊してしまうということが起こり得る.そこでメモリはOSが使用しているものとAppが使用しているものとに分けることができるということを利用し,Appが使用しているメモリはOSからアクセスできないようVMMがハードウェアの設定を行う.これにより,たとえバグを含んだOSであってもAppのメモリ内容を破壊することができなくなる.
2つ目の手法で,OS内に存在するAppの実行状態を再起動後に復元可能にする.Appは動作中にOSに対してさまざまな要求を出しており,その要求の結果はOSの内部にも保存される.Appがどのような要求を出したのか,その結果OSがどのような挙動をしたのかということを記録しておくことで,OS内にあるAppの実行状態をOS外から推測することができる.OSの再起動を行った後,これらの情報からOS内のデータオブジェクトを再構築することで,1つ目の手法で保存しておいたAppのメモリ内容と整合性を取りつつOS内のデータを復元することができる.
3つ目の手法で,OSが発行したI/Oを記録しAppの挙動と付き合わせることで,再起動後に発行するべきI/O命令を決定することができる.Appはディスク装置への書き込みやネットワーク通信をOSに要求するが,実際のハードウェア操作は非同期で行われる場合が多い.そのためOSがハードウェアを操作する前にクラッシュしてしまうと,Appからの要求は完了しているにもかかわらずハードウェアは操作されないということが起こり得る.Appが要求を出したにもかかわらず完了していないI/Oを記録しておくことで,クラッシュ後に再発行してAppの実行状態とハードウェアの状態の整合性を取る.
論文で提案する手法はLinuxやXenといった実際に使われているソフトウェアに実装を行った.実際にメモリ破壊を伴うOSカーネルクラッシュから,memcachedなど実用されているプログラムを保護することができた.
[貢献]OSの機能に依存しないアプリケーション実行状態の取得と保護
プログラムに不具合はつきもので.それはコンピュータの根幹を管理しているオペレーティングシステム(OS)も同じである.たとえばオープンソースOSのLinuxでは,プログラムの修正を行うパッチというものが1時間に数個という速さで生成されている.パッチの適用をせず放置すると,バグを含んだコードを実行してOSがクラッシュしたり,脆弱性をついた攻撃を受けてコンピュータが乗っ取られたりといったことが起こり,コンピュータを安心して使うことができなくなる.パッチを適用することでOSの中で発見されたバグを修正することができるが,OSにアップデートを適用するためにはコンピュータ全体を再起動することが一般的で,再起動中は稼働させていたアプリケーション(App)が停止してしまうというジレンマがある.この2つの問題を同時に解決するために,本研究では3つの手法を提案する.
1つ目の手法で,OSがAppの実行状態を破壊してしまうこと,失ってしまうことを防ぐ.OSよりも高いハードウェアの特権を持ち,ソースコードも短くOSよりも信頼しやすい仮想マシンモニタ(VMM)を導入し,Appの実行状態をVMMから保護する.本来OSはAppのメモリにも直接アクセスすることができるため,不具合によってプログラマが意図しない挙動をしてしまったOSがAppのメモリ内容を破壊してしまうということが起こり得る.そこでメモリはOSが使用しているものとAppが使用しているものとに分けることができるということを利用し,Appが使用しているメモリはOSからアクセスできないようVMMがハードウェアの設定を行う.これにより,たとえバグを含んだOSであってもAppのメモリ内容を破壊することができなくなる.
2つ目の手法で,OS内に存在するAppの実行状態を再起動後に復元可能にする.Appは動作中にOSに対してさまざまな要求を出しており,その要求の結果はOSの内部にも保存される.Appがどのような要求を出したのか,その結果OSがどのような挙動をしたのかということを記録しておくことで,OS内にあるAppの実行状態をOS外から推測することができる.OSの再起動を行った後,これらの情報からOS内のデータオブジェクトを再構築することで,1つ目の手法で保存しておいたAppのメモリ内容と整合性を取りつつOS内のデータを復元することができる.
3つ目の手法で,OSが発行したI/Oを記録しAppの挙動と付き合わせることで,再起動後に発行するべきI/O命令を決定することができる.Appはディスク装置への書き込みやネットワーク通信をOSに要求するが,実際のハードウェア操作は非同期で行われる場合が多い.そのためOSがハードウェアを操作する前にクラッシュしてしまうと,Appからの要求は完了しているにもかかわらずハードウェアは操作されないということが起こり得る.Appが要求を出したにもかかわらず完了していないI/Oを記録しておくことで,クラッシュ後に再発行してAppの実行状態とハードウェアの状態の整合性を取る.
論文で提案する手法はLinuxやXenといった実際に使われているソフトウェアに実装を行った.実際にメモリ破壊を伴うOSカーネルクラッシュから,memcachedなど実用されているプログラムを保護することができた.
(2019年6月12日受付)