IO-DATA 製レコーディングハードディスクにおけるクロスサイトリクエストフォージェリ(CSRF)の脆弱性が修正された

2016 年 8 月 8 日、アイ・オー・データ機器のレコーディングハードディスクにおけるクロスサイトリクエストフォージェリ(CSRF)の脆弱性(JVN#35062083)が修正されました。2016 年 1 月 3 日、僕は HVL-A2.0 でこの脆弱性を発見し、IPA に報告しました。そして、7 ヶ月後に関連製品を含めて当該脆弱性が修正されました。
この日記では、この脆弱性について下記 4 点をまとめました。

  • 脆弱性があった機能
  • 再現手順
  • 製品開発者による修正
  • 報告から取扱終了までの時系列

脆弱性があった機能

レコーディングハードディスク「RECBOX HVL-A2.0」には、保存しているコンテンツを操作できる WebUI 機能(下図)があります。この WebUI にはユーザ認証がなく、この機能の URL にアクセスできれば誰でも利用できます。


当該 WebUI で動画コンテンツを選択して、[削除] (画面上部を参照) を実行すると、Web ブラウザが /dms/transfer_tool/api/remove に POST リクエストを送信します。HTTP Body の「id」パラメータは、動画コンテンツの識別子を指します。

POST /dms/transfer_tool/api/remove HTTP/1.1
Host: 192.168.0.220:55247
Content-Length: 11
Accept: */*
Origin: http://192.168.0.220:55247
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://192.168.0.220:55247/dms/doc/transfer_tool/transfer_tool.html?20151071356
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.8,en;q=0.6
Connection: close

id=FS-13936

指定した動画コンテンツの削除に成功すると、当該製品は HTTP レスポンスコード 200 を応答します。

HTTP/1.1 200 OK
Server: Linux/2.6.31.8 UPnP/1.0 DiXiM/5.0
Date: Sun, 21 Aug 2016 03:21:44 GMT
Connection: close
Content-Type: application/json
Access-Control-Allow-Origin: *


この動画コンテンツの削除機能に CSRF脆弱性*1が存在しました。この HTTP リクエストに秘密情報を含んでいません。また XMLHttpRequest における Origin ヘッダおよびカスタムヘッダの検証(参考1, 参考2)も実施していませんでした。したがって、当該製品の利用者が罠サイトを閲覧すると、任意の動画コンテンツを削除する CSRF 攻撃を受ける恐れがありました。

再現手順

手順 1 から 4 で、当該製品に対する CSRF 攻撃を再現できます。この CSRF 攻撃を実現するためには、攻撃者が「削除対象コンテンツ ID」と「当該製品の IP アドレス」を推測する必要があります*2

  1. 削除対象コンテンツが存在することを確認する
    • http://当該製品のIPアドレス:55247/dms/transfer_tool/api/browse?id=FS-4&starting_index=0&requested_count=0
    • パラメータ id の「FS-4」は、削除対象コンテンツを格納しているフォルダのコンテンツ ID を指す
  2. 罠サイトに実証コードを配置する
  3. 当該製品の利用者を罠サイトに誘導する
  4. 改めて手順 1. を実施して、削除対象コンテンツが存在しないことを確認する
削除対象コンテンツ ID

脆弱性報告時の動画コンテンツ ID の分布*3をふまえると、動画コンテンツ ID を総当たりに試行すれば、現実的に任意の動画コンテンツを削除できる可能性があると判断しました。

当該製品の IP アドレス

WebRTC 実装仕様を利用することで、当該製品の IP アドレスを特定できると判断しました。

まず当該製品は、初期設定で DHCP サーバから IP アドレスを取得するよう設計されており、当該製品と利用者の PC が同一 LAN に接続する使い方が一般的だと考えます。また、Google Chrome および Mozilla Firefox の WebRTC 実装には、JavaScript からローカルホストの IP アドレスを取得できる仕様があります*4。そこで、Web ブラウザが動作するローカルホストの IP アドレスを取得して、同一 LAN の IP アドレスに対して当該製品の固有情報の有無(例:特定 URI の画像ファイル)を試行すれば、当該製品の IP アドレスを特定できます。

実際に Buffer NAS に対する Exploit コードをもとに、実証コード:cve-2016-4845_csrf-delete-withWebRTC_poc.htmlを準備しました。

製品開発者による修正

当該製品の最新バージョン 2.04 を確認したところ、/dms/transfer_tool/api/remove に対する POST リクエストの HTTP Body に「token」パラメータが追加されていました。この修正によって、攻撃者がこの「token」パラメータの値を推測できない限り、CSRF 攻撃が成功しなくなりました。

POST /dms/transfer_tool/api/remove HTTP/1.1
Host: 192.168.0.220:55247
Content-Length: 81
Accept: */*
Origin: http://192.168.0.220:55247
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://192.168.0.220:55247/dms/doc/transfer_tool/transfer_tool.html?201607211648
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.8,en;q=0.6
Connection: close

id=FS-1411&token=BQQGBgIPBwMi%2Fl6%2B4d4QwZyLDbj8Syiy9XPvxOMTMOAAIXC8c34b0g%3D%3D

報告から取扱終了までの時系列

年月日 事柄
2016年1月3日 IPA脆弱性を報告
2016年1月4日 IPA から届出情報受信の連絡
2016年1月8日 IPA から届出情報受理の連絡
2016年2月4日 IPA から「JPCERT/CCによる製品開発者への連絡開始」の連絡
2016年2月20日 IPA に追加の実証コードを送付
2016年8月3日 製品開発者が当該脆弱性を修正したファームウェア 2.04 を公開
2016年8月8日 JVN における脆弱性情報の公表

さいごに

脆弱性を修正いただいた(株)アイ・オー・データ機器、報告から修正および取扱終了まで調整いただいた IPA および JPCERT/CC、ご対応ありがとうございました。

参考情報

  • ブラウザハック
    • 9.3 クロスオリジンでの Web アプリケーションの特定, 第 9 章 Web アプリケーションに対する攻撃
    • フックしたブラウザの内部 IP アドレスの特定, 10.1 標的の特定, 第 10 章 ネットワークに対する攻撃

*1:厳密には CSRF脆弱性と言えません。IPA安全なウェブサイトの作り方」およびOWASPにおける CSRF の定義では「ログイン状態のユーザ」を規定しています。しかし、この脆弱性はその定義を満たしません(当該機能にはログイン機構が存在しないため)。便宜上、この日記では CSRF脆弱性と呼称します。

*2:この再現手順では削除対象コンテンツ ID を「FS-6411」、当該製品の IP アドレスを「192.168.0.220」としています。

*3:2016/01/02 時点で FS-108 から FS-8781 の範囲に 671 の動画コンテンツが分布していました

*4:2016 年 1 月 3 日報告時点で、Chrome 47.0.2526.106 m および Firefox 43.0.1 を使いローカルホストの IP アドレスを取得できることを確認済み