Comments
Description
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.