web3
A python interface for interacting with the Ethereum blockchain and ecosystem.
Activity
- Latest release
- 2w ago
- Total releases
- 252
- Cadence
- ~15 days
- Last 12 months
- 8
Reach
- Stars
- 5.5k
Details
- License
- MIT
- First release
- Apr 28, 2016
| Version | Released | |
|---|---|---|
8.0.0
major
| ||
7.16.0
minor
| ||
8.0.0b3
pre
| ||
8.0.0b2
pre
| ||
7.15.0
minor
| ||
7.14.1
patch
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
8.0.0b1
pre
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.14.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.13.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.12.1
patch
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.12.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.11.1
patch
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.11.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.10.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.9.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
6.20.4
patch
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.8.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.7.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.6.1
patch
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.6.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.5.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.4.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.3.1
patch
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.3.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.2.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.1.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
6.20.3
patch
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.0.0
major
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
6.20.2
patch
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.0.0b9
pre
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.0.0b8
pre
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
6.20.1
patch
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
6.20.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.0.0b7
pre
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.0.0b6
pre
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
6.19.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
6.18.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.0.0b5
pre
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
6.17.2
patch
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
6.17.1
patch
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
6.17.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.0.0b4
pre
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
6.16.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.0.0b3
pre
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.0.0b2
pre
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
7.0.0b1
pre
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
6.15.1
patch
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
6.15.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
6.14.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
| ||
6.13.0
minor
1 CVE
CVE-2026-40072
PYSEC-2026-3414
GHSA-5hr4-253g-cpx2
Jul 13, 2026
web3.py: SSRF via CCIP Read (EIP-3668) OffchainLookup URL handling
Low
Network
Low
None
None
Summaryweb3.py implements CCIP Read /
CCIP Read is enabled by default ( This results in Server-Side Request Forgery (SSRF) when web3.py is used in backend services, indexers, APIs, or any environment that performs Why This Is a VulnerabilityThe argument is not that CCIP Read itself is invalid or that web3.py should stop supporting EIP-3668. The issue is that, in server-side deployments (backends, indexers, bots, APIs), the current implementation doesn't provide destination policy controls, such as a validation/override hook, private-range blocking, or redirect target checks, which means contract controlled CCIP URLs can be used as an SSRF primitive. This is consistent with EIP-3668's own security considerations, which recommends that client libraries "provide clients with a hook to override CCIP read calls, either by rewriting them to use a proxy service, or by denying them entirely" and that "this mechanism or another should be written so as to easily facilitate adding domains to allowlists or blocklists." The mitigations I'm suggesting are meant to align with that guidance without breaking CCIP Read support.
Affected CodeSync CCIP handlerFile: Contract-controlled URLs are requested via
(The request is issued before response validation; subsequent logic parses JSON and enforces a Key observations:
Async CCIP handlerFile: Same pattern with
Key observations:
Default-on invocation pathFile:
File: The Security Impact1. Blind SSRF (Primary Impact)A malicious contract can supply URLs that cause the web3.py process to issue HTTP GET or POST requests to:
The request is made from the web3.py process. This alone constitutes SSRF -- the attacker controls the destination of an outbound request from the victim's infrastructure. Note on response handling: The CCIP handler expects a JSON response containing a
2. Redirect-Based SSRF AmplificationBoth
A contract-supplied URL can point to an attacker-controlled server that issues a 3. Internal Network ProbingBy varying the URLs supplied in the
4. POST-Based SSRFWhen the contract-supplied URL does not contain both Proof of ConceptPrerequisites
Step 1: Start a local HTTP listener
Step 2: Run the reproduction script
Step 3: ObserveThe HTTP server logs will show an inbound request to a path like The script will then print an error (the local HTTP server does not return the expected JSON), but the request has already been sent -- the SSRF occurs before any response validation. Reproduction script (
|