OliveTin has unauthenticated DoS via concurrent map writes in OAuth2 state handling

Description

Summary

An unauthenticated denial-of-service vulnerability exists in OliveTin’s OAuth2 login flow. Concurrent requests to /oauth/login can trigger unsynchronized access to a shared registeredStates map, causing a Go runtime panic (fatal
error: concurrent map writes) and process termination. This allows remote attackers to crash the service when OAuth2 is enabled.

Details

The OAuth2 handler stores per-login state in a shared map without synchronization:

  • service/internal/auth/otoauth2/restapi_auth_oauth2.go:24
    registeredStates map[string]*oauth2State
  • Unlocked write in login handler: .../restapi_auth_oauth2.go:141
  • Unlocked read in callback check: .../restapi_auth_oauth2.go:174
  • Unlocked writes in callback flow: .../restapi_auth_oauth2.go:284-285
  • Unlocked read in auth chain check: .../restapi_auth_oauth2.go:376

These paths are network reachable via publicly registered routes:

  - service/internal/httpservers/frontend.go:71 → /oauth/login
  - service/internal/httpservers/frontend.go:72 → /oauth/callback

Because Go HTTP handlers run concurrently, high parallel traffic to /oauth/login causes concurrent map access and runtime panic.

Tested on:

  • Container image: ghcr.io/olivetin/olivetin:3000.10.0
  • Source also contains same pattern at commit/tag eb42029b5d0c0633551621288180dd4566b913f7 (3000.10.1)

PoC

  1. Start OliveTin with OAuth2 provider configured (example github), exposing port 1337.
  2. Confirm baseline:
  curl -i http://127.0.0.1:1337/readyz
  curl -i "http://127.0.0.1:1337/oauth/login?provider=github"

Expected: 200 for /readyz, 302 for /oauth/login.

  1. Run concurrency PoC:
  python3 /OliveTin/tools/poc_oauth2_state_map_race_dos.py \
    --base-url http://127.0.0.1:1337 \
    --provider github \
    --workers 80 \
    --requests 120000 \
    --health-failures 3
  1. Verify crash:

docker inspect olivetin-dos --format 'status={{.State.Status}} exit={{.State.ExitCode}}'
docker logs olivetin-dos 2>&1 | grep -E "fatal error: concurrent map|concurrent map writes|restapi_auth_oauth2.go"

Observed result:

  • Process exited with code 2
  • Logs include:
    • fatal error: concurrent map writes
    • .../internal/auth/otoauth2/restapi_auth_oauth2.go:141 in HandleOAuthLogin

Impact

  • Vulnerability type: Race condition (CWE-362) leading to DoS.
  • Attacker requirements: network access only; no authentication required for exploit path.
  • Impacted deployments: OliveTin instances with OAuth2 enabled and reachable over network.
  • Security impact: remote unauthenticated attacker can repeatedly crash OliveTin, causing availability loss until restart/recovery.

poc_oauth2_state_map_race_dos.py

Basic information

Type
reviewed
Severity
high
Advisory on GitHub
Open advisory ↗
Repository advisory
Open repository advisory ↗
Source code
Browse source ↗
Published (advisory)
2026-03-02 21:41:36 UTC
Updated
2026-03-05 22:49:36 UTC
GitHub reviewed
2026-03-02 21:41:36 UTC
NVD published
2026-03-05

EPSS Score

Score Percentile
0.19% 40.91%

CVSS Scores

Base score Version Severity Vector
7.5 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H Click to expand
Attack vector (AV:N)
Could be attacked over the internet or any normal routed network—not just someone sitting at the machine.
Attack complexity (AC:L)
Once they can reach the bug, pulling it off is straightforward—no weird race conditions or rare setup.
Privileges required (PR:N)
No account or special rights needed—anonymous or random user is enough.
User interaction (UI:N)
Nobody has to click “OK” or open a trap file; it can work without a victim helping.
Scope (S:U)
Damage stays in the same “trust bubble” as the broken component—no big spill into unrelated systems.
Confidentiality (C:N)
Doesn’t really leak secrets in a meaningful way.
Integrity (I:N)
Data isn’t meaningfully altered or forged.
Availability (A:H)
Could take the service down hard or make it unusable for people who depend on it.

Identifiers

CWEs

CWE id Name
CWE-362 Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')
CWE-400 Uncontrolled Resource Consumption
CWE-662 Improper Synchronization

Credits

  • kule500 (reporter)

Affected packages (1)

Vulnerable version ranges and first patched releases as published by GitHub.

Ecosystem Package Vulnerable range First patched Vulnerable functions
go github.com/OliveTin/OliveTin < 0.0.0-20260301235225-f044d90d5525c 0.0.0-20260301235225-f044d90d5525c

References

cvelogic Threat Intelligence