René's URL Explorer Experiment


Title: gh-146581: Use ZipFile.extractall() in shutil for secure ZIP extraction by Shrey-N · Pull Request #146588 · python/cpython · GitHub

Open Graph Title: gh-146581: Use ZipFile.extractall() in shutil for secure ZIP extraction by Shrey-N · Pull Request #146588 · python/cpython

X Title: gh-146581: Use ZipFile.extractall() in shutil for secure ZIP extraction by Shrey-N · Pull Request #146588 · python/cpython

Description: This PR refactors shutil._unpack_zipfile to use zipfile.ZipFile.extractall() instead of a manual extraction loop. This resolves a directory traversal vulnerability on Windows where archives containing drive prefixed paths for exampleD:/file.txt could write files outside the intended destination directory. Changes Made Replaced manual path joining and validation with ZipFile.extractall(), which leverages the zipfile module Updated the _unpack_zipfile signature to accept **kwargs. This ensures compatibility with the filter argument, preventing TypeError while allowing future filter support for ZIP files. This change brings ZIP extraction in line with how shutil handles TAR files, which already uses extractall(). Regression Test Added a new test case test_unpack_zipfile_traversal_windows_drive to Lib/test/test_shutil.py. This test specifically verifies that a ZIP file containing a drive prefixed path is safely sanitized and extracted within the intended extract_dir on Windows. Linked Issue #146581 Issue: gh-146581

Open Graph Description: This PR refactors shutil._unpack_zipfile to use zipfile.ZipFile.extractall() instead of a manual extraction loop. This resolves a directory traversal vulnerability on Windows where archives contain...

X Description: This PR refactors shutil._unpack_zipfile to use zipfile.ZipFile.extractall() instead of a manual extraction loop. This resolves a directory traversal vulnerability on Windows where archives contain...

