NUM.OVERFLOW.DF.UNBOUNDED
制約のない値に起因する数値オーバーフローまたはラップアラウンドの可能性
NUM.OVERFLOW.DF.UNBOUNDED チェッカーは、算術演算において数値オーバーフローやラップアラウンドが発生する可能性を検出します。具体的には、型の全範囲を取り得る制約のない(信頼できない)関数パラメータなど、制約のない値が関与することで境界値に達してしまうケースが対象となります。
このチェッカーは、NUM.OVERFLOW.DF と同じオーバーフロー解析メカニズムを使用しています。これら2つのチェッカーが報告する欠陥の集合は互いに重複しません:
-
NUM.OVERFLOW.DF は、信頼された境界におけるオーバーフローを報告します(例:具体的な定数値によって境界を超える場合など)。
-
NUM.OVERFLOW.DF.UNBOUNDED は、制約のないパラメータや、型の全範囲をフォールバック値とする値など、信頼できない値のみを経由して境界を超過するオーバーフローを報告します。
これらのケースを区別することで、具体的な値によって生じるオーバーフローとは独立して、信頼できないソースに起因するオーバーフローをトリアージしたり、抑制したりすることが可能になります。
脆弱性とリスク
数値オーバーフローが発生すると、未定義の動作につながる結果が生じる可能性があります。さらに、オーバーフローはプログラムの信頼性やセキュリティを損なう恐れがあります。
脆弱コード例
unsigned char checkOverflowUnbounded(unsigned char c)
{
unsigned char r;
r = (unsigned char)(c + 1);
return r;
}
この例では、Klocworkは4行目でNUM.OVERFLOW.DF.UNBOUNDEDという欠陥を報告します。変数cは制約のないパラメータであるため、その値はunsigned char型の全範囲である[0, 255]を取り得ます。したがって、式c + 1は256に達する可能性があり、これはunsigned char型の上限を超過することになります。この超過は信頼できない入力に起因して発生するため、NUM.OVERFLOW.DFではなくNUM.OVERFLOW.DF.UNBOUNDEDとして報告されます。
修正コード例
unsigned char checkOverflowUnbounded(unsigned char c)
{
unsigned char r;
if (c < 255U) {
r = (unsigned char)(c + 1);
} else {
r = c;
}
return r;
}
この準拠ソリューションは、加算の結果が unsigned char の範囲を超えないように保護します。
関連チェッカー
- NUM.OVERFLOW
- NUM.OVERFLOW.DF
-
MISRA.COMP.WRAPAROUND
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。
拡張機能
このチェッカーは拡張できません。