マシン・ツー・マシン(M2M)技術における設計および実装上の脆弱性

トレンドマイクロは、David Quarta氏と共同で執筆したリサーチペーパー「The Fragility of Industrial IoT’s Data Backbone: Security and Privacy Issues in MQTT and CoAP Protocols」において、マシン・ツー・マシン(M2M)の通信プロトコル「MQTT」および「CoAP」に関する調査結果を公開しました。「MQTT」は産業用アプリケーションにおいて、「CoAP」はIoTや産業用IoTのデバイスにおいて、広く採用されているプロトコルです。攻撃者は、これらのプロトコルの設計および実装上の脆弱性を利用することにより、対象デバイスを「Denial of Service(DoS、サービス拒否)」状態に陥れることが可能になります。また、今回の調査を通して、設定に不備のある数十万台のホストが、認証情報、機密情報および産業に関連した処理データを露出していることも確認されました。

本記事では、問題の通信プロトコルの課題について技術的な側面から詳細に解説します。調査から明らかになった MQTT と CoAP の現状の課題はほとんど認識されていません。しかし、それらを悪用することにより、攻撃者は、事前調査や情報探索、遠隔操作、そして標的型攻撃にわたるさまざまな攻撃を実行することが可能になります。

■M2M通信を支える技術:「MQTT」と「CoAP」

「Message Queuing Telemetry Transport(MQTT)」は、ブローカーと呼ばれるサーバが 1 対多の通信を仲介するパブリッシュ/サブスクライブ型の通信プロトコルです。トレンドマイクロは、このプロトコルの仕様とソフトウェアの実装にセキュリティ上の課題があることを確認しました。MQTT は、産業用アプリケーションにおいて自動化などのために広く採用されているため、業務上必要不可欠な M2M 通信に重大な問題を引き起こす可能性があります。

一方、クライアントサーバ型の通信プロトコル「Constrained Application Protocol(CoAP)」は、性能や消費電力に制約のあるノードに対して、HTTP と同等の通信を可能にします。比較的新しい規格であるにもかかわらず、CoAP は今日すでに多くの「モノのインターネット(Internet of Things、IoT)」および「産業用 IoT(Industrial Internet of Things、IIoT)」デバイスのソフトウェアに実装されています。CoAP は「User Datagram Protocol(UDP)」に基づく通信プロトコルであり、今回明らかになったセキュリティ課題も、ノード同士の接続を確立しない「コネクションレス」な UDP の性質に主に由来しています。そのようなセキュリティリスクについては、CoAPの標準規格を定めた「Request for Comments(RFC)」でも十分に強調されていますが、トレンドマイクロは CoAP サービスで増幅型の攻撃が可能であることを実証し、その最大増幅率を推計しました。

■設計上のセキュリティ課題

MQTT:「Topic」文字列の処理における課題

MQTT の標準規格には、実装に応じた特定の条件で脆弱性が顕在するような不備が含まれています。その 1 つが、「Topic」に含まれた Unicode の処理に関する脆弱性です。Topic とは、メッセージを識別するための「/」で区切られた文字列(図 1 の例では「/room/temp=27C」)です。MQTT の標準規格では、Topic 文字列のバリデーションの結果、許可されていない「Unicode Transformation Format-8(UTF-8)」のコードポイントが確認された際に、接続を終了するかどうかは開発者の判断に委ねられています。そのため、もしブローカーが、標準規格に従わずにUTF-8 のバリデーションを行わない場合、不正なクライアントはこの不整合を利用し、無効な文字列を含む文字列を送信することによって他のクライアントの接続を切断することが可能です。

「Topic」文字列の処理に関する実装のパターンとその結果
図 1:「Topic」文字列の処理に関する実装のパターンとその結果

ブローカーが標準規格に従っている場合、問題は発生しません。興味深いことに、ブローカーとクライアントの両方が標準規格に従っていない場合も問題は発生しません。しかし、ブローカーが標準規格に違反して無効な文字列を通過させ、クライアントが標準規格に従っていた場合、このクライアントは無効な文字列を含むメッセージを受信すると通信を切断してしまいます。

ブローカーが標準規格に違反している場合、不正なクライアントは、最後に送信されたメッセージを保存する「Retain」機能を有効にし、到着保証の程度を定義する「Quality of Service(QoS)」を「2」に設定したメッセージを 1 件送信するだけで、すべてのクライアントを切断状態にすることが可能です。

不正なクライアントはバリデーションを利用し、ノードを切断状態にすることが可能
図 2:不正なクライアントはバリデーションを利用し、ノードを切断状態にすることが可能

無効なUTF-8を含むメッセージを受信したクライアントは、接続を切断し、受信したことをブローカーに伝える「ACK」応答を返しません。これにより、ブローカーは当該クライアントがメッセージを受信していないと判断し、Retain 機能によって保存されたメッセージを繰り返し送信することになります。このような挙動は、Retain機能の有効化と「QoS = 2」という設定のためです。この事例では、意外にも標準規格に違反することがクライアントにとっての最善の対処法となります。

