• 検索結果がありません。

Sapidによるソフトウェア解析技法 Ⅳ : ソースコードのリスク分析(2)

N/A
N/A
Protected

Academic year: 2021

シェア "Sapidによるソフトウェア解析技法 Ⅳ : ソースコードのリスク分析(2)"

Copied!
21
0
0

読み込み中.... (全文を見る)

全文

(1)

Sapidによるソフ トウエ ア解析技 法 Ⅳ

― ソース コー ドの リス ク分析 (2)一

は じめ に

ブ ロー ドバ ン ド ・ネ ッ トワー クの普及 や,イ ンタ

ー ネ ッ ト常時接続 の拡大 に

よ り,セ キユ リテ イ問題 が深刻 となってい る。 イ ンタ

ーネ ッ トを利用す る企業,

学校等 の組織 で は,セ キ ュ リテ イを包括 的 に検査 し,保 証 をす る体系 ,す なわ

ちセキ ュ リテ イ ・ポ リシーの確 立 が求 め られ てい る。

Sapidによるソフ トウエア解析技法 皿」で,Sapidを用いたソ

ースコー ドレ

ベルの脆弱性分析 を実現 した。本稿では,汎 用的にソフ トウエアの安全性,品

質 を保証す る体系の実現 をめ ざし,デ

ー タや制御構造の依存解析 を行 う。Sapid

によ り依存解析 を実現す るため,第 1章 で クラスblock,第2章 でstatementモ

ル,第 3章 でSDAモデルを説明す る。第 4章 で ソ

ースコー ドの リスク分析 を実

現す る。

I ク ラスb l o c k

関数本 体 は ブ ロ ツク と変 数 な どの宣 言 部 か ら構 成 され る。 ク ラス b l o c k ( ブ

ロ ック)を ,明 示 的 に中括 弧

H I H と

│ ‖

で 囲 まれ た部分 ,制 御 構造 に よる分 岐 の

部分 , 分 岐 の ない連続 す る文 の列 の 3 種 類 に分 ける。 ブロ ックの構造 は, サ ブ

ブ ロ ックかs t a t e m e n t ( 文

) の 列 か ら構 成 され る。s t a t e m e n t は

後述す るS D A モ デ ル

の クラスであ り,I―mOdelモデルで は クラス expresslonの

部 で あ る。

H I 打

H I ‖

で囲 まれた部分 をcompound blockと

呼ぶ。i f , d o ―

w h i l e , f o r , s w i t c h ,

w h i l e の制御 文 の 「

長 さ」 は, キ

ー ワー ドの先頭か ら分岐の終点 まで とす る。

分 岐 の終点 は, 分 岐後 に戻 り合流 す る文 の直前 であ る。空 白や改行 , セ ミロ

ンは無視 す る。分 岐 して処理 され る部分 をサ ブブロ ック とす る。分 岐 しない連

チト

(2)

3 0 彦 根論叢 第 3 3 5 号

続 す る s t a t e m e n t の

最 大 の列 をb a s i c b l o c k と

呼 ぶ 。b a s i c b l o c k の

前 後 には別 の

b a s i c b l o c k は

現 われ ない。

blockの属性 sortのマ クロ定義

1.例 題 1-ク ラス Ыockの情 報の取得

ブ ロ ックの基本情報 を取得す るプ

ログラム を作成す る。

ト ップ レベ ル

の ブ ロ ックは,関 数宣言 の部分 (ク

ラス o p t i o n a l d e c l ) と

関連 ル腕σ_bοαグ

を持 つ 。最底 辺 の ブ ロ ックは ク ラ

ス e x p r e s s i o n 式

の オ ブ ジ ェ ク トと関

連 b ι

た_θttγを持 つ 。 関数 の 中で 出

現 す るブ ロ ック情報 を求 め る。

ブロ ック構造 (I)

if block

if(k<1){←compOund block始ま り 1

↓while block始

ま り

while(k<10){←

cOmpOund block始

ま り 2

↓b a s i c b l o c k 始

ま り

k=aaa(2)+bbb(k); ←basic block J客

北)り

} ←c o I I l p O u n d b 1 0 c k 終

わ り 2

↑w h i l e b l o c k 終

わ り

← i f b l o c k 終

わ り

BLOCK BASIC

Basic block

BLOCK COMIP

Compound block

BLOCK IF

IF文 の block

BLOCK Sヽ VITCH

SWITCH文

の block

BLOCK FOR

FOR文 の block

BLOCK WHILE

WHILE文

の block

BLOCK D0

DO文 の block

BLOCK BRANCH

分岐 block

BLOCK HIERACHICAL

他の blockを 含 む b10ck

(3)

S a p i d に

よるソフ トウエア解析技法Ⅳ 3 1

サ ンプル コー ド1 - ブ

ロ ック情報 を求め る

祥include<stdio.h> 拝include<Sapid/Sapid.h> int main(int argc,char★ argv□ )(

SpdString progName=NULL; SpdObjldArray blk_array; SpdObjld prog_id; Int i;

鴨 翻 i襴 軌齢 路

辰鍔:艦P(

}

b姓

_群

ΥttfFl官

1奮

批胡 措報

'NULL,NULD;

:!吾

跳ぱ

ri皆

ザ古

理苦

i培

収上rray田

回);}

消紺 R3韻塩配督

Ha)

}

関数 getBlocklnfo ―

オブ ジェク トblockの基本情報 を求め る

