2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【STM32CubeMX + mbedTLS】自動生成される `mbedtls_hardware_poll()` は脆弱

Posted at

【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() のようなセキュリティクリティカルな関数については、必ず内容を確認し、必要な修正を行いましょう。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?