■実装上のセキュリティ課題

実装上のセキュリティ課題の例として、MQTT については遠隔からのコード実行脆弱性「CVE-2018-17614」を、CoAP については、実証実験に成功した増幅型攻撃について解説します。

MQTT:ペイロードの残り文字数に関する脆弱性「CVE-2018-17614」

CVE-2018-17614 は、人気のある MQTT クライアントライブラリに存在する脆弱性です。このライブラリには残り文字数を表す「remaining length」フィールドをチェックするコードが実装されておらず、無制限の書き込みが可能な状態でした。攻撃者はこの脆弱性を利用し、問題の MQTT クライアントを利用する脆弱なデバイスでバッファオーバーフローを引き起こし、任意のコード実行が可能です。このような攻撃が成立する条件は、攻撃者がブローカーを操作できること、あるいはブローカーが「remaining length」フィールドに対して適切なチェックを行わずそのままパブリッシャからサブスクライバにメッセージを伝達してしまうことのどちらかです。

この脆弱性は、「MQTTPUBLISH」パケットを構文解析する際、より正確には「remaining length」および「topic length」フィールドを読み取る際にバッファオーバーフローを発生させることで利用可能です。このバッファオーバーフローによって「callback」フィールドの上書きが可能になります。さらに、この上書きは、攻撃者が望む限り何度でも繰り返すことができるため、持続的に DoS 状態を引き起こすような攻撃や、任意のコードを実行させつづけるような攻撃が可能になります。

トレンドマイクロは、脆弱性発見・研究コミュニティ「Zero Day Initiative(ZDI)」のセキュリティ勧告を通して当該ライブラリの開発者に情報開示しました。この通知の時点ですでに、脆弱性の修正に関する議論がなされていましたが、実装方法について合意することができず、検討と追加の修正が続いていました。上述のように、無効なパケットを受信した際に、接続を終了するのか、あるいは問題のパケットを取り除いて接続を維持するのかは開発者次第です。この事例は、仕様の曖昧さが混乱を招く格好の例だと言えます。

CoAP:IP アドレスのなりすましおよび増幅型攻撃

CoAP の抽象化レイヤリング
図 3:CoAP の抽象化レイヤリング
(図は「Internet Engineering Task Force(IETF)」の文書に基づいて作成)

上述したように、CoAP は、UDP に基づく通信プロトコルであるため、本質的に IP アドレスのなりすまし攻撃を受けやすいという性質を持ちます。「Transmission Control Protocol(TCP)」とは異なり、UDP には 2 つのエンドポイントが接続を識別するシークエンスナンバーについて合意するハンドシェイクの過程が存在しません。これは、攻撃者があるエンドポイントに対して送信元 IP を偽装した UDP パケットを送信した場合、このエンドポイントにはパケットの送信元を検証する手段が無いということを意味します。つまり、もし自動化されたシステムが、送信元の偽装に対処する機能を備えていない場合、UDP パケットのヘッダ情報をそのまま信用し、その結果不正なパケットの指示通りに挙動してしまうことになります。

CoAP には、増幅型攻撃の可能性というリスクも存在します。テスト用の CoAP クライアントおよび CoAP サーバのネットワークを使用した実験では、ペイロードのサイズを増加させる増幅型攻撃を実証することに成功しました。また、増幅率の最大値についても推計しました。

CoAP は、UDP とリクエスト/レスポンスに基づく通信プロトコルであり、レスポンスのサイズはリクエストよりもはるかに大きなサイズになり得ます。トレンドマイクロは、その増幅率を最大 32 倍と見積もっています。つまり、1Mbpsの通信が可能な攻撃者は、対象に 32Mbps のパケットを送り込むことが可能です。この数字は、おおよそ「Domain Name System(DNS)」を利用した増幅型攻撃の増幅率と、「Simple Service Discovery Protocol(SSDP)」を利用した攻撃の増幅率との中間程度の増幅率です。

CoAP の仕様を詳しく見てみると、「block-wise transfer」に対応していることが分かります。これは、大きなサイズのレスポンスは、より小さなサイズのレスポンスに分割できることを意味します。興味深いことに、仕様には「Both sides have a say in the block size that actually will be used.」とあります。これは、攻撃者は、ブロックサイズを最大値に指定したリクエストパケットの作成が可能であることを意味します。通常、CoAP のノードはリソースが限られていることを考えると、増幅係数が32倍になるような増幅型攻撃は、十分効果的なものになると言えるでしょう。

本記事で解説したセキュリティ課題の詳細、各産業分野への影響、調査を通して得られたその他の知見についてはリサーチペーパー「The Fragility of Industrial IoT’s Data Backbone: Security and Privacy Issues in MQTT and CoAP Protocols」を参照してください。また、こちらのページではデモ動画(英語)の視聴が可能です。

参考記事:

翻訳: 澤山 高士(Core Technology Marketing, TrendLabs)