Medium, CVSS 6.9PyPIAmendedPublished
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
CVE-2026-111171 · GHSA-5hr4-253g-cpx2
- Affected
- PyPI web3 >= 6.0.0b3, < 7.15.0; >= 8.0.0b1, <= 8.0.0b1
- Fixed in
- 8.0.0b27.15.0· Vendor fix available
- Issue
- web3.py implements CCIP Read / OffchainLookup (EIP-3668) by performing HTTP requests to URLs supplied by smart contracts in offchainlookuppayload["urls"]. The implementation uses these contract-supplied URLs directly (after {sender} / {data} template substitution) without any destination validation: - No restriction to https:// (and no opt-in gate for http://) - No hostname or IP allowlist - No blocking of private/reserved IP ranges (loopback, link-local, RFC1918) - No redirect target validation (both requests and aiohttp follow redirects by default) CCIP Read is enabled by default (globalccipreadenabled = True on all providers), meaning any application using web3.py's .call() method is exposed without explicit opt-in. This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs ethcall / .call() against untrusted or user-supplied contract addresses. A malicious contract can force the web3.py…
Recommended action: Upgrade to 8.0.0b2 (pre-release) or 7.15.0 by release line, then redeploy and verify.A vendor fix does not resolve your finding until you verify it in your own systems.