Scrapy: S3DownloadHandler sends signed S3 requests over plaintext HTTP by default
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.
- Products
- Not specified
- Affected versions
- Not specified
- Fixed versions
- Not specified
- CVEs
- CVE-2026-84366
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 7 Nov 2026, 09:53 UTC · Revision 1
Source evidence
Scrapy: S3DownloadHandler sends signed S3 requests over plaintext HTTP by default
core-osv · Original sourcePublished 1 Sept 2026, 20:29 UTC
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.
osv:CVE-2026-84366
Complete source record
{
"id": "59c25662ccb2103b6b283d9c41a4eeebbedc9e0a4ea4aa4fc6fd9ea2840897be",
"url": "https://osv.dev/vulnerability/CVE-2026-84366",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "Scrapy: S3DownloadHandler sends signed S3 requests over plaintext HTTP by default",
"summary": "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.",
"evidence": "osv:CVE-2026-84366",
"products": [],
"severity": "high",
"structured": {
"id": "CVE-2026-84366",
"aliases": [
"CVE-2026-84366",
"GHSA-76g3-c3x4-crvx",
"PYSEC-2026-3918"
],
"metrics": [
{
"type": "CVSS_V3",
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N"
}
],
"affected": [
{
"ranges": [
{
"repo": "https://github.com/scrapy/scrapy",
"type": "GIT",
"events": [
{
"introduced": "0"
},
{
"fixed": "feb692f552e3ed4533cf4e3af4809908d84cd763"
},
{
"fixed": "9523e1ec8c41fde265a26d14563d178b6f1ad04b"
}
],
"database_specific": {
"extracted_events": [
{
"range": [
{
"introduced": "0"
},
{
"fixed": "2.17.0"
}
],
"source": "AFFECTED_FIELD",
"strategy": "StringRangeExpression"
},
{
"range": [
{
"fixed": "9523e1ec8c41fde265a26d14563d178b6f1ad04b"
}
],
"source": "REFERENCES_COMMIT"
},
{
"range": [
{
"fixed": "feb692f552e3ed4533cf4e3af4809908d84cd763"
}
],
"source": "REFERENCES_TAG",
"original_tag": "2.17.0"
}
]
}
}
],
"versions": [
"2.16.0",
"2.15.0",
"2.14.1",
"2.14.0",
"2.13.0",
"2.12.0",
"2.11.0",
"2.10.0",
"2.9.0",
"2.8.0",
"2.7.1",
"2.7.0",
"2.6.1",
"2.6.0",
"1.8.0",
"2.5.0",
"2.4.0",
"2.3.0",
"2.2.0",
"2.1.0",
"2.0.0",
"1.7.0",
"1.6.0",
"1.5.0",
"1.4.0",
"1.3.2",
"1.3.1",
"1.2.2",
"1.3.0",
"1.2.1",
"1.2.0",
"1.2.0dev2",
"1.0.0rc1",
"scrapy-0.25.1-sc",
"hojo",
"0.25.1",
"0.24.0",
"0.25.0",
"0.23.0",
"0.21.0",
"0.17.0",
"0.15.1",
"0.14.0",
"0.15.0",
"0.10.3",
"0.10.2",
"0.10.1",
"0.10",
"0.10-rc1",
"0.9",
"0.9-rc1",
"0.8",
"0.7",
"0.7-rc1"
],
"database_specific": {
"source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-84366.json"
}
}
],
"modified": "2026-10-28T02:30:50.526449455Z",
"provider": "osv",
"references": [
"https://github.com/scrapy/scrapy/releases/tag/2.17.0",
"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/84xxx/CVE-2026-84366.json",
"https://github.com/scrapy/scrapy/security/advisories/GHSA-76g3-c3x4-crvx",
"https://nvd.nist.gov/vuln/detail/CVE-2026-84366",
"https://github.com/scrapy/scrapy/commit/9523e1ec8c41fde265a26d14563d178b6f1ad04b"
],
"provider_metadata": {
"cwe_ids": [
"CWE-319"
],
"cna_assigner": "GitHub_M",
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/84xxx/CVE-2026-84366.json"
}
},
"related_cves": [
{
"value": "CVE-2026-84366",
"evidence": "/id"
}
],
"security_relevant": true,
"severity_evidence": "/severity/0/score"
},
"source_id": "core-osv",
"document_id": 518929,
"published_at": "2026-09-01T20:29:23.143+00:00"
}