@rsdoctor/rspack-plugin has Unauthenticated HTTP API that Exposes Project Source Code and Build Metadata
Exploiteerbaarheid: geen exploit bekend. Blootstelling: niet internet-facing / geen bekende blootstelling. Gemeentelijke relevantie: geen match met de gemeentelijke context. Impact: burgerdienstverlening kan geraakt worden. Bronvertrouwen: middel.
Scorecomponenten
geen exploit bekend
niet internet-facing / geen bekende blootstelling
geen match met de gemeentelijke context
burgerdienstverlening kan geraakt worden
beperkt bevestigd
geen mitigatie bekend
Geen automatische bestuurlijke escalatie — operationeel op te volgen.
Prioriteit: verhoogd
Aanbevolen reactietijd: deze week beoordelen
Verhoogd (59/100) — deze week beoordelen. Bepalend: technische ernst (85/100) en gemeentelijke relevantie (85/100). Beoordeel dit deze week en bepaal of gerichte actie nodig is. Deze prioritering is regelgebaseerd en navolgbaar; weeg de aannames en onzekerheden mee voor de eigen gemeentelijke omgeving.
zeer hoog — De technische ernst is hoog: succesvol misbruik kan systemen of gegevens direct compromitteren.
laag — Er zijn geen concrete aanwijzingen voor misbruik.
zeer hoog — Dit raakt technologie of processen die bij vrijwel elke Nederlandse gemeente in gebruik zijn.
verhoogd — Plan beoordeling en opvolging in; directe actie is nu niet vereist.
Positieve factoren
De dreiging raakt remote access of VPN (zoals Citrix, Fortinet, Ivanti of Palo Alto): vaak direct vanaf internet bereikbaar.
Bron: Technologieherkenning in titel, samenvatting en labels
De dreiging raakt een leverancier of de toeleveringsketen; gemeenten zijn sterk afhankelijk van externe leveranciers.
Bron: Technologieherkenning in titel, samenvatting en labels
Remote access en VPN zijn direct vanaf internet bereikbaar en een geliefd doelwit; dit verhoogt de urgentie.
Bron: Technologieherkenning in titel, samenvatting en labels
Negatieve factoren
De zekerheid is 'likely'; een onbevestigd signaal verlaagt de urgentie tot het is geverifieerd.
Bron: Zekerheidsinschatting van de radar
Aannames
Onzekerheden
Deze prioritering is regelgebaseerd en navolgbaar. Een CISO kan deze onderbouwing gebruiken richting directie of ICT-management; stem de opvolging af op de eigen gemeentelijke omgeving.
12 concrete acties verdeeld over 7 rol(len). Aanbevolen reactietijd: deze week beoordelen.
Taken voor CISO
Laat vaststellen of de getroffen component of het proces binnen de gemeente in gebruik is.
Bewijs vereist: Bevestiging in/uit gebruik door ICT-beheer.
Wijs per actie een eigenaar en deadline toe en bewaak dat de acties worden afgerond.
Laat bevestigen dat de patchstatus en mitigerende maatregelen voor de remote-accessvoorziening op orde zijn.
Bewijs vereist: Bevestiging van het beheerteam of de leverancier.
Beoordeel hoe kritiek de getroffen leverancier is voor de gemeentelijke processen.
CISO
Laat vaststellen of de getroffen component of het proces binnen de gemeente in gebruik is.
Bewijs vereist: Bevestiging in/uit gebruik door ICT-beheer.
Wijs per actie een eigenaar en deadline toe en bewaak dat de acties worden afgerond.
Laat bevestigen dat de patchstatus en mitigerende maatregelen voor de remote-accessvoorziening op orde zijn.
Bewijs vereist: Bevestiging van het beheerteam of de leverancier.
Beoordeel hoe kritiek de getroffen leverancier is voor de gemeentelijke processen.
ISO / patchmanagement
Controleer of een patch of mitigatie beschikbaar is en bepaal de deadline voor opvolging.
Bewijs vereist: Patch- of mitigatieoverzicht met versienummers.
SOC
Let op afwijkende of mislukte aanmeldingen en sessies op VPN of remote access.
ICT-beheer
Breng in kaart welke systemen, applicaties of accounts de kwetsbare component bevatten.
Bewijs vereist: Lijst van geraakte systemen uit de CMDB of inventaris.
Beperk waar mogelijk de internettoegang tot de remote-accessvoorziening tot de patch is uitgevoerd.
Functioneel beheer
Controleer of de geraakte applicatie of koppeling extra aandacht nodig heeft.
Leveranciersmanager
Vraag de leverancier of de kwetsbare component wordt gebruikt en of misbruik is geconstateerd.
Bewijs vereist: Schriftelijke reactie van de leverancier.
Vraag de leverancier om een concrete planning voor patch en mitigatie.
Bewijs vereist: Planning van de leverancier.
Proceseigenaar
Beoordeel wat de dreiging betekent voor de continuiteit van het geraakte proces.
De acties zijn regelgebaseerd gegenereerd. Stem ze af op de eigen gemeentelijke omgeving en wijs per actie een eigenaar en deadline toe.
Relevante logbronnen
MITRE ATT&CK — tactieken
MITRE ATT&CK — technieken
Huntingvragen
KQL-huntingqueries (Microsoft Sentinel)
Defender-waarschuwingen rond endpointcompromittatie
Toont waarschuwingen van Microsoft Defender for Endpoint met een hoge of gemiddelde ernst.
// Defender-waarschuwingen rond endpointcompromittatie
SecurityAlert
| where TimeGenerated > ago(7d)
| where ProductName == "Microsoft Defender for Endpoint"
| where AlertSeverity in ("High", "Medium")
| project TimeGenerated, AlertName, AlertSeverity, CompromisedEntity,
Description
| order by TimeGenerated descFalse positives: Beheertooling en pentests kunnen legitieme waarschuwingen genereren.
Aanmeldingen vanuit onbekende landen
Toont geslaagde aanmeldingen vanuit landen buiten het verwachte werkgebied.
// Aanmeldingen vanuit onverwachte landen
let bekendeLanden = dynamic(["NL", "BE", "DE"]);
SigninLogs
| where TimeGenerated > ago(7d)
| where ResultType == 0
| where isnotempty(Location) and Location !in (bekendeLanden)
| summarize Aanmeldingen = count() by UserPrincipalName, Location
| order by Aanmeldingen descFalse positives: Vakanties, grensregio's en cloud-egress kunnen onverwachte landen tonen.
Impossible travel-risicodetecties
Toont aanmeldingen die Entra ID Protection markeert als 'impossible travel' of onbekende kenmerken - mogelijk overgenomen sessies.
// Impossible travel-risicodetecties (Entra ID Protection)
AADUserRiskEvents
| where TimeGenerated > ago(7d)
| where RiskEventType in ("impossibleTravel", "unfamiliarFeatures",
"anonymizedIPAddress")
| project TimeGenerated, UserPrincipalName, RiskEventType, RiskLevel,
IpAddress, Location
| order by TimeGenerated descFalse positives: VPN's, mobiele netwerken en cloud-egress kunnen een legitieme aanmelding als onmogelijke reis laten ogen.
Indicators of compromise
Geen IOC's herkend in de openbare dreigingstekst. IOC's kunnen later via een threat-intelfeed worden aangevuld.
False-positive-aandachtspunten
Beoordeel afwijkingen in context; reguliere beheeractiviteit kan op een incident lijken.
Deze informatie is uitsluitend defensief: detectie en hunting. De KQL-queries zijn read-only en bedoeld voor Microsoft Sentinel.
Vragenlijst
E-mailonderwerp
Uitvraag leveranciersincident — reactie gevraagd
E-mailtekst
Geachte heer/mevrouw, Onze gemeente heeft kennisgenomen van een mogelijk incident bij npm. Wij doen deze uitvraag ter verificatie en feitenvaststelling, om te kunnen beoordelen of de aan onze gemeente geleverde dienstverlening wordt geraakt. Het betreft mogelijk het product of onderdeel "@rsdoctor/rspack-plugin". Wij verzoeken u de onderstaande vragen volledig en onderbouwd te beantwoorden en uw reactie binnen tien (10) werkdagen na ontvangst van dit bericht schriftelijk aan te leveren bij de informatiebeveiligingsfunctie van onze gemeente. Zijn bepaalde gegevens nog niet beschikbaar, dan ontvangen wij graag een tussentijdse terugkoppeling. Vragen: 1. Bent u geraakt door dit incident? 2. Welke dienstverlening aan gemeenten is mogelijk geraakt? 3. Zijn gegevens van onze gemeente bij het incident betrokken? 4. Zijn er persoonsgegevens betrokken? 5. Welke continuïteitsmaatregelen heeft u genomen? 6. Is een melding bij toezichthouders nodig of inmiddels gedaan? 7. Welke hersteltermijn verwacht u? 8. Welke bewijsstukken kunt u met ons delen? Deze uitvraag is bedoeld om de feiten vast te stellen en gezamenlijk tot een passende opvolging te komen. Wij stellen uw tijdige medewerking op prijs. Met vriendelijke groet, [Naam] Namens de informatiebeveiligingsfunctie Gemeente [Gemeente]
Vul vóór verzending de afzender en gemeentenaam in. De tekst is zakelijk en gericht op feitenvaststelling; pas hem aan op de eigen situatie.
Deze dreiging raakt de onderstaande governance-thema's. Met de aanbevolen bewijsstukken kunt u aantonen dat het signaal is opgevolgd — bruikbaar voor BIO2, NIS2/CBW, ISMS en de ENSIA-verantwoording.
Het incident raakt een leverancier; leveranciersmanagement borgt de afspraken en opvolging.
Aanbevolen bewijs: Leveranciersuitvraag en de schriftelijke reactie van de leverancier.
Uitval bij een leverancier kan de gemeentelijke continuïteit raken.
Aanbevolen bewijs: Continuïteitsafspraken met de leverancier.
NIS2 verlangt aandacht voor de beveiliging van de toeleveringsketen.
Aanbevolen bewijs: Risicobeoordeling van de leverancier en de gemaakte afspraken.
De dreiging en de opvolging ervan horen thuis in de periodieke rapportage aan het management en de directie.
Aanbevolen bewijs: Vermelding in de CISO- of directierapportage informatiebeveiliging.
De radar legt de beoordeling, prioritering en opvolging navolgbaar vast.
Aanbevolen bewijs: Scoringonderbouwing, actiekaart en statusgeschiedenis uit de radar.
De uitkomst van de uitvraag kan leiden tot bijsturing van afspraken of maatregelen (Act).
Aanbevolen bewijs: Besluit over vervolgmaatregelen of contractafspraken.
Aantoonbare opvolging draagt bij aan de jaarlijkse ENSIA-verantwoording over de BIO.
Aanbevolen bewijs: Overzicht van opgevolgde dreigingen voor de ENSIA-zelfevaluatie.
### Summary The default Rsdoctor report HTTP server started by `@rsdoctor/rspack-plugin` binds to all network interfaces (`0.0.0.0`) and serves a `POST /api/data/key` endpoint with no authentication and wildcard CORS (`Access-Control-Allow-Origin: *`). Any network-adjacent or remote attacker can send a single unauthenticated request to retrieve the full source code of all compiled JavaScript modules (`moduleCodeMap`), serialized build configuration (`configs`), error details, and other sensitive build metadata. This server is enabled by default in non-CI environments, requiring no special configuration from the victim developer. ### Details **Root cause: server binds to all interfaces with no authentication and no key allowlist.** The vulnerability is composed of four independently observable defects that together create a complete unauthenticated information-disclosure path: **1. Server binds to `0.0.0.0` (all interfaces)** `packages/utils/src/build/server.ts:107` calls `server.listen(port, callback)` without a `host` argument. Node.js defaults to `0.0.0.0`, exposing the server on every network interface of the developer's machine, including LAN interfaces. ```ts // packages/utils/src/build/server.ts:83,107 server.listen(port, () => { // no host → 0.0.0.0 resolve(res); }); ``` **2. Wildcard CORS enabled unconditionally** `packages/sdk/src/sdk/server/index.ts:106` applies `cors()` middleware with no origin restriction, and `:203–204` additionally sets `Access-Control-Allow-Origin: *` explicitly on every API response, allowing cross-origin browser requests from any domain. ```ts // packages/sdk/src/sdk/server/index.ts:106 this.app.use(cors()); // :203 res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Credentials', 'true'); ``` **3. `POST /api/data/key` registered with no authentication middleware** `packages/sdk/src/sdk/server/apis/data.ts:6` registers the route via `@Router.post`. There is no authentication guard, token check, or session validation anywhere in the middleware chain. ```ts // packages/sdk/src/sdk/server/apis/data.ts:6,13,29 @Router.post(SDK.ServerAPI.API.LoadDataByKey) public async loadDataByKey() { let { key } = req.body as SDK.ServerAPI.InferRequestBodyType ; const data = await this.loadData(key); return data; } ``` **4. `key` is passed to `getStoreData()` without an allowlist** `packages/sdk/src/sdk/server/apis/base.ts:29–39` indexes the entire SDK data store directly using the attacker-controlled `key`, including dot-path traversal for nested keys. ```ts // packages/sdk/src/sdk/server/apis/base.ts:29,33,35-36 const data = this.ctx.sdk.getStoreData(); let res = data[key]; if (key.includes(sep)) { res = key.split(sep).reduce((t, k) => t[k], data); } return res; ``` **Source-to-sink data flow:** | Step | Location | Description | |------|----------|-------------| | 1 | `packages/rspack-plugin/src/plugin.ts:111` | Plugin bootstraps the SDK server during build | | 2 | `packages/core/src/inner-plugins/utils/config.ts:98,110–115` | `disableClientServer` defaults to `false`; server starts in all non-CI builds | | 3 | `packages/utils/src/build/server.ts:83,107` | HTTP server created and bound to `0.0.0.0` | | 4 | `packages/sdk/src/sdk/server/index.ts:106,203` | Wildcard CORS applied unconditionally | | 5 | `packages/sdk/src/sdk/server/apis/data.ts:6,13,29` | Attacker `key` accepted from request body | | 6 | `packages/sdk/src/sdk/server/apis/base.ts:29,36,39` | `key` indexes `sdk.getStoreData()` with no allowlist | | 7 | `packages/sdk/src/sdk/sdk/index.ts:487,491` | `moduleCodeMap` getter calls `_moduleGraph.toCodeData()` | | 8 | `packages/graph/src/graph/module-graph/graph.ts:464–469` | `toCodeData()` returns all module source objects | | 9 | `packages/graph/src/graph/module-graph/module.ts:248–250` | Each module exposes `source`, `transformed`, and `parsedSource` | | 10 | `packages/sdk/src/sdk/server/router.ts:119,125` | Serialized result written to HTTP response | **Default confi
Categorie 'supplier_incident' overgenomen van de bron; geen specifieker incidenttype gedetecteerd. Severity 'critical' bepaald op basis van: bronlabel 'high', trefwoord 'unauthenticated'. Confidence 'likely': gerenommeerd securityonderzoek (GitHub Security Advisories). Geen bekende leveranciers of producten herkend.
Deze dreiging scoort 55/100 voor de gemeentelijke relevantie. Meegewogen: een hoge ernstinschaling, getroffen internetgerichte technologie en een leveranciers- of ketenrisico. Geraakte processen: Netwerk en infrastructuur, Leveranciersketen.
Bestuurlijke duiding
Deze dreiging is relevant voor de gemeente. Omdat het een leverancier betreft, is de gemeente afhankelijk van diens herstel en is regie op de keten nodig. De impact is beheersbaar mits de geadviseerde maatregelen tijdig worden opgevolgd. Laat de CISO de voortgang bewaken en escaleer richting directie zodra nieuwe signalen daartoe aanleiding geven.
Geraakte processen
Geraakte technologie
Betrokken rollen
CISO · ISO · SOC · ICT beheer · Leveranciersmanager
Concrete stappen voor ICT-beheer en het securityteam.
Dit zijn algemene handelingsperspectieven. Stem de opvolging af op de eigen omgeving en het ISMS van uw gemeente.
Deel geen vertrouwelijke of persoonsgegevens in dit formulier. Beschrijf je melding algemeen; gevoelige details horen niet op een publieke radar thuis.