{"items":[{"id":"NVI-00017564","kind":"vulnerability","title":"Algernon: Host header path traversal in --domain mode reads files and runs Lua from parent dir","revision":1,"unknowns":["Customer inventory, deployment, reachability and exploitation have not been inspected."],"lifecycle":"active","identifiers":["GHSA-jc3j-x6pg-4hmv","CVE-2026-48126"],"plain_summary":"GitHub lists this reviewed advisory for github.com/xyproto/algernon. Published version ranges and source prerequisites are shown below; this is not an inspection of a visitor’s application.","review_status":"source_listed","control_topics":[],"public_actions":[{"summary":"Identify the exact component and deployed version, examine the linked publisher’s conditions, and retain evidence of any mitigation.","source_ids":["sr-214346558d547fcbd681ebab180b351a"],"action_type":"investigate","limitations":"Confirm current vendor support, compatibility and deployment evidence. This report has not tested a fix in your system.","current_supported_target":null}],"schema_version":"1.1.0","source_metrics":[{"kind":"CVSS","as_of":"2026-06-23T21:49:13.000Z","value":"8.2 high","meaning":"GitHub source severity; exploitability and local consequence require separate evidence.","source_id":"sr-214346558d547fcbd681ebab180b351a"}],"why_it_matters":"Published affected context helps an owner decide what evidence to gather. This report has not examined your application.","related_sources":[{"id":"sr-214346558d547fcbd681ebab180b351a","url":"https://github.com/advisories/GHSA-jc3j-x6pg-4hmv","basis":"vendor_advisory","notes":"GitHub Advisory Database; CC-BY-4.0. Each advisory links its original attribution. Null normalizes fields.","title":"GHSA-jc3j-x6pg-4hmv","publisher":"GitHub Advisory Database","observed_at":"2026-11-05T19:06:16.668Z"}],"affected_context":[{"certainty":"source_listed","source_ids":["sr-214346558d547fcbd681ebab180b351a"],"technology":"github.com/xyproto/algernon","known_exclusions":[],"conditions_summary":"### Summary\n\nWhen algernon is started with `--domain` (or `--letsencrypt`, which silently turns on `--domain` at `engine/flags.go:372`), the request handler resolves the served directory by joining the configured `--dir` with the value of the client-supplied `Host` header. The join is performed by `filepath.Join` with no validation, so a `Host: ..` header walks one level above the document root. Subsequent file resolution then exposes everything in that parent directory — arbitrary file read, full directory listing, and, if any `.lua` file is present, server-side Lua execution. Algernon 1.17.7 and earlier are affected.\n\n### Details\n\n`engine/handlers.go` (function `RegisterHandlers`, around line 510):\n\n```go\nallRequests := func(w http.ResponseWriter, req *http.Request) {\n    ...\n    servedir := servedir\n    if addDomain {\n        servedir = filepath.Join(servedir, utils.GetDomain(req))   // <— line 531\n    }\n    ...\n    filename := utils.URL2filename(servedir, urlpath)\n```\n\n`utils/web.go` (`GetDomain`):\n\n```go\nfunc GetDomain(req *http.Request) string {\n    host, _, err := net.SplitHostPort(req.Host)\n    if err != nil {\n        return req.Host          // <— Host header returned verb","public_affected_ranges":["<= 1.17.7"]}],"null_published_at":"2026-11-05T19:10:21.416Z","source_updated_at":"2026-06-23T21:49:13.000Z","source_disclosed_at":"2026-06-23T21:49:11.000Z","is_synthetic_fixture":false,"null_last_reviewed_at":null,"public_change_summary":"First indexed by Null; source disclosure date is shown separately.","null_first_observed_at":"2026-11-05T19:06:16.668Z"}],"next_cursor":null,"snapshot_revision":"42594"}