PR
[画像のクリックで拡大表示]

 ボタンを押すと、Amazon.co.jpから指定した商品が2時間以内で届く─。これがAmazon Dash Button(以下Dash Button)の正しい使い方だ。しかしDash Buttonはそれだけに使うにはもったいないくらい高度な機能を持つハードウエアである。単体で無線LANに接続でき、TLSを利用した暗号化通信もこなせる。そこで、通信を解析した結果を基に、ほかの応用を試みた。具体的には、Dash ButtonのARP通信を検知し、Mac用のプレゼンテーションソフト「Keynote」でスライドのページをめくれるようにしてみた。

ARP要求を監視

 まずDash Buttonの動作をおさらいしておこう。ボタンを押すとDash Buttonが起動し、無線LANに接続する。最初にDHCPを使って、自身が利用するIPアドレスを取得する。次に無線LANルーターと通信するため、無線LANルーターのIPアドレスに対応するMACアドレスを要求する。これをARP要求という。

 その後、DNSサーバーに対して、二つのドメイン名の名前解決を依頼する。一つは購入リクエストを送信するための「dash-button-jp.amazon.com」、もう一つは時刻情報を取得するためのNTPサーバーである「time-c.nist.gov」だ。これらのIPアドレスを取得し、時刻を設定して購入リクエストを送信する。NTPサーバーにアクセスしているのは、TLSで利用する電子証明書の有効期限が切れていないかどうかをチェックする目的があると考えられる(図1)。

図1 Amazon Dash Buttonの通信シーケンス
図1 Amazon Dash Buttonの通信シーケンス
Dash Buttonでボタンを押すと、LAN内のDHCPサーバーにIPアドレスをリクエストする。次にARP要求を送信して、無線LANルーターのMACアドレスを把握する。そして、購入リクエストを送るサーバーとNTPサーバーのIPアドレスをDNSサーバーに問い合わせる。最後に、Amazon.co.jpへの購入リクエストとNTPへの時刻情報リクエストを並行して実施する。2番目の手順で発生するARP要求を監視すれば、ボタンを押したことを検知できる。
[画像のクリックで拡大表示]

 こうしたやり取りの詳細を確認するため、Dash Buttonが送受信するイーサネットフレームとIPパケットを「Wireshark」でキャプチャーした(図2)。この通信のシーケンスのうちDash Buttonから送信していることが識別できる情報を監視すれば、Dash Buttonの動作を検知できる。

図2 実際にやり取りするパケット
図2 実際にやり取りするパケット
パケットキャプチャーソフト「Wireshark」を使ってDash Buttonがやり取りするパケットを収集した。MacBook Airを無線LANのアクセスポイントとして動作させてDash Buttonを接続し、そこでWiresharkを動作させた。MacBook Airは有線LANを介してインターネットに接続している。
[画像のクリックで拡大表示]

 ここでは、Dash Buttonが発行するARP要求を監視して、ボタンが押されたことを検知することにした。

 ARPを捕捉するこの方法は「ARPスニファー」と呼ばれ、対象機器のIPアドレスやMACアドレスから機種を判別する攻撃手法の一つとしても利用されている。

Dash Buttonの設定を中断

 それでは、ARPを監視する仕組みを利用してDash Buttonをハックしよう。まずDash Buttonの初期設定を途中で終わらせる。目的はARPを監視することだけなのに、ボタンを押した際に実行される処理が完了してしまうと、商品を購入してしまう。そこで設定の最後の商品選択画面で、設定を行わず×ボタンを押して終了させる(図3)。これで、Dash Buttonを無線LANに接続するが商品は購入しないという状態にできる。

図3 ARPを監視する場合はDash Buttonの初期設定を途中でやめる
図3 ARPを監視する場合はDash Buttonの初期設定を途中でやめる
ボタンを押すたびに商品を購入してしまうと困るので、Dash Buttonの設定を商品購入設定画面で強制的に終了する。こうすると、ボタンを押しても実際に商品を購入せずに済む。
[画像のクリックで拡大表示]

 設定を完了した場合でも完了しなかった場合でも、ボタンを押すとDash Buttonはネットワークに接続する。パケットをキャプチャーして両者の状態を比較すると、通信内容は変わらなかった。つまり、Dash Buttonは「ボタンを押した」というイベント情報だけをサーバーに送信し、購入する商品の情報はサーバー側で保持していると考えられる。

プログラムはわずか10行

 ではDash Buttonをスライドめくりに利用するアプリを作成しよう。Dash Buttonを押すと、MacBook Airで動くKeynoteのプレゼンテーションのページが送られる(図4)。実際の動作の様子は、YouTubeの動画で紹介している(図5)。

