GHSA-m3qr-fvp4-78xj: Arc has unauthenticated application log disclosure via `/api/v1/logs`

Published Nov 3, 2026
·
Updated

Summary

Arc exposes GET /api/v1/logs without authentication even when authentication is enabled by default. The route is registered before the global Fiber authentication middleware, and the handler returns recent buffered application logs without performing its own authorization check.

Details

Arc applies the global auth middleware after calling server.RegisterRoutes():

- cmd/arc/main.go:1598-1599 registers base routes via server.RegisterRoutes(). - cmd/arc/main.go:1601-1618 configures and installs auth.NewMiddleware(...) later.

server.RegisterRoutes() registers GET /api/v1/logs as a base route:

- internal/api/server.go:164-183 registers base health, metrics, and logs routes, including s.app.Get("/api/v1/logs", s.logsHandler).

The logs handler returns buffered logs without checking authentication or authorization:

- internal/api/server.go:537-567 parses limit, level, and sinceminutes, reads logger.GetBuffer().GetRecent(...), and returns JSON. - internal/logger/buffer.go:9-16 defines log entries returned to callers: timestamp, level, component, message, and caller. - internal/logger/buffer.go:33-39 creates a global log buffer holding the last 10,000 entries. - internal/api/server.go:540-558 permits up to limit=1000 and sinceminutes=1440 in one unauthenticated request.

Authentication is enabled by default and /api/v1/logs is not listed as a public route:

- internal/config/config.go:841-843 defaults auth to enabled. - internal/auth/middleware.go:29-41 public defaults are /health, /ready, /api/v1/auth/verify, and /metrics prefix; /api/v1/logs is not public.

However, Fiber route/middleware order makes the later middleware ineffective for an earlier exact route. Local verification against Fiber v2.52.13 showed a route registered before app.Use(...) returns 200 and the later middleware is not reached. Fiber’s router walks routes in declaration order and stops after the first matching route unless the handler calls c.Next(); logsHandler does not call c.Next().

Proof of concept

Safe local reproduction only; do not scan external infrastructure.

1. Start Arc with default authentication enabled. 2. Request logs without an Authorization header or x-api-key header:

bash curl -i 'http://127.0.0.1:8000/api/v1/logs?limit=1000&sinceminutes=1440'

Expected vulnerable result:

http HTTP/1.1 200 OK Content-Type: application/json

{"timestamp":"...","count":...,"logs":[...]}

3. Compare with a protected endpoint without credentials:

bash curl -i 'http://127.0.0.1:8000/api/v1/auth/tokens'

Expected protected result:

http HTTP/1.1 401 Unauthorized

This demonstrates that default auth is active while /api/v1/logs bypasses it due to registration order.

Impact

An unauthenticated network attacker can retrieve recent application logs. Depending on deployment and log level, logs can disclose operational metadata such as component names, internal paths, database/measurement names, node identifiers, caller locations, request outcomes, and error details. This can assist further attacks and may expose sensitive data if any deployment logs secrets or user-controlled confidential data.

The audit did not confirm that the bootstrap admin token banner is captured by this endpoint; that banner is printed with fmt.Fprintf(os.Stderr, ...), while this endpoint reads the zerolog-backed application buffer.

Workarounds

Until patched, operators can restrict access to /api/v1/logs at a reverse proxy, firewall, ingress policy, or service mesh. If the endpoint is not needed, block it entirely.

Suggested fix

- Move /api/v1/logs registration after global auth middleware and require an authenticated administrator; or - Add explicit route-level middleware: auth.RequireAdmin(authManager) for /api/v1/logs; and - Add a regression test that unauthenticated requests to /api/v1/logs return 401/403 while /health and /ready remain public.

References / evidence

- cmd/arc/main.go:1598-1618 - internal/api/server.go:164-183 - internal/api/server.go:537-567 - internal/auth/middleware.go:29-41 - internal/config/config.go:841-843 - internal/logger/buffer.go:9-16 - internal/logger/buffer.go:33-39

Affected Software

1 affected componentFixes available
go/github.com/basekick-labs/arc<0.0.0-20260615165136-bb7d9761ad98
0.0.0-20260615165136-bb7d9761ad98

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade go/github.com/basekick-labs/arc to a version that resolves this vulnerability.

    Fixed in 0.0.0-20260615165136-bb7d9761ad98
  2. Configuration

    Require an authenticated administrator for /api/v1/logs by applying auth.RequireAdmin(authManager) at the route level, or register the route after the global authentication middleware.

    Arc GET /api/v1/logs route authentication middleware = auth.RequireAdmin(authManager)
  3. Compensating control

    Until patched, restrict or block access to /api/v1/logs at a reverse proxy, firewall, ingress policy, or service mesh; if the endpoint is not needed, block it entirely.

  4. Operational

    Add a regression test verifying that unauthenticated requests to /api/v1/logs return 401/403 while /health and /ready remain public.

Event History

Nov 3, 2026
Advisory Published
via GitHub·04:29 PM
Data Sourced
via GitHub·04:29 PM
DescriptionWeaknessAffected Software

Frequently Asked Questions

1

Who can access the affected endpoint?

Any unauthenticated party that can reach the Arc HTTP service can request the logs endpoint. Authentication being enabled, including the default configuration, does not protect this route.

2

What information can be exposed?

The endpoint returns recent buffered application log entries. Each entry includes a timestamp, level, component, message, and caller.

3

Does exploiting this require credentials or a special request?

No credentials are required. The affected route is a GET endpoint at /api/v1/logs, and its handler does not perform authentication or authorization checks.

4

How can I determine whether an instance is affected?

From an unauthenticated client that can reach the service, request GET /api/v1/logs. Receiving buffered log data in JSON indicates that the route is exposed without authentication.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203