ESP32をポートスキャンしてみる
脆弱なIoT機器を総務省が洗い出すという報道を受けて、適当に作っている自作IoT機器の状況を確認すべく実験してみることにしました。
私の自作IoTデバイスは直接インターネットにつながっているわけではなく、ルーターに守られたLAN内に接続しているだけですので、直接的な脅威は及ばない想定ですが、念のため調査してみます。
Arduino IDEでも簡単に開発できるESP32(ESP-WROOM-32)にはWiFi/Bluetooth通信機能があります。
このWiFi機能を使用してサーバーを構築した場合に、LAN内からポートスキャンするとどのように見えるか確認しました。
ポートスキャン結果
LAN内からESP32の全ポートに対してNmapでポートスキャンしてみた結果は以下の通り*1。
Nmap scan report for 192.168.***.*** Host is up (0.13s latency). Not shown: 65534 closed ports PORT STATE SERVICE 60000/tcp open unknown Nmap done: 1 IP address (1 host up) scanned in 5256.11 seconds
WiFiServerインスタンス生成時に指定したポート(ここではTCP#60000)のみ開いており、意図しないポートが開いていないことが確認できます。
OS検出オプションを指定してポートスキャンしてみた結果は以下の通り。
Nmap scan report for 192.168.***.*** Host is up (0.15s latency). All 1000 scanned ports on 192.168.***.*** are closed MAC Address: 30:AE:A4:**:**:** (Unknown) Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port Aggressive OS guesses: 2N Helios IP VoIP doorbell (95%), British Gas GS-Z3 data logger (95%), Espressif WiFi system-on-a-chip (95%), Grandstream GXP1105 VoIP phone (95%), LaSAT satellite receiver (95%), lwIP 1.4.0 lightweight TCP/IP stack (95%), Milight WiFi Receiver bridge (95%), NodeMCU firmware (lwIP stack) (95%), Philips Hue Bridge (lwIP stack v1.4.0) (95%), Philips Hue Bridge (lwIP stack) (95%) No exact OS matches for host (test conditions non-ideal). Network Distance: 1 hop OS detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 88.93 seconds
MACアドレスは30:AE:A4でベンダはEspressif Inc.と判るはずですが、NmapではUnknownと出ました。
一方で、Espressif WiFi system-on-a-chip (95%)と推定できるだけのDBがNmapにはあるようです*2。もちろん、ESP32は所謂OS的なものは無くてファームウェアというか組み込みコードしかありませんが、それでもフィンガープリンティングには十分な特徴があるようです。
まとめ
Arduino Coreで動作するESP32には意図しないポートが開いていたりすることはありませんでした*3。
一方で、このデバイスがEspressif WiFi system-on-a-chipを使用した機器であることは高い確度で推定可能なことも判ります。LAN内だけではなく、インターネットに曝した状態で使用する場合には、自作コードの脆弱性だけではなくEspressifのライブラリ自体に脆弱性が無いかについても十分に注意する必要があります。
といったことを、機器を運用している間、注意し続けるのかなり大変だと思えます。脆弱性検出時にアップデートしようにも、機器を回収してArduinoIDE等から再度ソフトウェアを書き込み直す必要があり、ネットワーク経由でアップデートできるわけでもありません(そこまで自力で作り込めば話は別ですが)。このような観点から、インターネットに公開するのであれば、RaspberryPiに代表されるようなLinuxが動くシングルボードコンピュータとサーバソフトウェアを使った方がアップデートも容易で管理しやすいのではないかと思います。
以上。