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-WX3M-WHQV-XV47

GHSA-WX3M-WHQV-XV47: Multiple Path Traversal and Symlink-Following Vulnerabilities in skillctl

Amit Schendel
Amit Schendel
Senior Security Researcher

Jun 5, 2026·6 min read·8 visits

Executive Summary (TL;DR)

A cluster of path-safety flaws in skillctl allows attackers to exfiltrate local files via symbolic links and delete arbitrary directories using manipulated path configurations.

An analysis of four critical vulnerabilities in the skillctl Rust crate (versions 0.1.0 and 0.1.1) that allow arbitrary file exfiltration and directory deletion.

Vulnerability Overview

The skillctl command-line utility is a Rust crate designed to manage and synchronize personal agent skill libraries across software engineering projects. In versions 0.1.0 and 0.1.1, the tool suffers from a critical cluster of filesystem path validation and symbolic link handling vulnerabilities. These flaws expose operators to potential arbitrary file disclosure and arbitrary directory deletion.

The primary attack surface resides within the mechanism used to clone, copy, and synchronize skill folders. This process involves copying directory structures from remote or local repositories and reading configuration definitions from user-supplied .skills.toml files. Because the software fails to validate input paths and handle symbolic links securely, malicious repositories can manipulate the host filesystem during standard CLI operations.

This vulnerability cluster is tracked as GHSA-WX3M-WHQV-XV47. The vulnerabilities present a High severity risk due to the potential for unauthorized local file exfiltration and local denial of service through file destruction. The issues are resolved in the 0.1.2 release.

Root Cause Analysis

The root cause of these vulnerabilities stems from four distinct programming oversights in skillctl related to path resolution and filesystem operations. The first flaw lies in the recursive copying helper function fs_util::copy_dir_all. When resolving directory entries, the code uses standard Rust filesystem APIs without checking whether a directory entry is a symbolic link. If an entry is a symbolic link to a file, the API evaluates is_dir() to false and falls back to standard file copying, which implicitly dereferences the link and copies the target content.

The second flaw is located in the serialization of the .skills.toml configuration file. The configuration parser deserializes destination and source_path directly into PathBuf structures without enforcing boundaries or performing lexical path validation. In Rust, joining an absolute path to an existing PathBuf completely replaces the base path, allowing an absolute destination path in the configuration file to hijack the entire filesystem path used during execution.

The third and fourth flaws exist in parameter handling. The --target argument in the detect subcommand and the user-defined fork names fail to validate relative path traversal sequences (..). By supplying traversal sequences, an attacker can escape the designated project directory root. When the utility attempts to clean or rename folders during synchronization, it deletes or overwrites directories outside the intended workspace.

Code Analysis

An analysis of the vulnerable source code prior to the patch reveals how the recursive directory copying process fails to account for symbolic links. In the fs_util::copy_dir_all implementation, the code performs a standard directory traversal. It evaluates file types and executes a standard file copy operation when the item is not a directory.

// Vulnerable implementation in fs_util.rs (<= 0.1.1)
// If the entry is a symlink to a file, is_dir() evaluates to false,
// and fs::copy will dereference the symlink and copy the target file.
if entry.file_type()?.is_dir() {
    copy_dir_all(&from, &to)?;
} else {
    fs::copy(&from, &to)?; // Vulnerable: implicit dereference of symlinks
}

The patch introduced in commit 827fff5c0698dd9e48e777d5907cf7bc19b91aca resolves this by querying symbolic link metadata explicitly before executing filesystem modifications. The updated implementation replaces the blind directory traversal with checks utilizing symlink_metadata and halts operations if a symbolic link is detected.

