Published · yesterdayScience6 min read
Scanners turned a Vite file-read bypass into a wordlist sweep for .env files
F5 Labs logged 807 scanning sessions against exposed Vite development servers in August, four months after the file-read bypass was published, while the volunteers who coordinate CVEs for the OpenJS ecosystem take a planned 20-day break.
Written for builders.See today for builders

What happened
- F5 Labs reported that August 2026 saw an escalation in automated reconnaissance targeting internet-exposed developer tooling, with honeynet sensors recording a sustained scanning operation focused on pulling cloud credentials and infrastructure-as-code state files out of exposed Vite development servers.
- The campaign generated 807 session-grouped attacks, roughly 32,000 raw events over the monthly analysis window.
- Rather than target a single file, the scanning fleet systematically cycled through extensive wordlists of environment files, AWS keys, Azure tokens, and Infrastructure-as-Code state files.
- CVE-2026-39364 is an unauthenticated file-read and access-list bypass affecting the Vite development server, CVSS 7.5 (High), CWE-200, published April 7, 2026, affecting Vite 7.1.0 to versions prior to 7.3.2 and 8.0.5, with no authentication required.
- Vite exposes an internal @fs route designed to serve files from the host filesystem, and relies on the server.fs.deny deny-list setting to block access to sensitive items such as .env files, certificates, and private application source code.
Compiled by The ScientistSomething wrong?How this is made
Why it matters
A file-read bypass in the Vite development server was published on April 7, 2026, scored 7.5 on CVSS, and requires no authentication [5]. By August, F5 Labs was logging it as a sustained scanning operation against its honeynet sensors: 807 session-grouped attacks and roughly 32,000 raw events over the monthly analysis window, aimed at pulling cloud credentials and infrastructure-as-code state files out of exposed development servers [1][2]. Publication to commodity scanning traffic took about four months [17].
The fleet cycled through extensive wordlists of environment files, AWS keys, Azure tokens and IaC state files [4]. Roughly 32,000 events spread across 807 sessions works out at about 40 requests per session [16].
How the deny list gets walked past
Vite's development server exposes an internal `@fs` route so it can serve files from the host filesystem, and it relies on a deny-list setting, `server.fs.deny`, to block sensitive items such as `.env` files, certificates and private application source [6]. CVE-2026-39364 defeats that setting with query parameters. Append `?raw`, `?import&raw` or `?import&url&inline` and the server stops enforcing the filter, returning the target file with an HTTP 200 [7].
F5 breaks the chain into three stages. An unauthenticated scanner sends a GET to `/@fs/` referencing a sensitive path with the bypass parameters attached; the server normalizes the path and strips or misinterprets the query string while validating access, so the `server.fs.deny` check never fires; the file comes back in plaintext in the response body [9]. Affected versions run from 7.1.0 up to, but not including, 7.3.2 and 8.0.5 [5].
There is one real precondition, and it is a configuration choice. Vite binds to localhost by default, so the service has to be published: someone passes `--host`, sets `server.host`, or maps a Docker container port wrongly [8]. Pointed at a configuration directory, a successful read gives immediate access to plaintext API secrets, database passwords and cloud administrative credentials [14].
The evasion in the probe strings is aimed at the middleboxes. Alongside requests such as `GET /@fs/.env?raw??` and `GET /@fs/../.env?raw??`, F5 logged double-encoded traversal using `%252f`, which it describes as an attempt to bypass normalization routines in intermediate reverse proxies and web application firewalls [11].
What 807 sessions count
Three event classes carry the campaign in F5's telemetry: Information Leakage at 32,010 events, Predictable Resource Location at 1,729, and Path Traversal at 1,586 [10]. Those three add up to 35,325, roughly 3,300 more than the approximately 32,000 raw events given for the same window, and the write-up does not reconcile the two figures [15].
The bigger caveat is about the denominator. These are counts from honeynet sensors [1]. They count requests. The share of real estates that answer one with a 200 is a separate measurement, and this kind of telemetry does not produce it.
Severity scores and what actually fires
Older Vite access-control flaws kept firing in the same window: CVE-2025-30208 at CVSS 5.3, CVE-2025-31125 at 5.3, and CVE-2024-45811 at 4.8 [12]. Of the cluster, only CVE-2025-31125 appears on CISA's Known Exploited Vulnerabilities catalog [13]. F5's own assessment is that the simplicity of the query-string trick makes exploitation trivial against any reachable server [13].
A CVSS score ranks the consequence of a successful read. A KEV listing records that exploitation has been observed and confirmed. An operator who wants to know which strings a scanning fleet already has loaded has to look somewhere else [16].
The coordination desk closes on September 17
The OpenJS Foundation CNA will pause its security operations from September 17 to October 6, 2026, both dates included, and return on October 7 [18]. The gap is 20 days [29]. Express, an OpenJS-hosted project, is joining the break [21], which also coincides with the Node.js Collaborator Summit [22].
The stated cause is load. The Foundation says the volume of advisories and CVE requests it coordinates has grown sharply, that a significant part of the growth comes from reports generated or assisted by large language models, and that many are low signal but still need careful human review to separate real issues from noise [19]. The CNA team wrote that "AI has lowered the barrier to generating security reports, but not the cost of handling them, and volunteer availability does not scale with report volume" [20].
There is a precedent in the post: the Foundation writes that the curl project ran a month-long pause on vulnerability intake it called "Summer of Bliss", described it afterwards as one of their best decisions in a long while, and that the experience showed a clearly announced break can give maintainers real rest without meaningful security consequences [23]. During the OpenJS pause, actively exploited vulnerabilities and critical issues posing immediate risk still get a response, through the public #security channel on the Foundation's Slack, with a request to keep the first message high-level and mark it urgent [24].
Nothing in either publication connects the scanning campaign to the pause. The dates overlap. What the two documents share is a subject: the same window in which a four-month-old bypass became automated credential harvesting is the window in which one ecosystem's CVE coordination is deliberately reduced to an emergency channel. Node.js also edited the definitions in the same period, listing a commit from James M Snell in the 26.8.2 changelog titled "meta: refine the security vuln posture for experimental features" [28].
A control that expires by itself
npm shipped the other kind of answer on September 9. Any account that signs in with a recovery code now gets a temporary 72-hour security hold, a protection that previously applied only to high-impact accounts [25]. During the hold, publishing and other security-sensitive writes are paused, including creating access tokens, while sign-in, browsing and installing keep working [26]. The hold expires automatically, with no action or support request needed to restore full access [26]. npm describes the goal as slowing account-takeover attempts and reducing the risk of malicious publishing from a compromised recovery code [27].
The npm hold assumes a stolen credential will be used at some point and inserts three days of friction on the write path without anyone being awake to authorise it. Coordinated disclosure assumes a volunteer reads the report. The npm hold needs no human across the twenty days; the CVE triage the OpenJS post is cutting back needs one [18][19].
For anyone running a development server on a published port, what matters is narrow, and it does not depend on the AI-report argument at all. The bypass needs no account, the query parameters walk past the deny list, and the paths in the wordlists are the ones holding plaintext secrets [5][7][4]. F5's conclusion from the traffic is that the rapid increase from baseline background noise shows how quickly newly disclosed bypass methods get folded into automated credential-harvesting operations [32].
What to watch
- Whether the OpenJS Foundation CNA resumes on October 7 as announced, and what its intake rules look like after 20 days of queued reports.
- Whether CVE-2026-39364 is added to CISA's Known Exploited Vulnerabilities catalog, where only CVE-2025-31125 from this Vite cluster currently sits.
- Whether npm extends the automatically expiring hold pattern from recovery-code sign-ins to other credential paths.
Claim ledger
Ranked by verification strength, evidence, and original report placement.
- [1]
F5 Labs reported that August 2026 saw an escalation in automated reconnaissance targeting internet-exposed developer tooling, with honeynet sensors recording a sustained scanning operation focused on pulling cloud credentials and infrastructure-as-code state files out of exposed Vite development servers.
- [2]
The campaign generated 807 session-grouped attacks, roughly 32,000 raw events over the monthly analysis window.
- [4]
Rather than target a single file, the scanning fleet systematically cycled through extensive wordlists of environment files, AWS keys, Azure tokens, and Infrastructure-as-Code state files.
ReportedView cited source - [5]
CVE-2026-39364 is an unauthenticated file-read and access-list bypass affecting the Vite development server, CVSS 7.5 (High), CWE-200, published April 7, 2026, affecting Vite 7.1.0 to versions prior to 7.3.2 and 8.0.5, with no authentication required.
ReportedView cited source - [6]
Vite exposes an internal @fs route designed to serve files from the host filesystem, and relies on the server.fs.deny deny-list setting to block access to sensitive items such as .env files, certificates, and private application source code.
ReportedView cited source - [7]
When parameters such as ?raw, ?import&raw, or ?import&url&inline are appended to a request, the server fails to enforce deny-list filtering and serves the target file with an HTTP 200 response.
ReportedView cited source - [8]
Under default configurations Vite binds to localhost; the development server becomes directly reachable over the local network or public internet when developers pass the --host flag, set server.host, or misconfigure Docker container port mappings.
ReportedView cited source - [9]
F5 describes a three-stage attack chain: an unauthenticated scanner sends an HTTP GET to /@fs/ referencing a sensitive file path with bypass query parameters; the server normalizes the path and strips or misinterprets the query string during access validation, failing to trigger the server.fs.deny check; the server returns the requested file in plaintext in the HTTP response body.
ReportedView cited source - [10]
F5 telemetry shows Information Leakage accounting for 32,010 events, followed by Predictable Resource Location (1,729) and Path Traversal (1,586).
ReportedView cited source - [11]
Observed probes included GET /@fs/.env?raw??, GET /@fs/root/.env?raw?? and GET /@fs/../.env?raw??, and the presence of double-encoded path traversal (%252f) indicates an attempt to bypass normalization routines in intermediate reverse proxies and WAFs.
ReportedView cited source - [12]
The activity co-fires with related Vite access-control flaws: CVE-2025-30208 (CVSS 5.3), CVE-2025-31125 (CVSS 5.3), and CVE-2024-45811 (CVSS 4.8).
ReportedView cited source - [13]
With the exception of CVE-2025-31125, which appears on the CISA Known Exploited Vulnerabilities catalog, these CVEs remain unlisted on CISA KEV; F5 states that the simplicity of the query-string trick makes exploitation trivial against any reachable server.
- [14]
When targeted against configuration directories, successful exploitation gives attackers immediate access to plaintext API secrets, database passwords, and cloud administrative credentials.
ReportedView cited source - [32]
F5 writes that the rapid increase from baseline background noise highlights how quickly newly disclosed bypass methods are folded into automated credential-harvesting operations.
- [18]
The OpenJS Foundation CNA will pause its security operations from September 17 to October 6, 2026 (both dates included) and says it will be back on October 7, 2026.
ReportedView cited source - [19]
The OpenJS Foundation says the volume of security advisories and CVE requests it coordinates has grown sharply, that a significant part of that growth comes from reports generated or assisted by large language models, and that many are low signal but need careful human review to separate real issues from noise.
- [20]
"AI has lowered the barrier to generating security reports, but not the cost of handling them, and volunteer availability does not scale with report volume."
- [22]
The break coincides with the Node.js Collaborator Summit, where much of the community gathers in person.
ReportedView cited source - [23]
The OpenJS post says the curl project recently ran a month-long pause on vulnerability intake it called "Summer of Bliss", described it afterwards as one of their best decisions in a long while, and that their experience showed a clearly announced break can give maintainers real rest without meaningful security consequences.
- [24]
During the pause, OpenJS says it will still respond to vulnerabilities that are being actively exploited or critical issues posing immediate and serious risk, via the public #security channel on the OpenJS Foundation Slack, asking reporters to keep the first message high-level and mark it urgent.
ReportedView cited source - [25]
npm now places a temporary 72-hour security hold on any account after a successful recovery-code sign-in, extending a protection that previously applied only to high-impact accounts; the change was published in the GitHub changelog dated September 9, 2026.
ReportedView cited source - [26]
During the npm hold, publishing and other security-sensitive writes, including creating access tokens, are paused, while sign-in, browsing and installing packages still work; the hold expires automatically with no action or support request needed to restore full access.
ReportedView cited source - [27]
npm says the extension builds on preventive account protection for high-impact accounts, further slowing account-takeover attempts and reducing the risk of malicious publishing from a compromised recovery code.
- [28]
The Node.js 26.8.2 (Current) changelog lists a commit from James M Snell, "meta: refine the security vuln posture for experimental features" (#65438).
ReportedView cited source - [15]
The three F5 event classes sum to 35,325, about 3,300 more than the roughly 32,000 raw events reported for the same monthly window.
Derived - [16]
Roughly 32,000 raw events across 807 session-grouped attacks is about 40 requests per session.
Derived - [17]
CVE-2026-39364 was published on April 7, 2026, and the scanning escalation was recorded in August 2026, about four months later.
Derived - [29]
September 17 to October 6, 2026 inclusive is 20 days.
Derived
Sources & coverage · 20 publishers
The reporting this story was synthesized from, earliest first. Every link goes to the original.
- master.dev2d agoStay Sharp in the Age of AI
- github.com2d agomodern-web-types
- openjsf.org2d agothe OpenJS Foundation's CVE team is taking a break
- blog.master.dev2d agonew and emerging HTML features worth knowing about
- github.com2d agogoes ESM-only
- github.com2d agoMoment.js 2.31.0
- github.com2d agopopular jargon reference
- github.com2d agoan npm package
- github.com2d agoHere's the agenda
- github.com2d agoPlaywright 1.63
- threejs.paris2d agoThree.js Conference
- tympanus.net2d agoa live-blog writeup of both days
- snapdom.dev2d agoSnapDOM 3.0: Turn DOM Elements Into Images, Canvas and More
- mattstromawn.com2d agothis algorithm for picking categorical chart colors
- evanhahn.com2d agoAnecdotally, Programmers Dislike reduce
- flaviocopes.com2d agoA Deep Dive into StyleX
- sentry.io2d agoWorkshop: From an Error to the Logs That Explain It
- chromewebstore.google.com2d agoChrome Web Store
- cel.cs.brown.edu2d agoA Design Space Exploration of async/await
- rgrove.github.io2d agoparse-xml 5.0
- reactrouter.com2d agoReact Router 8.4
- mattstromawn.com2d agocategory-colors: Generate 'Least Wrong' Color Palettes for Charts
- nodejs.org2d agoNode.js v26.8.2 (Current)
- f5.com2d agoscanning for exposed Vite dev servers
- nodejs.org2d agov24.21.0 (LTS)
- seldo.com2d ago'Nobody Pays for Open Source: We Can Force Them To'
- philipwalton.com2d agoModern Web Types: TypeScript Support for Newer Web APIs
- github.blog2d agonpm now places a temporary 72-hour 'security hold'
Additional citations
- F5 Labs
- OpenJS Foundation CNA
- The OpenJS Foundation CNA team, in its announcement
- OpenJS Foundation, describing curl
- npm changelog