JP2006048186A - 動的コンパイラの生成コードを保護する言語処理系 - Google Patents
動的コンパイラの生成コードを保護する言語処理系 Download PDFInfo
- Publication number
- JP2006048186A JP2006048186A JP2004225056A JP2004225056A JP2006048186A JP 2006048186 A JP2006048186 A JP 2006048186A JP 2004225056 A JP2004225056 A JP 2004225056A JP 2004225056 A JP2004225056 A JP 2004225056A JP 2006048186 A JP2006048186 A JP 2006048186A
- Authority
- JP
- Japan
- Prior art keywords
- area
- program
- dynamic compiler
- execution
- processing system
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Storage Device Security (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
【課題】
攻撃者からの入力を受けとったプログラムが、動的コンパイラの生成した機械コードや、機械コードへのポインタなど、制御に関係するデータを書き換え、結果として攻撃者にコンピュータの制御を奪われることを防ぐ。
【解決手段】
動的コンパイルをおこなう言語処理系を起動する際に、動的コンパイラを、プログラムの実行を担当するプロセスとは別のプロセスとして起動し、それぞれのプロセス間を共有メモリ領域で接続する。そして、該共有メモリ領域に対して、プログラムの実行を担当するプロセスから書込みができないよう保護し、保護した領域に、動的コンパイラが生成する機械コードやデータを書き込む。
【選択図】 図3
攻撃者からの入力を受けとったプログラムが、動的コンパイラの生成した機械コードや、機械コードへのポインタなど、制御に関係するデータを書き換え、結果として攻撃者にコンピュータの制御を奪われることを防ぐ。
【解決手段】
動的コンパイルをおこなう言語処理系を起動する際に、動的コンパイラを、プログラムの実行を担当するプロセスとは別のプロセスとして起動し、それぞれのプロセス間を共有メモリ領域で接続する。そして、該共有メモリ領域に対して、プログラムの実行を担当するプロセスから書込みができないよう保護し、保護した領域に、動的コンパイラが生成する機械コードやデータを書き込む。
【選択図】 図3
Description
本発明は、ソフトウェアの一種である言語処理系に関する。
本発明の目的は、コンピュータシステムを不正な利用から守ることにある。コンピュータシステムを不正に利用しようと試みる者(攻撃者)が、コンピュータに任意の動作を実行させる手順の例を示す。
攻撃者はコンピュータシステム上で動作しているソフトウェアに対して、攻撃のための入力を与える。このとき、入力先のソフトウェアに脆弱性(欠陥)があると、ソフトウェアの設計者が想定しなかった記憶領域を書き換えられる。攻撃者は、この書き換えによって、機械コードなど、コンピュータの制御に関する情報を書き換えるよう、ソフトウェアに与える入力に細工する。静的にコンパイルされたプログラムでは、OSがプログラムの機械コードを書込不可の領域に配置するので、機械コードを上書きすることは困難だが、Java(登録商標:以下同様)仮想機械(Java Virtual Machine,JavaVMと略す)のように、プログラムを動的にコンパイルする言語処理系では、1つのプロセスの内部で、プログラムの実行を担当するスレッドと、コンパイルを担当するスレッドが並行動作する構成をとる場合が多く、このとき機械コードは、コンパイルを担当するスレッドからはもちろん、プログラムの実行を担当するスレッドからも書込可能な記憶領域に配置される。このような状況下では、プログラムの実行を担当するスレッドが、攻撃者からの入力を受けとった際に、機械コードを書き換え、結果として攻撃者の望む動作をしてしまいうる。
機械コードや、動的コンパイラが生成するさまざまな制御にかかわるデータを、攻撃者による書換えから保護する従来技術にMVMがある(非特許文献1)。MVMはJavaVMの一種で、複数のJavaアプリケーションを同時に実行できるが、Javaで記述したプログラムからC言語で記述したプログラムを呼び出す場合、C言語で記述したプログラムの実行は、個々のJavaアプリケーションに対応するプロセスが実行する。攻撃者が利用する脆弱性は、多くの場合、C言語で記述したプログラムの内部に存在し、従ってC言語で記述したプログラムの実行を、JavaVMとは別のプロセスで実行すれば、C言語で記述したプログラムの脆弱性をついて、JavaVMの動的コンパイラが生成した機械コードを書き換えることは困難になる。
ただしMVMには問題点がある。それは実行にともなうオーバヘッドが大きいという点である。MVMでは、Javaで記述したプログラムからC言語で記述したプログラムを呼び出すのにプロセス間通信が必要になるが、ここから大きなオーバヘッドが生じ、プログラムの実行が数倍のオーダで遅くなりうる。
Czajkowski et al.: Code Sharing between Virtual Machines, In the Proceedings of the 16th European Conference on Object-Oriented Programming, pp. 155-177 (2002).
動的コンパイラが生成する機械コードやデータ構造を、小さなオーバヘッドで保護する。
プログラムを実行時にコンパイルする言語処理系において、プログラムの実行を担当するプロセスと、コンパイルを担当するプロセスを個別に設ける。そして、コンパイルを担当するプロセスが生成した機械コードや制御にかかわるデータを配置するメモリ領域を、コンパイルを担当するプロセスからは書込可能だが、実行を担当するプロセスからは読込可能であっても書込可能でない領域にする。具体的には、それぞれのプロセスで共有するメモリ領域を設け、OSが提供するメモリ保護の機能を使って、該領域を、コンパイルを担当するプロセスから書込可能にし、実行を担当するプロセスからは読込可、書込不可に指定する。
本発明を適用すると、プログラムの実行を担当するプロセスが、攻撃者からの入力を受けとったとしても、動的コンパイラが生成した機械コードなどを上書きすることは困難になる。また、本発明はMVMとは異なり、プロセスを、Javaで記述したプログラムの実行担当(およびJavaで記述したプログラムの動的コンパイル担当)と、C言語で記述したプログラムの実行担当に分割する訳ではないので、Javaで記述したプログラムからC言語で記述したプログラムを呼び出す際に、プロセス間通信が必要になって大きなオーバヘッドが生じることはない。
本発明の適用によって生じるオーバヘッドは,プログラムの実行を担当するプロセスと、コンパイルを担当するプロセス間の通信にある。この通信はプログラムの起動時に頻発するものの、プログラムの恒常的な実行状態においては、ほとんど発生しない。なぜなら、プログラムのコンパイルは、プログラムの起動時に多発するが、プログラムの定常的な実行状態においては、すでに必要なコンパイル処理が終了しているため、ほとんどコンパイルをおこなう必要がないからである。このため、本発明の適用による実行速度の低下は極めて小さい。
JavaVMなど、プログラムを実行時にコンパイルする言語処理系に本発明を適用し、プログラムの実行を担当するプロセスと、コンパイルを担当するプロセスを分離する。
本発明を適用したJavaVMの実行イメージを図1に示す。図1において、JavaVM101はハードディスク102にインストールされており、実行時にバス103を通じて主記憶104に読み込まれ、プロセッサ105で実行される。JavaVMは、バス103を通じてハードディスク102からJavaアプリケーション106を読み込み、動的コンパイラでコンパイルして実行する。
本発明のJavaVM101は、図1にあるように、実行時に、Javaアプリケーションの実行を担当するプロセス107と動的コンパイラ108の、2つのプロセスに分かれて動作する。それぞれのプロセスは共有メモリ領域109によって接続されている。共有メモリ領域109は、メモリマップトファイルなどとして実現できる。共有メモリ領域109の中には、通信用領域110と、保護領域111がある。通信用領域110には、2つのプロセスが通信をおこなうために用いるデータ構造を配置し、保護領域111には、動的コンパイラ108が生成したコンパイル済コード112や、コンパイル済コードのアドレス113を登録する表であるディスパッチ表114を配置する。ディスパッチ表114に登録してあるデータである、コンパイル済コードのアドレス113は、動的コンパイラが生成するデータの実施例である。保護領域111はJavaアプリケーションの実行を担当するプロセス107から書込不可に指定されており、したがって、攻撃者がJavaVMに入力を与えても、入力を受けとって処理するのは実行を担当するプロセス107であるため、保護領域111の中にあるコンパイル済コード112やディスパッチ表114を書き換えることはできない(実行時スタック115やインスタンス用ヒープ領域116は書き換えられる)。また、動的コンパイラが機械コードを一時的に保存するコードバッファなどのワーク領域117は、動的コンパイラのプロセスのみが参照可能な領域に確保されており、実行を担当するプロセス107から読書きできない。したがって、ワーク領域117を攻撃対象とすることもできない。
本発明の適用対象である言語処理系(本実施例においてはJavaVM)の実施例を図2に示す。JavaVMは、図2にあるように、まず起動に伴う初期化処理201を実施し、次に処理202で、main()メソッドから先にあるJavaアプリケーション本体の実行をおこない、最後に終了処理203を実施する。
本発明の適用対象は処理201の内部にある。処理201の実施例を図3に示す。図3では、処理301で、共有メモリ領域109を読み書き可能な領域として確保し、その内部に通信用領域110と保護領域111を確保する。続く処理302で、通信用領域110の中に、プログラムを実行するプロセスがコンパイル対象として指定するメソッドの待ち行列303を生成し、空の待ち行列として初期化する。処理302が終了したら、処理304に進み、動的コンパイラを子プロセス108として起動する。処理304以降、親プロセスはプログラムの実行を担当するプロセス107となる。親プロセスは処理304が終了したら、処理305に進み、処理301で確保した領域のうち、保護領域111を書込不可に指定して保護する。
本発明を適用しない場合における、処理201の実施例を図4に、図4の処理201を使う従来のJavaVMの実行イメージを図5に示す。図4では、処理401でヒープ領域402を確保し、その内部に通信用領域110とコード領域403を確保する。続く処理302で、通信用領域110の中に、プログラムを実行するプロセスがコンパイル対象として指定するメソッドの待ち行列303を生成し、空の待ち行列として初期化する。処理302が終了したら、処理404に進み、動的コンパイラをスレッドとして起動する。図4では、コード領域403に保護をかけることはしない。なぜなら、一般的なスレッドの実装では、特定のスレッドのみ書込可能なメモリ領域を設定することは不可能であり、処理404で起動する動的コンパイラのスレッドがコード領域403に書込可能である必要がある以上、コード領域403を書込不可に設定できないからである。図5を参照すると、実行担当のスレッド501と動的コンパイラのスレッド502が同一のプロセス503内で動作しており、コード領域403が、実行担当のスレッド501からも書込可能になっていることが判る。
図3と図4を比較すると、処理301と処理304、処理305が本発明の適用対象となっていることが判る。すなわち、処理301は、従来の処理401とは異なり、動的コンパイラが参照しうる領域を、ただのヒープ領域402ではなく、共有メモリ領域109として確保する。また、処理304は、従来の処理404とは異なり、動的コンパイラをスレッドではなく、子プロセス108として起動し、処理305は保護領域111を書込不可と指定して保護する。この結果、図2の処理202を実行している過程で、Javaアプリケーションの実行を担当するプロセス107が、攻撃者からの入力を受けとっても、動的コンパイラの生成した機械コードやデータを書き換えることは困難になる。これに対し、図4では動的コンパイル済みコードを配置するための領域403を書込不可としないので、動的コンパイル済みコードが書き換えられ、攻撃者に任意のコードを実行される可能性がある。
本発明をJavaVMのように、プログラムを動的にコンパイルする言語処理系に適用することにより、実行速度をほとんど低下させることなく、動的コンパイラが生成する機械コードやデータへの攻撃(書換え)によって、制御を奪うことを困難にできる。
109 共有メモリ領域
110 通信用領域
111 動的コンパイラが生成した機械コードやデータを配置する領域
301 共有メモリ領域を確保する処理
302 コンパイル待ち行列を生成する処理
303 コンパイル待ち行列
304 動的コンパイラを子プロセスとして起動する処理
305 動的コンパイラの出力先領域を書込不可にする処理
110 通信用領域
111 動的コンパイラが生成した機械コードやデータを配置する領域
301 共有メモリ領域を確保する処理
302 コンパイル待ち行列を生成する処理
303 コンパイル待ち行列
304 動的コンパイラを子プロセスとして起動する処理
305 動的コンパイラの出力先領域を書込不可にする処理
Claims (3)
- プログラムを実行時にコンパイルする言語処理系において、プログラムの実行とコンパイルを実行するプロセスを主記憶上に個別に生成し、それぞれのプロセスを、共有メモリ領域で連結し、前記共有メモリ領域を、前記コンパイルをおこなうプロセスがコンパイルの結果生成するコードやデータの配置先とする方法。
- 請求項1において、前記共有メモリ領域を、前記のプログラムの実行をおこなうプロセスから書込不可の領域とする方法。
- 請求項1に記載の方法を使う言語処理系。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2004225056A JP2006048186A (ja) | 2004-08-02 | 2004-08-02 | 動的コンパイラの生成コードを保護する言語処理系 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2004225056A JP2006048186A (ja) | 2004-08-02 | 2004-08-02 | 動的コンパイラの生成コードを保護する言語処理系 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2006048186A true JP2006048186A (ja) | 2006-02-16 |
Family
ID=36026686
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2004225056A Pending JP2006048186A (ja) | 2004-08-02 | 2004-08-02 | 動的コンパイラの生成コードを保護する言語処理系 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2006048186A (ja) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2009193131A (ja) * | 2008-02-12 | 2009-08-27 | Rohm Co Ltd | 情報処理システム、情報処理端末、カートリッジ、および、プログラム実行方法 |
JP2010511227A (ja) * | 2006-11-28 | 2010-04-08 | マイクロソフト コーポレーション | 信頼性の低いアドレス空間への実行コードのコンパイル |
WO2010109751A1 (ja) * | 2009-03-25 | 2010-09-30 | 日本電気株式会社 | コンパイルシステム、コンパイル方法およびコンパイルプログラムを格納した記憶媒体 |
JP2012104104A (ja) * | 2010-11-10 | 2012-05-31 | Internatl Business Mach Corp <Ibm> | 動的バイナリ・トランスレータに関するメモリ管理のための装置、方法、およびコンピュータ・プログラム |
JP2018152061A (ja) * | 2017-03-05 | 2018-09-27 | エンサイロ リミテッドenSilo Ltd. | 安全なジャストインタイム(jit)コード生成 |
-
2004
- 2004-08-02 JP JP2004225056A patent/JP2006048186A/ja active Pending
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2010511227A (ja) * | 2006-11-28 | 2010-04-08 | マイクロソフト コーポレーション | 信頼性の低いアドレス空間への実行コードのコンパイル |
JP2009193131A (ja) * | 2008-02-12 | 2009-08-27 | Rohm Co Ltd | 情報処理システム、情報処理端末、カートリッジ、および、プログラム実行方法 |
WO2010109751A1 (ja) * | 2009-03-25 | 2010-09-30 | 日本電気株式会社 | コンパイルシステム、コンパイル方法およびコンパイルプログラムを格納した記憶媒体 |
JP5278538B2 (ja) * | 2009-03-25 | 2013-09-04 | 日本電気株式会社 | コンパイルシステム、コンパイル方法およびコンパイルプログラム |
JP2012104104A (ja) * | 2010-11-10 | 2012-05-31 | Internatl Business Mach Corp <Ibm> | 動的バイナリ・トランスレータに関するメモリ管理のための装置、方法、およびコンピュータ・プログラム |
JP2018152061A (ja) * | 2017-03-05 | 2018-09-27 | エンサイロ リミテッドenSilo Ltd. | 安全なジャストインタイム(jit)コード生成 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Sung et al. | Intra-unikernel isolation with intel memory protection keys | |
US8341614B2 (en) | Memory management for closures | |
US10635823B2 (en) | Compiling techniques for hardening software programs against branching programming exploits | |
EP1600857B1 (en) | Thread rendezvous for read-only code in an object-oriented computing enviroment | |
EP1626338B1 (en) | System and method for providing exceptional flow control in protected code through watchpoints | |
JP5769891B2 (ja) | リターン指向プログラミングを抑制するための動的実行防止 | |
US8010788B2 (en) | Program security through stack segregation | |
JP2008510238A (ja) | オペレーティングシステム | |
Tang et al. | Exploring control flow guard in windows 10 | |
US20140359773A1 (en) | Intra stack frame randomization for protecting applications against code injection attack | |
JP2008027306A (ja) | ユーザ空間仮想化システム | |
KR102509365B1 (ko) | 보안 모드 상태 데이터 액세스 트랙킹 | |
US20100082929A1 (en) | Memory protection method, information processing apparatus, and computer-readable storage medium that stores memory protection program | |
JP2004013556A (ja) | プロセッサ装置、コンパイル装置及びその方法 | |
JP2009009232A (ja) | コンピュータとカーネル保護方法並びにコンピュータソフトウエア | |
US8838996B2 (en) | Non-transitory computer readable medium, program protection apparatus, and program protection method | |
US10496433B2 (en) | Modification of context saving functions | |
JP2009134565A (ja) | 仮想計算機システム及び仮想計算機システムの制御方法 | |
JP2006048186A (ja) | 動的コンパイラの生成コードを保護する言語処理系 | |
US11500982B2 (en) | Systems and methods for reliably injecting control flow integrity into binaries by tokenizing return addresses | |
US11256631B1 (en) | Enhanced security via dynamic regions for memory protection units (MPUs) | |
JP6295914B2 (ja) | プログラマブルコントローラシステム、その支援装置、プログラマブルコントローラ | |
JP5820754B2 (ja) | 変換装置、変換方法、変換プログラム | |
KR101961818B1 (ko) | 프로세스 중단 없는 메모리 랜덤화 방법 및 이를 수행하기 위한 컴퓨팅 장치 | |
US20160313938A1 (en) | Fine grained memory protection to thwart memory overrun attacks |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
RD04 | Notification of resignation of power of attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7424 Effective date: 20060424 |