// Patched implementation in fs_util.rs (>= 0.1.2)
// The function now explicitly rejects symlinks to prevent dereferencing.
pub fn copy_dir_all(src: &Path, dst: &Path) -> Result<()> {
    let src_meta = fs::symlink_metadata(src)?;
    if src_meta.file_type().is_symlink() {
        return Err(AppError::Config("refusing to copy symlink".into()));
    }
    // ...
    for entry in fs::read_dir(src)? {
        let entry = entry?;
        let from = entry.path();
        let to = dst.join(entry.file_name());
        let file_type = entry.file_type()?;
        if file_type.is_symlink() {
            return Err(AppError::Config("refusing to copy nested symlink".into()));
        }
        if file_type.is_dir() {
            copy_dir_all(&from, &to)?;
        } else {
            fs::copy(&from, &to)?; // Safe: symlinks have been actively blocked
        }
    }
    Ok(())
}

Exploitation Methodology

Exploitation of these vulnerabilities requires inducing an operator to run skillctl commands on a project containing a malicious configuration or a compromised skill library. In a file exfiltration scenario, an attacker publishes a repository containing a skill with a symbolic link. This symbolic link is designed to point to a known location of sensitive files on the operator's machine, such as /home/user/.aws/credentials or /etc/hostname.

When the operator adds the skill using the skillctl add command, the utility clones the repository and copies its contents. The application traverses the directories, encounters the symbolic link, treats it as a standard file due to the flawed file-type check, and copies the contents of the target sensitive file into the local project workspace. The next time the user runs a synchronization command like skillctl push, the copied file is uploaded to the remote repository.

In a directory destruction scenario, an attacker can modify the .skills.toml configuration file in a shared repository or via a Pull Request. By setting the destination field to an absolute path such as /home/victim/.ssh or a relative path with directory traversals such as ../../.ssh, the attacker forces the utility to execute filesystem operations outside the project root. When the victim runs skillctl pull, the replace_folder_contents function executes fs::remove_dir_all on the target directory, deleting the victim's local configurations.

Impact Assessment

The security impact of GHSA-WX3M-WHQV-XV47 is characterized by unauthorized disclosure of sensitive data and localized denial of service through file destruction. Because the tool runs with the privileges of the invoking user, the exploitation range is bounded only by the operating system permissions of the operator running the CLI utility.

The arbitrary file exfiltration vector allows external actors to target high-value assets. This includes configuration profiles, cryptographic keys, authentication tokens, and environment configurations stored on developers' machines. This exfiltration bypasses standard access controls by leveraging the legitimate write-back functionality of the tool during subsequent repository pushes.

The directory deletion vector presents a severe threat to operational integrity. A single automated pull request can cause irreversible loss of key directories on developer workstations. No specific host configurations or administrative privileges are required to exploit these flaws beyond standard command execution permissions.

Remediation & Workarounds

The primary remediation strategy is the immediate upgrade of all skillctl installations to version 0.1.2 or later. The update introduces robust lexical path safety checks and explicitly rejects symbolic links during cloning and synchronization operations. Users can update their global installation by running cargo install skillctl --force.

If immediate upgrading is not feasible, operators must implement strict manual workarounds. Avoid running skillctl commands within untrusted repositories or merging pull requests that modify .skills.toml configurations without performing a manual security review of the proposed file paths.

Additionally, operators can inspect local systems for indicators of compromise. Search .skills.toml files for absolute paths or directory traversal sequences using text search utilities. Furthermore, search for symbolic links within downloaded skill libraries to ensure no links point to sensitive system folders.

Fix Analysis (1)

Technical Appendix

CVSS Score
7.5/ 10

Affected Systems

skillctl

Affected Versions Detail

Product
Affected Versions
Fixed Version
skillctl
umanio-agency
>= 0.1.0, <= 0.1.10.1.2
AttributeDetail
CWE IDCWE-22, CWE-61
Attack VectorLocal, via malicious remote repository or pull request configurations
CVSS SeverityHigh (7.5)
Exploit Statusnone
KEV Statusnot listed

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1083File and Directory Discovery
Discovery

Vulnerability Timeline

Vulnerabilities privately disclosed by researcher firebaguette
2026-05-19
Lead developer Fernando Pinho merges patch commit 827fff5c0698dd9e48e777d5907cf7bc19b91aca
2026-05-20
Version 0.1.2 released on crates.io
2026-05-20
GitHub Advisory GHSA-WX3M-WHQV-XV47 reviewed and published
2026-06-05

