...

診断結果報告書サンプルPDFファイル - 福島コンピューターシステム株式

by user

on
Category: Documents
19

views

Report

Comments

Transcript

診断結果報告書サンプルPDFファイル - 福島コンピューターシステム株式
株式会社××××× 御中
生産管理システム
ソースコード診断結果報告書
Software Quality and Vulnerability Examination Service
COde REview
福島コンピューターシステム株式会社
〒963-0201 福島県郡山市大槻町字北八耕地 13 番
Tel: 024-961-1007 / Fax: 024-961-1017
20XX 年 XX 月 XX 日
承認者
承認者
レビュー
責任者
作成者
作成者
株式会社×××××様
生産管理システム
分析結果報告書
__________________________________________________________________________________________________________
1.1 Buffer Overflow
該当箇所:/src-abcdef/ServerConnect.c
Level 4:重大
脆弱性
/src-abcdef /ServerConnect.c
533
534
535
536
537
538
539
540
static int SendInitCommand(char *Cmd)
{
char Tmp[INITCMD_LEN+1];
char *Pos;
while(strlen(Cmd) > 0)
{
strcpy(Tmp, Cmd);
解説
外部関数やファイル・レジストリから取得した信頼性が低いデータを制限なく使用し
ているため、バッファ・オーバーフローが発生しメモリ破壊や攻撃者により悪意ある
コードを実行される可能性があります。
対応方法
strcpy()など安全な使用が困難な関数の使用を避けてください。strcpy()など境界のな
い関数は strncpy()や strsafe.h で定義されている WinAPI など境界のある関数に置き換
えてください。
例)
static int SendInitCommand(char *Cmd)
{
char Tmp[INITCMD_LEN+1];
char *Pos;
while(strlen(Cmd) > 0)
{
memset(Tmp, 0, sizeof(Tmp));
/* 終端に NULL が格納されるよう初期化*/
strncpy(Tmp, Cmd, sizeof(Tmp)-1); /* 終端の NULL が上書きされないために
第3引数を-1 */
______________________________________________________________________________________________
Confidential
Copyright© 2009 Fukushima Computer System, Inc. All rights reserved.
株式会社×××××様
生産管理システム
分析結果報告書
__________________________________________________________________________________________________________
1.2 Command Injection
該当箇所:/src-abcdef/main.c
Level 4:重大
脆弱性
/src-abcdef/ConfigDelete.c
591
592
593
594
595
ReadMultiStringFromReg(hKey4, "DefAttr", DefAttrList, DEFATTRLIST_LEN+1);
ReadStringFromReg(hKey4, "Tmp", TmpPath, FMAX_PATH+1);
TmpPathをベースにComLineを生成しています。
ReadBinaryFromReg(hKey4, "Hdlg", &HostDlgSize, sizeof(SIZE));
/ src-abcdef/main.c
2148
2149
2150
2151
memset(&Startup, NUL, sizeof(STARTUPINFO));
Startup.cb = sizeof(STARTUPINFO);
Startup.wShowWindow = SW_SHOW;
if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL,
&Startup, &Info) == FALSE)
解説
レジストリから読み込んだ信頼できないデータを用いて、コマンドを実行していま
す。これにより、攻撃者による悪意あるコマンドの実行が可能になります。
対応方法
プログラムが実行するコマンドをユーザが直接・間接制御できないようにしてくださ
い。
______________________________________________________________________________________________
Confidential
Copyright© 2009 Fukushima Computer System, Inc. All rights reserved.
株式会社×××××様
生産管理システム
分析結果報告書
__________________________________________________________________________________________________________
1.3 String Termination Error
該当箇所:/src-abcdef /HogeMoge.c
Level 3:高
脆弱性
/src-abcdef/HogeMoge.c
165
166
167
168
169
170
171
172
173
175
176
if(hWndTask != NULL)
{
if((szBuf = malloc(10*1024+3)) != NULL)
{
va_start(vaArgs, szFormat);
if(wvsprintf(szBuf, szFormat, vaArgs) != EOF)
{
//#pragma aaa
//
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), szBuf,
strlen(szBuf), &Tmp, NULL);
//
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), 176"¥n",
strlen("¥n"), &Tmp, NULL);
strcat(szBuf, "¥r¥n");
解説
strcat() をコールする際にソースバッファの終端が NULL であることを期待してい
ますが、必ずしも NULL 終端でない場合がありバッファ・オーバーフローが引き起こ
される可能性があります。
対応方法
NULL 終端に依存した関数(strcat()など)をコールする場合、length パラメータを
使用して手動で文字列長を制限します。または、境界のある同等の関数(strncat()など)
に置き換えます。このとき、必ず文字列が NULL 終端で終わるように全ての文字列を
NULL で初期化します。
例)
if(hWndTask != NULL)
{
if((szBuf = malloc(10*1024+3)) != NULL)
{
memset(szBuf, 0, sizeof(szBuf)); /* 確保した領域を初期化 */
va_start(vaArgs, szFormat);
if(wvsprintf(szBuf, szFormat, vaArgs) != EOF)
{
strncat(szBuf, "¥r¥n", sizeof(szBuf));{ /* 境界のある関数を使用*/
______________________________________________________________________________________________
Confidential
Copyright© 2009 Fukushima Computer System, Inc. All rights reserved.
Fly UP