BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Zip Slipディレクトリトラバーサル脆弱性の影響は多くのJavaプロジェクトに

Zip Slipディレクトリトラバーサル脆弱性の影響は多くのJavaプロジェクトに

原文(投稿日:2018/06/05)へのリンク

A note to our readers: You asked so we have developed a set of features that allow you to reduce the noise: you can get email and web notifications for topics you are interested in. Learn more about our new features.

オープンソースとクラウドのセキュリティモニタリング企業であるSnyk社Zip Slip開示した。これは任意のファイルを上書きする脆弱性で、パスをトラバースするファイル名を持つ、巧妙に作られたZIPアーカイブを使い弱点を突いている。脆弱性は何千ものプロジェクトに影響を与え、そこにはEclipse用のAWSツールキットSpring IntegrationLinkedInのPinot OLAPデータベース、Apache/TwitterのHeron、AlibabaのJStormJenkinsGradleが含まれる。問題はほかのクラウドプロバイダにも見られ、InfoQは情報がさらに公開されればこの投稿を更新する予定だ。

このベンダによると、Javaに高レベルのファイルアーカイブ処理を持った中心となるライブラリが欠けているということは、Javaのjava.util.zipを持ち今回影響を受けたJavaライブラリがあるJavaエコシステムというのはとりわけ脆弱であるということを意味している。Apache commons-compresApache Ant、ZeroTurnaround zt-zipzip4jといったものである。解凍ライブラリがサポートしていて相対フォルダを許可するあらゆるアーカイブフォーマットに脆弱性が影響すると仮定すると、JAR/EAR/WARは潜在的に脆弱であるとSnyk社のCEOであるGuy Podjarny氏はInfoQに述べている。

ファイルトラバーサル攻撃はルートフォルダの外側に保存されているファイルやディレクトリにアクセスすることを目的としている。“ドット-ドット-スラッシュ (../)”シーケンスやそのバリエーションでファイルを参照する変数を操作して、または絶対ファイルパスを使って、ハッカーがファイルシステムに保存されたアプリケーションのソースコードや設定、重要なシステムファイルといった任意のファイルやディレクトリにアクセスできる可能性がある。たとえばZIPアーカイブが"../../file.exe"というファイルを含む場合、展開時にターゲットフォルダの外側を破壊してしまう。これはサーバサイドでもクライアントサイドでも起こるだろうし、悪意のあるファイルが書き込まれたり機密ファイルが上書きされたりすることになるだろう。悪意のあるコードが含まれたファイルで実行可能ファイルや設定ファイルが上書きされると、問題は任意のコード実行の問題に変化する。

以下のコードはSnyk社のホワイトペーパーから引用しているが、Javaの脆弱なコードの例である。

Enumeration entries==zip・g‘tEntries();trie
    while(entries・h∥sMoreElements()){()
        ZipEntry e ・‘ntries.nextElement();t(
        File f = new File(dir, e.=getName());()
        InputStream input ==zip・g‘tInputStream(e);ream
        IOUtils・c{py(input, write(f));f)
    } 

ここでe.getName()はターゲットディレクトリdirと連結されている。バリデーションは一切ない。Javaファイルfの場所を決めている。ファイル名が親ディレクトリをパスに含んでいた場合 (すなわち../../で始まる場合)、IOUtilsの.copyコマンドでターゲットディレクトリの外側に書き込まれてしまう。

この脆弱性から保護するのは一度やり方を知ってしまえば簡単だ。ZIPアーカイブがターゲットディレクトリの外側にファイルを書き込む必要があるという理由はないので、単純にこれをチェックして防止できる。

String canonicalDirPath=dir.getCanonicalPath();
    String canonicalDestPath=e.getName().getCanonicalPath();
    if(!canonicalDestPath.startsWith(canonicalDirPath)){
        throw new ArchiverException("Entry is outside of the target dir: " 
            + e.getName());
    }

Snyk社のDeveloper RelationsディレクタであるSimon Maple氏は、連絡したほとんどのベンダがそれから数日以内にこの問題を修正しているとInfoQに語っている。

Javaは影響を受けた唯一の言語ではないが、もっとも脆弱である。JavaScriptはより中心的なライブラリがあることから恩恵を得た。アーカイブを解凍する機能を提供する脆弱なライブラリは両方とも今は修正されている。.Netエコシステムも解凍を実行するより中心的なライブラリがある。その3つのライブラリのうち2つはすでに修正されている。脆弱性はNuGet DotNetZipSharpCompressに見つかっている。Goエコシステムではmholt archiverにあったが、これも修正されている。Snyk社の研究チームはRubyやPythonでこのバグを発見していない。

Snyk社のGitHubリポジトリにSnyk社やさまざまなコミュニティのプロジェクトメンテナが協力して最新情報を掲載する予定だ。そこに言語エコシステム周辺の最新の脆弱性情報に関する完全なリストもある。

Rate this Article

Adoption Stage
Style

この記事に星をつける

おすすめ度
スタイル

BT