CodeVetter · Repo Unpack · Risk map
withastro/astro
These risks are source observations and explicitly labeled hypotheses, not confirmed vulnerabilities. Sensitive boundaries include executable configuration, package-manager subprocesses, request-body parsing, forwarded headers, remote images, encrypted server data, and output-directory cleanup. Runtime composition and content persistence are coupling hotspots with regression tests present in the inspected sample. Documentation drift can misdirect changes, and CI has at least one intentionally nonblocking test step. No repository-wide security or coverage conclusion follows from this bounded inspection.
- Configuration loading is an execution boundary: loadConfig() calls loadConfigWithVite(), rather than parsing a passive JSON document.
- Package discovery can dynamically import resolved packages and trigger installation outside CI; installation uses a detected package manager and user confirmation unless skipAsk is set.
- Origin protection is enforced at action and composable page dispatch sinks as well as through middleware; its predicate exempts safe methods/prerendering and allows requests lacking both Fetch Metadata and Origin.
- Action namespace traversal blocks forbidden path keys, requires own properties, and treats functions as leaves to prevent traversal into handler properties.
- Hypothesis requiring adapter-specific verification: action parsing trusts a finite Content-Length for direct json()/formData() parsing, whereas missing-length requests use streamed byte accounting; correctness depends on how the host constructs Request bodies and headers. (inferred)
- Unexpected action exceptions become INTERNAL_SERVER_ERROR results containing the original Error.message, and serialization includes that message in the response body.
- Remote image requests validate initial sources and each redirect destination, cap redirect depth, and buffer the successful response; this is a network and memory-allocation boundary.
- Builds empty the configured outDir unless emptyOutDir is false; AstroBuilder explicitly rejects equality with root, making output-path configuration a destructive file-I/O boundary to inspect before execution.
- Content file loaders resolve names against config.root and read through fs; chunk writers prune their target directory after committing the manifest, so configured paths control the filesystem scope.
- Atomic store writes use a fixed .tmp sibling and require callers to serialize concurrent writes; MutableDataStore supplies in-instance serialization, but cross-process coordination was not established by these files.
- Cryptographic code reads the ASTRO_KEY variable by name, uses AES-GCM with 256-bit generated keys and random 12-byte IVs, and supports authenticated additionalData; no key values were inspected.
- The agent architecture guide describes Pipeline classes while core/README.md explicitly describes functional handlers and compatibility facades; CONTRIBUTING.md also lists pnpm 10.28.0 while package.json pins 11.27.0.