CWE-681: 数値型間の誤った変換 (Incorrect Conversion between Numeric Types) 脆弱性概要 あるデータ型から別のデータ型(例:整数への変換)へ変換する際、データが欠落したり、予期せぬ値を生成する形で変換されることがあります。これらの結果値が機密性の高いコンテキストで使用された場合、危険な振る舞いが引き起こされる可能性があります。 影響範囲 この脆弱性は主に数値精度の損失と型変換ロジックのエラーに関わり、具体的には以下の現象として現れます。 1. 精度損失:浮動小数点数を整数に変換する際、小数部が切り捨てられる。 2. 予期せぬ丸め動作:明示的なキャストにより、意図した四捨五入ではなく、下方へ切り捨て(round down)される可能性がある。 3. 符号付き/符号なし変換エラー:関数が負の値を返すにもかかわらず、戻り値が符号なし整数(unsigned int)として宣言されている場合、負の値は巨大な正の値(例:-1 が 4,294,967,295 に変化)に暗黙的に変換され、バッファオーバーフローやロジックエラーを引き起こす可能性がある。 修正方案 不要な変換を避ける:適切なデータ型をできるだけ使用し、必要のない型変換を行わないようにする。 変換を明示的に処理する:型変換の実行前に、データ範囲を明示的にチェックし、変換後の値が期待通りに収まることを確認する。暗黙的な変換に依存しないようにする。 適切な型を使用する:変数に負の値が含まれる可能性がある場合は、符号なし整数(unsigned int)ではなく、符号付き整数(signed int)を使用する。 脆弱性コード例 (POC) 例 - 1 (Java) 例 - 2 (PHP) 例 - 3 (C/C++) 例 - 4 (C/C++)**