void getBlocklnf。(SPdObjld block_i

int attr_↓ al;

attr_val=spdGetAttrVallnt(block_id,"sort口 )' switch(attr_val)(

case BLOCK_BASICi

〔printF(・BASIC Block‐ >Ⅲ);break;} case BLOCK_IF:

(printf("IF Blocと ‐>");break;} case BLOCK_FOR:

(printf("FOR Block‐ >Ⅲ );break;} case BLOCK_WIIILE:

{printf("WHILE Block‐ >“ );break;} case BLOCK_COMP:

(printf(Ⅲ{}Block‐ >Ⅲ )ibreak;) case BLOCK_BRANCH:

【printf(“BRANCH Block‐ >");break;} default:

printf(・Other Block‐ >"); }

実行結果 倍悟

分)

BASIC BIock‐ >Block ID 6291476 BASIC Block‐ >Block ID 6291480 COMPOUND Block'>Block ID 6291481 BASIC Block‐ >Block ID 6291456 COMPOUND Block‐ >BIcck ID 6291457 BASIC Block・ >Block ID 6291458 COMPOUND Block‐ >Block ID 6291459 BASIC Block‐ >Block ID 6291460 BASIC Block‐ >Block ID 6291461 cOMPOUND Block‐ >Block ID 6291462 W H I L E B l o c k ‐> B I o c k I D 6 2 9 1 4 6 3 B A S I C B l o c k ‐ > B l o c k I D 6 2 9 1 4 6 4 c O M P O U N D B l o c k ‐ > B l o c k I D 6 2 9 1 4 6 5 F O R B l o c k ‐ > B l o c k I D 6 2 9 1 4 6 6

(4)

32 彦 根論叢 第 335号

2 口 例 題 2 - ブ

ロ ック構 造 の解 析

TOPBLOCK

continued

関数本体 の トップブ ロ ックを基 ″

点と し

て,ブ ロ ックとブロ ックの関連 をた ど り,

最底 辺 の ブロ ックまで行 く。

ト ップ レベ

ル の ブ ロ ッ ク は 関 数 の 本 体 (ク ラ ス

optionttdecl)と

関連 湧θcι

_碑 けを持 つ 。最

底 辺 の ブ ロ ック は ク ラス expressionと

連 bι

花多碑γを持 つ。本 プログラムで は,

main関 数 のみ を対 象 と し,解 析 を行 う。

サ ンプル コー ド2 -ブ

ロ ック構造 の解析

#includeくstdio.h> 孝include<Sapid′Sapid.h> int main(int argc,char★argv口) ( SpdObjldArray blk_array; SpdObjld top_block_idi S p d D B I d d b l d ; d b l d = s p d O p e n S D B O ; open_IModel(dbld); top_block_id=getTopB10ck(); b l k _ a r r a y = s p d G e t O b j l d A r r a y ( " b l o c k " , N U L L , N U L L ) ; f o r ( 1 = 0 , i < b l k _ a r r a y , s i z e ; i + + ) if(8pdGetARelld(blk_array id[i],top_block_id,"any")1=SAPID_NON_ID)て printf(Ⅲ¥nTOP‐ >"); getB10ckTrace(blk_array.id[i]); printf(1'¥n・), } spdFreeObjldArray(blk_array); return(EXIT_SUCCESS);

関数 open」

Model ―卜modelを モデル として利用

void open_IModel(SpdDBId dbld){ SpdModelld IInodelld,PmOdelld, I m o d e l l d = s p d U s e M o d e l ( & L m o d e l ) ; ←I ‐m o d e l モデ ル の 利 用 を 宣 言 P m o d e l l d = s p d U s e M o d e l ( & P _ m o d e l ) ; ←P ‐m o d e l モデ ル の 利 用 を 宣 言 s p d R e a d D B ( I m o d e I I d , a b l d ) , ←I ‐m o d e l のデ ー タベ ー ス の 読 み 込 み s p d R e a d D B ( P m o d e l l d , d b l d ) ; ←P ‐m o d e l のデ ー タ ベ ー ス の 読 み 込 み }

(5)

dObjld getTop SpdObjldArray opt_array; SpdObjld top_block_id; int i;

昭晶

遇鞘整

路謎盟鮮

品掛

&出i子

icDEFj

if(strcmp( spdGetName(

spdCetARe」

描遼tARe10bjttpt_array.id□

,"decl_opt",い

any")

, “d e c l _ i d e n t " , Ⅲa n y Ⅲ) )

top_block_蔦

3:舌

試革

elobj(opt_array,id[il,Ⅲ

func bodyⅢ

,Ⅲ

any"),

return top_block_id;

Sapidによるソフ トウエア解析技法Ⅳ 33

関数 getTopBlock 一

main関数の トップの blockIDを

求め る

実行結果 (部分)

OP‐ > 6291469‐ >BASIC Block

T O P ' > 6 2 9 1 4 6 8 ‐ > I F B l o c k 6 2 9 1 4 6 7 ' > C O M P B l o c k 6 2 9 1 4 6 6 ‐ > F O R B l o c k 6 2 9 1 4 6 5 ‐ > C O M P B l o c k 6 2 9 1 4 6 4 ‐ > B A S I C B l o c k 6 2 9 1 4 6 3 ‐ > W H I L E B l o c k 6 2 9 1 4 6 2 ‐ > C O M P B l o c k 6291461‐ >BASIC BIocと

関数 getBlockTrace 一オブジェク トblockの基本情報 を求める

子。id getB10ckTrace(SpdObjld block_id

SPdObjld blk_id' int attr_vaL spdcursor ★ blk_Csr; getBlocklnfo(block_id);

斌花Ri古

選:皆

:摘

程嵩ぷ

瑞格を

式鮒進

紺│」

貫も

getBlockTracc(blk_id); spdPree Cursor(blk_csr); } ID)

ブロ ック構造 (Ⅱ)

↓if block 6291468

i f ( k < 1 6 ) { ←

c o m p O u n d b l o c k 6 2 9 1 4 6 7

↓w h i l e b l o c k 6 2 9 1 4 6 3

w h i l e ( k く

1 0 ) ( ←

c o m p O u n d b l o c k 6 2 9 1 4 6 2

↓basic block 6291461

k=aaa(2)十bbb(k);

)

↓f o r b l o c k 6 2 9 1 4 6 6

f o r ( i = 1 ; i < 4 ; 二

十十) 〔

← c O m p O u n d b l o c k 6 2 9 1 4 6 5

(6)

34 彦

根論叢 第 335号

工 変 数の トレースと制御構造

条件式や制御 ブロ ックとの関係で変数の トレースを行 う。取得 した文の所属

す るブロ ックの種類,ブ ロックの構造,式 の所属 ブロックなどを調べ る。

1.変 数の トレースとブロック情報

変数の ターゲ ッ ト識別子 をkと し,左 辺値 として出現する式 を順番に調査 し,

取得 した文が どの種類 のブロ ックに属す るかを調べ る。 もし,式 が制御 ブロッ

クの条件部等 に属 していれば,制 御 ブロックと直接関連 をもつ。

アル ゴ リズム :文の直接属するブロックの種類を求める

1.変 数名 (k)を 左辺値 と して含 む文の オブジェク ト旧 を取得

2日当該の文 と直接関連 を持 つ ブロ ックを取得

3口当該 ブロ ックの情報 を出力 getBlocklnfo()

サ ンプル コー ド3 -変

数 の トレース とブロ ック情報 (1)

i n t m a i n ( i n t a r g c , c h a r t a r g v □) { SpdDBId dbldi SpdObjldArray id_array; SpdObjld id8[101,expr_id,statement_id; SpdCursor tident_csr; int i,J,ld_num=0, d b l d = s p d O p e n S D B O ; o p e n _ I M o d e l ( d b l d ) i i d _ a r r a y = s p d G e t O b j l d A r r a y ( W i d e n t i f i e r Ⅲ, N U L L , N U L L ) ; f o r ( i = 0 ; i く i d _ a r r a y , s i z e ; i 十+ ) ifくspdGetAttrVallnt(id_array.idtil,"80rt")==ID_VARIABLE) if(strcmp(Ⅲk',spdGetName(id_array.idtil))==0) idstid_num++]=id_array.idti]; f o r ( j = 0 ; j く i d _ n u m ; j キ+ ) (

printf("¥nThe%d‐th object of identiier¥Ⅲk¥Ⅲ¥nⅢ,j); ide nt_car=spdGetRe10bjlnit(ids[j〕,Ⅲide nt_rer',Ⅲany");

while((expr_id=spdGetRe10bj(ide nt_csr))1=SAPID_NON_ID) if(spdGetAttrVallnt(expr_id,ⅢlrtypeW)==EXPR_L_VALUE)( statement_id=getExpre38iOn(expr_id), getBlocklnfo(sPdGetARe10bj(statement_id,田blk_expr",Wany・)); } printf("¥n"); } spdFreeObjldArray(id_array), spdCloseSDB(dbld); return(EXIT_SUCCESS); }

(7)

S a p l d に

よるソフ トウエア解析技法Ⅳ 3 5

関数 g e t E x p r e s s l o n 一

関数 の情報 を求め る ( 行数利用)

static int spd_get_line(SpdObjld id) ( S p d O c c o c c ; S P d R e g i o n t r e g i o n ; S p d R e g i o n c _ r e g i o n ; i n t l i n e = S P D _ N O N _ L I N E N O ; i n t c o l u m n i S P D _ N O N _ C O L U M N ; OCC=SpdcetA■ OffsetOfObj(id); if(occ.objectld i=SPD_NON_ID){ i_re gio n=spdConvOccToRegion(occ); c_region=spdConvRegionltoCbyPIDB(1_re giO n), if(c_region.fileld!=SPD_NON_ID)(

spdCnvOffsetToLineColum■ (c_region flleld,c_region offset, & l i n e , & c o l u m n ) , } } return(line); }

実行結果

h e l ‐t h o b j e c t o f i d e n t i f l e r Ⅲk " e x p r = k = b b b ( 5 ) a t 浮 2 1 ‐> B A S I C B l o c k e x p r = k = a a a ( 2 ) 十 b b b ( 3 ) a t # 1 4 ' > B A S I C B l o c k e x p r = k ‐ l a t # 1 1 ‐ > B A S I C B l o c k

The 2‐th object of identiner"k"

exPr= k=k+bbb(k)at#25‐ >BASIC Block expr= k=l at#23‐ >IF Block

SpdObjld getExpression(SpdObjttd expr_id)( SPdObjld expr_tmp_idi SpdCur30r teXpr_csri expr_cer=sPdGetRe10bjlnit(expr_id,Ⅲexpr_exp=W,"c‐id“), w h i l e ( ( e x p r _ t m p _ i d = 8 p d G e t R e 1 0 b j ( e x p r _ c s r ) ) ! = S A P I D _ N O N _ I D ) { i f ( s p d G e t A R e 1 0 b j ( e x p r _ t E L p _ i d , " b l k _ e x p r " , " a n y " ) ! = S A P I D _ N O N _ I D ) { p r i n t f ( " ¥ n e x p r = % 8 a t 孝% d " , s p d G e t O b j T e x t ( e x p r _ t m p _ i d ) ,spd_get_line(expr_tmp_id))テ return expr_tmp_id, } e l s e g e t E x p r e s s i o n ( e x p r _ t m p _ i d ) , } }

関数 spにget_line ―

オブジェク ト出現 の行数 を求める

変数 kの 出現 とブ ロ ック構造 (The 2_th o明

eCt Of identiner"kⅢ

)

行 数 ↓ 2 番 目の ス コー プ 2 2 ( i n t k = 1 ; ← 初 期 化 式 は、 この プ ログ ラムで は無 視

↓i f b l o c k 内

の式での左辺値の出現 ( 代入式中)

2 3 i f ( k = 1 ) (

2 4 W h i l e ( k < 5 ) ←

算術式

↓b a s i c b l o c k 内

の式での出現

2 5 { k = k t t b b b ( k ) ; ←

左辺値での出現 〈代入式)

2 6 p r i n t f ( Ⅲ k こ0 / 。d ¥ n ・, k ) ; ← 関 数 呼 び 出 し 式

2 7 }

(8)

3 6 彦 根論叢 第 3 3 5 号

2.変 数 の トレー ス とブ 回 ック情 報 (2)

ブ ロ ックの情報 を取得 す る。最終 的 に

ある文の直接属するブロック (トッ

プ レベル)を 求める。各定義関数 ご

とに,制 御 の流れを調べ ることとな

るが,こ こで は,main関 数 のみ を

扱 う。 ターゲ ッ トの識別子が属する

ブロ ックを最内か ら外側へ と調べ,

トップレベルに達する。

│ アル ゴ リズム

1 1.変

数名 (k)を 左辺値 と して含 む文 の オ ブジェク トIdを取得

1 2.関

数本体 と直接 関連 を持 つ ブロ ックを取得 getTopblock

i 3.1で

求 めた文 の ブロ ック情報 を最 内 か ら順番 に取得 getBlockTrace

i 4.3で

得 られた トップ レベル ブロ ック情報 を基 に,制御lllgに

並べ出力 getBlocklnfo

⊃ k

(9)

Sapidによるソフ トウエア解析技法Ⅳ 37

サ ンプル コー ド4 -変

数 の トレース とブロ ック情報 (2)

斗includeく stdio,h> #includeく Sapid′Sapid.h> 弁define MAX_TOP_BLOCK 100 #deine MAX_SYNON_ID 10

int main(int argc,char targv□ )( SpdObjldArray id_array,blk_array;

SpdObjld top_block_id,expr_id,statement_id,block_id,blkユ _id,blk2_idi SpdObjld idstMAX_SYNON_ID],blocks〔 MAX_TOP_BLOCK];

SpdC■ lrsor ★ ident_ceri SpdRel block_rel, int i,j=0,id_nun=0; S p d D B I d d b l d ; d b l d = s p d O p e n S D B O ; open_IModel(dbld); tOp_block_id=getTopBlockO; b l k _ a r r a y = s p d G e t O b j l d A r r a y ( Ⅲ b l o c k Ⅲ, N U L L , N U L L ) ; for(i=0,1<blk_array.sizei i++) if(8pdGetARelld(blk_array.id[il,top_block_id,・ anyⅢ)!=SAPID_NON_ID) if(j>MAX_TOP_BLOCK) continue; e l s e blocks[j++]=blk_array.id[il; spdFreeObjldArray(blk_array); i d _ a r r a y = s p d G e t O b j l d A r r a y ( " i d e n t i n e r " , N U L L , N U L L ) ; for(i=0;iく id_arrayosize;i+キ) if(spdGetAttrVallnt(id_array`id【 i],'80rt")==ID_VARIABLE) if(strcmp(Ⅲk“,spdGetName(id_array.idtil))==0) if(i>MAX_SYNON_ID) continuei e l s e idstid_num++]=id_array,idti]; spdFreeObjldArray(id_array); f o r ( j = 0 ; j く i d _ n u m ; j + + ) 【

printf("¥nThe%d'th object of identiier¥"k¥"¥n",j); ide nt_cer=spdCetRe10bjlnit(idstj],"ident_rer',"any");

W皿

堆受

::こ

e酬盤路機皿

理島為描掛茜為D{

statement_id=getExpre8SiOn(expr_id); i f ( ( b l k 2 _ i d = s p d G e t A R e 1 0 b j ( s t a t e m e n t _ i d , " b l k _ e x p r " , “a n y Ⅲ) ) ! = S A P I D _ N O N _ I D ) g e t B l o c k T r a c e ( b l k 2 _ i d ) ; } } r e t u r n ( E X I T _ S U C C E Q Q ) , }

(10)

3 8 彦 根論叢 第 3 3 5 号

実行結果

The O‐th object of identifier"k"

expr ld=7340080 expr= k=k+bbb(k)Offset=275

B A S I C B l o c k ‐ > C O M P O U N D B l o c k ‐ > W H I L E B l o c k ‐ > C O M P O U N D B l o c k ‐ > I F B l o c k ‐ > C O M P O U N D B l o c k ‐ > T O P

exPr ld=7340074 expr= k=1 0ffset=249 1 F B l o c k ‐> C O M P O U N D B l o c k ‐ > T O P T h e l ‐t h o b j e c t o f i d e n t i f i e r " k Ⅲ e x p r l d = 7 3 4 0 0 6 o e x p r = k = b b b ( 5 ) O f f s e t = 2 1 4 B A S I C B l o c k ‐ > T O P

expr ld=7340046 expr= k=aaa(2)■ bbb(3)Offset=84

B A S I C B l o c k ‐ > C O M P O U N D B l o c k ‐ > W H I L E B I o c k ‐ > C O M P O U N D B l o c k ・ > I F B l o c k ‐ > T O P

e x p r l d = 7 3 4 0 0 3 7 e x p r = k = 1 0 f f s e t = 2 5 B A S I C B l o c k ‐ > T O P

変数 kの 出現 とブロ ック構造 (The 2_th o明

eCt Of identiier"k")

行 数 ↓ compound block(2番 目の ス コー プ)

22 {int k二 1;

↓if block ↓compound block

23 if(k=1) { ←

expr ld=7340074

↓w h i l e b 1 0 c k

24 while(kく5)↓basic block

25 compound block→ {k=kttbbb(k),く

←expr ld=7340080

26 printf(Ⅲ

k=%d¥n",k);

27 )

Ⅲ 制 御の依存解析 SDA4モ デル

制御情報 を利用 したアプ リケー シ ョンを作成す るために, S D A モ デルが用

意 されてい る。S D A モ デルは,あ るローカル変数 に関 して,そ の値 を直前 に

代入 した可能性 のある式 を求めた り,あ る文が どの文 に依存 して実行/不 実行

が決 まるか,文 の実行順や関数呼び出 し情報 などを求めるときに用いる。

C 言 語で書かれたソースプログラムの依存解析 を行 なうためのモデル とコマ

ン ド群 の現在 のバ ージ ヨンがSDA4(Sapid Dependency Analyzer ver,4)で

ある。

S D A 4 は ,制 御 フロー解析 とデータ依存解析の解析 データを提供する。

S D A 4 モ デル を作成す るために,コ マ ン ドmkSDA4を 用いる。 また,い くつ

かの ライブラリも必要 となる。モデル呼び出 しの記述 をサ ンプルコー ドとして

例示す るが,こ の コー ドは暫定的なものである。

(11)

Sapldに よるソフ トウエア解析技法 Ⅳ

SDAモ デルの作成法

S D B # IIlkSDA4

S D A モ デルの利用法

S D A 4 等の モ デ ル の宣 言

S p d D B I d d b l d ;

S p d M o d e l l d A r e a M o d e l l d , S t m t M o d e l l d , S D A m o d e l l d i

S D A 4 等の モ デ ル の呼 び 出 し記 述

A r e a M o d e l l d = s p d U s e M o d e l ( & A r e a _ m o d e l ) , ←

エ リアモデ ル

S t I I l t M o d e l l d i s p d U s e M o d e l ( & S t I I l t _ I I I o d e l ) ; ) , ←s t a t e m e n t モデ ル S D A m o d e l t t d = s p d U 3 e M O d e l ( & S D A _ I I L o d e l ) ; ) ; ← S D A モ デリレ s p d C r e a t e D B ( A r e a M o d e l l d , d b l d ) , s p d R e a d D B ( S t l n t M o d e l l d , d b l d ) , s p d R e a d D B ( S D A m o d e l l d , d b l d ) ;

1 . S D A の

ク ラス とI ―

m O d e l との関連

S D A モ デ ル は制 御 フ ロ ー とデ ー タ フ ロ ー を扱 う。S D A 固 有 の ク ラス は

s d a f u n c と

v a r g であ る。制御 フロー に関連 す るオブ ジェ ク トは s t a t e m e n t お

よび

d e c l a r a t i o n , l a b e l の

部 な ど, e x p r e s s l o n を

子 に持 つ オ ブ ジ ェ ク トで あ る。制御

フロー関連 のモ デル は, こ れ らの オブジェク トが実行 され る順序 関係 を示す。

この関係 は関数 ご とに定義 され, 仮 想 的 な実行 の最初 の オブジェク トは s d a f u n c

であ る。

S D A と s t a t e m e n t モ

デルのクラス

sdafunc l varg l Statement

図 1,SDAモ

デ ル 図

(12)

4 0 彦 根論叢 第 3 3 5 号

1 口例 題 4 - ク

ラ ス s t a t e m e n t の

基 本 情 報 を求 め る

クラス sdafuncの

オブジェク トは sortがDECL FUNCDEFである declarationオ

ジェク トと, 関 連挽腕c交ル物Cを 持つ。 また最初の文 (クラス statement)へ

披 ι

ttCゴ

物けをた どる。 クラス statementを

扱 うため に,statementモ

デルが用意

されてい る。statementモ

デルはほぼ クラス blockに

対応 し,10個 のマ クロと 5

個 の関連で定義 される。アクセス関数 も用意 される。本 プログラムでは,ク ラ

ス statementの

オブジェク ト配列 を用いて,各 種の情報 を得 る。

クラスstatementの

主なマクロ定義

STATE BLOCK

STATE IF

r文

STATE WHILE

while文

STATE NORMAL

普通 の文

STATE RETURN

returnぢ

statementの

関連

for_expr

cond_expr

iter_expr stmt_expr

stmt irabel

return_expr

block decl

block strnt

control二body

elsettbody

関連 stmとeXpr i一般 の文 とその文 中の expressionと

の関係 を示す

id Intetter

Rdadonの 識別番号

stmt id

Integer

Statementの識別番号

expr_id

Integer

Expresslonの識別番号

(13)

S a p i d に

よるソフ トウエア解析技法Ⅳ 4 1

サ ンプル コー ド5 - ク

ラス s t a t e m e n t の

基本情報 を求める

# i n c l u d e < s t d i o , h > 浮i n c l u d e < S a p i d ′ S a p i d , h > キi n c l u d e < S a p i d ′ S t m t M o d e l h > # i n c l u d e < S a p i d ′S D A m o d e l h > int main(int argc,char targv□ ) ( SpdObjldArray state_array,sda_array, SpdObjld progld,id,expr_id; SpdString targetProgramName=NULL; int i; SpdDBId dbld; dbld=spdOpenSDBO; openttlodel(dbld); s t a t e _ a r r a y = s p d G e t O b j l d A r r a y ( Ⅲ s t a t e m e n t “, N U L L , N U L L ) ; s d a _ a r r a y = s p d G e t O b j l d A r r a y ( Ⅲ s d a f u n c " , N U L L , N U L L ) ; for(1=0;i<state_array.sizef i十 十)( getStatementSort(state_array.id[i]), p r i n t f ( " % d ¥ n Ⅲ , s t a t e _ a r r a y . i d t i ] ) ; } for(i=0;i<sda_array,size;i十 +)( p r i n t f ( " F U N C T 1 0 N % d ¥ n " , s d a _ a r r a y . i d [ i ] ) ; } sPdFreeObjldArray(state_array), spdFreeObjldArray(sda_array); sPac10sesDB(dbld), return(EXIT_SUCCESS), }

関数 getstatementSort―

Statenamentの

Sortを求める

void getStatementSort(SpdObjld state_id

int attr_val;

attr_val=spdGetAttrVallnt(state_id,"sortⅢ ); switch(attr_val)(

case STATE NORMAL:

printf(ⅢNORMAL Statement‐ >");break; case STATE IF:

printX"IF Statement‐ >");break; │

省 略 │ case STATE_BLOCK:

printf(巾BLOCK Statement‐ >・ );break; case STATE RETURN:

Printf(ⅢRETURN Statement‐ >");break} default:

PrintK"Other statement‐ >Ⅲ ); }

(14)

4 2 彦 根論叢 第 335号

実行結果

B L O C K S t a t e m e n t ‐ > 5 6 6 2 3 1 0 6 R E T U R N S t a t e m e n t , > 5 6 6 2 3 1 0 7 B L O C K S t a t e m e n t ‐ > 5 6 6 2 3 1 0 8 R E T U R N S t a t e m e n t ― > 5 6 6 2 3 1 0 9 B L O C K S t a t e m e n t ― > 5 6 6 2 3 1 1 0 N O R M A L S t a t e m e n t ‐ > 5 6 6 2 3 1 1 1 B L O C K S t a t e m e n t ‐ > 5 6 6 2 3 1 1 2 N O R M A L S t a t e m e n t ‐ > 5 6 6 2 3 1 1 3 1F Statement‐ > 56623114 BLOCK Statement‐ > 56623115 WIIILE Statement‐ > 56623116 BLOCK Statement‐ > 56623117 NORMAL Statement‐ > 56623118 FOR Statement‐ > 56623119 BLOCK Statement‐ > 56623120 NORMAL Statement‐ > 56623121 途 中 省 略 F U N C T 1 0 N 5 6 6 2 3 1 3 5 F U N C T 1 0 N 5 6 6 2 3 1 3 6 F U N C T I O N 5 6 6 2 3 1 3 7 F U N C T I O N 5 6 6 2 3 1 3 8 ← ' F 封数 m a l n

2 . S D A モ デル と待J 御フロー

s d a t t n c オブ ジ ェ ク ト は , v a r g オ ブ ジ ェ ク ト, 関 数 定 義 文 ( s o r t が

D E C L F U N C D E F で

あ るd e c l a r a t i O n ) や

, 最 初 に 出 現 す る の 文 と関 連 を持 つ 。 最

初 の 文 へ は 披 ι

t t C ゴ

物けをた どる。

文が通常の文 ( N O R M A L ) で

あれば, そ の実行文 は, 物θ冴け

ゴけ

物汐関連のた

だ 1 つ の親である。関連 を子の側へた どり,プ ログラム実行時の関数内の実行

順で文 を得 る。この とき対象 となるオブジェク トは,statementお

よび d e c i a r a t i o n ,

L b e l の一部など,expresslonを

子 に持つオブジェク トである。

SDAモ デル の関連

next_stmt ldata_depend l func_sfunc i sfunc_varg l sfunc_stmt l dentゴ

arg

関連 next stmt i

Integer

Reladonの 識別番号

prev_id

Integer

基準 となる文の識別番号

next id

Integer

基準 の文の次 に実行す る文の識別番号

(15)

Sapidに よるソフ トウエ ア解析技法 Ⅳ

3.例 題 6 -実 行順でオブジェク トを求める

s d a f u n c から, 関 連 物θ筋 ゴ け

物 けに よ つ て 次 に実 行 さ れ る可 能 性 の あ る文 を順 番

に 求 め る 。 関 連 物θ筋 ゴ け

物 渉の s o r t が N E X T S T M T _ N O R M A L の

場 合 は , 実 行 可 能

文 は 1 つ で あ る 。 t t r , w h i l e , d o 文は 1 つ , i f 文 は 1 つ ま た は 2 つ , s w i t c h 文 は

c a s e の数 だ け の 実 行 可 能 文 を持 つ 。 そ の 場 合 の s o r t は N E X T S T M T C O N T R O L で

あ る 。

関 数 か ら抜 け 出 る と き , 関 連 物θ″け

ゴ け

物 けの 先 は 元 の s d a t t n c に

戻 る ( s o r t は

N E X T S T M L E N D ) 。

t t r , w h l l e と

い っ た の 繰 返 し文 の 場 合 , ブ ロ ッ ク最 後 の 文 の

次 は 制 御 文 で あ る 。 こ の 関 係 を 示 す 関 連 の s o r t は N E X T S T M L L O O P B A C K と

る 。

サ ンプ ル コー ド6 - 実

行 順 で オ ブ ジ ェ ク トを求 め る

関連 nexLStmtの sortのマ クロ定義

NEXTSTMT NORMAL

通常 の文へ の フロー

NEXTSTMIT CONTROL

制御 ブロ ックの文へ の フロー

NEXTSTMIT LOOPBACK

制御 文へ戻 る ことを示す

NEXTSTMIT DECL

次 の文が宣言文 であ るこ とを示す

NEXTSTMT END

関数 を抜 ける ことを示す

d b l d = s p d O p e n S D B O ; o p e n M o d e l ( d b l d ) , state_array=spdGetObjldArray(Ⅲstatement",NULL,NULL)i sda_array=spdCetObjldArray("sdafunc",NULL,NULL), ) spdFreeObjldArray(3da_array)テ spdCloseSDB(dbld); return(EXIT_SUCCESS);

(16)

44 彦 根論叢 第 335号

関数 getNextStmt 一

次 の Statementを

求める

void getNextStmt(SpdObjld top_id,SpdObjld next_id

SpdObjld tmp_id; SpdCursor tstmt_csr; stmt_csr=spdGetRe10bjlnit(next_id,"next_stmt",巾 a nyⅢ); w h i l e ( ( t m p _ i d = s p d G e t R e 1 0 b j ( s t m t _ c s r ) ) ! = S A P I D _ N O N _ I D ) │ if(tmp_id==top_id)( printF(Ⅲ¥n¥tnext= %dⅢ ,tmp_id); getStmtSort(spdCetARelld(next_id,top_id,NULL)); printKⅢ¥n"); return; } e l s e ( lf(tmp_id>next_id){ getNextStmt(top_id,tmp_id)iprintf("!!!Ⅲ); printX"¥n¥t next=%d%dⅢ ,next_id,tIIlp_id); getStmtSort(spdCetARelld(next_id,tmp_id,NULL)); )

}

spdFreeCursor(stmt_csr);

関数 getNextStmtSort 一

次 の Statemantのsortを求め る

void getNextStmtSort(SpdRelld state_Relld)( int attr val;

SpdObjld expr_id;

attr_val=spdGetAttrVallnt(state_Relld,Ⅲ sort'); switch(attr_val){

case NEXTSTMT NORMAL:

p r i n t f ( けN O R M A L S t a t e m e n t " ) ; b r e a k ; case NEXTSTMT_L00PBACK:

printf("L00PBACK StatementⅢ );break; case NEXTSTMT CONTROLi

printf(巾CONTROL Stateれ entⅢ),break; case NEXTSTMT DECL:

printf(ⅢDECLARATION StatementⅢ );break; case NEXTSTMT END:

printf("END Statement");break; default:

printf("Other statement Ⅲ )i }

(17)

Sapldに よるソフ トウエア解析技法 Ⅳ

実行結果 脩ほ

分)

F U N C T 1 0 N ( S D A ) : 5 6 6 2 3 1 3 8 f i r s t = 2 0 9 7 1 5 5 f r o m = 5 6 6 2 3 1 1 6 L 0 0 P B A C K S t a t e m e n t c o n d = 7 3 4 0 0 4 7 control_body=56623117 next=56623118 from=56623119 next=56623116 from‐ 56623121 next=56623119 f r o m = 5 6 6 2 3 1 1 9 L 0 0 P B A C K S t a t e m e n t i t e r = 7 3 4 0 0 6 4 c o n d = 7 3 4 0 0 6 2 for=7340059 control_body=56623120 next=56623121 from=56623123 next‐ 56623122 from=56623123 next=2097156 f r o m = 5 6 6 2 3 1 2 2 N O R M A L S t a t e m e n t s t m t = 7 3 4 0 0 6 9 n e x t = 5 6 6 2 3 1 2 3 from=56623122 next=56623119 from=56623122 next=56623114 f r o m = 5 6 6 2 3 1 1 9 N O R M A L S t a t e m e n t i t e r = 7 3 4 0 0 6 4 c o n d = 7 3 4 0 0 6 2 for=7340059 control_body=56623120 next=56623122 f r o m = 5 6 6 2 3 1 1 6 N O R M A L S t a t e m e n t c o n d = 7 3 4 0 0 4 7 control_body=56623117 next=56623119 f r o m = 5 6 6 2 3 1 1 4 C O N r r R O L S t a t e m e n t c o n d = 7 3 4 0 0 4 4 control_body=56623115 next=56623116 from=56623123 next=56623122 from=56623123 next=2097156

from=56623122 NORMAL Statement stmt=7340069 next=56623123 from=56623122 next=56623119

from=56623122 next=56623114

f r o m = 5 6 6 2 3 1 1 4 N O R M A L S t a t e m e n t c o n d = 7 3 4 0 0 4 4 control_body=56623115 next=56623122

from=56623113 NORMAL Statement stmt=7340041 next=56623114 from=2097155 DECLARATION Statement next=56623113

実行結果は,制 御 フローの流れを表現する。少 し分か りにくいが,図 2が ソ

スプログラムの解析結果 となる。

実行結果の解析対象 (部分)

・ sample Program (main) オ

/

int inain(int argc,charキargv回){

int i,k;

k=1;

if(k<10){

w h i l e ( k < 1 0 ) (

k = a a a ( 2 ) 十b b b ( k ) ;

}

f o r ( i = 1 れ< 4 五十+ ) 【

c c c ( ) ; )

}

p r i n t f ( " H e l l o w o r l d ! ¥ n “

) ;

k = b b b ( 5 ) ;

図 2 . 制 御 フ

(18)

46 彦 根論叢 第 335号

I V デ ー タ依 存 解 析 と リス ク分 析 ツ ール の 実 装

1日 SDA4の デ ータ依存解析

SDA4の 依存 解析 は,す べ てのパ ス を調べ ,基 本型 と構造体 につ いて解析 す

る。 ポ イ ンタに関 して は基本型 のみ実装 す る。現在 のバ ー ジ ョンで は関数 ご と

の解析 のみ を行 い,関 数 にまたが る解析 は提供 してい ない。5+数 ・大域変数 に

ついて も実装 されてい ない。配列 の要素 について も,イ ンデ ックス による区別

が で きない。例 えば以下 の式 に対 して,最 初 の式 a[A]か

ら次 の文 の式 bヘ

依存 関係 が あ る とみ な して しま う。

a [ A ] = 0 ;

b = a [ B ] ;

2ロ リスク分析ツールの実装

現在のSDAモ デルでは,脆 弱性 をもた らす原因 となるstrcpyといったメモ リ

・文字列処理関数のデータ依存解析はで きない。ここでは,関 数にまたがる解

析 を新 たにSapidアプ リケー シ ョンとして実装 した。対象 となる関数 を含 む式

の一覧 と属性 を求めて一時 ファイルに保存 し,perlスクリプ ト等 を利用 してデー

タの依存解析 を実現 した。

脆弱性の分析 に加 え,情 報漏洩 といった危険性の抽出 も行 った。解析結果 は

XMLデ ー タお よびハ イパー ドキュメン ト (HTML形 式)と して作成 してお り,

セキュ リテ イ ・ポ リシーの作成やISOの認証で再利用可能である。以下 に脆弱

性 ・情報漏洩チェックの リス ト分析結果のサ ンプルを掲載する。

(19)

Sapidによるソフトウエア解析技法Ⅳ

ドキ ュメ ン ト(1)ト

ップベ ー ジ (HTML形 式)

一一一Sοttγ

cθ σOαθ あθυθJ――一

Security Check Report

例 1:リ ス ク分析 の

Pro

m e maln

VulIIorabilit立

│(‐

1)

Function Local Stack Over Flow Check ltem Check

strcpy

strcpy(υaだ,υa″ )

Boundatt size of υ

aだ,Sぢβθげ υa″

strncpy

strncpy(varl,var2,length)

Boundatt size of υ

aだ,Sttθ げ け

θ

物oけ

strcat strcat(υ αγゴ,υα″ )

Boundatt size of υ

oガ,Sづβθげ υa″

sprintf

帥価 (υ

a仇

比…

.)力

物ち

Boundatt size of υ

aガ,Sttθ げ parぶ

sscanf

sscanf(υ

aだ,ヵ卸切ちpattF)… ) Boundarj‐size of υ

aガ,Sttθ げ paGぶ

fgets

fgets(υa/SF,ι

θ

竹伊ろυa//S2)

Boundatt size of e/1a竹

, Sを

βθ

o/υa″

gets gets(υaだ )

An Occurrence of this function

scanf

scanf(拘 物切 ら pattF,…

)

Type of pa角 航ヽ

is charネ

fscanf

偽canf(υ

aだ,ヵ柳caらpattF,… )

Type of pa角 効ヽ

「is char*

VlllⅢ

O:abiit立

(2)

FunctiOn Format String Attack Check ltem Check

printf

printf(Jら

御物aち pa?4aF, ……)

Check if 10/01 character is used

IIIfOrmlti011Leakage

Function Leakage Check ltem Check

printf

printf(jわ御物αち

pa?40F, ….)

Check if pa角

効V is signiflcant information

● write

write(υa/tF,υ

a//2)

Check if υ

a佐2 is significant information

例 2 : リ ス ク分析 の ドキュメン ト(2)関 数strcpyの

出現 I(HTML形

式)

一―一

S ο 物 ? 笹 ο C ο t t σ L θ υθι ―一一

Security Check Report

一一一一一一―-OCCURRENCE of

F u n c t i o n : s t r i n i

孝3 i s t r c p y ( a r 質

1 , a r 宮2 ) ;

F u n c t i o n : m a i n

# 1 2 : s t r c p y ( b u f f e r , ‖? ) ;

# 1 6 : s t r i n i ( b u f f e r 2 [ i l , 付

N U L L ‖ ) ;

# 1 9 i s t r c p y ( b u f f e r , a r t t v [ 1 ] ) ;

♯2 2 : s t r c p y ( b u f f e r , ' 9 d u I I I I n y " ) ;

# 2 4 : s t r c p y ( b u f f e r 2 [ 1 ] , b u f f e r ) ,

# 2 5 : s t r c p y ( b u f f e r l , b u f f e r 2 [ 1 ] ) ;

# 2 6 : p r i n t f ( " % d W , s t r c p y ( b u f f e r 3 , b u F f e r l ) ) ;

# 2 7 : s t r c p y ( b u f f e r 3 , b u f f e r l ) ,

(20)

4 8 彦 根論叢 第 3 3 5 号

例 3 . リ

ス ク分 析 の ドキ ュ メ ン ト(3)関 数strcpyの出現 工 (HTML形 式 )

一 一 一

S ο 物? ′c θ σ O t t θ L θ υ θ ι 一 一 一

Security Check Report(一 音卜)

一一一一一一一- O C C U R R E N C E o f s t r c p y 一 一―一一一一一

T a r g d E x p r e s 韻o ぃ 出 L E . 延 「U N 似 1 0 N 避

端 立r c D V t t r g l . a r 宮分;

Source Variablei argl Function #lichar tt ar貿1

Destination Variablei arg2 Function #1:char*ar宮2 Control Depend Expressloni

Data DeDend Expressioni

Targd Expres韻oぶ HLS tt FUN甲 ON叫

12立 にDV ttuffen均;

S o u r c e V a r i a b l e i b u f f e r しocal #9ichar buffer[80]

Destination Variablei Constant Control Depend Expresslo■ :

Data Depend Expresslon.

Target Expres韻oボ HLS tt FUド CTI°

跳 鶏 品Gtlffer2同."NULい

Source Variable:buffer2 しocal Ⅲ9ichar buffer2「2011201

Destination Variablei Constant ⅢNULL

Control Depend Expresslo■:

Data Depend Expressioni

Target Expressおぶ FILE:2 c FUNCT10N:隷

trcDV 6uffer,ar郎「

Source Variable:buffer しocal #9:char buffer[80]

Destination Variablet Function

耕7ichar Ⅲ

argv□

Control Depend Expression: #18:argc>1

Data Depend Expresslon:

Targd Expres韻oぶ HL「 堅 FUNCTIO特

歩汗普祥cっv Guttr2□,bu徒め

Source Variablei burer2 Local 学9ichar buffer2[20][20]

Destination Variable:buffeI Function 苦9ichar buffer[80]

Control Depend Expressloni

Data DeDend ExDreSSlon: #22:strcDV(buFfer,ⅢdummvⅢ)

例 4:リ ス ク分析の ドキュメン ト(4)変 数bufferの出現 (VML形 式)

(21)

S a p l d に

よるソフ トウエア解析技法Ⅳ 4 9

お わ りに

「Sapidに よ る ソ フ トウエ ア解 析 技 法 皿」 で危 険 な 関数 と変 数 (標準 入 力 等 )

の 出現 をチ ェ ックす る手 法 を実 現 した 。本 稿 で は デ ー タや制御 の依 存 解 析 まで

対 象 と し,精 度 の 高 い リス ク解 析 を実 現 した 。 解 析 結 果 をXMLや

HTML形

で 表 現 す る こ とで ,セ キ ュ リテ イ ・ポ リシー や セ キ ュ リテ イ認 証 の ドキ ュ メ ン

トで 再 利 用 可 能 な もの と した。

[参考文献]

(1)UNYUN(2001)「 ハ ッカー ・プログラミング大全」データハウス株式会社

(2)斉藤邦彦 (2001)「

Sapidによるソフ トウエア解析技法 Ⅱ」彦根論叢第325号pp 121-139

(3)斉藤邦彦 (2001)「

Sapidによるソフ トウエア解析技法田」彦根論叢第

(4)大橋 洋貴,山 本 晋一郎,阿 草 清滋 (1999)「

ソフ トウェア空間を トラバースする柔軟

な検索」 日本ソフ トウェア科学会第16回大会論文集,pp.149-152

(5)鈴木 崇文,山 本 晋一郎 (1999)「

SDA4仕様書」www.sapido org/

参照

関連したドキュメント

そこで本解説では,X線CT画像から患者別に骨の有限 要素モデルを作成することが可能な,画像処理と力学解析 の統合ソフトウェアである

名の下に、アプリオリとアポステリオリの対を分析性と綜合性の対に解消しようとする論理実証主義の  

Comparison between serum protein components as obtained by QIEP and single radial immunodiffusion.... Comparison between QIEP pattern of normal and abnormal Hodgkin's

ベクトル計算と解析幾何 移動,移動の加法 移動と実数との乗法 ベクトル空間の概念 平面における基底と座標系

カウンセラーの相互作用のビデオ分析から,「マ

2813 論文の潜在意味解析とトピック分析により、 8 つの異なったトピックスが得られ

解析の教科書にある Lagrange の未定乗数法の証明では,

析の視角について付言しておくことが必要であろう︒各国の状況に対する比較法的視点からの分析は︑直ちに国際法