Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Eliminate Zip-Slip vulnerability #908

Merged
merged 1 commit into from
Aug 30, 2018
Merged

Conversation

chanseokoh
Copy link
Member

@chanseokoh
Copy link
Member Author

chanseokoh commented Aug 30, 2018

Seems like Kokoro won't run when not merging into master. I'll just put the "PR: Not Ready" until merging #906.

Path entryPath = destination.resolve(entry.getName());

String canonicalTarget = entryPath.toFile().getCanonicalPath();
if (!canonicalTarget.startsWith(canonicalDestination + File.separator)) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this be done with NIO? Like maybe entryPath.toAbsolutePath().startsWith(destination.toAbsolutePath())?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A canonical path is an absolute path, but the opposite is not true. For example,

System.out.println(Paths.get("/temp1/../temp/test.txt").toAbsolutePath());

prints /temp1/../temp/test.txt.

The code here is what https://snyk.io/research/zip-slip-vulnerability actually suggests, so I think it is safe to stick with the canonical path.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, though it feels off having to use the deprecated java.io.File API to account for a security vulnerability. Perhaps we could use Path#normalize?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I still don't think Path.normalize() would work. A canonical path is a unique path for any given file; there can ever be only one canonical path. Computing a canonical path may involve "resolving symbolic links (on UNIX platforms), and converting drive letters to a standard case (on Microsoft Windows platforms)" according to its Javadoc. So I think it's safe to stick with the canonical path approach.

@chanseokoh chanseokoh merged commit 80f9221 into i431-add-ZipUtil Aug 30, 2018
@chanseokoh chanseokoh deleted the i431-zip-slip branch August 30, 2018 17:53
chanseokoh added a commit that referenced this pull request Aug 30, 2018
* Add unzip util method
* Eliminate Zip-Slip vulnernability (#908)
@chanseokoh chanseokoh mentioned this pull request Sep 19, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants