CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-FHGH-WQ4Q-R37X

GHSA-FHGH-WQ4Q-R37X: Remote Code Execution via Sigstore Signature Verification Bypass in uniget CLI

Alon Barad
Alon Barad
Software Engineer

Aug 17, 2026·5 min read·4 visits

Executive Summary (TL;DR)

A programming mistake in the uniget CLI reversed the check for disabling metadata signature verification. As a result, the application only verifies cryptographic signatures when the user explicitly requests to ignore them, allowing unauthenticated remote code execution via poisoned metadata in default installations.

A high-severity logic inversion flaw in the uniget CLI completely bypasses Sigstore cryptographic signature verification on metadata files by default. If an attacker can poison the package metadata cache or repository, they can execute arbitrary OS commands under the privileges of the active user.

Vulnerability Overview

The uniget CLI is a package management and download tool written in Go that retrieves tools and applications from various sources. To determine how to fetch and check the status of local binaries, the utility relies on a central metadata catalog (metadata.json). This metadata structure contains specialized testing parameters, including version-checking directives executed directly on the host operating system.

To prevent the execution of untrusted or modified instructions, the system relies on Sigstore cryptographic signatures to validate the catalog's integrity. Under normal operation, the application must confirm the authenticity of the metadata using the corresponding signature bundle (metadata.json.sigstore.json) before loading any configurations. This validation acts as the primary gate to prevent malicious command execution through untrusted package catalog files.

In version 0.27.4, developers introduced a logical error that disabled this verification loop under default configurations. This regression allowed the application to load unverified catalog files without raising warnings or execution errors. If an attacker is capable of local file system modification, cache injection, or adversary-in-the-middle manipulation, they can inject malicious instructions into the command-line executor.

Root Cause Analysis

The vulnerability stems from a logical negation error within the verification gate configuration checks. In version 0.27.1, introduced to address an injection vector, the application checked Sigstore signatures unconditionally. Developers subsequently introduced the UNIGET_IGNORE_METADATA_SIGNATURE environment variable to permit debugging or offline usage without checking cryptographic signatures.

Initially, the safety gate verified signatures if the environment variable was not set to "true". In commit b68a27d5 (released in version 0.27.4), developers altered the conditional branch to accept any non-empty value. However, the logical negation operator was omitted during this refactoring process.

The resulting conditional statement checked if the length of the environment variable was greater than zero. If the variable was empty or absent, the verification code path was bypassed entirely. Consequently, the application failed to call the underlying VerifySigstoreBundle function unless the user explicitly defined the environment variable intended to disable the check.

Code Analysis

The logic inversion is located in two distinct code paths within the application. The primary gate resides in internal/config/update.go inside the LoadMetadata function, which determines whether to invoke the verification routine.

