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が報告されたライブラリ類一覧
| endor | Product | Language | Confirmed vulnerable | Fixed Version | CVE | Fixed |
| npm library | unzipper | JavaScript | YES | 0.8.13 | CVE-2018-1002203 | 17/4/2018 |
| npm library | adm-zip | JavaScript | YES | 0.4.9 | CVE-2018-1002204 | 23/4/2018 |
| Java library | codehaus/plexus-archiver | Java | YES | 3.6.0 | CVE-2018-1002200 | 6/5/2018 |
| Java library | zeroturnaround/zt-zip | Java | YES | 1.13 | CVE-2018-1002201 | 26/4/2018 |
| Java library | zip4j | Java | YES | 1.3.3 | CVE-2018-1002202 | 13/6/2018 |
| .NET library | DotNetZip.Semverd | .NET | YES | 1.11.0 | CVE-2018-1002205 | 7/5/2018 |
| .NET library | SharpCompress | .NET | YES | 0.21.0 | CVE-2018-1002206 | 2/5/2018 |
| Go library | mholt/archiver | Go | YES | N/A | CVE-2019-10743 | |
| Oracle | java.util.zip | Java | * No High Level API | Documentation Fix | N/A | |
| Apache | commons-compress | Java | * No High Level API | Documentation Fix | N/A | 23/4/2018 |
| .NET library | SharpZipLib | .NET | YES | v1.0.0 | CVE-2018-1002208 | 19/8/2018 |
| Ruby gem | zip-ruby | Ruby | * No High Level API | N/A | ||
| Ruby gem | rubyzip | Ruby | YES | CVE-2018-1000544 | ||
| Ruby gem | zipruby | Ruby | * No High Level API | N/A | ||
| Go library | archive | Go | * No High Level API | N/A | ||
| Python library | tarfile | Python | YES | N/A | ||
| C++/qt library | quazip | C++ | YES | 0.7.6 | CVE-2018-1002209 | 12/6/2018 |
| Clojure library | Raynes/fs | Clojure | YES | akvo/fs 20180618-134534.a44cdd5b | N/A | 18/6/2018 |
| Go library | cloudfoundry/archiver | Go | YES | 24/5/2018 | N/A | 24/5/2018 |
| PHP library | chumper/zipper | PHP | YES | 1.0.3 | N/A | 26/2/2020 |
| Perl library | libarchive-zip-perl | Perl | YES | CVE-2018-10860 | ||
| Rust library | rs-async-zip | Rust | * No High Level API | Documentation Fix | N/A |
また下記のように多くのプロジェクトでも本問題が指摘されています。
Zip Slipが指摘されたプロジェクト一覧
| ndor | Product | Fixed date | Fixed version | CVE | Vulnerable Code |
| Apache Storm | Storm | 2/5/2018 | 1.1.3, 1.2.2 | CVE-2018-8008 | #1 #2 #3 #4 |
| Apache Software Foundation | Apache Hadoop | 30/5/2018 #1 #2 | 2.7.7, 2.8.5, 2.9.2, 3.0.3, 3.1.1 | CVE-2018-8009 | |
| Apache | Maven | ||||
| Apache | Ant | 21/4/2018 | 1.9.12 | CVE-2018-10886 | |
| Pivotal | spring-integration-zip | 3/5/2018 | 1.0.1 | CVE-2018-1261 | |
| Pivotal | spring-integration-zip | 10/5/2018 | 1.0.2 | CVE-2018-1263 | |
| HP | Fortify Cloud Scan Jenkins Plugin | 27/4/2018 | 1.5.2 | #1 | |
| OWASP | DependencyCheck | 7/5/2018 | 3.2.0 | CVE-2018-12036 | |
| Amazon | AWS Toolkit for Eclipse | 31/5/2018 | |||
| SonarSource | SonarQube | 4/5/2018 | 6.7.4 LTS, 7.2 | #1 | |
| Cinchapi | Concourse | 30/5/2018 | #1 | ||
| Orient Technologies | OrientDB | 31/5/2018 | #1 #2 | ||
| FenixEdu | Academic | 30/5/2018 | #1 | ||
| Lucee | Lucee | 5/6/2018 | 5.2.7.63, 5.2.8.47 | #1 | |
| groovy-common-extensions | groovy-common-extensions | 3/7/2018 | 0.7.1 | #1 | |
| fabric8 | fabric8 | 5/6/2018 | 2.2.170-85 | #1 | |
| Apache | Tika | 19/9/2018 | 1.19 | ||
| Apache | DeepLearning4J | 10/24/2018 | 1.0.0-SNAPSHOT | ||
| FireGiant | WiX Toolkit | 09/19/2019 | 3.11.2 | CVE-2019-16511 |
Zip Slipが起こる原因
前述した通りZip圧縮されたファイルを展開する際にファイル名および展開先のファイルやディレクトリのチェックがされていないことが原因で問題が発生します。
Zip Slip攻撃への対策手法
プログラム実装している場合
Zip圧縮されたファイルを展開する際にファイル名および展開先のファイルやディレクトリのチェックを実装します。
ライブラリ類を利用している場合
お使いライブラリバージョンにおいてZip Slip脆弱性が報告されていないか確認の上、必要に応じてセキュリティパッチの適用もしくは最新バージョンへのアップグレードを行います。
また上記の2点の対策に併せて、OSごとに用意されているファイルバーミッション設定を適切に行うことで被害を縮小させることができます。
まずは手軽にツールで脆弱性診断
上述の対策手法が重要となる一方で、脆弱性が混入されていないかを検知する事も重要となります。そのためには脆弱性診断を受診する必要があり、コードインジェクションの脆弱性についても脆弱性診断を通じて発見する事が出来ます。
脆弱性診断とは何かについて詳しく知りたい⽅は脆弱性診断とは(エンジニア向け)と脆弱性診断とは(⾮エンジニア向け)もぜひご参照ください。
脆弱性診断ツール「Securify Scan」では、コードインジェクションの脆弱性検知も対応しております。脆弱性検知やセキュリティレベルを強化したい企業様はぜひ弊社の脆弱性診断ツール「Securify Scan」を活用ください。
無償でのトライアル実施も行っておりますので、お気軽にお問い合わせください。