McAfee Advanced Threat Research(ATR)チームは、2月下旬にWeMoを使ったスマートコーヒーメーカー「Mr. Coffee」の脆弱性について詳しく説明したブログを公開しました。前回このスマートコーヒーメーカーを調査し、最終的に対策を提示するために使用したプロセスとテクニックについてはこちらのブログをご参照ください。
デバイスを調査している間に、私が再現したいと思っていた攻撃ベクトルが常に1つありました。今回のブログの執筆中に、私はついにそれを再度確認することができました。結局のところ、私の直感は正確でした。 私が発見した2番目の脆弱性ははるかに単純であり、それでも私はターゲットへのrootアクセスを得ることが可能でした。
前回報告した脆弱性の確認
最初の脆弱性では、抽出スケジュールのルールファイルの「テンプレート」セクションが変更されました。これは、ユーザーが事前に作成スケジュールを設定したときに送信される一意のファイルです。また、WeMoモバイルアプリケーションから直接コーヒーメーカーに送信されたテンプレート自体を変更する必要もありました。その調査の間、私は他のフィールドの多くにも影響を与える可能性があることに気がづいたのですが、テンプレートほど徹底的に調査はしませんでした。
ユーザーが抽出をスケジュールすると、個々のルールがMr. Coffeeのルートcrontabに追加されます。crontabエントリは、ルールの「id」フィールドを使用して、正しいルールが希望の時間に実行されるようにします。
CrontabはOSレベルから基本的なスケジューリング機能を可能にします。 図3に示すように、ユーザーは実行するためのコマンドと1分以内のタイミング詳細の両方を提供します。
最初の調査中、私はルールIDフィールドをあいまいにして始めました。ただし、悪意のあるスケジュールに入れたすべてのルール名の前に必ず「/sbin/ rtng_run_rule」が付いていたため、異常なことが起こることはありませんでした。また、コマンドインジェクションに役立つ可能性のある多くの文字がフィルタリングされていることにも気付きました。
以下は、入力時にサニタイズまたはフィルタリングされた文字のリストです。
この時点で私は先に進み、前のブログで説明したようにテンプレートの脆弱性を見つけました。
さらに、新たな脆弱性を発見
Belkinに開示して数ヶ月後、私は前述の件について公に開示する記事の準備のために、このテンプレートの誤用機能を確認するステップを再度実行しました。ルートのcrontabに直接任意のコードを書くことができる点は興味深いため、再度調べてみました。それには “ rtng_run_rule”を終了させ、“ id”フィールドを修正することによって自分のコマンドをcrontabファイルに追加する方法を見つける必要がありました。 “ rtng_run_rule”ファイルは、“ rtng_run_rule.lua”という名前のLuaスクリプトを直接呼び出すシェルスクリプトです。調査の中で二重パイプの「||」文字を送信できても、「rtng_run_rule」ラッパースクリプトが失敗したリターンコードを返さないことに気付きました。次に、ラッパースクリプトが以下に示すようにコマンドライン引数を処理している様子を調べました。
この時点で私は“-f|| touch test”という新しいルールを作成しました。“ -f”は解析された引数ではないため、“不正なオプション”の場合が発生し、“ rtng_run_rule”ラッパースクリプトは“ -1”を返します。ラッパースクリプトが失敗したリターンコードを返すと、”||”(または)ステートメントが開始され、“touch test”が実行され、“test”という名前の空のファイルが作成されます。私はまだシリアルアクセスを持っていたので(これをどのようにして達成したかについては前のブログで詳しく説明しました)、コーヒーメーカーにログインして“ test”ファイルがある場所を見つけることができました。ルートのホームディレクトリで見つけました。
ほとんどのファイルパスやWeb URLにスラッシュが必要になるため、任意のファイルを作成したり、「/」文字を付けずにコマンドを実行したりすることはやや制限されます。「/」の文字が含まれているコマンドを実行する方法を見つける必要がありました。私は自分が管理しているWebサーバーからファイルをダウンロードし、Ashでそれを実行してファイルパスのサニタイズ文字を回避することによってこれを行うことにしました。
これを分解してみましょう。 前述のように”-f”を指定すると、ラッパースクリプトは “||” コマンドを実行します。 それから、”wget”コマンドは私のWebサーバーからダウンロードを開始します。これはIPアドレス “172.16.127.31”にあります。 “-q”はwgetに受信したものだけを表示させます。ファイルの代わりにSTDOUTに出力します。 最後に、“| ash”コマンドは、STDOUTからのすべての出力を取得し、それをLinuxシェルコマンドとして実行します。
このようにして、必要なLinuxコマンドを含むファイルを単に返すサーバーをセットアップし、それを自分のローカルマシンでホストすることができます。上記のコマンドインジェクションを使用してルールを送信すると、ローカルサーバーにアクセスし、すべてをrootとして実行します。 wgetをAshにパイプするというテクニックは、すべての文字フィルタリングを迂回するので、必要なコマンドを実行することができます。
ベンダーの状況
Belkinは元のテンプレートの脆弱性を修正し、新しいファームウェアをリリースしました。しかし、このブログで説明されている脆弱性は新しいファームウェアで発見されました。この脆弱性は、2019年2月25日にBelkinに公開されているのですが、本記事を公開する時点でこの点に対応したパッチを見ることはできませんでした。マカフィーの脆弱性の開示ポリシーに従って、セキュリティの継続的な発見について消費者のみなさんにデバイスへの注意を喚起することを目的に、今回この欠陥の詳細を公開することになりました。このバグはWeMoのスケジューリング機能を使用したMr. Coffeeにも含まれていますが、テンプレートの変更やコード変更の再ハッシュを必要としないため、攻撃者にとってははるかに簡単です。
次のデモビデオはこの脆弱性について、完全にパッチが適用されたWindows10 PCを含む、ネットワーク上の他のデバイスを危険にさらすためにこの脆弱性がどのように使用される可能性があるかを示しています。
企業、消費者、およびベンダー 各々が出来ること
WeMoを搭載したMr. Coffeeなどのデバイスは、「スマートな」IoTの長所と短所を思い出させるものとして役立ちます。自動化と技術の進歩はエキサイティングな新機能を提供しますが、それらは潜在的なセキュリティ問題と比較検討されるべきです。
家庭環境では、消費者は、敏感なネットワークトラフィックやより重要なデバイスから隔離された、セグメント化されたネットワーク上にこれらの種類のデバイスを設定する必要があります。ネットワークアクセスをより困難にし、利用可能なときはいつでもすべてのネットワークデバイスにパッチまたはアップデートを適用するために、強力なパスワードポリシーを実装する必要があります。
企業は、企業環境でこのようなデバイスへのアクセスを制限するか、少なくとも監視と管理のためのポリシーを提供する必要があります。IoTデバイスは監視されていないことが多く、より重要なネットワークインフラストラクチャになるため、ネットワーク上の他の資産とまったく同じように扱う必要があります。既知の問題に対する厳密なパッチ適用サイクルと併せて、ネットワークスキャンと脆弱性評価を実行する必要があります。
ベンダーはこの脆弱性に対するCVEを提供していませんが、CVSSスコアは10点中の9.1です。このスコアはこれを重大な脆弱性として分類します。
最後に、これらの製品の消費者として、より多くのベンダーとメーカーに問い合わせる必要があります。製品が市場に出る前に、安全なコーディングと脆弱性評価の理解を深めることが重要です。脆弱性報告プログラムを実装して迅速に対応するベンダーは、消費者の信頼を得て、製品の評判が損なわれないようにすることができるのです。McAfee ATRチームの目標の1つは、今日の複雑で絶えず進化する状況の中で、幅広い範囲の脅威を識別して明らかにすることです。分析と責任ある開示を通じて、私たちはより包括的なセキュリティ体制に向けて製品メーカーを導くことを目指しています。
※本ページの内容は 2019年5月30日(US時間)更新の以下のMcAfee Blogの内容です。
原文: Mr. Coffee with WeMo: Double Roast
著者: Sam Quinn