JP2003288129A - メモリ管理方法、メモリ装置、コンピュータシステム、コンパイラ及びプログラム - Google Patents

メモリ管理方法、メモリ装置、コンピュータシステム、コンパイラ及びプログラム

Info

Publication number
JP2003288129A
JP2003288129A JP2002092219A JP2002092219A JP2003288129A JP 2003288129 A JP2003288129 A JP 2003288129A JP 2002092219 A JP2002092219 A JP 2002092219A JP 2002092219 A JP2002092219 A JP 2002092219A JP 2003288129 A JP2003288129 A JP 2003288129A
Authority
JP
Japan
Prior art keywords
stack
storage area
area
address
subroutine
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
Application number
JP2002092219A
Other languages
English (en)
Inventor
Yoriyuki Harikawa
順行 針川
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
SUN ATMARK KK
Original Assignee
SUN ATMARK KK
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by SUN ATMARK KK filed Critical SUN ATMARK KK
Priority to JP2002092219A priority Critical patent/JP2003288129A/ja
Publication of JP2003288129A publication Critical patent/JP2003288129A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Storage Device Security (AREA)
  • Executing Machine-Instructions (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【課題】 スタックスマッシング攻撃を回避するための
メモリ管理技術を提供する。 【解決手段】 サブルーチンスタックの局所変数格納領
域LVを確保するに際し、局所変数格納領域LVの大きさ
を、サブルーチンのソースプログラムで宣言された全局
所変数を格納するために必要な大きさより大きい範囲で
ランダムに決定する。このようにすると、スタックフレ
ーム中でのリターンアドレス格納領域RAの相対位置をソ
ースコード等から事前に正確に知ることは不可能である
ため、スタックスマッシング攻撃でリターンアドレスを
目的のアドレス(悪意のあるプログラムコードの開始ア
ドレス)に書き換えることは極めて難しくなる。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、スタックスマッシ
ング攻撃により悪意のあるプログラムを実行されるとい
う問題を回避するためのメモリ管理技術に関する。
【0002】
【従来の技術】インターネットの発達に伴い、悪意のあ
る者が、コンピュータ上で動作しているプログラム(例
えば、WWWサーバ、FTPサーバ)に対してスタック
スマッシング攻撃(Stack Smashing Attack)と呼ばれ
る攻撃を仕掛け、ユーザのID及びパスワードを盗んで
コンピュータに侵入し、データの破壊、改竄、詐取等の
不正な活動を行ったり、更には、そのコンピュータを他
のコンピュータへの攻撃の踏み台にしたりするという問
題が深刻化してきている。
【0003】スタックスマッシング攻撃では、サブルー
チンの実行環境の管理に利用されるスタック型のメモリ
領域(以下、サブルーチンスタック又は単にスタックと
呼ぶ)を利用して不正なプログラムを実行させる。C言
語で記述されたプログラムを例に、スタックスマッシン
グ攻撃の原理について図2及び図3を参照しながら簡単
に説明する。
【0004】図2にソースコードで示した関数fooは、
環境変数"ENV_STR"に格納された値(文字列)をC言語
の標準ライブラリ関数"getenv"で取得し、その値を同じ
くC言語の標準ライブラリ関数である"strcpy"で局所変
数"buffer"に複写する。変数bufferは文字列を格納する
ための配列変数で、大きさは128バイトである。
【0005】関数fooを呼び出すとき、プログラムは、f
ooの実行環境に関する情報を保存するための領域(スタ
ックフレームと呼ばれる)をスタック上に確保する。ス
タックフレームには次のような情報を確保するための領
域が用意される。 ・関数fooに渡される引数(Parameters:PARAMS)。 ・関数fooを呼び出した関数へのリターンアドレス(Ret
urn Address:RA)。 ・関数fooを呼び出す前のフレームポインタ。このポイ
ンタを本明細書では前フレームポインタ(Previous Fra
me Pointer:PFP)と呼ぶ。 ・関数fooが内部で使用する局所変数(Local Variabl
e:LV)。
【0006】スタックによるサブルーチン管理ではスタ
ックポインタ(Stack Pointer:SP)とフレームポイン
タ(Frame Pointer:FP)が用いられる。関数fooが別の
関数barから呼び出される場合を例に、上記ポインタの
操作を具体的に説明する。なお、ここでは、関数の呼び
出しに伴ってスタックがメモリの上位アドレスから下位
アドレスに向けて成長するものとする。
【0007】fooが呼び出される前、スタックポインタS
Pはbarのスタックフレームの最下位アドレスを指し、フ
レームポインタFPはbarの前フレームポインタ領域のア
ドレスを指している。この状態では、フレームポインタ
FPの指すアドレスより1つ下位のアドレスからスタック
ポインタSPの指すアドレスまでの領域が、barの局所変
数格納領域に相当する。
【0008】fooが呼び出されると、まずスタックにfoo
の引数領域Paramsが確保され、そこに引数が格納され
る。次に、リターンアドレス領域RAが確保され、そこに
barへのリターンアドレスが格納される。次に、前フレ
ームポインタ領域PFPが確保され、そこにその時点にお
けるフレームポインタFPの値(barの前フレームポイン
タ領域PFPのアドレス)が格納されるとともに、フレー
ムポインタFPにはfooの前フレームポインタ領域PFPのア
ドレスが格納される。最後に、fooの局所変数格納領域L
Vが確保される。なお、スタックポインタSPには、上記
のように新たな領域が確保される度に、その領域の最下
位アドレスが格納される(つまり、SPは常にスタック全
体の最下位アドレスすなわちスタックトップを指してい
る)。以上のような処理の結果、フレームポインタFPの
指すアドレスより1つ下位のアドレスからスタックポイ
ンタSPの指すアドレスまでの領域が、fooの局所変数格
納領域に相当することになり、この状態でfooの処理が
実行される。
【0009】fooの処理が終了したら、上記と逆の手順
でフレームポインタFP及びスタックポインタSPの値をfo
oの呼び出し前の状態に戻す。そして、fooの領域RAに格
納しておいたリターンアドレスにプログラムの制御を戻
し、foo呼び出し後のbarの処理を続行する。
【0010】fooのスタックフレームの構造は、関数foo
のソースコード及びコンパイラの仕様に基づいて容易に
解析することができる。この解析結果に基づいたスタッ
クスマッシング攻撃の一例について図3を参照しながら
説明する。
【0011】まず、悪意のあるプログラムのコード30
(Attack Code)を用意する。次に、fooの局所変数格納
領域LVからリターンアドレスRAまでカバーするような大
きさの文字列32を用意する。この文字列32のうち、
局所変数格納領域LVに対応する部分にコード30を書き
込んでおき、領域RAに対応する部分にはコード30の開
始アドレスAddr_Xを書き込んでおく。次に、コンピュー
タの環境変数ENV_STRに何らかの方法で上記文字列を格
納する。
【0012】上記のような状態で関数fooが呼び出され
ると、foo内部で関数strcpyが実行される。ところで、
C言語の標準ライブラリ関数であるstrcpyは通常、入力
文字列が局所変数格納領域LVの大きさより大きいかどう
かを自動的に検査するようには実装されていない。従っ
て、図3の場合、文字列32は局所変数格納領域LVのベ
ースアドレス(フレームポインタFPが指すアドレス)を
超えて領域RAまで書き込まれる。こうして、局所変数格
納領域LVにコード30が送り込まれるとともに、リター
ンアドレス領域RAにはそのコード30の開始アドレスAd
dr_Xが格納される。この状態でfooの処理が終了する
と、プログラムの制御はbarのリターンアドレスには戻
らず、コード30の開始アドレスに移る。こうして、悪
意のあるプログラムが実行されてしまうのである。
【0013】また、上記攻撃では、strcpyの実行により
前フレームポインタPFPの値も書き換えられるため、bar
へのリターン時にフレームポインタFPを正しいアドレス
(barの前フレームポインタPFP)に戻すことができな
い。更に、文字列32のうち前フレームポインタPFPに
対応する部分に予め計算された不正な値を書き込んでお
くことによりプログラムに障害を発生させることも考え
られる。
【0014】スタックスマッシング攻撃に対する対策は
従来より各種考えられている。例えば、特開2001-21616
1号公報に記載の方法や、同公報の中で従来技術として
引用されているStackGuardと呼ばれる技術では、攻撃の
有無を検査するためにガード値(guard value)を導入
している。すなわち、スタックスマッシング攻撃で必ず
アクセスされるようなメモリ上の位置にガード値を書き
込んでおき、このガード値が関数の実行前後で一致する
どうかを関数のリターン処理時に検査する。そして、関
数の実行前後でガード値が一致しなかった場合、スタッ
クスマッシング攻撃が行われたものと判断し、エラー処
理等を行うのである。また、C言語に関しては、スタッ
クオーバーフローが発生する可能性がある関数(例え
ば、strcpy, strcat等の文字列操作関数)を入力文字列
の大きさの検査が必ず行われるように実装し直したライ
ブラリ(libsafeと呼ばれる)も提供されている(Arash
Baratloo, Timothy Tsai, and Navjot Singh, "Transp
arent Run-Time Defense Against Stack Smashing Atta
cks," in Proceedings of the USENIX Annual Technica
l Conference, June 2000. http://www.avayalabs.com/
project/libsafe/doc/usenix00/paper.html)。
【0015】
【発明が解決しようとする課題】個人がパーソナルコン
ピュータで手軽にWWWサーバ等のサーバシステムを構
築してインターネット上で公開できるようになってきた
今日、スタックスマッシング攻撃により大きな被害が発
生する可能性もそれだけ高くなってきている。本発明は
このような問題に鑑みて成されたものであり、その目的
とするところは、スタックスマッシング攻撃を回避する
ためのメモリ管理技術を提供することにある。
【0016】
【課題を解決するための手段】上記課題を解決するため
に成された本発明に係るメモリ管理方法は、リターンア
ドレス格納領域、前フレームポインタ格納領域及び局所
変数格納領域を有するスタックフレームを積み重ねて成
るサブルーチンスタックをメモリ上に形成する方法にお
いて、前記局所変数格納領域の大きさを、サブルーチン
のソースプログラムで宣言された全局所変数を格納する
ために必要な大きさより大きい範囲でランダムに決定す
ることを特徴とする。
【0017】
【発明の実施の形態及び発明の効果】スタックスマッシ
ング攻撃が可能であるのは、スタックフレームの構造が
サブルーチン(C言語であれは関数)のソースコード及
びコンパイラの仕様に基づいて容易に解析することがで
きるからである。このことに着目し、本発明に係るメモ
リ管理方法では、呼び出されたサブルーチンの局所変数
格納領域をサブルーチンスタック上に確保するに際し、
前記領域の大きさをコンパイル時に固定的に決定するの
ではなく、全局所変数を格納するのに必要な大きさより
大きい範囲でランダムに決定する。これについて図1を
参照しながら以下に具体的に説明する。
【0018】図1にソースコードで示した関数foo及びb
arは図2のものと同じである。いま、関数fooの呼び出
しに伴うスタックフレームの形成手順を考える。まず、
先に図2を参照しながら説明したのと同様の手順で、引
数格納領域PARAMSを確保してそこに引数を格納し、リタ
ーンアドレス格納領域RAを確保してそこにbarへのリタ
ーンアドレスを格納し、前フレームポインタ格納領域PF
Pを確保してそこにbarの前フレームポインタ格納領域PF
Pのアドレスを格納する。
【0019】次に、局所変数格納領域LVを確保する際、
本発明の方法では、fooの局所変数bufferの大きさ(128
バイト)よりも大きい領域を確保する。図1では符号α
で示した部分が余分に確保された領域(以下、余剰領域
と呼ぶ)に相当する。余剰領域αの大きさは関数の実行
時にランダムに決定される。このように局所変数格納領
域LVを確保した後、フレームポインタFPに余剰領域αの
最下位アドレスを格納する。これにより、フレームポイ
ンタFPの指すアドレスをベースアドレスとする局所変数
の相対参照が可能になる。
【0020】上記のような領域確保操作は、前フレーム
ポインタ格納領域PFPと必要な大きさ(図1の例では128
バイト)の局所変数格納領域LVとの間にランダムな大き
さの余剰領域を別途確保する操作であると解釈すること
も可能である。
【0021】なお、上記の方法では、局所変数格納領域
LVを確保した後、フレームポインタFPの値を余剰領域α
の最下位アドレスに変更するようにしたが、これは本発
明にとって必須ではない。例えば、図1に破線で示した
ように、フレームポインタFPを同領域αの最上位アドレ
スのまま維持しておき、局所変数へのアクセスに際して
は、フレームポインタFPの値に余剰領域αの大きさを加
えた値をベースアドレスとする相対参照によりアクセス
を行うようにしてもよい。
【0022】以上のように、本発明に係るメモリ管理方
法によれば、同じサブルーチンを呼び出したとしても、
局所変数格納領域LVの大きさは呼び出しの度に異なるも
のとなるため、サブルーチンの実行前に領域LVの大きさ
を知ることはできない。局所変数格納領域LVの大きさが
分からなければ、スタックフレーム中でのリターンアド
レス格納領域RAの相対位置をソースコードやコンパイラ
の仕様に基づいて事前に正確に知ることは不可能であ
る。従って、スタックスマッシング攻撃によりリターン
アドレスを目的のアドレス(悪意のあるプログラムコー
ドの開始アドレス)に書き換えることに成功する確率は
極めて低くなる。(旧0023を削除)
【0023】また、本発明のメモリ管理方法は多様な形
態で実装することができる。
【0024】例えば、本発明の実装形態として、上記メ
モリ管理方法によって形成されたサブルーチンスタック
領域を有することを特徴とするメモリ装置や、そのよう
なメモリ装置を備えるコンピュータシステムが挙げられ
る。
【0025】また、本発明の別の実装形態として、リタ
ーンアドレス格納領域、前フレームポインタ格納領域及
び局所変数格納領域を有するスタックフレームを積み重
ねて成るサブルーチンスタック領域をメモリ上に形成す
るための命令をオブジェクトプログラムの内部に埋め込
むに際し、その命令を、上記メモリ管理方法によってメ
モリ上にサブルーチンスタック領域を形成するような命
令として生成することを特徴とするコンパイラや、その
ようなコンパイラで作成されたプログラム(オブジェク
トプログラム又は実行可能プログラム)が挙げられる。
【0026】上記の他にも、本発明はその精神及び範囲
内において様々な形態で実装することが可能である。
【図面の簡単な説明】
【図1】 本発明におけるサブルーチンスタックの構成
例。
【図2】 従来のサブルーチンスタックの構成例。
【図3】 スタックスマッシング攻撃の一例を示す概念
図。
─────────────────────────────────────────────────────
【手続補正書】
【提出日】平成14年4月11日(2002.4.1
1)
【手続補正2】
【補正対象書類名】図面
【補正対象項目名】図3
【補正方法】変更
【補正内容】
【図3】

Claims (5)

    【特許請求の範囲】
  1. 【請求項1】 リターンアドレス格納領域、前フレーム
    ポインタ格納領域及び局所変数格納領域を有するスタッ
    クフレームを積み重ねて成るサブルーチンスタックをメ
    モリ上に形成する方法において、前記局所変数格納領域
    の大きさを、サブルーチンのソースプログラムで宣言さ
    れた全局所変数を格納するために必要な大きさより大き
    い範囲でランダムに決定することを特徴とするメモリ管
    理方法。
  2. 【請求項2】 請求項1に記載のメモリ管理方法によっ
    て形成されたサブルーチンスタック領域を有することを
    特徴とするメモリ装置。
  3. 【請求項3】 請求項2に記載のメモリ装置を備えるコ
    ンピュータシステム。
  4. 【請求項4】 リターンアドレス格納領域、前フレーム
    ポインタ格納領域及び局所変数格納領域を有するスタッ
    クフレームを積み重ねて成るサブルーチンスタック領域
    をメモリ上に形成するための命令をオブジェクトプログ
    ラムの内部に埋め込むに際し、その命令を、請求項1に
    記載のメモリ管理方法によってメモリ上にサブルーチン
    スタック領域を形成するような命令として生成すること
    を特徴とするコンパイラ。
  5. 【請求項5】 請求項4に記載のコンパイラで作成され
    たプログラム。
JP2002092219A 2002-03-28 2002-03-28 メモリ管理方法、メモリ装置、コンピュータシステム、コンパイラ及びプログラム Pending JP2003288129A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2002092219A JP2003288129A (ja) 2002-03-28 2002-03-28 メモリ管理方法、メモリ装置、コンピュータシステム、コンパイラ及びプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2002092219A JP2003288129A (ja) 2002-03-28 2002-03-28 メモリ管理方法、メモリ装置、コンピュータシステム、コンパイラ及びプログラム

Publications (1)

Publication Number Publication Date
JP2003288129A true JP2003288129A (ja) 2003-10-10

Family

ID=29237106

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2002092219A Pending JP2003288129A (ja) 2002-03-28 2002-03-28 メモリ管理方法、メモリ装置、コンピュータシステム、コンパイラ及びプログラム

Country Status (1)

Country Link
JP (1) JP2003288129A (ja)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2006001574A1 (en) * 2004-03-18 2006-01-05 Korea University Industry and Academy Cooperation Foundation Method for sensing and recovery agatinst buffer overflow attacks and apparatus thereof
JP2006185347A (ja) * 2004-12-28 2006-07-13 Fujitsu Ltd 情報処理装置及び情報処理方法
US7682252B2 (en) 2003-11-19 2010-03-23 Creatures, Inc. Game data control program, game data overwriting program and game data overwriting device

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7682252B2 (en) 2003-11-19 2010-03-23 Creatures, Inc. Game data control program, game data overwriting program and game data overwriting device
WO2006001574A1 (en) * 2004-03-18 2006-01-05 Korea University Industry and Academy Cooperation Foundation Method for sensing and recovery agatinst buffer overflow attacks and apparatus thereof
US7814333B2 (en) 2004-03-18 2010-10-12 Korea University Industry and Academy Cooperation Foundation Method for sensing and recovery against buffer overflow attacks and apparatus thereof
JP2006185347A (ja) * 2004-12-28 2006-07-13 Fujitsu Ltd 情報処理装置及び情報処理方法

Similar Documents

Publication Publication Date Title
US6578094B1 (en) Method for preventing buffer overflow attacks
CN105760773B (zh) 通过易受攻击的应用控制打开文件的系统和方法
AU2004218703B2 (en) Security-related programming interface
US8261244B2 (en) Arbitrary runtime function call tracing
US7962952B2 (en) Information processing apparatus that executes program and program control method for executing program
US20050081053A1 (en) Systems and methods for efficient computer virus detection
US7533138B1 (en) Practical lock-free doubly-linked list
JP2014142960A (ja) ブラウザベースの不正行為防止方法およびシステム
US20070083378A1 (en) Secure application programming interface
JP2001159984A (ja) サービス妨害攻撃を阻止するための装置および方法
JP2005135265A (ja) 情報処理装置
WO2009123342A1 (ja) データベースシステム、データベース更新方法、データベース、及びデータベース更新プログラム
CN116502220B (zh) 一种对抗性Java内存马的检测方法及处理方法
US20190294760A1 (en) Protecting an application via an intra-application firewall
JP5225071B2 (ja) 埋め込みシステム、特にスマートカードにロードされる疑似コードの検証方法
CN116150739A (zh) 一种基于关键地址动态保护的栈溢出自动防御方法
JP2005316599A (ja) 割込制御装置
US8707424B2 (en) Method for making secure execution of a computer programme, in particular in a smart card
JP2003288129A (ja) メモリ管理方法、メモリ装置、コンピュータシステム、コンパイラ及びプログラム
US6792596B2 (en) Method and system for protecting resource central programs
JP4643201B2 (ja) バッファオーバーフロー脆弱性分析方法、データ処理装置、分析情報提供装置、分析情報抽出処理用プログラムおよび分析情報提供処理用プログラム
EP0969361A1 (en) Class loader
KR19990028574A (ko) 고정프로그램을변경시키는방법및장치
JP4358648B2 (ja) スタックスマッシング攻撃防御方法、スタックスマッシング攻撃防御装置及びスタックスマッシング攻撃防御プログラム
JP2010113566A (ja) 情報処理装置、アクセス制御方法、及びプログラム