図4 Amazon Dash Buttonでプレゼンテーションのスライドを制御
図4 Amazon Dash Buttonでプレゼンテーションのスライドを制御
プレゼンテーションソフトは、パケットキャプチャーを実施しているMacBook Airで動かした。このパソコンに接続したDash ButtonがARPパケットを送出するのを、Node.jsで記述したプログラムで追跡する。ARPパケットの送出を検出したら、プレゼンテーションソフトのスライドのページを送る。
[画像のクリックで拡大表示]
図5 Dash Buttonを使ってスライドのページをめくっているところ
図5 Dash Buttonを使ってスライドのページをめくっているところ
ボタンを押すたびにスライドが1枚ずつ進んでいく。実際の動作はYouTubeのページ(https://www.youtube.com/watch?v=pKFglwUm6RU)で公開している。ここに示したのはその動画をキャプチャーした画面。
[画像のクリックで拡大表示]

 ARPの監視はJavaScriptのプログラムで実施した。JavaScriptの実行環境には「Node.js」を利用した。Dash Buttonを利用するためのプログラムをJavaScriptで記述している。ARPの監視には、Node.jsに対応した「node-dash-button」というモジュールを利用した。

 JavaScriptで記述したプログラムのソースコードを図6に示した。わずか10行のシンプルなプログラムである。node-dash-buttonに加え、スライドのページ送りを行う「slideshow」というモジュールを使った。なおslideshowは一部修正したため、筆者のGitHubアカウントで修正版のソースコードを公開している

図6 JavaScriptで記述したプログラム
図6 JavaScriptで記述したプログラム
公開されている「node-dash-button」と「slideshow」というモジュールを使った。
[画像のクリックで拡大表示]

 ここで利用したnode-dash-buttonモジュールは、MACアドレスを調べる「findbutton」というコマンドを備えている。プログラム内に記述しているDash ButtonのMACアドレスは、このコマンドを利用して調べた。

ボタン操作を容易に偽装できる

 このように、ARP監視は比較的手軽に実現できる。ただし、二つの問題点がある。

 まず、スマートフォンのAmazonアプリに大量の通知が来てしまう点だ(図7)。Dash Buttonを最後まで設定せずに利用しているため、ボタンを押すたびにAmazonアプリに「設定未完了」の通知が送られてくる。この通知をボタンの監視に利用する方法もないわけではないが、ボタンを押すたびに通知が来るのはわずらわしい。これらの大量の通知によって他の重要な通知が埋もれてしまうという実用上の問題もある。

図7 Amazonアプリに連続的に通知が届く
図7 Amazonアプリに連続的に通知が届く
課題は、Dash Buttonの設定を完了させずに利用しているので、ボタンを押すたびにスマートフォンのAmazonアプリに「設定未完了」の警告が届く点。またARPは偽装可能なため、ボタンを押さなくても別の機器が偽装ARPを送ればイベントを実行できてしまうという問題もある。
[画像のクリックで拡大表示]

 もう一つが、比較的簡単にボタンを押したと誤認させられる点だ。Dash ButtonのMACアドレスを偽装したARPをネットワークに送れば、図6のプログラムはボタンが押されたと勘違いする。ARPには認証や暗号化などの仕組みが存在しないため、このように容易に偽装できる。

広がるDash Buttonの可能性

 こうした問題があるとはいえ、ARPによる監視は簡単に実装できる点が魅力だ。複雑なハードウエアを作らなくても、Dash ButtonのようなデバイスさえあればIoTアプリケーションを手元で簡単に実現できる。

 例えば、ボタンを押したときにLEDを点灯させるといったローカルな処理だけでなく、「ボタンを押した」というイベントをネットワークに流すこともできる。ARP監視を受け取ったパソコンで、HTTPやMQTTといった別のプロトコルを使ってイベントを発行すればいい。

 こうしたARP監視の手法を使った様々なアプリケーションが有志によって開発されている。例えば、Dash Buttonで照明を制御したりピザを注文したりといった試みがインターネットで紹介されている。参考になる動画や資料も公開されているので、誰でも簡単に始められるだろう。

 ここで取り上げたスライドめくりに限らず、照明の点灯/消灯などシンプルな「押す」という動作で実現できるものは多い。Dash Buttonを利用すると、この「押す」という動作をネットワークにイベントとして通知できる。買い物だけに使うのはもったいないデバイスだ。

▼TLS
Transport Layer Securityの略。SSLの後継プロトコルで、電子証明書を使った相互認証と暗号化を実施する。
▼ARP
Address Resolution Protocolの略。MACアドレスを知るためのプロトコル。インターネットのアドレスであるIPアドレスから、LANが利用するMACアドレスを調べるために使う。
▼DHCP
Dynamic Host Configuration Protocolの略。端末が利用するIPアドレスを、サーバーが管理して動的に割り当てる仕組み。
▼MACアドレス
MACはMedia/Medium Access Controlの略。無線LANやイーサネットにおける所在地を表す。
▼DNSサーバー
DNSはDomain Name Systemの略。IPネットワークで名前解決をするためのサーバー。
▼名前解決
「www.amazon.com」や「www.nikkeibp.co.jp」といったドメイン名から、IPアドレスを知ること。
▼NTPサーバー
NTPはNetwork Time Protocolの略。IPネットワークで時刻合わせをするためのサーバー。
▼Wireshark
オープンソースのパケットキャプチャーソフト。入手先はhttps://www.wireshark.org/。
▼MacBook Air
OSはmacOS Sierra(10.12.3)である。
▼YouTubeの動画
URLはhttps://www.youtube.com/watch?v=pKFglwUm6RU。
▼Node.js
利用したバージョンは6.10.0。
▼修正版のソースコードを公開している
URLはhttps://github.com/hirotakaster/slideshow。
▼IoT Internet of Thingsの略。
▼HTTP HyperText Transfer Protocolの略。Web閲覧で使われているプロトコル。
▼MQTT MQ Telemetry Transportの略。デバイス間通信で使われるプロトコル。IoT機器でよく使われる。