Aug 17, 2026·5 min read·12 visits
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.
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.
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.
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.
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.
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.
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 statesFor 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.
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
gitlab.com/uniget-org/cli uniget-org | >= 0.27.4, < 0.28.9 | 0.28.9 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-347 |
| Attack Vector | Local |
| CVSS v3.1 | 7.8 |
| Impact | Remote Code Execution (RCE) |
| Exploit Status | Proof of Concept |
| CISA KEV Status | No |
The software does not verify, or incorrectly verifies, the cryptographic signature for data.
An LDAP injection vulnerability exists in the centraldogma-server-auth-shiro module of LY Corporation Central Dogma before version 0.84.0. The search logic dynamically constructs LDAP search filters by interpolating user-provided usernames without escaping RFC 4515 metacharacters. Unauthenticated remote attackers can leverage this flaw to bypass authentication, enumerate directory hierarchies, and access unauthorized resources.
CVE-2026-11746 is a critical vulnerability in Central Dogma Server prior to version 0.84.0, where an embedded ZooKeeper replication secret silently falls back to a publicly known, hard-coded default string ('ch4n63m3'). Remote attackers with access to the replication network can authenticate as legitimate cluster peers, potentially leading to unauthorized data exposure, state manipulation, or complete cluster takeover.
A logical verification flaw in ZITADEL's external JWT Identity Provider validation allows attackers to bypass session expiration checks. If an incoming JWT lacks the 'exp' claim, the system skips validation entirely, creating an indefinitely valid session. This issue has been addressed in versions 3.4.12 and 4.15.2.
CVE-2026-59149 identifies a directory traversal vulnerability in `@mockoon/commons-server`, the backend mock-server library powering the Mockoon application. The flaw occurs in the path containment validation logic used during raw file response generation. An unauthenticated attacker can exploit this weakness to retrieve arbitrary files from sibling directories sharing a common prefix with the designated static base directory.
An in-depth analysis of CVE-2026-59148, a high-severity flaw in Mockoon where unauthenticated administrative endpoints and a wildcard Cross-Origin Resource Sharing (CORS) policy allow remote execution, state poisoning, and credential theft.
An improper authentication vulnerability (CWE-287) in ZITADEL's external identity provider handler before version 4.15.3 allows remote attackers to perform complete account takeover. When auto-linking by email is enabled, ZITADEL verifies that the local target account has a verified email address but fails to verify if the external provider confirmed ownership of that same email. Attackers can exploit this by registering an unverified account with a victim's email address on a permissive external provider, leading to unauthorized account binding and persistent access.