SV.UNBOUND_STRING_INPUT.FUNC
バインドされていない文字列コピーからのバッファ オーバーフロー
複数の文字で構成される文字列をメモリのバッファにコピーするには、文字列コピー関数を使用します。strcpy 関数には、書き込まれるデータのサイズを制限する引数がないので、バッファオーバーフローが発生する場合があります。
SV.UNBOUNDED_STRING_INPUT.FUNC チェッカーは、gets()、gettext()、catgets() など、バッファサイズを指定しないセキュアでない文字列コピー関数を呼び出すコードを探します。
脆弱性とリスク
文字列コピー関数が、サイズパラメーターなしで呼び出されると、バッファオーバーランエラーが発生することがあります。これは、アプリケーションの不安定性や、注意深く練られた攻撃ではコード挿入やその他の脆弱性につながることがあります。
軽減と防止
この脆弱性を回避するには
- gets ではなく fgets のように、必ず入力パラメーターのバッファサイズを持つ関数を使用します
- Windows では、StringCchGetsや、gets_s のように安全な CRT 関数など、StrSafe 関数 String*Gets を使用します。
- strlen() のような関数を使用して、必要なバッファサイズを特定します
脆弱コード例 1
コピー
#include <stdio.h>
int main()
{
char string [256];
printf ("Insert your full address: ");
gets (string); /* SV.UNBOUND_STRING_INPUT.FUNC reported here */
printf ("Your address is: %s\n",string);
return 0;
}
修正コード例 1
コピー
#include <stdio.h>
int main()
{
char string [256];
printf ("Insert your full address: ");
fgets (string, 256, stdin); /* No checker reported because fgets considers the size of the string array */
printf ("Your address is: %s\n",string);
return 0;
}
脆弱コード例 2
コピー
#include <stdio.h>
int main()
{
char string [256];
printf ("Please Enter Your Full Name:");
_gettws (string); /* SV.UNBOUND_STRING_INPUT.FUNC reported here */
printf ("Your Full Name Is: %s\n", string);
return 0;
}
修正コード例 2
コピー
#include <stdio.h>
int main()
{
char string [256];
printf ("Please Enter Your Full Name:");
gets_s (string, strlen(string)); /* no SV.UNBOUND_STRING_INPUT.FUNC reported here */
printf ("Your Full Name Is: %s\n", string);
return 0;
}
関連チェッカー
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。