ラック・セキュリティごった煮ブログ

セキュリティエンジニアがエンジニアの方に向けて、 セキュリティやIT技術に関する情報を発信していくアカウントです。

株式会社ラックのセキュリティエンジニアが、 エンジニアの方向けにセキュリティやIT技術に関する情報を発信するブログです。(編集:株式会社ラック・デジタルペンテスト部)
/ セキュリティブログ / セキュリティエンジニア /
当ウェブサイトをご利用の際には、こちらの「サイトのご利用条件」をご確認ください。

デジタルペンテスト部提供サービス:ペネトレーションテスト

ESP32の隠しコマンドを試してみた

免責事項

当記事の内容は教育・学習およびセキュリティの向上目的で執筆されており、サイバー攻撃行為を推奨するものではありません。​
三者が所有する資産に管理者の許可なく攻撃行為を行うと各種の法律に抵触する可能性があります。​
当記事の内容を使用して起こるいかなる損害や損失に対し、当社は一切責任を負いません。​
※当記事の検証では自社で保有している環境を使用しております。試行する際は自身の所有する環境に対して実施してください。

はじめに

デジタルペンテスト部のν(ニュー)です。

先日、以下のような記事が公開され、話題となっています。

www.itmedia.co.jp

www.tarlogic.com

ESP32は身近な機器でも多く使用されており、IoT家電などでよく見かけることがあります。    
また、安価にモジュールが手に入り、開発環境も無償のため、趣味の電子工作などにも使われることが多いです。

この隠しコマンドについては脆弱性としても公表されており、資料を確認したところ検証が比較的容易そうであったため、検証を行いました。

脆弱性の概要

ESP32のBluetooth HCIには、以下の操作を行える非公開のベンダー固有コマンドが存在します。

CVE番号:CVE-2025-27840
CWE:CWE-912(非公開の機能)
CVSS:6.8(CVSS 3.1、ベーススコア)

検証環境

検証環境は以下の図のような環境です。

検証環境

検証用PCは、BlueZがインストールされたLinuxです。

ESP32の評価ボードである、ESP32-DevKitCには開発環境に付属のサンプルの、ESP-IDF UART HCI Controllerをベースとしたプログラムを書き込みました。

github.com書き込み後、以下のコマンドでUSB-シリアル変換経由で出ているBluetooth HCIのUARTをBluetoothバイスとして認識させます。

$ sudo btattach -B <USB-シリアル変換のデバイス> -S <速度> -P h4 -N

(-Nはフロー制御を無効にした場合に必要)

正常に認識すれば、hciconfigコマンドで以下のようにESP32が認識されるはずです。


$ hciconfig
hci1: Type: Primary Bus: UART
BD Address: 30:AE:A4:xx:xx:xx ACL MTU: 1021:9 SCO MTU: 255:4
UP RUNNING
RX bytes:4071 acl:0 sco:0 events:321 errors:0
TX bytes:5642 acl:0 sco:0 commands:321 errors:0

これで、BlueZのBluetooth HCI Protocolを使用して好きなコマンドをESP32に対して発行することができます。

発表スライドには、隠しコマンドの一部のオペコードが記載されており、例えばメモリ読み出しコマンドは0xFC01です。
今回は、プログラムに予め仕込んでおいた秘密の文字列を、このメモリ読み出しコマンドを使用して読み取ってみます。
秘密の文字列のアドレスと内容は以下の通りです。


(gdb) x/22c 0x3f403c3c
0x3f403c3c: 77 'M' 89 'Y' 32 ' ' 84 'T' 79 'O' 80 'P' 32 ' ' 83 'S'
0x3f403c44: 69 'E' 67 'C' 82 'R' 69 'E' 84 'T' 32 ' ' 83 'S' 84 'T'
0x3f403c4c: 82 'R' 73 'I' 78 'N' 71 'G' 33 '!' 0 '\000'

Bluetooth HCI Protocolを使用して、メモリ読み出しコマンドを発行するプログラムを作成しました。
省力化のため、コードの大半を生成AIで生成した後に、メモリ読み出しコマンドのオペコードとパラメータを自分で入れています(パラメータの詳細は割愛します)

その後、WiresharkでESP32のBluetooth HCIをキャプチャしながらプログラムを実行し、秘密の文字列を読み出せていることを確認しました。

メモリ読み出しコマンド経由での、秘密の文字列の取得

脆弱性の評価

ESP32のBluetooth HCIのUARTは、通常の場合外部へ出ていることはなく、明示的にそのようにピンへの割り付けを設定しない限り発生しません。
また、仮に外部へ出ていたとしてもCVSSの評価通り、悪用には物理アクセスが必要になります。
実環境を想定した場合、通常Bluetoothの制御は内部で完結しているため、ほとんどの環境では影響を受けないと考えられます。

また、この脆弱性について開発元のEspressifは声明を発表しており、開発用のコマンドであること、また将来的には隠しコマンドは削除されることが示されています。

www.espressif.com