SV.BANNED.REQUIRED.COPY
禁止されたコピー関数呼び出し
安全とは考えられない多数の C/C++ 関数があり、それを理由に '禁止された' として知られています。これらの関数を以下に示します。
- alloca などのメモリ割り当て関数
- strcat や strncat などの文字列連結関数
- strcpy や strncpy などの文字列コピー関数
- gets や _getts などの取得関数
- IsBadWritePtr などの isbad 関数
- _iota や _itow のような数値変換関数
- CharToOem のような OEM 変換関数
- _splitpath や makepath のようなパス関数
- scanf のようなスキャン関数
- sprintf や snprintf のような文字列表示関数
- strtok のような文字列トークン作成関数
チェッカーの SV.BANNED ファミリーは、禁止された関数の使用をコード内に検出します。
SV.BANNED.REQUIRED.COPY チェッカーは、安全でないコピー関数の使用にフラグを立てます。
脆弱性とリスク
これらの多くの禁止された関数は、バッファオーバーランにつながる可能性があるために禁止されました。
strcpy や strcat のような関数と同様に、禁止された関数のリストには、strncpy や strncat のような対応する 'n' 関数が多く含まれています。一致している非 'n' 関数の置換として 'n' 関数がしばしば推奨されますが、現在ではオーバーフローしたバッファの非 null 終了やオーバーフローで返るエラーが欠落しているという指摘があると考えられています。
軽減と防止
禁止されたこれらの API の使用を妨げることは、多数のコード脆弱性を排除するのに良い方法です。禁止された関数は、より安全なバージョンと置換される必要があります。そうでなければ、禁止された関数を完全に回避するため、コードを再設計する必要があります。
セキュリティに関する問題を回避するには、お使いのコンパイラについて同等で安全なものがあれば、関数の各カテゴリで同等で安全な関数を使用することをお勧めします。場合によっては、置換関数はありません。このため、コードのアーキテクチャの再構築が推奨されます。
Microsoft コンパイラユーザーの場合は、コピー関数について StrSafe ライブラリの関数の使用を検討してください。これらの関数は、StringCchCopy、StringCchCopyN、StringCchCopyEx、StringCchCopyNEx、StringCbCopy、StringCbCopyN、StringCbCopyEx または StringCbCopyNEx で、文字カウントやバイトカウントによっては異なります。
gcc ユーザーの場合は、__strcpy_chk.c や __strncpy_chk.c などの libssp ライブラリの関数の使用を検討してください。
他のオプションとしては、strcpy_s や strncpy_s などの Safe CRT 関数があります。
安全な置換関数の使用に加えて、出力先バッファが適切なサイズであるかチェックすることが重要です。オプションとして検討できることは、直接バッファを操作する代わりに、std::string テンプレートクラスを使用することです。
memcpy、RtlCopyMemory、CopyMemory、または wmemcpy 関数を使用している (これらは C の拡張ライブラリで非推奨になっており、拡張ライブラリを使用しないことによるセキュリティリスクを認識している) 場合、この KAST チェッカーの本体を次の内容で変更することで、欠陥を除外できます。
<pattern>
// CallExpr/Func::IdExpr
[ getName() = 'memcpy' ]
[ $0 := 'memcpy' ] [ $1 := 'memcpy_s' ]
[isMacroDefined('__STDC_LIB_EXT1__')]
[isMacroDefined('__STDC_WANT_LIB_EXT1__')]
</pattern>
<pattern>
// CallExpr/Func::IdExpr
[ getName() = 'RtlCopyMemory' ]
[ $0 := 'RtlCopyMemory' ] [ $1 := 'memcpy_s' ]
[isMacroDefined('__STDC_LIB_EXT1__')]
[isMacroDefined('__STDC_WANT_LIB_EXT1__')]
</pattern>
<pattern>
// CallExpr/Func::IdExpr
[ getName() = 'CopyMemory' ]
[ $0 := 'CopyMemory' ] [ $1 := 'memcpy_s' ]
[isMacroDefined('__STDC_LIB_EXT1__')]
[isMacroDefined('__STDC_WANT_LIB_EXT1__')]
</pattern>
<pattern>
// CallExpr/Func::IdExpr
[ getName() = 'wmemcpy' ]
[ $0 := 'wmemcpy' ] [ $1 := 'wmemcpy_s' ]
[isMacroDefined('__STDC_LIB_EXT1__')]
[isMacroDefined('__STDC_WANT_LIB_EXT1__')]
</pattern>
関連チェッカー
- SV.BANNED.RECOMMENDED.ALLOCA
- SV.BANNED.RECOMMENDED.NUMERIC
- SV.BANNED.RECOMMENDED.OEM
- SV.BANNED.RECOMMENDED.PATH
- SV.BANNED.RECOMMENDED.SCANF
- SV.BANNED.RECOMMENDED.SPRINTF
- SV.BANNED.RECOMMENDED.STRLEN
- SV.BANNED.RECOMMENDED.TOKEN
- SV.BANNED.RECOMMENDED.WINDOW
- SV.BANNED.REQUIRED.CONCAT
- SV.BANNED.REQUIRED.COPY
- SV.BANNED.REQUIRED.GETS
- SV.BANNED.REQUIRED.ISBAD
- SV.BANNED.REQUIRED.SPRINTF
- SV.UNBOUND_STRING_INPUT.FUNC
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。