Zip Slipとは?

Zip Slipとは?

Zip SlipとはZipファイルからアーカイブされているファイル類を解凍する際に、存在する別のファイルに展開した圧縮ファイルを上書きしてしまう問題です。

また、Zip Slipは攻撃用のファイルをさあ行くすることで、ファイル解凍の際にディレクトリトラバーサル脆弱性のように相対パスを指定して解凍先を指定することでshellコードなどを実行できる場合があります。shellコードが実行できた場合は、OSコマンドインジェクションと同様に任意のコマンドが実行できるため、非常に危険性が高くなります。

ZipSlip攻撃の仕組み

以下はZip Slip脆弱性を含むプラグラムコードの例です。

Zip Slip脆弱性を含むプログラムコードの例

  Enumeration<ZipEntry>entries = zip.getEntries(); 
  while (entries.hasMoreElements()) { 
      ZipEntry e = entries.nextElement(); 
      File f = new File(destinationDir, e.getName()); 
      InputStream input = zip.getInputStream(e); 
      IOUtils.copy(input, write(f)); 
  }

上記のプログラムコードではアーカイブされているファイル名のチェックや展開先のディレクトリやファイル名の存在チェックがされておらず、そのままファイル内容が展開されています。そのため例えば下記のようなファイル名がzip圧縮されていると、展開される際に任意のshellコードが実行されます。

Zip Slip攻撃用のファイル例

Tue Jun 5 11:04:29 BST 2018 good.sh 20 Tue Jun 5 11:04:42 BST 2018 ../../../../../../../../tmp/evil.sh

被害事例

ZIp Slip脆弱性は低水準のライブラリに問題が含まれているため、当脆弱性が原因で被害に至ったという報告はされていませんが、以下のように多くのライブラリで問題が検出されています。

Zip Slipが報告されたライブラリ類一覧

endorProductLanguageConfirmed vulnerableFixed VersionCVEFixed
npm libraryunzipperJavaScriptYES0.8.13CVE-2018-100220317/4/2018
npm libraryadm-zipJavaScriptYES0.4.9CVE-2018-100220423/4/2018
Java librarycodehaus/plexus-archiverJavaYES3.6.0CVE-2018-10022006/5/2018
Java libraryzeroturnaround/zt-zipJavaYES1.13CVE-2018-100220126/4/2018
Java libraryzip4jJavaYES1.3.3CVE-2018-100220213/6/2018
.NET libraryDotNetZip.Semverd.NETYES1.11.0CVE-2018-10022057/5/2018
.NET librarySharpCompress.NETYES0.21.0CVE-2018-10022062/5/2018
Go librarymholt/archiverGoYESN/ACVE-2019-10743
Oraclejava.util.zipJava* No High Level APIDocumentation FixN/A
Apachecommons-compressJava* No High Level APIDocumentation FixN/A23/4/2018
.NET librarySharpZipLib.NETYESv1.0.0CVE-2018-100220819/8/2018
Ruby gemzip-rubyRuby* No High Level APIN/A
Ruby gemrubyzipRubyYESCVE-2018-1000544
Ruby gemziprubyRuby* No High Level APIN/A
Go libraryarchiveGo* No High Level APIN/A
Python librarytarfilePythonYESN/A
C++/qt libraryquazipC++YES0.7.6CVE-2018-100220912/6/2018
Clojure libraryRaynes/fsClojureYESakvo/fs 20180618-134534.a44cdd5bN/A18/6/2018
Go librarycloudfoundry/archiverGoYES24/5/2018N/A24/5/2018
PHP librarychumper/zipperPHPYES1.0.3N/A26/2/2020
Perl librarylibarchive-zip-perlPerlYESCVE-2018-10860
Rust libraryrs-async-zipRust* No High Level APIDocumentation FixN/A

また下記のように多くのプロジェクトでも本問題が指摘されています。

Zip Slipが指摘されたプロジェクト一覧

ndorProductFixed dateFixed versionCVEVulnerable Code
Apache StormStorm2/5/20181.1.3, 1.2.2CVE-2018-8008#1 #2 #3 #4
Apache Software FoundationApache Hadoop30/5/2018 #1 #22.7.7, 2.8.5, 2.9.2, 3.0.3, 3.1.1CVE-2018-8009
ApacheMaven
ApacheAnt21/4/20181.9.12CVE-2018-10886
Pivotalspring-integration-zip3/5/20181.0.1CVE-2018-1261
Pivotalspring-integration-zip10/5/20181.0.2CVE-2018-1263
HPFortify Cloud Scan Jenkins Plugin27/4/20181.5.2#1
OWASPDependencyCheck7/5/20183.2.0CVE-2018-12036
AmazonAWS Toolkit for Eclipse31/5/2018
SonarSourceSonarQube4/5/20186.7.4 LTS, 7.2#1
CinchapiConcourse30/5/2018#1
Orient TechnologiesOrientDB31/5/2018#1 #2
FenixEduAcademic30/5/2018#1
LuceeLucee5/6/20185.2.7.63, 5.2.8.47#1
groovy-common-extensionsgroovy-common-extensions3/7/20180.7.1#1
fabric8fabric85/6/20182.2.170-85#1
ApacheTika19/9/20181.19
ApacheDeepLearning4J10/24/20181.0.0-SNAPSHOT
FireGiantWiX Toolkit09/19/20193.11.2CVE-2019-16511

Zip Slipが起こる原因

前述した通りZip圧縮されたファイルを展開する際にファイル名および展開先のファイルやディレクトリのチェックがされていないことが原因で問題が発生します。

Zip Slip攻撃への対策手法

プログラム実装している場合

Zip圧縮されたファイルを展開する際にファイル名および展開先のファイルやディレクトリのチェックを実装します。

ライブラリ類を利用している場合

お使いライブラリバージョンにおいてZip Slip脆弱性が報告されていないか確認の上、必要に応じてセキュリティパッチの適用もしくは最新バージョンへのアップグレードを行います。

また上記の2点の対策に併せて、OSごとに用意されているファイルバーミッション設定を適切に行うことで被害を縮小させることができます。

まずは手軽にツールで脆弱性診断

上述の対策手法が重要となる一方で、脆弱性が混入されていないかを検知する事も重要となります。そのためには脆弱性診断を受診する必要があり、コードインジェクションの脆弱性についても脆弱性診断を通じて発見する事が出来ます。

脆弱性診断とは何かについて詳しく知りたい⽅は脆弱性診断とは(エンジニア向け)脆弱性診断とは(⾮エンジニア向け)もぜひご参照ください。

脆弱性診断ツール「Securify Scan」では、コードインジェクションの脆弱性検知も対応しております。脆弱性検知やセキュリティレベルを強化したい企業様はぜひ弊社の脆弱性診断ツール「Securify Scan」を活用ください。

無償でのトライアル実施も行っておりますので、お気軽にお問い合わせください。

Webアプリケーションの
継続的セキュリティを簡単に実現
Securify

ブログ一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る