// Vulnerable logic in v0.27.4 through v0.28.8
func (c *Config) LoadMetadata(filename string) (loadedTools *tool.Tools, err error) {
    // The signature check ONLY executes if the IGNORE environment variable is set.
    if len(os.Getenv("UNIGET_IGNORE_METADATA_SIGNATURE")) > 0 {
        _, err = security.VerifySigstoreBundle(
            filename,
            filename+".sigstore.json",
            // ... additional signature validation parameters
        )
        if err != nil {
            return nil, fmt.Errorf("error verifying sigstore bundle for metadata: %s", err)
        }
    }
    loadedTools, err = tool.LoadFromFile(filename)

A matching logic error exists in cmd/uniget/main.go within the re-download decision flow. The application evaluates whether a missing .sigstore.json signature bundle should trigger a fresh metadata download.

// Vulnerable download decision logic
if !myos.FileExists(configuration.GetMetadataFile()) ||
    configuration.AutoUpdate ||
    (len(os.Getenv("UNIGET_IGNORE_METADATA_SIGNATURE")) > 0 &&
        !myos.FileExists(configuration.GetMetadataFile()+".sigstore.json")) {

This check prevents uniget from recognizing a missing signature file as an error condition. In a default state, the execution bypasses download routines for missing signature files, rendering the overall cryptographic defense mechanism inactive.

Exploitation Methodology

An attacker can exploit this logic inversion to trigger remote code execution by replacing or poisoning the local metadata.json catalog file. When the target user initiates a tool version check, the CLI reads the metadata configuration and executes the code block defined under the check parameter.

The primary command injection sink is located within the RunVersionCheck function of the tool module:

// pkg/tool/tool.go
func (tool *Tool) RunVersionCheck() (string, error) {
    logging.Tracef("Running version check for %s: %s", tool.Name, tool.Check)
    cmd := exec.Command("/bin/bash", "-c", tool.Check+" | tr -d '\\n'")

Because the input to the /bin/bash system executor is derived directly from the unverified JSON structure, an attacker can insert a shell command inside the check attribute of any tool definition. When the victim executes commands such as uniget version <tool_name>, the shell command executes with the permissions of the local user.

This exploitation chain does not require cryptographic keys or signature generation because the target binary never calls the verification sequence.

Impact Assessment

The impact of this logic bypass is high. Because the security gate intended to prevent arbitrary code execution was completely disabled in default installations, the safety of the application rested entirely on the security of the host cache and metadata distribution channels.

If an attacker compromises the distribution repository, hijacks metadata mirrors, or alters local cache files via a separate lower-privilege process, they can gain full shell control. The commands are processed within /bin/bash under the security context of the active terminal session, allowing the attacker to read, modify, or delete files, perform privilege escalation, or establish persistent remote access.

The vulnerability is tracked under GitHub Security Advisory GHSA-FHGH-WQ4Q-R37X with a CVSS v3.1 score of 7.8, reflecting the high potential impact to system confidentiality, integrity, and availability.

Remediation and Mitigation

To resolve the vulnerability, update the uniget installation to version 0.28.9 or higher. The patch reverses the evaluation check in both update.go and main.go, changing the logic from checking for a non-empty string to verifying that the string is empty.

// Patched logic in v0.28.9
if len(os.Getenv("UNIGET_IGNORE_METADATA_SIGNATURE")) == 0 {
    // Verification now executes under default configuration states

For systems where the application cannot be immediately updated, administrators can apply a manual workaround. Setting the UNIGET_IGNORE_METADATA_SIGNATURE environment variable to any non-empty value (such as 1) will force vulnerable versions of the binary to trigger the signature checking sequence.

> [!WARNING] > This workaround is a temporary measure designed to trigger verification on affected binaries. If the variable remains set after upgrading to version 0.28.9 or later, the patched binary will skip signature verification as originally intended.

Official Patches

uniget-orgOfficial fix commit implementing comparison reversal to fix logic bypass.

Fix Analysis (1)

Technical Appendix

CVSS Score
7.8/ 10
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H

Affected Systems

uniget CLI

Affected Versions Detail

Product
Affected Versions
Fixed Version
gitlab.com/uniget-org/cli
uniget-org
>= 0.27.4, < 0.28.90.28.9
AttributeDetail
CWE IDCWE-347
Attack VectorLocal
CVSS v3.17.8
ImpactRemote Code Execution (RCE)
Exploit StatusProof of Concept
CISA KEV StatusNo

MITRE ATT&CK Mapping

T1553.002Subvert Trust Controls: Code Signing
Defense Evasion
T1059.004Command and Scripting Interpreter: Unix Shell
Execution
T1195.001Supply Chain Compromise: Compromise Software Dependencies
Initial Access
CWE-347
Improper Verification of Cryptographic Signature

The software does not verify, or incorrectly verifies, the cryptographic signature for data.

Known Exploits & Detection

GitHub Security Advisory ContextDescribes vulnerability details and includes replication steps to simulate catalog poisoning.

Vulnerability Timeline

Vulnerability remediated in code commit 6d8efd8dbb5b76196508058f640457d27d4e6972
2026-08-10
Official release of patched version v0.28.9
2026-08-11
GitHub Advisory Database formally published GHSA-FHGH-WQ4Q-R37X
2026-08-17

References & Sources

  • [1]GHSA-FHGH-WQ4Q-R37X: Bypass of metadata signature verification
  • [2]uniget CLI Release v0.28.9
  • [3]Associated Command Injection Vulnerability (CVE-2026-45152)

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•26 minutes ago•CVE-2026-59893
7.5

CVE-2026-59893: Regular Expression Denial of Service in sqlparse Lexer

A high-severity Regular Expression Denial of Service (ReDoS) vulnerability in the sqlparse Python library prior to version 0.6.0 allows unauthenticated remote attackers to trigger CPU exhaustion and application denial of service via crafted SQL inputs containing unmatched dollar-quoted literals or unclosed multiline comments.

Alon Barad
Alon Barad
0 views•6 min read
•about 2 hours ago•CVE-2026-59903
6.5

CVE-2026-59903: Cache Poisoning and Information Disclosure via CorsHandler Vary Header Overwrite

A technical analysis of CVE-2026-59903 in Netty's HTTP CORS handler, where the CorsHandler overwrites existing application Vary headers with Origin, leading to unauthorized caching of sensitive information.

Alon Barad
Alon Barad
4 views•5 min read
•about 3 hours ago•CVE-2026-59902
7.5

CVE-2026-59902: Memory Exhaustion in Netty SctpMessageCompletionHandler

An uncontrolled resource consumption vulnerability in Netty's SctpMessageCompletionHandler allows unauthenticated remote attackers to cause a Denial of Service. By transmitting a series of large, fragmented Stream Control Transmission Protocol (SCTP) messages, an attacker can exhaust the Java Virtual Machine heap or direct memory. This occurs because the handler fails to enforce limits on the cumulative byte size of buffered, incomplete SCTP fragments.

Amit Schendel
Amit Schendel
6 views•6 min read
•about 4 hours ago•CVE-2026-68518
8.8

CVE-2026-68518: Command Injection Bypass in Glances via Cross-Field Shell-Operator Reconstruction

A command injection bypass vulnerability exists in the Glances system monitoring tool prior to v4.5.6. This flaw permits an attacker with local process or container metadata control to bypass action-template sanitizers by reconstructing shell execution operators across adjacent unescaped variables. When a system alert triggers a configured action template, the reconstructed operators are evaluated by the underlying shell, leading to arbitrary code execution in the context of the Glances process.

Amit Schendel
Amit Schendel
4 views•9 min read
•3 days ago•CVE-2026-53653
8.7

CVE-2026-53653: Unauthenticated Denial of Service via Unbounded Image Derivative Dimensions in Grav CMS

Grav CMS prior to version 1.7.53 and 2.0.0-rc.8 is vulnerable to an unauthenticated remote denial of service (DoS) vulnerability. By supplying crafted query parameters with extremely large dimensions to image assets, remote unauthenticated attackers can force the server to allocate massive amounts of system memory, leading to kernel Out-Of-Memory (OOM) termination of web worker processes.

Amit Schendel
Amit Schendel
11 views•7 min read
•3 days ago•CVE-2026-53657
8.2

CVE-2026-53657: Privilege Escalation via Overly Permissive Unix Domain Socket in Lima Guest Agent

CVE-2026-53657 is a local privilege escalation vulnerability in Lima (lima-vm/lima) affecting versions prior to 2.1.3 when configured with the QEMU driver. The guest agent daemon, running as root, creates its communication socket `/run/lima-guestagent.sock` with world-writable permissions (0777). This allows unprivileged local users to command the agent to establish arbitrary tunnels, including to privileged local UNIX sockets (like D-Bus). Because the target daemon authenticates the incoming connection using the credentials of the root-owned guest agent (via SO_PEERCRED), unprivileged users can perform root operations, resulting in complete guest VM compromise.

Amit Schendel
Amit Schendel
8 views•9 min read