{"id":"GHSA-8mv7-9c27-98vc","revision":"81c0e8797f04435fb33239ff5f61b02c","records":[{"revision":"81c0e8797f04435fb33239ff5f61b02c","observedAt":"2026-10-24T13:17:17.793+00:00","statement":{"source":"osv","id":"GHSA-8mv7-9c27-98vc","aliases":["CVE-2026-73423"],"title":"Astro: composable `astro/hono` pipeline bypasses `security.checkOrigin` when `middleware()` is absent or misordered","description":"## Summary\n\nIn the composable `astro/hono` pipeline, the `security.checkOrigin` protection is only installed by the `middleware()` primitive. The `actions()` and `pages()` primitives each dispatch to user code independently, so a pipeline that mounts either primitive before (or without) `middleware()` will bypass the origin check for those requests.\n\n## Details\n\n`security.checkOrigin` (default: `true`) is intended to reject cross-site `POST`/`PUT`/`PATCH`/`DELETE` form submissions. In the classic pipeline (`astro()` all-in-one), the check always runs because Astro injects a virtual middleware module even when the user has no `src/middleware.ts`. In the composable `astro/hono` pipeline, the user assembles primitives manually. The check is only installed inside `middleware()` — so:\n\n- Mounting `actions()` before `middleware()` allows cross-origin form-encoded action requests to execute before the gate runs. The `examples/advanced-routing` example and the Cloudflare `hono` docs shipped this order.\n- Omitting `middleware()` entirely (reasonable for apps with no custom middleware) silently drops `checkOrigin` protection for all on-demand endpoints and pages dispatched through `pages()`.\n\nThe attack is a blind write-only CSRF: the attacker can trigger a state-mutating action or endpoint handler using the victim's cookies, but cannot read the cross-origin response body.\n\n## Affected versions\n\nAstro `>= 7.0.0` when using the composable `astro/hono` pipeline with either:\n- `actions()` mounted before `middleware()`, or\n- `pages()` used without `middleware()`\n\nThe default (non-composable) pipeline is not affected.\n\n## Fix\n\nThe origin check is now applied at each dispatch sink (`ActionHandler.handle` and `PagesHandler.handleWithErrorFallback`), gated on `manifest.checkOrigin`, using the same predicate as the middleware. The check is order-independent and a no-op when `middleware()` has already run.\n\nFix: https://github.com/withastro/astro/pull/17250\n\n## Workaround\n\nEnsure `middleware()` is mounted before both `actions()` and `pages()` in the composable pipeline, and that it is always included even when no custom middleware logic is needed:\n\n```ts\napp.use(middleware());\napp.use(actions());\napp.use(pages());\n```","state":0,"publishedAt":"2026-07-20T23:26:27+00:00","modifiedAt":"2026-08-12T20:56:01.953813+00:00","affected":[{"ecosystem":"npm","name":"astro","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"7.0.0"},{"kind":"fixed","version":"7.0.6"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V4","vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:N/SI:L/SA:N","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"MODERATE"}],"references":["https://github.com/withastro/astro/security/advisories/GHSA-8mv7-9c27-98vc","https://github.com/withastro/astro/pull/17250","https://github.com/withastro/astro/commit/0b30b35f864310bee8485c952d1877e82e2b9b1a","https://github.com/withastro/astro","https://github.com/withastro/astro/releases/tag/astro@7.0.6"],"sourceUrl":"https://github.com/advisories/GHSA-8mv7-9c27-98vc","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-8mv7-9c27-98vc","identifiers":["GHSA-8mv7-9c27-98vc","CVE-2026-73423"]},"retained":false,"historicalAffected":[]}],"coverage":[]}