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 の制御 文 の 「
長 さ」 は, キ
ー ワー ドの先頭か ら分岐の終点 まで とす る。
分 岐 の終点 は, 分 岐後 に戻 り合流 す る文 の直前 であ る。空 白や改行 , セ ミロ
ンは無視 す る。分 岐 して処理 され る部分 をサ ブブロ ック とす る。分 岐 しない連
チト
藤
齋
彦
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 blockif(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
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
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 のデ ー タ ベ ー ス の 読 み 込 み }
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_idSPdObjld 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
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); }
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 kThe 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 }
3 6 彦 根論叢 第 3 3 5 号
2.変 数 の トレー ス とブ 回 ック情 報 (2)
ブ ロ ックの情報 を取得 す る。最終 的 に
ある文の直接属するブロック (トッ
プ レベル)を 求める。各定義関数 ご
とに,制 御 の流れを調べ ることとな
るが,こ こで は,main関 数 のみ を
扱 う。 ターゲ ッ トの識別子が属する
ブロ ックを最内か ら外側へ と調べ,
トップレベルに達する。
│ アル ゴ リズム
1 1.変
数名 (k)を 左辺値 と して含 む文 の オ ブジェク トIdを取得
1 2.関
数本体 と直接 関連 を持 つ ブロ ックを取得 getTopblock
i 3.1で
求 めた文 の ブロ ック情報 を最 内 か ら順番 に取得 getBlockTrace
i 4.3で
得 られた トップ レベル ブロ ック情報 を基 に,制御lllgに
並べ出力 getBlocklnfo
⊃ kSapidによるソフ トウエア解析技法Ⅳ 37
サ ンプル コー ド4 -変
数 の トレース とブロ ック情報 (2)
斗includeく stdio,h> #includeく Sapid′Sapid.h> 弁define MAX_TOP_BLOCK 100 #deine MAX_SYNON_ID 10int 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 ) , }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を 用いる。 また,い くつ
かの ライブラリも必要 となる。モデル呼び出 しの記述 をサ ンプルコー ドとして
例示す るが,こ の コー ドは暫定的なものである。
Sapldに よるソフ トウエア解析技法 Ⅳ
SDAモ デルの作成法
S D B # IIlkSDA4S 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モ
デ ル 図
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_exprstmt irabel
return_expr
block decl
block strnt
control二body
elsettbody
関連 stmとeXpr i一般 の文 とその文 中の expressionと
の関係 を示す
id Intetter
Rdadonの 識別番号
stmt id
IntegerStatementの識別番号
expr_id
IntegerExpresslonの識別番号
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_idint 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‐ >Ⅲ ); }
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 n2 . 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基準 の文の次 に実行す る文の識別番号
F
I
I
I
I
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);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 }
「
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=2097156from=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 . 制 御 フ
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の認証で再利用可能である。以下 に脆弱
性 ・情報漏洩チェックの リス ト分析結果のサ ンプルを掲載する。
Sapidによるソフトウエア解析技法Ⅳ
ドキ ュメ ン ト(1)ト
ップベ ー ジ (HTML形 式)
一一一Sοttγ
cθ σOαθ あθυθJ――一
Security Check Report
例 1:リ ス ク分析 の
Pro
m e malnVulIIorabilit立
│(‐
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
● writewrite(υ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 ) ,
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Ⅲ)