このコードはなぜバッファオーバーフロー攻撃に対して脆弱なのでしょうか? 質問する

このコードはなぜバッファオーバーフロー攻撃に対して脆弱なのでしょうか? 質問する
int func(char* str)
{
   char buffer[100];
   unsigned short len = strlen(str);

   if(len >= 100)
   {
        return (-1);
   }

   strncpy(buffer,str,strlen(str));
   return 0;
}

このコードはバッファ オーバーフロー攻撃に対して脆弱です。その理由を解明しようとしています。ではなく としてlen宣言されていることが原因だと考えていますが、よくわかりません。shortint

何か案は?

ベストアンサー1

ほとんどのコンパイラでは、の最大値はunsigned short65535 です。

それ以上の値は折り返されるため、65536 は 0 になり、65600 は 65 になります。

つまり、適切な長さ (例: 65600) の長い文字列はチェックに合格し、バッファをオーバーフローします。


ではなくsize_tの結果を格納し、のサイズを直接エンコードする式と比較するために使用します。たとえば、次のようになります。strlen()unsigned shortlenbuffer

char buffer[100];
size_t len = strlen(str);
if (len >= sizeof(buffer) / sizeof(buffer[0]))  return -1;
memcpy(buffer, str, len + 1);

おすすめ記事