ESP32をポートスキャンしてみる

 脆弱なIoT機器を総務省が洗い出すという報道を受けて、適当に作っている自作IoT機器の状況を確認すべく実験してみることにしました。
 私の自作IoTデバイスは直接インターネットにつながっているわけではなく、ルーターに守られたLAN内に接続しているだけですので、直接的な脅威は及ばない想定ですが、念のため調査してみます。

 Arduino IDEでも簡単に開発できるESP32(ESP-WROOM-32)にはWiFi/Bluetooth通信機能があります。
 このWiFi機能を使用してサーバーを構築した場合に、LAN内からポートスキャンするとどのように見えるか確認しました。
 

前提

f:id:kachine:20171112051053j:plain

 

ポートスキャン結果

 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が動くシングルボードコンピュータとサーバソフトウェアを使った方がアップデートも容易で管理しやすいのではないかと思います。
 



以上。

*1:なお、ESP32のWiFiは2.4GHz帯にしか対応していないこともあってか、全ポートスキャンには軽く1時間以上かかりました。

*2:併記されている機器群は、ESP32やESP8266を内部に使用していそうな機器が多いように思えます。

*3:自作コード内で認証/認可を行っている場合などは、その実装に脆弱性が無いかの検証は別途必要です。