EN JP CN

NNTS.MUST

NNTS.MUST

非 null 終了文字列からのバッファ オーバーフロー

C とC++ では、C 文字列または null 終了文字列では、null 文字 (\0) で終了する文字のシーケンスです。C 文字列の長さは、null 文字を検索することで求められます。

チェッカーの NNTS ファミリーは、null 終了しないまたはしない可能性のある文字配列を持つ文字列操作関数を使用するコードを探します。NNTS.MUST チェッカーは、文字配列が null 終了されていない文字列操作関数を使用して、コードを探します。

脆弱性とリスク

従来は、null 終了によりセキュリティに関する問題が発生しました。たとえば、次のようになります。

  • 文字列に挿入する null 文字は、予期せずにそれを一部省略できます。
  • null 文字に十分なスペースが割り当てられていない、または、null を忘れた一般的なバグです
  • 多くのプログラムでは、文字列を固定サイズのバッファにコピーする前に長さをチェックせず、長すぎるとバッファオーバーフローが発生します
  • null 文字を保存できないということは、間違った関数が使用された場合に問題が発生する可能性のあるさまざまな関数が文字列とバイナリデータを処理する必要があるという意味です

軽減と防止

問題を回避するには、次を実行します。

  • パフォーマンスの制約が許せば、特別なコードを追加して文字列バッファの null 終了を検証します
  • strncpy のようなバインドされた文字列操作関数に切り替えます
  • バッファオーバーラントレースバックに関与するバッファの長さを検査します

脆弱コード例

1  #include <stdio.h>
2  
3  int main()
4  {
5      char buf[8];
6      char tgt[1024];
7      const char * src = "abcdef";
8  
9      strncpy(buf, src, 3);
10     strcpy(tgt, buf);
11     return 0;
12 }

Klocwork は 10 行目で配列 'tgt' のバッファオーバーフローレポートを生成します:非 null 終了文字列 'buf' による 'tgt' のバッファオーバーフロー。類似したエラーが 10 行目の配列 'buf' について報告されます。この例では、'buf' の読み取りと 'tgt' の書き込みがあるため、配列範囲の違反は 2 回レポートされます。(strcpy を適切に使用しなかったことが原因で) buf' が null 終了されなかったため 、読み取りと書き込みの両方がバッファの範囲外 (3 以上) で起きています。このコードは、バッファオーバーフローとなり、セキュリティに関するさまざまな重大問題が生じる可能性があります。

拡張機能

このチェッカーは機能を拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。