Email numminen.mikko.petteri@gmail.com with a description, reproduction steps, and the affected URL or file. This is a personal portfolio with no bug-bounty program, but reports are welcome and will be acknowledged. Please do not open a public issue for an unfixed vulnerability.
A response can be expected within a few days.
- The deployed static site (
mikkonumminen.dev/ thevercel.appalias). - This repository's source and build output.
Out of scope: the third-party hosting platform (Vercel) itself, denial-of-service, and findings that require a compromised local developer machine.
This site is deliberately small in attack surface:
- Fully static output — no SSR, no server runtime, no database, no authentication, and no user accounts. Pages are pre-rendered HTML served from a CDN. There is no server-side code path an attacker can reach.
- No secrets — the site requires no application secrets and ships no
.env. The environment variables it reads at build time are: Vercel-injected metadata (VERCEL_ENV,VERCEL_PROJECT_PRODUCTION_URL,VERCEL_URL) used to compute the canonical URL; an optionalPUBLIC_SENTRY_DSNenabling client telemetry (aPUBLIC_-prefixed value is exposed to the browser by design — a Sentry DSN is not a secret); and an optionalCHROME_PATHfor local PDF rendering. - Hardened response headers — a strict Content-Security-Policy, HSTS with
preload,X-Frame-Options: DENY,X-Content-Type-Options: nosniff, a locked-downPermissions-Policy, andframe-ancestors 'none'/object-src 'none'. All defined invercel.json. - One HTML-injection boundary — every string interpolated into
innerHTMLpasses throughescapeHtml.
The trust boundaries, security invariants an agent or contributor must not weaken,
and the current dependency-advisory status are documented in
docs/security/threat-model.md.
Dependencies are monitored by Dependabot. Run
npm audit for the current state. The Astro 5 → 6 upgrade has been adopted
(see ADR 0007), which cleared the two
Astro-native high advisories. The remaining highs reduce to one transitive,
dev-only esbuild advisory pair with no fix available — not present in the
static production artifact. See the threat model
for the per-advisory reachability analysis.