References & Sources

  • [1]GitHub Security Advisory GHSA-WX3M-WHQV-XV47
  • [2]Vendor Security Advisory
  • [3]Patch Commit Details

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

•2 days ago•GHSA-8RQH-VXPR-X77P
4.3

GHSA-8RQH-VXPR-X77P: Stored Cross-Site Scripting via MIME Type Spoofing in Plone REST API

A stored Cross-Site Scripting (XSS) vulnerability exists within plone.restapi, the REST API package for Plone content management system. By supplying a spoofed input MIME type (text/x-html-safe), an attacker can mislead the rendering layer (plone.app.textfield) into assuming that the supplied content is already sanitized. This causes the system to skip the safe_html transform, allowing arbitrary JavaScript to execute in the victim's browser when they view the compromised page.

Amit Schendel
Amit Schendel
9 views•7 min read
•2 days ago•CVE-2026-11400
8.0

CVE-2026-11400: Privilege Escalation via Untrusted Search Path in AWS Advanced JDBC Wrapper

An untrusted search path vulnerability in the GlobalDatabasePlugin component of the AWS Advanced JDBC Wrapper for Amazon Aurora PostgreSQL allows authenticated, low-privilege database users to hijack administrative session queries. By defining a custom function in a writable schema such as the public schema, an attacker can hijack queries executed automatically during driver-level topology detection. When a highly privileged database user connects to the database utilizing an affected version of the wrapper, the custom function executes under their security context, enabling remote privilege escalation to rds_superuser.

Alon Barad
Alon Barad
11 views•6 min read
•2 days ago•CVE-2026-27771
8.2

CVE-2026-27771: Authentication Bypass and Information Disclosure in Gitea Container and Composer Registries

CVE-2026-27771 represents a critical security flaw in Gitea and Forgejo (up to and including version 1.26.1) involving missing authorization checks (CWE-862). Unauthenticated remote attackers can query, enumerate, and download private container images from the OCI-compliant container registry. Additionally, unauthorized users can retrieve private or internal source repository URLs via the Composer package registry metadata API. A public proof-of-concept exists, and threat metrics indicate highly active scanning and exploitation risks.

Alon Barad
Alon Barad
20 views•7 min read
•2 days ago•GHSA-CVPC-HCCG-WMW4
8.8

GHSA-CVPC-HCCG-WMW4: Missing Authorization in Formie Administrative Settings Allows Privilege Escalation

A missing authorization vulnerability in the Formie plugin for Craft CMS prior to version 3.1.28 allows low-privileged Control Panel users to read and modify sensitive administrative settings, configuration options, and third-party integrations.

Amit Schendel
Amit Schendel
7 views•6 min read
•2 days ago•CVE-2026-53598
7.5

CVE-2026-53598: Arbitrary File Read via File Reference Expansion in Microsoft Prompty

CVE-2026-53598 is a directory traversal and arbitrary file read vulnerability in Microsoft Prompty ecosystem loaders across multiple languages. Prior to version 2.0.0-beta.2, the loaders resolved `${file:...}` reference strings inside frontmatter configuration blocks without enforcing that the target file paths resided within authorized directories. This deficiency allows an attacker-controlled configuration file to read sensitive operating system and application files through absolute paths, directory traversal, or symbolic link escapes. The issue is addressed across the Python, C#, Node.js/TypeScript, and Rust ecosystems.

Amit Schendel
Amit Schendel
8 views•6 min read
•2 days ago•GHSA-MFR4-MQ8W-VMG6
7.3

GHSA-MFR4-MQ8W-VMG6: Path Traversal in proot-distro copy Command Allows Container Escape

A directory traversal vulnerability exists in the copy subcommand of the proot-distro utility. Due to incomplete path sanitization, local attackers or malicious scripts can read from or write to arbitrary files outside the container rootfs, bypassing isolation barriers and potentially gaining unauthorized access or persistent execution on the host system.

Alon Barad
Alon Barad
9 views•7 min read