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 が提供しているアプリケーションセキュリティトレーニング教材。