Fix arbitrary file write extracting an archive containing symbolic links #9660
+8
−0
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
To properly fix this issue:
path
created will, when resolved, not point outside the intended extraction directory.path
pointing toheader.Linkname
, that you:path
is indestinationDir
, and (b) the link target (when resolved as if the symlink would exist) would still be withindestinationDir
.filepath.EvalSymlinks
, starting fromdestinationDir
and the archive entry, to confirm it's "in jail".For minimal safe fix (without refactoring to check every write):
destinationDir
destinationDir
) does not remain underdestinationDir
.path
pointing toheader.Linkname
, simulates following the resulting symlink and checks if it is insidedestinationDir
.Changes to implement:
isSafeSymlink(linkPath, linkTarget, destinationDir string) (bool, error)
that:filepath.EvalSymlinks
.destinationDir
.tar.TypeSymlink
case, conditionally create the symlink only if this check passes, else error.What is needed:
"path/filepath"
if not already present (already imported here).case tar.TypeSymlink
block ofuntar
.Checklist
./changelog/fragments
using the changelog tool