-
-
Notifications
You must be signed in to change notification settings - Fork 984
Security: Prevent zip slip during archive extraction #5112
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
Open
RishabhJain2018
wants to merge
11
commits into
master
Choose a base branch
from
cursor/fix-zip-slip-extraction-9812
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 3 commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
13924d6
Security: Prevent zip slip during archive extraction
cursoragent 71416be
Address CodeRabbit review: isolate zip extraction from Django imports.
RishabhJain2018 fec47a3
Address CodeRabbit review: validate YAML-derived paths under extracti…
RishabhJain2018 ea6291e
Merge branch 'master' into cursor/fix-zip-slip-extraction-9812
RishabhJain2018 05ae194
Potential fix for pull request finding 'Empty except'
RishabhJain2018 e560df1
Merge branch 'master' into cursor/fix-zip-slip-extraction-9812
RishabhJain2018 99b0117
Address remaining CodeRabbit review on zip path hardening.
RishabhJain2018 a1e5611
Fix unit tests for zip path hardening changes.
RishabhJain2018 4c93dc0
Add tests for zip path traversal coverage gaps.
RishabhJain2018 a61e500
Merge branch 'master' into cursor/fix-zip-slip-extraction-9812
RishabhJain2018 2966897
Fix UnboundLocalError when test annotation path is unsafe.
RishabhJain2018 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| import os | ||
| import zipfile | ||
|
|
||
|
|
||
| class PathTraversalError(ValueError): | ||
| """Raised when a resolved path escapes its intended root directory.""" | ||
|
|
||
|
|
||
| def safe_join_under_root(root, *relative_paths): | ||
| """ | ||
| Join path segments under root and verify the result stays within root. | ||
| """ | ||
| root_path = os.path.abspath(root) | ||
| candidate = os.path.abspath(os.path.join(root_path, *relative_paths)) | ||
| if not ( | ||
| candidate == root_path or candidate.startswith(root_path + os.sep) | ||
| ): | ||
| raise PathTraversalError("Path escapes extraction root.") | ||
| return candidate | ||
|
|
||
|
|
||
| def safe_extract_zip_file(zip_ref, destination): | ||
| """ | ||
| Extract zip archive members while preventing path traversal (zip slip). | ||
| """ | ||
| destination_path = os.path.abspath(destination) | ||
| for member in zip_ref.namelist(): | ||
| member_path = os.path.abspath(os.path.join(destination_path, member)) | ||
| if not ( | ||
| member_path == destination_path | ||
| or member_path.startswith(destination_path + os.sep) | ||
| ): | ||
| raise zipfile.BadZipFile("Zip archive contains unsafe file paths.") | ||
| zip_ref.extractall(destination_path) | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
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.
Uh oh!
There was an error while loading. Please reload this page.