JP2021092951A - 実行ファイル生成装置、方法、およびプログラム - Google Patents
実行ファイル生成装置、方法、およびプログラム Download PDFInfo
- Publication number
- JP2021092951A JP2021092951A JP2019222883A JP2019222883A JP2021092951A JP 2021092951 A JP2021092951 A JP 2021092951A JP 2019222883 A JP2019222883 A JP 2019222883A JP 2019222883 A JP2019222883 A JP 2019222883A JP 2021092951 A JP2021092951 A JP 2021092951A
- Authority
- JP
- Japan
- Prior art keywords
- code
- data
- memory
- register
- conversion unit
- 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
- 238000000034 method Methods 0.000 title claims abstract description 211
- 238000006243 chemical reaction Methods 0.000 claims abstract description 69
- 230000008569 process Effects 0.000 claims description 197
- 230000010365 information processing Effects 0.000 claims description 13
- 230000008859 change Effects 0.000 claims description 4
- 238000013500 data storage Methods 0.000 claims description 2
- 230000006870 function Effects 0.000 description 18
- 238000010586 diagram Methods 0.000 description 17
- 238000004364 calculation method Methods 0.000 description 4
- 238000004891 communication Methods 0.000 description 4
- 238000013515 script Methods 0.000 description 4
- 238000013468 resource allocation Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000010295 mobile communication Methods 0.000 description 2
- 230000001133 acceleration Effects 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000007726 management method Methods 0.000 description 1
- 239000000203 mixture Substances 0.000 description 1
- 238000003672 processing method Methods 0.000 description 1
- 230000000717 retained effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/12—Protecting executable software
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/54—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by adding security routines or objects to programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/62—Protecting access to data via a platform, e.g. using keys or access control rules
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/08—Key distribution or management, e.g. generation, sharing or updating, of cryptographic keys or passwords
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Computer Security & Cryptography (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- General Health & Medical Sciences (AREA)
- Bioethics (AREA)
- Health & Medical Sciences (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Multimedia (AREA)
- Technology Law (AREA)
- Devices For Executing Special Programs (AREA)
- Storage Device Security (AREA)
Abstract
【課題】主記憶装置のデータ保護を容易にする技術を提供する。【解決手段】ソースファイルから実行ファイルを生成する実行ファイル生成装置が、ソースファイル内の変数をプロセッサのレジスタまたはメモリに割り付けて、割り付け結果を含む中間コードを生成する第1コード変換部と、中間コードから実行ファイルを生成する第2コード変換部と、第1コード変換部の前段において、第1レジスタを予約するコードをソースファイルに追加する第1コード埋め込み部と、第1コード変換部の後段で第2コード変換部の前段において、中間コードにおける、データをメモリへ書き込む書き込み処理を検出し、データを暗号化してメモリに書き込む暗号化書き込む処理に置換し、メモリからデータを読み出す読み出し処理を検出し、暗号化されたデータを読み出して復号する復号読み出し処理に置換する第2コード埋め込み部と、を有する。【選択図】 図4
Description
本発明は、情報処理装置におけるデータの盗用を防止する技術に関する。
スマートフォンやパーソナルコンピュータ等のモバイル端末の普及とWebサービスの高度化とに伴い、モバイル端末で利用可能なサービスの種類も多様化している。特に近年では、モバイル決済のように、従来は、金融機関のATM(Automatic Teller Machine)、窓口、あるいは専用端末を経由して行う必要のあった料金の支払や送金を、ユーザのモバイル端末上で行うことを可能にする金融サービスが流行の兆しを見せている。この種の金融サービスは、専用のアプリケーションソフトウェア(以下、単に「アプリ」ともいう)をモバイル端末にインストールし、そのアプリを介してサービスを利用するという形態が一般的である。
このようなサービスを利用するときにはユーザ認証または端末認証を行う必要がある。この認証には、ユーザまたは端末のみが有する秘密情報が用いられる。このような高い秘匿性が求められる処理は、モバイル端末に搭載されたSIM(Subscriber Identity Module)チップ上の領域で行われることが望ましい。しかしながら、SIMチップの記憶容量および処理能力は、そのようなアプリをインストールし動作させるには十分でない。そのため、上述したように、実際には、通常のメモリ領域でアプリを実行して秘密情報を取り扱うケースがほとんどである。
その一方で、モバイル端末は、一定の割合でマルウェア(不正ソフトウェア)に感染しているという現実がある。例えば、金融サービスに特化して不正な動作を行うマルウェアの存在も確認されている。アプリを実行しているときには秘密情報が主記憶装置(メインメモリ)上に保持されることがある。メインメモリ上のデータを読み取り、そのデータからクレジットカード番号などを特定するマルウェアが報告されている。
このような状況から、モバイル端末にてアプリが実行されている間のメインメモリのデータを保護することが求められている。そして、特許文献1には、データを暗号化してメモリに格納する技術が知られている。
特許文献1に開示された技術は、CPU(Central Processing Unit)の機能として、ハードウェア的にセキュアな領域を確保し、OS(Operating System)から独立してメインメモリへのアクセスを制御するものである。しかし、この技術を利用するには専用のハードウェアが必要であるため、ユーザにとって利便性が低く、サービス提供者にとってもユーザによるサービス利用の機会を損失する可能性がある。
本発明のひとつの目的は、主記憶装置のデータ保護を容易にする技術を提供することである。
本開示にひとつの態様による実行ファイル生成装置は、プロセッサとメモリを備える情報処理装置で実行されるプログラムのソースコードが記述されたソースファイルから、マシン語の実行ファイルを生成する実行ファイル生成装置であって、ソースファイル内の変数を前記プロセッサのレジスタまたは前記メモリに割り付けて、割り付け結果を含む中間コードを生成する第1コード変換部と、中間コードから実行ファイルを生成する第2コード変換部と、前記第1コード変換部の前段において、第1レジスタを予約するコードを前記ソースファイルに追加する第1コード埋め込み部と、前記第1コード変換部の後段で前記第2コード変換部の前段において、前記第1レジスタを予約するコードが追加されたソースファイルから前記第1コード変換部により生成された中間コードにおける、データをメモリへ書き込む書き込み処理を検出し、前記書き込み処理を、前記第1レジスタを用いて前記データを暗号化してメモリに書き込む暗号化書き込む処理に置換し、前記中間コードにおける、メモリからデータを読み出す読み出し処理を検出し、前記読み出し処理を、前記第1レジスタを用いてメモリから暗号化されたデータを読み出して復号する復号読み出し処理に置換する第2コード埋め込み部と、を有する。
本開示のひとつの態様によれば、メインメモリのデータ保護を容易に実現することができる。
以下、本発明の実施形態について図面を参照して説明する。
図1は、本実施形態の情報処理システムのブロック図である。
本情報処理システムは、アプリ配信サーバ103と、認証サーバ110と、アプリケーションサーバ111とを含んでいる。ユーザ101はネットワーク端末102を用いて情報処理システムを利用する。ネットワーク端末102は、ユーザ101が携帯するスマートフォンなどネットワーク201経由の通信が可能な情報処理端末である。本実施形態では一例としてネットワーク端末102はシングルCPU構成である。認証サーバ110およびアプリケーションサーバ111は、アプリを利用した所定のサービスを提供するサービス提供者104により構築されている。アプリは、実行ファイル生成装置900で生成され、アプリ配信サーバ103に格納される。実行ファイル生成装置900は、アプリの実行ファイルを生成する装置である。アプリ配信サーバ103は、アプリを配信するサーバである。
ユーザ101は、アプリ配信サーバ103からネットワーク端末102にアプリをダウンロードする。ダウンロードしたアプリは、サービス提供者104が提供する特定のサービスを利用するために用いられる。ネットワーク端末102にアプリをダウンロードしたユーザ101は、アプリを利用して認証サーバ110に対してユーザ登録を実行する。ユーザ登録は、アプリを利用するユーザ101および/またはネットワーク端末102を認証サーバ110に対して登録する処理である。ユーザ登録によりユーザ101はユーザ認証あるいはネットワーク端末102に対する機器認証を受けることが可能となる。その後、ユーザ101は、認証サーバ110によるユーザ認証あるいは機器認証を経て、アプリケーションサーバ111を通じサービスを利用する。
図2は、ネットワーク端末102のブロック図である。
ネットワーク端末102は、ネットワークIF(インターフェース)210、センサ220、ストレージ230、CPU240、RAM(Random Access Memory)250を有している。
ネットワークインターフェース210は、3G(第3世代移動通信システム)、4G(第4世代移動通信システム)などの規格、IEEE802.11などのLANの規格による無線通信、または、Ethernet(登録商標)の有線通信の規格により、外部と情報のやり取りを行うインターフェース装置である。
センサ220は、加速度や光などの物理情報を読み取る装置である。
ストレージ230は、データやプログラムを保存する不揮発性の記憶装置である。
CPU240は、プログラムを実行し、演算処理やネットワーク端末102の制御を行う処理装置である。
RAM250は、情報処理装置の主記憶装置として用いられ、処理中の中間データやプログラムを保持する揮発性の記憶装置である。
ネットワークインターフェース210、センサ220、ストレージ230、CPU240、およびRAM250は、データバスで相互に接続されている。ネットワークインターフェース210、センサ220、ストレージ230、およびCPU240は、RAM250を介してデータをやり取りする。
CPU240は、複数のレジスタ241、演算器242、エントロピー発生源243、およびサイクルカウンタ244を内蔵している。エントロピー発生源243は、物理現象を利用して乱数を発生させる物理乱数生成器などエントロピー入力を発生させる装置である。サイクルカウンタ244は、タイミング信号を発生させるタイマに相当する装置である。
ストレージ230上には、アプリ231が保存される。アプリ231にはプログラムのバイナリデータと、プログラムの実行に用いられる設定情報が記録された設定ファイルとが含まれている。
アプリ231による処理の対象となる処理対象データ251はRAM250に記憶される。例えば、センサ220から取得されたセンサデータ221および/またはネットワークIF210から取得された通信データ211が処理対象データ251としてRAM250に記録される。また、ストレージ230上のデータが処理対象データ251となることもある。
ネットワーク端末102のハードウェア上には、通常、OS(不図示)が常駐している。OSは、ハードウェアとアプリの間でデータのやり取りを仲介し、また複数のアプリのそれぞれについて処理を実行する権限を管理し、またネットワーク端末102が有するリソースを管理する。
アプリ231は一般的なアプリケーションソフトウェアなので、アプリ231と処理対象データ251はユーザ領域に格納される。ユーザ領域は、ユーザ権限と呼ばれる限定された権限を有するソフトウェアがアクセス可能な領域である。ユーザ権限を与えられたアプリケーションはユーザ領域にアクセスできる。一方、OSユーザ権限より強い権限である特権を有する。OSはリソース管理などの処理を特権領域で実行する。特権領域は、特権を有するソフトウェアがアクセス可能な領域である。特権領域では割り込み制御が動作する。
図3は、一般的なアプリケーションソフトウェアによるメモリアクセスを表す概念図である。図3を参照すると、アプリ231のプロセス301は、RAM250上に置かれている入力データ302をレジスタ241上に読み込み、演算器242を用いて計算する(ステップ310)。計算の途中の中間データ312は、プロセス301により、RAM250上の利用できる領域に書き込まれる(ステップ311)。中間データ312は必要に応じてレジスタ241に再度読み込まれる(ステップ313)。プロセス301は、これらを繰り返して所定の処理を実行し、最終的な結果を出力データ303として出力する(ステップ314)。この場合、プロセス301が実行されている間、RAM250には暗号化されていない中間データ312が置かれる。
本実施形態の実行ファイル生成装置900は、このような一般的なアプリのソースファイルから、アプリが実行されている間の主記憶装置上のデータを暗号化する実行ファイルを生成するものである。
図4は、本実施形態の実行ファイル生成装置により生成された実行ファイルによるメモリアクセスを表す概念図である。ここではアプリ231にメモリ上のデータを暗号化するRAM暗号化処理が追加されており、そのアプリ231によるプロセス401もRAM暗号化処理が追加されたものとなっている。図4のプロセス401は、図3のプロセス301にRAM暗号化処理が追加されたプロセスである。
プロセス401は、まずRAM暗号化処理に用いる秘密鍵を生成する(ステップ411)。より具体的には、プロセス401はエントロピー発生源243からエントロピー入力402を受け取り、エントロピー入力に基づいて鍵412を生成し、レジスタ241上に保管する。
プロセス401は、RAM250上に置かれている入力データ302をレジスタ241上に読み込み、演算器242を用いて計算する(ステップ310)。計算途中の値は、鍵412を使って暗号化されて(ステップ421)暗号文431となり、プロセス401がRAM250上の利用できる領域にその暗号文431を書き込む(ステップ422)。暗号文431は必要に応じてレジスタ241に再度読み込まれ(ステップ441)、鍵412を使って復号され(ステップ442)、レジスタ241上のデータ処理に用いられる。プロセス401は、これらを繰り返して所定の処理を実行し、最終的な結果を出力データ303として出力する(ステップ314)。プロセス401は、終了時にレジスタ241を初期化することで鍵412を廃棄する(ステップ413)。
図5は、RAM暗号化処理におけるCPUのハードウェア上でのデータの流れを示す図である。
図5を用いてCPU240のハードウェア機構とRAM暗号化処理の関係について説明する。ここではCPU240は、レジスタ長が32ビットのレジスタをm本有しているものとする。このうち2本のレジスタR[m−1]511、R[m]512に、鍵412を配置する。また、RAM暗号化処理で暗号化されるデータである暗号化対象データ501と定数502はレジスタR[2]513とR[k]514にそれぞれ配置されているものとする。
この暗号化対象データ501と定数502とを連結した平文505と鍵412に基づき、暗号化対象データ501を暗号化した暗号文431が生成される(ステップ821)。ここでは、暗号文431のデータサイズは暗号化対象データ501のデータサイズの2倍であるとする。暗号文431は、レジスタ長に等しい2つのデータブロック(暗号文データC1 503と暗号文データC2 504)に分割され、レジスタR[2]とレジスタR[k]に上書きされる。
なお、RAM暗号化処理には、データを暗号化してRAM250に暗号化書き込み処理と、RAM250上の暗号化されたデータを読み出して復号する復号読み出し処理とが含まれている。ここでは暗号化書き込み処理における暗号化の方を例にとって説明したが、復号読み出し処理における復号もCPU240のハードウェア機構との関係は基本的にこれと同様である。
また、ここでは比較的単純な暗号化の演算を説明のための一例とし、定数502を用いる例を示したが、これに限定されることはない。他の例として、定数502の代わりに、暗号化対象データ501を書き込むメモリアドレスなど可変の値を用いても良い。これによれば、暗号化対象データ501が同じ値であっても、書き込むメモリアドレスが異なれば暗号文の値は異なるものとなるため、より安全性の向上がが期待できる。更に、暗号化の演算として複雑なXTSモードを用いても良い。
以上の通り、本実施形態の実行ファイル生成装置900で生成した実行ファイルによる情報処理装置のデータ処理方法によれば、RAM250上にはデータは暗号化された状態で書き込まれる。また、そのための暗号処理はCPU240上で行われ、鍵412はCPU240上で管理される。アプリ231によるプロセス401以外のものが鍵412にアクセスするためには、デバッガの機能を用いるなど高度な攻撃が必要となる。例えば、デバッガを使用した攻撃が行われれば、その検出は容易である。したがって、本実施形態によれば、アプリ231の実行時にRAM250から情報が流出するリスクを軽減することができる。
以下、実行ファイル生成装置900について説明する。
図6は、実行ファイル生成装置のブロック図である。実行ファイル生成装置900は、アプリ231のソースコードが記述されたソースファイル601から、暗号化および復号の処理を埋め込みながらマシン語の実行ファイル602を生成する装置である。
図6を参照すると、実行ファイル生成装置900は、第1コード変換部901と、第2コード変換部902と、第1コード埋め込み部903と、第2コード埋め込み部904と、を有している。実行ファイル生成装置900のハードウェアは、1つ以上のコンピュータにより構成されている。第1コード変換部901、第2コード変換部902、第1コード埋め込み部903、および第2コード埋め込み部904はコンピュータのプロセッサがソフトウェアプログラムを実行することにより実現される。
第1コード変換部901は、ソースファイル601内の変数をプロセッサのレジスタまたはメモリに割り付けて、割り付け結果を含む中間コードを生成するコンパイラを含む。
第2コード変換部902は、中間コードから実行ファイルを生成するアセンブラおよびリンクを含む。
第1コード埋め込み部903は、第1コード変換部901の前段において、第1レジスタを予約する処理をソースファイル601に追加する。
第2コード埋め込み部904は、第1コード変換部901の後段で第2コード変換部902の前段に配置される。第2コード埋め込み部904は、第1レジスタを予約するコードが追加されたソースファイルから第1コード変換部901により生成された中間コードにおける、データをメモリへ書き込む書き込み処理を検出し、その書き込み処理を、第1レジスタを用いてデータを暗号化してメモリに書き込む暗号化書き込む処理に置換する。また、第2コード埋め込み部904は、第1レジスタを予約するコードが追加されたソースファイルから第1コード変換部901により生成された中間コードにおける、メモリからデータを読み出す読み出し処理を検出し、その読み出し処理を、第1レジスタを用いてメモリから暗号化されたデータを読み出して復号する復号読み出し処理に置換する。
以下、実行ファイル生成装置900が、ソースファイル601からRAM暗号化処理を加えた実行ファイル602を生成する処理について詳細に説明する。
図7は、本実施形態による実行ファイル生成処理のフローチャートである。本実施形態の実行ファイル生成処理は、アプリに暗号化および復号の処理のコードを埋め込みながら、実行ファイルを生成する処理である。ここでは、ソースファイル601がC言語で記述されている場合を例示する。第1コード変換部901にはプリプロセッサが含まれる。
図7を参照すると、実行ファイル生成処理は以下のステップ611〜617を含む。ステップ611〜612は、第1コード埋め込み部903により実行される。ステップ613〜614は第1コード変換部901により実行される。ステップ615は第2コード埋め込み部904により実行される。ステップ616〜617は第2コード変換部902により実行される。
・ステップ611:リソース確保処理を実行する。リソース確保処理は、RAM250上に書き込まれるデータを暗号化する処理(RAM暗号化処理)に必要なリソースを確保するコードをソースファイル601に追記する処理である。その際、予め用意しておいた当該コードのスクリプトを追記することにしてもよい。実行ファイル生成処理が施される前のソースファイル601が図7にはcode_0cとして示されている。ステップ611の詳細は図8を参照して後述する。
・ステップ612:鍵生成処理および鍵廃棄処理をソースファイル601に追加する。鍵生成処理および鍵廃棄処理が追加されたソースファイル601が図7にはcode_1cとして示されている。
・ステップ613:プリプロセッサがソースファイル601からコメントを除去し、ソースファイル601に定義されたマクロを展開する。
・ステップ614:コンパイラがソースファイル601の構文を解析し、抽象的に記述された論理をハードウェア上で動作するアスキーコードの命令の列に変換する。このステップ614により中間コードが生成される。この中間コードが図7ではcode_1asmとして示されている。
・ステップ615:暗号化コード埋め込み処理を実行する。暗号化コード埋め込み処理は、中間コードにおけるメモリアクセス処理にデータを暗号化または復号する処理を付加する処理である。データを暗号化および/または復号する処理が付加された中間コードが図7ではcode_2asmとして示されている。ステップ615の詳細は図10を参照して後述する。
・ステップ616:アセンブラが、中間コードにデータを暗号化および/または復号する処理が付加されたアスキーコードで記述された命令の列をバイナリのコードに変換する。
・ステップ617:リンカが、複数のソースファイルから生成された複数のバイナリのファイルと外部ライブラリとをリンクし、実行ファイル602を生成する。実行ファイル602が図7ではcode_2exeとして示されている。
このように、本実施形態によれば、変数として抽象的に記述されたデータを保持する機能を、メモリやレジスタといった物理的な計算資源に割り当てるステップ614の前後にRAM暗号化処理の埋め込み処理を分割する。具体的には、コンパイラが物理的な計算資源の割り当てを決定するに先立って、鍵412を保持するレジスタの割り当てを決定する。その後、コンパイラが物理的な計算資源の割り当てを決定することで、プロセス301のメモリアクセスが決定されるので、その後にアセンブリコードからメモリアクセスを検出し、RAM暗号化処理を挿入する。これにより、ソースファイル601から実行ファイル602を生成する手順に沿って任意のアプリ231にRAM暗号化処理を実装することができる。
なお、ステップ611およびステップ612はステップ613の後で実行しても良い。ただし、ステップ611はステップ614前に実行する必要がある。
また、ステップ611〜ステップ616は、ファイル単位で実行される処理なので、makefileにRAM暗号化処理の埋め込みの有無を指定することで、ファイル単位でRAM暗号化処理を行うか否かを決定できる。ファイル単位ではなく、更に詳細にRAM暗号化処理でデータを保護する範囲を決定したい場合には、コメントおよび/またはdefine文で保護の対象とする変数を定めても良い。この場合、RAM暗号化処理を埋め込む処理に先立って、RAM暗号化処理を埋め込まないプロセス301の実行ファイルを生成し、デバッガ上でメモリアクセスのパターンを解析することにより、RAM暗号化処理でデータを保護することによるアプリの実行速度の低下を分析し、実行速度と安全性とのトレードオフを決定してから保護対象の変数を決めることにしても良い。このようなRAM暗号化処理を埋め込む処理に先立つ事前の分析により、1つの変数の値が影響する範囲を調べ、保護対象として定めた変数の範囲が妥当か否かを検証することもできる。
なお、本実施形態では、ステップ612にてソースファイル601に追加する鍵生成処理は、CPU240が持つエントロピー発生源243からエントロピー入力を取得する処理を含むものである。例えば、乱数生成器を呼び出してエントロピー入力を取得する方法の他に、より簡便にCPUの備えるタイマが示す値を読み取り、その値からエントロピー入力を算出することにしてもよい。また、OSが提供する疑似乱数生成器により生成される疑似乱数をエントロピー入力としてもよい。CPUのタイマが示す値はエントロピーの度合いが比較的低いが、時間間隔を空けてタイマの値を複数回読み取り、それら複数の値を用いることにより、エントロピーの度合いを十分に高めることができる。集めたエントロピー入力をハッシュ関数などで変換することにより鍵412を生成することができる。
また、ここでは、C言語を例にとって説明したが、この例に限定されことはない。本実施形態に用いられている実行ファイルの生成方法は、C言語以外のプログラミング言語であっても、変数をメモリあるいはレジスタといった物理的な計算資源に割り当てる手順の前と後でコードを書き換えることが可能なものであれば、同様に適用できる。また、アプリケーションソフトウェアがインタプリタを利用して実行させるものである場合、あるいは、アプリケーションソフトウェアを実行する実行環境がVM(Virtual Machine)である場合には、インタプリタあるいはVMに対して、本実施形態に示されたRAM暗号化処理を埋め込むことで、個別のアプリケーションソフトウェアにRAM暗号化処理を埋め込まなくても、メモリ上のデータを暗号化して保護することができる。
図8は、リソース確保処理のフローチャートである。
図8を参照すると、ステップ611のリソース確保処理は以下のステップ711〜714を含む。
・ステップ711:C言語のソースファイルcode_0cに、鍵412を保持するためのレジスタ511、512をグローバル変数として宣言するコードを挿入する。
・ステップ712:ソースファイルcode_0cに、データの暗号化および復号に使用するレジスタ513をグローバル変数として宣言するコードを挿入する。
・ステップ713:ソースファイルcode_0cに宣言されているメモリ変数から、RAM暗号化処理を追加する前の状態のプロセス301の実行に必要なワークエリアの上限値を算出する。
・ステップ714:ステップ713で算出した上限値から、RAM暗号化処理を追加した後のプロセス401の実行で暗号文の保持に必要となる領域を算出する。そして、算出された領域をグローバル変数のテーブルとして宣言するコードをソースファイルcode_0cに挿入する。
ステップ711〜714までの結果として得られたソースファイルはcode_1cとして出力される。
なお、C言語では、volatile宣言を用いることでレジスタを特定の変数に割り付けることができる。ただし、汎用レジスタのいくつかはOSあるいはコンパイラが予約しているので、このリソース確保処理ではそれ以外のレジスタを変数へ割り付ける。
図9は、関数間でのデータの受け渡しを示す概念図である。
プロセス401が実行される中では、ある関数が他の関数を呼び出す関数呼び出しが多数発生する。関数呼び出しでは、呼び出し側の関数(caller)801は、呼ばれる側の関数(callee)811にRAM250を介してデータを渡す。
本実施形態では、上述のように、鍵412を保持するレジスタ511、512がグローバル変数で宣言される。このようにレジスタ511、512をグローバル変数で宣言しておくと、caller801とcallee811のいずれもレジスタ511、512を鍵412の保持以外の用途には使用しなくなる。また、レジスタは511、512は、関数呼び出しによって初期化されることはない。そのため、RAM250を介さずに鍵412をcaller801からcallee811に渡すことが可能となる。
また、本実施形態では、上述のように、暗号文の保持に必要となる領域となるテーブル803がグローバル変数で宣言される。このようにテーブル803をグローバル変数で宣言しておくと、caller801とcallee811は暗号文の書き込みと読み出しを同じ領域にアクセスすることで行うことができる。
なお、関数呼び出しの実行前にレジスタ上の値はcaller801のスタック805に退避される。この退避処理は、ステップ614に示したコンパイラの実行時に挿入される。したがって、ステップ615の暗号化コード埋め込み処理によって、対比処理にはメモリ上のデータを暗号化する処理が付加される。これにより、スタック805に退避されるデータは暗号化され、保護されることになる。
図10は、暗号化コード埋め込み処理のフローチャートである。
図10を参照すると、ステップ615の暗号化コード埋め込み処理は以下のステップ911〜917を含む。
・ステップ911:ステップ614におけるコンパイラによる処理の出力であるcode_1asmを検索して、暗号文を保持するテーブルの先頭アドレスを取得する。
・ステップ912:code_1asmにおける命令ブロックの先頭に移動する。
・ステップ913〜915:code_1asmにおける命令ブロックから命令を1行ずつ読み込む(ステップ913)。読み込んだ命令がメモリアクセス命令になるまで、この処理を繰り返す(ステップ915)。code_1asmのファイルの終端に到達したら、RAM暗号化処理を埋め込んだアセンブリコードcode_2asmを出力し、処理を終了する(ステッ914)。
・ステップ916:ステップ915にて命令がメモリアクセス命令であった場合、そのメモリアクセス命令が書き込み命令であれば、その書き込み命令のコードを暗号化書き込み処理のコードに置換し、そのメモリアクセス命令が読み込み命令であれば、その読み込み命令のコードを復号読み出し処理のコードに置換する。暗号化書き込み処理および復号読み出し処理のスクリプトを予め用意しておいて、置換するコードとして挿入することにしてもよい。ただし、暗号文を格納するメモリのアドレスについてはメモリアクセス命令毎に異なるので、別途算出する。
・ステップ917:さらに、code_1asmに、暗号文を書き込むアドレスを算出するコードを挿入する。その際、予め用意しておいた、暗号文を書き込むアドレスを算出するスクリプトを挿入することにしてもよい。
図11は、RAM暗号化処理を加えることにより書き込み命令がどのように変換されるかを示す概念図である。上述のように図10の暗号化コード埋め込み処理においてメモリアクセス命令が変換される。具体的には、ステップ916〜917にて中間コードにメモリアクセス命令の部分にスクリプトが埋め込まれる。図11には、そのメモリアクセス命令が書き込み命令であった場合の処理の変換の様子が示されている。
図11の上段には、変換前の処理1001が示されている。変換前の処理1001では、メモリにデータを書き込む書き込み命令(ストア命令)は、データを書き込む先のアドレスptxt_addr 1002と、書き込むデータの値を保持しているレジスタR[2] 513とを引数に取り、レジスタR[2] 513上の値をメモリ上のメモリアドレスptxt_addrの位置に書き込む(ステップ1003)。
このレジスタR[2] 513上にあるデータが暗号化対象データ501となる。
変換後の処理1011では、暗号化処理のために確保したレジスタR[k] 514に定数502をセットする。次に、レジスタR[2] 513とレジスタR[k] 514とを結合した値を平文ptxt 505とし、鍵412を用いて暗号文ctxt 431を生成する(ステップ1012)。暗号文ctxt 431を生成する手順は図5に示した通りである。ここで生成される暗号文ctxt 431のサイズは2ワードである。
また、それとは独立して、変換前の処理1001におけるデータを書き込むアドレスptxt_addr 1002から、変換後の処理1011において、そのデータに対応する暗号文を書き込むアドレスctxt_addr 1014を算出する(ステップ1013)。最後に、2ワードの暗号文ctxt 431を、メモリ上のアドレスctxt_addr 1014の位置に書き込む(ステップ1015)。
なお、ここでは、図5の例に合わせて、暗号化対象データ501がレジスタR[2] 513に格納されている例を示したが、これに限定されることはない。実際には、RAM暗号化処理で用いるためにグローバル変数で定義されたレジスタ以外のすべてのレジスタ上のデータが暗号化対象データとなりうる。
図12は、RAM暗号化処理を加えることにより読み出し命令がどのように変換されるかを示す概念図である。図12には、メモリアクセス命令が読み出し命令であった場合の処理の変換の様子が示されている。
図12の上段には、変換前の処理1101が示されている。変換前の処理1101では、メモリからデータを読み出す命令(ロード命令)は、データを読み出すアドレスptxt_addr 1102に示されるメモリ上の位置から、そこに書き込まれているデータptxt 505を読み出して、レジスタR[2] 513に格納する(ステップ1103)。
これに対して、変換後の処理1111では、まず、変換前の処理1101においてデータを読み出すアドレスptxt_addr 1102から、変換後の処理1111において暗号文を読み出すアドレスctxt_addr 1114を算出する(ステップ1113)。次に、メモリ上のアドレスctxt_addr 1114の位置から、2ワード分のデータを読み出して、各ワードをレジスタR[2] 513とレジスタR[k] 514とにそれぞれ格納する(ステップ1115)。このレジスタR[2] 513とレジスタR[k] 514に格納された2ワードのデータを暗号文ctxt 431とする。この暗号文ctxt 431に対して、鍵412を用いて復号処理を行う(ステップ1116)。復号処理の結果として、レジスタR[2] 513上には、変換前の処理1101において、メモリから読み出されてレジスタR[2] 513に格納されるデータptxt 505が生成される。
なお、本実施形態では、一例としてレジスタのワード長は32ビットである。また、暗号化に用いるブロック暗号のブロック長は2ワードであるとしている。しかし、実施の態様がこれらに限定されることはない。例えば、ブロック暗号として、AES(Advanced Encryption Standard)を使う場合には、ブロック長が128ビットになる。この場合、定数502を複数ワードとしても良い。あるいは、2〜4ワードの平文のデータをまとめて暗号化して1つの暗号文にしても良い。アプリケーションソフトウェアが連続的にメモリへアクセスするような処理を含む場合、複数ワードの平文のデータをまとめて暗号化することにより、暗号化の演算の回数を削減し、また暗号文を保持するために必要とされるメモリの領域を削減することができる。1ワードが64ビットの場合も同様である。
また、本実施形態では、変換後の処理1111の実行中に、ステップ1113で、暗号文を読み出すアドレスctxt_addr 1114を算出しているが、これに限定されることはない。変換前の処理1101においてデータを読み出すアドレスptxt_addr 1102が即値で与えられている場合には、暗号化コード埋め込み処理において、暗号文を読み出すアドレスctxt_addr 1114を算出し、予め中間コードにそのアドレスを書き込むことにしてもよい。それにより、変換後の処理1111におけるアドレスctxt_addr 1114を算出する処理を省略し、アドレスの算出によるオーバーヘッドが削減されアプリの処理を高速化することができる。図11で説明した書き込み処理についても、同様の方法でアドレスの算出処理1013を省略することができる。
また、本実施形態における、平文のアドレスptxt_addrから、その平文に対応する暗号文のアドレスctxt_addrを算出する方法は特に限定されない。平文のアドレスと暗号文のアドレスとの関係が定まっていれば、その関係を基に計算することができる。
一例として、プロセス401が使用するデータ領域が連続領域である場合を想定し、平文のptxt_addrから、暗号文のアドレスctxt_addrを算出することとする。例えば、プロセス401が使用するデータ領域の先頭アドレスをptxt_bpとし、暗号文を書き込む領域の先頭アドレスをctxt_bpとする。また、暗号文のデータサイズは平文(暗号化対象データ)のデータサイズの2倍であるとする。その場合に以下の式(1)により暗号文のアドレスctxt_addrを算出することができる。
ctxt_addr=ctxt_bp+(ptxt_addr−ptxt_bp)×2 …(1)
なお、式(1)の「2」は、本実施形態における、暗号文のデータサイズの平文(暗号化対象データ)のデータサイズに対する比である。この比が変われば式(1)における「2」の部分がその比の値に変わる。
他の例として、逆に、プロセス401が使用するデータ領域が細切れのブロックになっている場合には、暗号文を{word ptxt_addr、word ctxt[2]}のように、元のアドレスを保持する構造体で定義し、ptxt_addrを検索キーとして検索する方法を用いてもよい。
また、一般的なアプリケーションプログラムは、バイト変数とワード変数が混在している場合が多い。暗号化対象データがバイト変数の場合、復号読み出し処理において、メモリ上の暗号文の位置として、ワード単位のアドレスctxt_addrを算出し、そのアドレスから読み出される暗号文を平文に復号し、得られた平文の特定のバイト位置ptxt_posから、暗号化対象データを取得する必要がある。1ワードが32ビットすなわち4バイトであるとすると、以下の式(2)により、バイト位置ptxt_posを算出することができる。「%」は、剰余演算による余りを算出する剰余演算子である。
ptxt_pos=ptxt_addr%4 …(2)
なお、式(2)における「4」は、本実施形態における、1ワードのバイト数である。この値が変われば、式(2)における「4」の部分がその値に変わる。
以上説明した本実施形態には以下に示す事項が含まれる。ただし、本実施形態に示されている事項が以下の事項に限定されることはない。
(事項1)
プロセッサとメモリを備える情報処理装置で実行されるプログラムのソースコードが記述されたソースファイルから、マシン語の実行ファイルを生成する実行ファイル生成装置であって、ソースファイル内の変数を前記プロセッサのレジスタまたは前記メモリに割り付けて、割り付け結果を含む中間コードを生成する第1コード変換部と、中間コードから実行ファイルを生成する第2コード変換部と、前記第1コード変換部の前段において、第1レジスタを予約するコードを前記ソースファイルに追加する第1コード埋め込み部と、前記第1コード変換部の後段で前記第2コード変換部の前段において、前記第1レジスタを予約するコードが追加されたソースファイルから前記第1コード変換部により生成された中間コードにおける、データをメモリへ書き込む書き込み処理を検出し、前記書き込み処理を、前記第1レジスタを用いて前記データを暗号化してメモリに書き込む暗号化書き込む処理に置換し、前記中間コードにおける、メモリからデータを読み出す読み出し処理を検出し、前記読み出し処理を、前記第1レジスタを用いてメモリから暗号化されたデータを読み出して復号する復号読み出し処理に置換する第2コード埋め込み部と、を有している。これにより、プログラムの変数をレジスタあるいはメモリへ割り付ける前後に分けてプログラムに修正を加えてメモリ上のデータを暗号化するので、メインメモリのデータ保護を容易に実現することができる。
プロセッサとメモリを備える情報処理装置で実行されるプログラムのソースコードが記述されたソースファイルから、マシン語の実行ファイルを生成する実行ファイル生成装置であって、ソースファイル内の変数を前記プロセッサのレジスタまたは前記メモリに割り付けて、割り付け結果を含む中間コードを生成する第1コード変換部と、中間コードから実行ファイルを生成する第2コード変換部と、前記第1コード変換部の前段において、第1レジスタを予約するコードを前記ソースファイルに追加する第1コード埋め込み部と、前記第1コード変換部の後段で前記第2コード変換部の前段において、前記第1レジスタを予約するコードが追加されたソースファイルから前記第1コード変換部により生成された中間コードにおける、データをメモリへ書き込む書き込み処理を検出し、前記書き込み処理を、前記第1レジスタを用いて前記データを暗号化してメモリに書き込む暗号化書き込む処理に置換し、前記中間コードにおける、メモリからデータを読み出す読み出し処理を検出し、前記読み出し処理を、前記第1レジスタを用いてメモリから暗号化されたデータを読み出して復号する復号読み出し処理に置換する第2コード埋め込み部と、を有している。これにより、プログラムの変数をレジスタあるいはメモリへ割り付ける前後に分けてプログラムに修正を加えてメモリ上のデータを暗号化するので、メインメモリのデータ保護を容易に実現することができる。
(事項2)
事項1において、前記第1コード埋め込み部は、前記ソースファイルに、秘密鍵を生成して前記第1レジスタに設定する鍵生成処理と、前記第1レジスタを初期化して前記秘密鍵を消去する鍵廃棄処理とを追加し、前記第2コード埋め込み部は、前記暗号化書き込みおよび前記復号読み出し処理において、前記第1レジスタ上の前記秘密鍵を用いる。これにより、プログラムの中で秘密鍵を生成し、秘密鍵を利用してメモリ上のデータの暗号化および復号を行い、秘密鍵を消去するので、秘匿性の高い暗号化を実現できる。
事項1において、前記第1コード埋め込み部は、前記ソースファイルに、秘密鍵を生成して前記第1レジスタに設定する鍵生成処理と、前記第1レジスタを初期化して前記秘密鍵を消去する鍵廃棄処理とを追加し、前記第2コード埋め込み部は、前記暗号化書き込みおよび前記復号読み出し処理において、前記第1レジスタ上の前記秘密鍵を用いる。これにより、プログラムの中で秘密鍵を生成し、秘密鍵を利用してメモリ上のデータの暗号化および復号を行い、秘密鍵を消去するので、秘匿性の高い暗号化を実現できる。
(事項3)
事項1において、前記第1コード埋め込み部は、前記ソースファイルの記述から、利用されるメモリ領域の大きさを知得し、該メモリ領域の大きさと、暗号化によるデータの大きさの変化の割合と、に基づいて、暗号化されたデータの保持に要するメモリ領域の大きさを算出し、前記ソースファイルに、該大きさのメモリ領域を確保する処理を追加する。これにより、暗号化されたデータを保持するために要するメモリ領域を予め確保するので、暗号化によりデータ量が増大する場合にもデータの保持が可能である。
事項1において、前記第1コード埋め込み部は、前記ソースファイルの記述から、利用されるメモリ領域の大きさを知得し、該メモリ領域の大きさと、暗号化によるデータの大きさの変化の割合と、に基づいて、暗号化されたデータの保持に要するメモリ領域の大きさを算出し、前記ソースファイルに、該大きさのメモリ領域を確保する処理を追加する。これにより、暗号化されたデータを保持するために要するメモリ領域を予め確保するので、暗号化によりデータ量が増大する場合にもデータの保持が可能である。
(事項4)
事項1において、前記第2コード埋め込み部は、第2レジスタ上のデータを暗号化してメモリに書き込むメモリデータ暗号化プログラムを予め用意しており、前記中間コード内に所定の対象レジスタのデータをメモリに書き込む書き込み処理を検出すると、前記書き込み処理の部分の代わりに、前記第2レジスタを前記対象レジスタで置換した前記メモリデータ暗号化プログラムを埋め込む。これにより、メモリデータ暗号化プログラムを予め用意しておいてそれを中間コードに埋め込むという方法でプログラムを容易に変更することができる。
事項1において、前記第2コード埋め込み部は、第2レジスタ上のデータを暗号化してメモリに書き込むメモリデータ暗号化プログラムを予め用意しており、前記中間コード内に所定の対象レジスタのデータをメモリに書き込む書き込み処理を検出すると、前記書き込み処理の部分の代わりに、前記第2レジスタを前記対象レジスタで置換した前記メモリデータ暗号化プログラムを埋め込む。これにより、メモリデータ暗号化プログラムを予め用意しておいてそれを中間コードに埋め込むという方法でプログラムを容易に変更することができる。
(事項5)
事項1において、前記第2コード埋め込み部は、前記メモリから第3レジスタ上にデータを読み出し、前記第1レジスタに保持された秘密鍵を用いて復号処理を行うメモリデータ復号プログラムを予め用意しており、前記中間コード内にメモリから読み出したデータを所定の対象レジスタに格納する読み出し処理を検出すると、前記読み出し処理の部分の代わりに、前記第3レジスタを前記対象レジスタで置換した前記メモリデータ復号プログラムを埋め込む。これにより、メモリデータ復号プログラムを予め用意しておいてそれを中間コードに埋め込むという方法でプログラムを容易に変更することができる。
事項1において、前記第2コード埋め込み部は、前記メモリから第3レジスタ上にデータを読み出し、前記第1レジスタに保持された秘密鍵を用いて復号処理を行うメモリデータ復号プログラムを予め用意しており、前記中間コード内にメモリから読み出したデータを所定の対象レジスタに格納する読み出し処理を検出すると、前記読み出し処理の部分の代わりに、前記第3レジスタを前記対象レジスタで置換した前記メモリデータ復号プログラムを埋め込む。これにより、メモリデータ復号プログラムを予め用意しておいてそれを中間コードに埋め込むという方法でプログラムを容易に変更することができる。
(事項6)
事項1において、前記第2コード埋め込み部は、前記書き込み処理または前記読み出し処理にデータの格納先として用いれらているメモリの第1アドレスを取得し、該アドレスに基づいて前記暗号化書き込み処理または前記復号読み出し処理に前記データに対応する暗号文の格納先として用いるメモリの第2アドレスを算出する。これにより、データのアドレスに対応付けて暗号文を格納するアドレスを特定して暗号化および復号の処理をプログラムに埋め込むことができる。
事項1において、前記第2コード埋め込み部は、前記書き込み処理または前記読み出し処理にデータの格納先として用いれらているメモリの第1アドレスを取得し、該アドレスに基づいて前記暗号化書き込み処理または前記復号読み出し処理に前記データに対応する暗号文の格納先として用いるメモリの第2アドレスを算出する。これにより、データのアドレスに対応付けて暗号文を格納するアドレスを特定して暗号化および復号の処理をプログラムに埋め込むことができる。
(事項7)
事項6において、前記第2コード埋め込み部は、前記書き込み処理を前記暗号化書き込み処理に置換するとき、および、前記読み出し処理を前記復号読み出し処理に置換するとき、前記第1コード変換部から出力された前記中間コードから、暗号化前のデータに割り当てられたデータ領域の先頭アドレスptxt_bpと、暗号化後のデータに割り当てられたデータ領域の先頭アドレスctxt_bpを検出し、前記第1アドレスをptxt_addrとし、前記第2アドレスをctxt_addrとし、前記第1アドレスptxt_addrから、ctxt_addr=ctxt_bp+(ptxt_addr−ptxt_bp)×n(nは暗号化前のデータに対する暗号化後のデータのサイズ比)という式を用いて、前記第2アドレスctxt_addrを算出する。これにより、暗号化前後のデーサイズの比に基づいて、データのアドレスに対応する暗号文を格納するアドレスを特定して暗号化および復号の処理をプログラムに埋め込むことができる。
事項6において、前記第2コード埋め込み部は、前記書き込み処理を前記暗号化書き込み処理に置換するとき、および、前記読み出し処理を前記復号読み出し処理に置換するとき、前記第1コード変換部から出力された前記中間コードから、暗号化前のデータに割り当てられたデータ領域の先頭アドレスptxt_bpと、暗号化後のデータに割り当てられたデータ領域の先頭アドレスctxt_bpを検出し、前記第1アドレスをptxt_addrとし、前記第2アドレスをctxt_addrとし、前記第1アドレスptxt_addrから、ctxt_addr=ctxt_bp+(ptxt_addr−ptxt_bp)×n(nは暗号化前のデータに対する暗号化後のデータのサイズ比)という式を用いて、前記第2アドレスctxt_addrを算出する。これにより、暗号化前後のデーサイズの比に基づいて、データのアドレスに対応する暗号文を格納するアドレスを特定して暗号化および復号の処理をプログラムに埋め込むことができる。
(事項8)
事項7において、前記第2コード埋め込み部は、前記読み出し処理を前記復号読み出し処理に置換するとき、前記読み出し処理で読み出す変数がバイト変数であれば、前記第2アドレスから読み出したデータを復号したワードデータptxtのうち、ptxt_pos=ptxt_addr%m(mはバイトに対するワードのサイズ比)という式を用いて特定したバイト位置にあるデータを取得する。これにより、例えばバイトの変数をワード単位で暗号化するような場合に、復号されたワードにおける対象のデータの位置を特定することができる。
事項7において、前記第2コード埋め込み部は、前記読み出し処理を前記復号読み出し処理に置換するとき、前記読み出し処理で読み出す変数がバイト変数であれば、前記第2アドレスから読み出したデータを復号したワードデータptxtのうち、ptxt_pos=ptxt_addr%m(mはバイトに対するワードのサイズ比)という式を用いて特定したバイト位置にあるデータを取得する。これにより、例えばバイトの変数をワード単位で暗号化するような場合に、復号されたワードにおける対象のデータの位置を特定することができる。
(事項9)
事項1において、前記第1コード埋め込み部は、前記第1レジスタをグローバル変数として宣言するコードを前記ソースファイルに追加する。これにより、メモリ上のデータを暗号化する処理にグローバル変数を用いるので、ある関数が他の関数を呼び出すような処理がある場合に、関数呼び出しにより変数を保持するレジスタが初期化されず、呼び出す側の関数と呼び出される側の関数がレジスタ上の値を容易に共有することができる。
事項1において、前記第1コード埋め込み部は、前記第1レジスタをグローバル変数として宣言するコードを前記ソースファイルに追加する。これにより、メモリ上のデータを暗号化する処理にグローバル変数を用いるので、ある関数が他の関数を呼び出すような処理がある場合に、関数呼び出しにより変数を保持するレジスタが初期化されず、呼び出す側の関数と呼び出される側の関数がレジスタ上の値を容易に共有することができる。
101…ユーザ、102…ネットワーク端末、103…アプリ配信サーバ、104…サービス提供者、110…認証サーバ、111…アプリケーションサーバ、201…ネットワーク、210…ネットワークインターフェース、211…通信データ、220…センサ、221…センサデータ、230…ストレージ、231…アプリ、240…CPU、241…レジスタ、242…演算器、243…エントロピー発生源、244…サイクルカウンタ、250…RAM、251…処理対象データ、301…プロセス、302…入力データ、303…出力データ、312…中間データ、401…プロセス、402…エントロピー入力、412…鍵、501…暗号化対象データ、511…レジスタ、601…ソースファイル、602…実行ファイル、900…実行ファイル生成装置、901…第1コード変換部、902…第2コード変換部、903…第1コード埋め込み部、904…第2コード埋め込み部
Claims (11)
- プロセッサとメモリを備える情報処理装置で実行されるプログラムのソースコードが記述されたソースファイルから、マシン語の実行ファイルを生成する実行ファイル生成装置であって、
ソースファイル内の変数を前記プロセッサのレジスタまたは前記メモリに割り付けて、割り付け結果を含む中間コードを生成する第1コード変換部と、
中間コードから実行ファイルを生成する第2コード変換部と、
前記第1コード変換部の前段において、第1レジスタを予約するコードを前記ソースファイルに追加する第1コード埋め込み部と、
前記第1コード変換部の後段で前記第2コード変換部の前段において、前記第1レジスタを予約するコードが追加されたソースファイルから前記第1コード変換部により生成された中間コードにおける、データをメモリへ書き込む書き込み処理を検出し、前記書き込み処理を、前記第1レジスタを用いて前記データを暗号化してメモリに書き込む暗号化書き込む処理に置換し、前記中間コードにおける、メモリからデータを読み出す読み出し処理を検出し、前記読み出し処理を、前記第1レジスタを用いてメモリから暗号化されたデータを読み出して復号する復号読み出し処理に置換する第2コード埋め込み部と、
を有する実行ファイル生成装置。 - 前記第1コード埋め込み部は、前記ソースファイルに、秘密鍵を生成して前記第1レジスタに設定する鍵生成処理と、前記第1レジスタを初期化して前記秘密鍵を消去する鍵廃棄処理とを追加し、
前記第2コード埋め込み部は、前記暗号化書き込みおよび前記復号読み出し処理において、前記第1レジスタ上の前記秘密鍵を用いる、
請求項1に記載の実行ファイル生成装置。 - 前記第1コード埋め込み部は、前記ソースファイルの記述から、利用されるメモリ領域の大きさを知得し、該メモリ領域の大きさと、暗号化によるデータの大きさの変化の割合と、に基づいて、暗号化されたデータの保持に要するメモリ領域の大きさを算出し、前記ソースファイルに、該大きさのメモリ領域を確保する処理を追加する、
請求項1に記載の実行ファイル生成装置。 - 前記第2コード埋め込み部は、第2レジスタ上のデータを暗号化してメモリに書き込むメモリデータ暗号化プログラムを予め用意しており、前記中間コード内に所定の対象レジスタのデータをメモリに書き込む書き込み処理を検出すると、前記書き込み処理の部分の代わりに、前記第2レジスタを前記対象レジスタで置換した前記メモリデータ暗号化プログラムを埋め込む、
請求項1に記載の実行ファイル生成装置。 - 前記第2コード埋め込み部は、前記メモリから第3レジスタ上にデータを読み出し、前記第1レジスタに保持された秘密鍵を用いて復号処理を行うメモリデータ復号プログラムを予め用意しており、前記中間コード内にメモリから読み出したデータを所定の対象レジスタに格納する読み出し処理を検出すると、前記読み出し処理の部分の代わりに、前記第3レジスタを前記対象レジスタで置換した前記メモリデータ復号プログラムを埋め込む、
請求項1に記載の実行ファイル生成装置。 - 前記第2コード埋め込み部は、前記書き込み処理または前記読み出し処理にデータの格納先として用いれらているメモリの第1アドレスを取得し、該アドレスに基づいて前記暗号化書き込み処理または前記復号読み出し処理に前記データに対応する暗号文の格納先として用いるメモリの第2アドレスを算出する、
請求項1に記載の実行ファイル生成装置。 - 前記第2コード埋め込み部は、前記書き込み処理を前記暗号化書き込み処理に置換するとき、および、前記読み出し処理を前記復号読み出し処理に置換するとき、前記第1コード変換部から出力された前記中間コードから、暗号化前のデータに割り当てられたデータ領域の先頭アドレスptxt_bpと、暗号化後のデータに割り当てられたデータ領域の先頭アドレスctxt_bpを検出し、前記第1アドレスをptxt_addrとし、前記第2アドレスをctxt_addrとし、前記第1アドレスptxt_addrから、ctxt_addr=ctxt_bp+(ptxt_addr−ptxt_bp)×n(nは暗号化前のデータに対する暗号化後のデータのサイズ比)という式を用いて、前記第2アドレスctxt_addrを算出する、
請求項6に記載の実行ファイル生成装置。 - 前記第2コード埋め込み部は、前記読み出し処理を前記復号読み出し処理に置換するとき、前記読み出し処理で読み出す変数がバイト変数であれば、前記第2アドレスから読み出したデータを復号したワードデータptxtのうち、ptxt_pos=ptxt_addr%m(mはバイトに対するワードのサイズ比)という式を用いて特定したバイト位置にあるデータを取得する、
請求項7に記載の実行ファイル生成装置。 - 前記第1コード埋め込み部は、前記第1レジスタをグローバル変数として宣言するコードを前記ソースファイルに追加する、
請求項1に記載の実行ファイル生成装置。 - プロセッサとメモリを備える情報処理装置で実行されるプログラムのソースコードが記述されたソースファイルから、マシン語の実行ファイルを生成するための実行ファイル生成方法であって、
ソースファイル内の変数を前記プロセッサのレジスタまたは前記メモリに割り付けて、割り付け結果を含む中間コードを生成する第1コード変換部と、中間コードから実行ファイルを生成する第2コード変換部と、を備えるコンピュータが、
前記第1コード変換部の前段において、第1レジスタを予約するコードを前記ソースファイルに追加し、
前記第1コード変換部の後段で前記第2コード変換部の前段において、前記第1レジスタを予約するコードが追加されたソースファイルから前記第1コード変換部により生成された中間コードにおける、データをメモリへ書き込む書き込み処理を検出し、前記書き込み処理を、前記第1レジスタを用いて前記データを暗号化してメモリに書き込む暗号化書き込む処理に置換し、前記中間コードにおける、メモリからデータを読み出す読み出し処理を検出し、前記読み出し処理を、前記第1レジスタを用いてメモリから暗号化されたデータを読み出して復号する復号読み出し処理に置換する、
実行ファイル生成方法。 - プロセッサとメモリを備える情報処理装置で実行されるプログラムのソースコードが記述されたソースファイルから、マシン語の実行ファイルを生成することを、ソースファイル内の変数を前記プロセッサのレジスタまたは前記メモリに割り付けて、割り付け結果を含む中間コードを生成する第1コード変換部と、中間コードから実行ファイルを生成する第2コード変換部と、を備えるコンピュータに実行させるための実行ファイル生成プログラムであって、
前記第1コード変換部の前段において、第1レジスタを予約するコードを前記ソースファイルに追加し、
前記第1コード変換部の後段で前記第2コード変換部の前段において、前記第1レジスタを予約するコードが追加されたソースファイルから前記第1コード変換部により生成された中間コードにおける、データをメモリへ書き込む書き込み処理を検出し、前記書き込み処理を、前記第1レジスタを用いて前記データを暗号化してメモリに書き込む暗号化書き込む処理に置換し、前記中間コードにおける、メモリからデータを読み出す読み出し処理を検出し、前記読み出し処理を、前記第1レジスタを用いてメモリから暗号化されたデータを読み出して復号する復号読み出し処理に置換する、
ことをコンピュータに実行させるための実行ファイル生成プログラム。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2019222883A JP2021092951A (ja) | 2019-12-10 | 2019-12-10 | 実行ファイル生成装置、方法、およびプログラム |
PCT/JP2020/044409 WO2021117524A1 (ja) | 2019-12-10 | 2020-11-30 | 実行ファイル生成装置、方法、およびプログラムが記録された非一時的記憶媒体 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2019222883A JP2021092951A (ja) | 2019-12-10 | 2019-12-10 | 実行ファイル生成装置、方法、およびプログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2021092951A true JP2021092951A (ja) | 2021-06-17 |
Family
ID=76312472
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2019222883A Pending JP2021092951A (ja) | 2019-12-10 | 2019-12-10 | 実行ファイル生成装置、方法、およびプログラム |
Country Status (2)
Country | Link |
---|---|
JP (1) | JP2021092951A (ja) |
WO (1) | WO2021117524A1 (ja) |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2009009537A (ja) * | 2006-09-11 | 2009-01-15 | Renesas Technology Corp | プログラム作成方法及び情報処理装置ならびにマイコン |
US10289842B2 (en) * | 2015-11-12 | 2019-05-14 | Samsung Electronics Co., Ltd. | Method and apparatus for protecting kernel control-flow integrity using static binary instrumentation |
JP6899308B2 (ja) * | 2017-10-16 | 2021-07-07 | 株式会社日立製作所 | 情報処理装置および情報処理装置のデータ処理方法 |
-
2019
- 2019-12-10 JP JP2019222883A patent/JP2021092951A/ja active Pending
-
2020
- 2020-11-30 WO PCT/JP2020/044409 patent/WO2021117524A1/ja active Application Filing
Also Published As
Publication number | Publication date |
---|---|
WO2021117524A1 (ja) | 2021-06-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10853270B2 (en) | Cryptographic pointer address encoding | |
CN108781210B (zh) | 具有可信执行环境的移动设备 | |
KR101471589B1 (ko) | 공통중간언어 기반 프로그램을 위한 보안 제공 방법 | |
US11263311B2 (en) | Securing virtual-machine software applications | |
CN109784007B (zh) | 一种字节码加密的方法、字节码解密的方法及终端 | |
CN110637301B (zh) | 减少虚拟机中敏感数据的泄密 | |
CN104298932A (zh) | 一种so文件的调用方法及装置 | |
CN101957903A (zh) | 一种保护类文件的方法和装置 | |
CN111159658B (zh) | 字节码处理方法、系统、装置、计算机设备和存储介质 | |
US10867017B2 (en) | Apparatus and method of providing security and apparatus and method of executing security for common intermediate language | |
Silva et al. | Dynsgx: A privacy preserving toolset for dinamically loading functions into intel (r) sgx enclaves | |
CN107871066B (zh) | 基于安卓系统的代码编译方法及装置 | |
JP6899308B2 (ja) | 情報処理装置および情報処理装置のデータ処理方法 | |
WO2021117524A1 (ja) | 実行ファイル生成装置、方法、およびプログラムが記録された非一時的記憶媒体 | |
Schrittwieser et al. | Aes-sec: Improving software obfuscation through hardware-assistance | |
Kim et al. | CAFE: A virtualization-based approach to protecting sensitive cloud application logic confidentiality | |
DONG et al. | Sesoa: Security enhancement system with online authentication for android apk | |
Deyannis et al. | Andromeda: Enabling secure enclaves for the Android ecosystem | |
WO2020226054A1 (ja) | 情報処理方法、情報処理装置及び記憶媒体 | |
CN114297589A (zh) | 应用程序的资源保护方法、资源读取方法及装置 | |
JP2021051199A (ja) | 情報処理装置 |