EN JP CN

NNTS.TAINTED

NNTS.TAINTED

汚染した入力の非 null 終了文字列からのバッファ オーバーフロー

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

チェッカーの NNTS ファミリーは、null 終了しないまたはしない可能性のある文字配列を持つ文字列操作関数を使用するコードを探します。NNTS.TAINTED チェッカーは、ユーザーまたは外部デバイスからの、未検証または汚染した入力データが引き起こす非 null 終了文字列によるバッファオーバーフローを探します。このチェッカーは、バッファオーバーフローに関与する入力データが検証されていないコードへの実行パスにフラグを立てます。

脆弱性とリスク

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

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

軽減と防止

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

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

脆弱コード例

1  void TaintedAccess()
2  {
3      char src[32];
4  
5      char dst[48];
6  
7      read(0, src, sizeof(src));
8      strcpy(dst, src);
9  }

関数 'read' は、任意のデータを汚染している可能性がある外部ソース (ファイル) から読み取ります。得られたバッファは、null 終了が保証されていません (ここでは、バッファの静的サイズは問いません)。strcpy が呼び出されると、src の超過範囲の読み取りおよび dst の超過範囲の書き込みの 2 つの違反が起こります。この場合、NNTS.TAINTED チェッカーは、ユーザーまたは外部デバイスからの未検証入力データが引き起こす非 null 終了文字列によるバッファオーバーフローを 2 つ検出しました。Klocwork は 8 行目の配列 'dst' について次のバッファオーバーフローレポートを生成します:非 null 終了文字列 'src' による未検証のユーザー入力が原因の 'dst' のバッファオーバーフロー類似したエラーが 8 行目の配列 'src' について報告されます。類似したエラーが 8 行目の配列 'src' について報告されます。このコードは、バッファオーバーフローとなり、セキュリティに関するさまざまな重大問題が生じる可能性があります。

拡張機能

このチェッカーは機能を拡張できます。プラットフォームとアプリケーションに固有の情報は、Klocwork knowledge base (ナレッジベース) を利用して追加できます。構成を使用して、バッファ操作を実行するシステム関数のプロパティを記述します。プラットフォーム固有の構成には、標準配布の一部として提供されているものもあります。詳細については、C/C++ 解析のチューニングを参照してください。