【STM32CubeMX + mbedTLS】自動生成される mbedtls_hardware_poll()
は脆弱
✅ 環境
- マイコン:STM32F750N8H
- ツール:STM32CubeMX v6.12.0
⚠ 問題の背景
STM32CubeMXで mbedTLS
を有効にすると、mbedtls_hardware_poll()
という関数が自動生成されます。この関数は STM32 のハードウェア RNG(HAL_RNG_GenerateRandomNumber()
)を使ってエントロピーを提供します。
ところが、そのままのコードにはセキュリティ上の問題があります。
❌ 自動生成される問題のあるコード
int mbedtls_hardware_poll(void *Data, unsigned char *Output, size_t Len, size_t *oLen)
{
uint32_t index;
uint32_t randomValue;
for (index = 0; index < Len/4; index++)
{
if (HAL_RNG_GenerateRandomNumber(&hrng, &randomValue) == HAL_OK)
{
*oLen += 4;
memset(&(Output[index * 4]), (int)randomValue, 4); // ← NG!
}
else
{
Error_Handler();
}
}
return 0;
}
🚨 何が問題なのか?
memset()
は、指定された1バイトの値でメモリを埋める関数です。
memset(ptr, value, size);
たとえば randomValue = 0xDEADBEEF
のとき、最下位バイト 0xEF
が4バイト分 Output
に書き込まれます。
つまり:
- 4バイト中、実際にランダムなのは1バイトだけ
- エントロピー(情報量)が極端に少ない
✅ 正しい修正:memcpy()
に置き換える
int mbedtls_hardware_poll(void *Data, unsigned char *Output, size_t Len, size_t *oLen)
{
uint32_t randomValue;
for (uint32_t index = 0; index < Len / 4; index++)
{
if (HAL_RNG_GenerateRandomNumber(&hrng, &randomValue) == HAL_OK)
{
memcpy(&Output[index * 4], &randomValue, 4);
*oLen += 4;
}
else
{
return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED;
}
}
return 0;
}
このようにすれば、**32ビットの乱数値を正しくエントロピーとして扱うことができ、TLS通信や鍵生成などにおけるセキュリティ要件も満たせます。
おわりに
STM32CubeMX は便利なコード生成ツールですが、生成されたコードが常に安全とは限りません。mbedtls_hardware_poll()
のようなセキュリティクリティカルな関数については、必ず内容を確認し、必要な修正を行いましょう。