Opengraph URL: https://github.com/python/cpython/pull/146588

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:ad184f21-fe6e-909d-2898-7ee731282565
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idB0F8:31B5FB:77830B:AEE488:6A5616C3
html-safe-nonce8ceaa513aaec0a81e936e96021febcdfac7b702c54bbb2f60713a924f1534e8f
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCMEY4OjMxQjVGQjo3NzgzMEI6QUVFNDg4OjZBNTYxNkMzIiwidmlzaXRvcl9pZCI6IjY0NTE0MDI5ODQ3NzM3ODUyODMiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ==
visitor-hmac91ce24cabcba3ca94ad11d38da38d376d5ead74be402d9f5d922143441f026e1
hovercard-subject-tagpull_request:3462108772
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/python/cpython/pull/146588/files
twitter:imagehttps://avatars.githubusercontent.com/u/221686259?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/221686259?s=400&v=4
og:image:altThis PR refactors shutil._unpack_zipfile to use zipfile.ZipFile.extractall() instead of a manual extraction loop. This resolves a directory traversal vulnerability on Windows where archives contain...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
Nonef4368738fc918fecd9b3958f6b49218bbe60d4185f38e72e3954e11f1ad0213a
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/python/cpython git https://github.com/python/cpython.git
octolytics-dimension-user_id1525981
octolytics-dimension-user_loginpython
octolytics-dimension-repository_id81598961
octolytics-dimension-repository_nwopython/cpython
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id81598961
octolytics-dimension-repository_network_root_nwopython/cpython
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
releaseb76b9cc70d30da50674184c9c66c56423fd0b93c
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/python/cpython/pull/146588/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fpython%2Fcpython%2Fpull%2F146588%2Ffiles
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fpython%2Fcpython%2Fpull%2F146588%2Ffiles
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=python%2Fcpython
Reloadhttps://github.com/python/cpython/pull/146588/files
Reloadhttps://github.com/python/cpython/pull/146588/files
Reloadhttps://github.com/python/cpython/pull/146588/files
Please reload this pagehttps://github.com/python/cpython/pull/146588/files
python https://github.com/python
cpythonhttps://github.com/python/cpython
Please reload this pagehttps://github.com/python/cpython/pull/146588/files
Notifications https://github.com/login?return_to=%2Fpython%2Fcpython
Fork 35k https://github.com/login?return_to=%2Fpython%2Fcpython
Star 73.8k https://github.com/login?return_to=%2Fpython%2Fcpython
Code https://github.com/python/cpython
Issues 5k+ https://github.com/python/cpython/issues
Pull requests 2.3k https://github.com/python/cpython/pulls
Actions https://github.com/python/cpython/actions
Projects https://github.com/python/cpython/projects
Security and quality 0 https://github.com/python/cpython/security
Insights https://github.com/python/cpython/pulse
Code https://github.com/python/cpython
Issues https://github.com/python/cpython/issues
Pull requests https://github.com/python/cpython/pulls
Actions https://github.com/python/cpython/actions
Projects https://github.com/python/cpython/projects
Security and quality https://github.com/python/cpython/security
Insights https://github.com/python/cpython/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fpython%2Fcpython%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fpython%2Fcpython%2Fissues%2Fnew%2Fchoose
Shrey-Nhttps://github.com/Shrey-N
python:mainhttps://github.com/python/cpython/tree/main
Shrey-N:patch-2https://github.com/Shrey-N/cpython-for-fix/tree/patch-2
Conversation 3 https://github.com/python/cpython/pull/146588
Commits 8 https://github.com/python/cpython/pull/146588/commits
Checks 44 https://github.com/python/cpython/pull/146588/checks
Files changed https://github.com/python/cpython/pull/146588/files
Please reload this pagehttps://github.com/python/cpython/pull/146588/files
gh-146581: Use ZipFile.extractall() in shutil for secure ZIP extraction https://github.com/python/cpython/pull/146588/files#top
Show all changes 8 commits https://github.com/python/cpython/pull/146588/files
b3d178a Update shutil.py Shrey-N Mar 29, 2026 https://github.com/python/cpython/pull/146588/commits/b3d178a58e7bebaeab1e55d199a32c56829e40a4
494d2b1 Implement Windows ZIP traversal test in test_shutil Shrey-N Mar 29, 2026 https://github.com/python/cpython/pull/146588/commits/494d2b19cf22b02c88b95e796719c7bb90220535
d185905 Clarify comments in test_unpack_zipfile_traversal_windows_drive Shrey-N Mar 29, 2026 https://github.com/python/cpython/pull/146588/commits/d18590531c7f2d7e43333c7b3cb3185d70b4f537
958ec29 📜🤖 Added by blurb_it. blurb-it[bot] Mar 29, 2026 https://github.com/python/cpython/pull/146588/commits/958ec29b135fec8115fec08f708ff0b2a29f1730
b0f0dc8 Remove unnecessary blank lines in test_shutil.py Shrey-N Mar 29, 2026 https://github.com/python/cpython/pull/146588/commits/b0f0dc8ebcbe2aa72295eb8f36b89177f30c7cba
8ce8bc2 Clean up whitespace in _unpack_zipfile function Shrey-N Mar 29, 2026 https://github.com/python/cpython/pull/146588/commits/8ce8bc2343b1813ebe0f95b9897f4f19d6c09f75
cfb3d0f Update shutil.py Shrey-N Mar 29, 2026 https://github.com/python/cpython/pull/146588/commits/cfb3d0fdb0f8367667715978cf4049314e152cc6
678fc3d Update shutil.py Shrey-N Mar 29, 2026 https://github.com/python/cpython/pull/146588/commits/678fc3d5a269f5e31ca0b10c9487304832fb1a10
Clear filters https://github.com/python/cpython/pull/146588/files
Please reload this pagehttps://github.com/python/cpython/pull/146588/files
Please reload this pagehttps://github.com/python/cpython/pull/146588/files
shutil.py https://github.com/python/cpython/pull/146588/files#diff-db8ac59326160713929e0e1973aef54f0280fe9f154ef24d14244909a0e0689b
test_shutil.py https://github.com/python/cpython/pull/146588/files#diff-ed52359d591fff799c0b81414bdfd9a90541cbc3b97b50a7ebaca38ed98062e7
2026-03-29-08-14-09.gh-issue-146581.81t9a4.rst https://github.com/python/cpython/pull/146588/files#diff-5a0452fd215fc57d36baa24999fdbf3165b67f0bf07d2ae358633051a9ba073b
https://github.com/python/cpython/blob/main/.github/CODEOWNERS#L572
Lib/shutil.pyhttps://github.com/python/cpython/pull/146588/files#diff-db8ac59326160713929e0e1973aef54f0280fe9f154ef24d14244909a0e0689b
View file https://github.com/Shrey-N/cpython-for-fix/blob/678fc3d5a269f5e31ca0b10c9487304832fb1a10/Lib/shutil.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/python/cpython/pull/146588/{{ revealButtonHref }}
https://github.com/python/cpython/pull/146588/files#diff-db8ac59326160713929e0e1973aef54f0280fe9f154ef24d14244909a0e0689b
https://github.com/python/cpython/pull/146588/files#diff-db8ac59326160713929e0e1973aef54f0280fe9f154ef24d14244909a0e0689b
https://github.com/python/cpython/blob/main/.github/CODEOWNERS#L573
Lib/test/test_shutil.pyhttps://github.com/python/cpython/pull/146588/files#diff-ed52359d591fff799c0b81414bdfd9a90541cbc3b97b50a7ebaca38ed98062e7
View file https://github.com/Shrey-N/cpython-for-fix/blob/678fc3d5a269f5e31ca0b10c9487304832fb1a10/Lib/test/test_shutil.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/python/cpython/pull/146588/{{ revealButtonHref }}
https://github.com/python/cpython/pull/146588/files#diff-ed52359d591fff799c0b81414bdfd9a90541cbc3b97b50a7ebaca38ed98062e7
Misc/NEWS.d/next/Security/2026-03-29-08-14-09.gh-issue-146581.81t9a4.rsthttps://github.com/python/cpython/pull/146588/files#diff-5a0452fd215fc57d36baa24999fdbf3165b67f0bf07d2ae358633051a9ba073b
View file https://github.com/Shrey-N/cpython-for-fix/blob/678fc3d5a269f5e31ca0b10c9487304832fb1a10/Misc/NEWS.d/next/Security/2026-03-29-08-14-09.gh-issue-146581.81t9a4.rst
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/python/cpython/pull/146588/{{ revealButtonHref }}
Please reload this pagehttps://github.com/python/cpython/pull/146588/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.