Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAttain MitM position on network path
-
DeliveryIntercept plaintext HTTP S3 request
-
ExploitExtract AWS Authorization and X-Amz-Security-Token headers
-
ExecutionRead full S3 object contents
-
PersistForge modified S3 response body and headers
-
ImpactInject poisoned data into downstream scraping pipeline
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A04:2025 - Cryptographic Failures
ASVS 5.0
V12 - Secure Communication Transport encryption
|
| Exploitation Conditions | Exploitation requires the attacker to hold a man-in-the-middle position on the IP network path between the Scrapy process and AWS S3 service endpoints - either through ARP spoofing on a local segment, BGP route manipulation, a compromised network device, or shared infrastructure such as a cloud VPC with insufficient segmentation. On the Scrapy side, the application must be issuing s3:// scheme requests; HTTP-scheme or HTTPS-scheme requests to S3 are not affected. The default configuration of Scrapy prior to 2.17.0 is vulnerable - no special misconfigurations or feature flags are required. Deployments that have explicitly set request.meta['is_secure'] = True on all S3 requests in their spider code are not exposed, as HTTPS would have been used. Deployments operating behind a TLS-enforcing proxy that re-encrypts outbound S3 traffic before it leaves the controlled network boundary are also protected. The absence of A:N (no availability impact) means denial-of-service is not a concern; the risk is limited to credential theft and data integrity corruption. |
| Impact | The CVSS vector (AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N, score 7.4) accurately characterizes this as a network-exploitable, high-impact flaw gated by significant attack complexity - specifically, a privileged network position between Scrapy workers and AWS S3 infrastructure. The dual C:H/I:H is realistic and not inflated: credential exposure enables lateral movement into broader AWS environments, while response tampering directly corrupts downstream data pipelines. EPSS data was not provided and KEV status is negative, so real-world exploitation frequency is unconfirmed, but the attack requires no special tooling beyond standard packet interception. Cloud and co-location environments where Scrapy workers communicate with S3 over shared or semi-trusted network fabrics represent a credible attack surface; even a mid-sized municipal IT team in inowroclaw running Scrapy jobs in a shared cloud tenant should treat this as urgent given that harvested AWS temporary credentials can be immediately replayed against other AWS services. The AC:H gating is the primary check on widespread passive exploitation - active MitM capability is non-trivial to achieve against well-segmented cloud networks. |
| Exploit ScenarioDerived | An attacker with a privileged network position - such as access to a shared cloud network segment, a rogue switch or router, or a compromised VPC peering gateway - passively captures plaintext HTTP traffic between a Scrapy worker and AWS S3 and extracts the AWS Authorization header and X-Amz-Security-Token from each request, obtaining valid temporary credentials that can be immediately replayed against other AWS services. For an active attack, the same attacker injects a crafted HTTP response in place of the legitimate S3 object, inserting malicious URLs into the scraped content to redirect subsequent crawl jobs toward attacker-controlled infrastructure or poisoning exported datasets. No public exploit code has been identified, but the attack requires only standard network interception tooling such as tcpdump or arpspoof. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 01, 2026
Scrapy's S3DownloadHandler transmitted s3:// requests - including signed AWS Authorization headers, temporary session tokens, and full S3 object contents - over plaintext HTTP by default in all versions prior to 2.17.0, exposing credentials and data to any network attacker with a man-in-the-middle position. A passive observer on the network path can harvest AWS credentials silently; an active attacker can modify S3 response bodies, status codes, and headers to poison scraped data exports, corrupt HTTP caches, or manipulate subsequent crawl targets through forged redirects. The root cause is a logic inversion in a single line of s3.py: HTTPS was opt-in rather than opt-out. No public exploit has been identified at time of analysis, and a patched release (2.17.0) is confirmed available.
RemediationAI
Upgrade to Scrapy 2.17.0 or later; this is confirmed by the vendor release at https://github.com/scrapy/scrapy/releases/tag/2.17.0 and corroborated by the commit at https://github.com/scrapy/scrapy/commit/9523e1ec8c41fde265a26d14563d178b6f1ad04b, which inverts the default transport scheme to HTTPS. For deployments that cannot immediately upgrade, set request.meta['is_secure'] = True explicitly on every s3:// request as a per-request workaround - this mechanism existed in older versions and forces HTTPS, though it requires touching all call sites. Operators should also rotate any AWS IAM credentials and STS temporary tokens that may have traversed plaintext connections while the vulnerable version was deployed; assume all previously transmitted temporary tokens are compromised. If HTTP caching was enabled alongside S3 fetches, flush the cache entirely, as forged responses may have been stored. Deploying Scrapy workers inside a VPC with private S3 endpoints enforcing TLS would mitigate this class of attack for future incidents regardless of Scrapy version.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in pypi
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Scrapy (CPE: cpe:2.3:a:scrapy:scrapy:*:*:*:*:*:*:*:*) is a Python framework for high-throughput web crawling and structured data extraction. Its S3DownloadHandler (scrapy/core/downloader/handlers/s3.py) translates s3:// scheme URLs into HTTP/HTTPS requests directed at AWS S3 endpoints, injecting AWS Signature Version 4 credentials into request headers before transmission. Prior to 2.17.0, the scheme selection logic read: scheme = 'https' if request.meta.get('is_secure') else 'http', defaulting to plaintext HTTP because get() on an absent key returns None, which is falsy. CWE-319 (Cleartext Transmission of Sensitive Information) is the precise root cause class: signed AWS Authorization headers, and X-Amz-Security-Token values for temporary credentials (STS), were transmitted unencrypted. The commit at 9523e1ec inverts the conditional to scheme = 'http' if request.meta.get('is_secure') is False else 'https', making HTTPS the default and preserving an explicit opt-out path.
Know when Scrapy gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
MitM position raises AC:H; no attacker authentication needed; both credential exposure (C:H) and active response tampering (I:H) are realistic impacts with no availability concern.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Scrapy is a high-level web crawling and scraping framework for Python. Prior to 2.17.0, in scrapy/core/downloader/handlers/s3.py, Scrapy's S3DownloadHandler converts an S3-scheme bucket and key request into a plaintext HTTP request to the corresponding S3 endpoint unless request.meta["is_secure"] is explicitly enabled, then signs and sends the plaintext request with configured AWS credentials. A network attacker who can observe traffic between Scrapy and S3 can read the bucket and key path, AWS Authorization header, X-Amz-Security-Token when temporary credentials are used, S3 object contents, and S3 response headers. An active man-in-the-middle attacker can also modify the plaintext S3 response body, status code, and headers before Scrapy processes them, causing scraped-data poisoning, poisoned exports, HTTP cache poisoning when caching is enabled, or influence over later crawl targets through forged redirects or attacker-controlled links. Users making S3-scheme requests with AWS credentials are affected. This issue is fixed in version 2.17.0.
Articles & Coverage 2
Technical POC Analysis
The flaw is a cleartext-transmission bug classified as CWE-319: Cleartext Transmission of Sensitive Information.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Scrapy versions before 2.17.0 expose AWS credentials and scraped data over unencrypted connections when accessing S3 buckets, allowing attackers positioned on the network to steal authentication credentials and tamper with scraped data. No public exploit code has been identified, but organizations using Scrapy for S3-based collection face risk of AWS account compromise and poisoning of data used in downstream business processes.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Scrapy 1.4 allows remote attackers to cause a denial of service (memory consumption) via large files because arbitrarily
In scrapy/scrapy, an issue was identified where the Authorization header is not removed during redirects that only chang
In scrapy version 2.10.1, an issue was identified where the Authorization header, containing credentials for server auth
The scrapy/scrapy project is vulnerable to XML External Entity (XXE) attacks due to the use of lxml.etree.fromstring for
A Regular Expression Denial of Service (ReDoS) vulnerability exists in the XMLFeedSpider class of the scrapy/scrapy proj
Exposure of Sensitive Information to an Unauthorized Actor in GitHub repository scrapy/scrapy prior to 2.6.1. Rated medi
Denial of service in Scrapy 1.4.0 through 2.14.1 allows any web server the crawler visits to terminate the crawler proce
Scrapy is a high-level web crawling and scraping framework for Python. Rated medium severity (CVSS 6.5), this vulnerabil
EUVD-2026-69647
GHSA-76g3-c3x4-crvx
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB