Vulnerabilities in pkg:golang/github.com/charmbracelet/soft-serve

PACKAGE
Advisory Identifier: GHSA-xgxp-f695-6vrp
Advisory Summary

CVE-2026-33353 is a HIGH security vulnerability vulnerability (CWE-862: Missing Authorization) affecting Github.com/charmbracelet/soft serve libraries in the Go ecosystem. The issue involves in soft serve, an authenticated repo import can clone server-local private repositories. Remediation is available by upgrading affected packages to version 0.11.6.

10 Known Advisory Record(s)
Package Vulnerability Intelligence

pkg:golang/github.com/charmbracelet/soft-serve

10 Known Advisory Record(s)

Vulnerability advisories affecting package pkg:golang/github.com/charmbracelet/soft-serve. Select an advisory below to view technical details or fixes.

Advisory ID CVE / NVD Severity Summary
GHSA-xgxp-f695-6vrp CVE-2026-33353 HIGH In Soft Serve, an authenticated repo import can clone server-local private repositories
GHSA-3fvx-xrxq-8jvv CVE-2026-30832 CRITICAL soft-serve vulnerable to SSRF via unvalidated LFS endpoint in repo import
GHSA-pchf-49fh-w34r CVE-2026-24058 HIGH Soft Serve Affected by an Authentication Bypass
GHSA-6jm8-x3g6-r33j CVE-2026-22253 MODERATE Soft Serve is missing an authorization check in LFS lock deletion
GHSA-fv2r-r8mp-pg48 CVE-2025-64494 MODERATE Soft Serve does not sanitize ANSI escape sequences in user input
GHSA-vwq2-jx9q-9h9f CVE-2025-64522 CRITICAL Soft Serve is vulnerable to SSRF through its Webhooks
GHSA-33pr-m977-5w97 CVE-2025-58355 HIGH Soft Serve vulnerable to arbitrary file writing through SSH API
GHSA-j4jw-m6xr-fv6c CVE-2025-22130 MODERATE Soft Serve vulnerable to path traversal attacks
GHSA-m445-w3xr-vp2f CVE-2024-41956 HIGH soft-serve vulnerable to arbitrary code execution by crafting git-lfs requests
GHSA-mc97-99j4-vm2v CVE-2023-43809 HIGH Soft Serve Public Key Authentication Bypass Vulnerability when Keyboard-Interactive SSH Authentication is Enabled

CVE-2026-33353 at a Glance

CVE Identifier CVE-2026-33353
GHSA Identifier GHSA-xgxp-f695-6vrp
Severity HIGH
CVSS v3.1 Base Score N/A
CWE Classification CWE-862: Missing Authorization
Affected Product Github.com/charmbracelet/soft serve
Package Ecosystem Go
Published Date
Last Updated

How to Fix CVE-2026-33353

To remediate this vulnerability, upgrade all affected Github.com/charmbracelet/soft serve dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

github.com/charmbracelet/soft-serve fixed: 0.11.6
Upgrade github.com/charmbracelet/soft-serve to 0.11.6
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

inspect dependencies for github.com/charmbracelet/soft-serve

How to Check if You Are Affected

To determine whether your application is affected by CVE-2026-33353, inspect your project dependencies for Github.com/charmbracelet/soft serve:

inspect dependencies for github.com/charmbracelet/soft-serve

Analyze the terminal output to locate any version of Github.com/charmbracelet/soft serve in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 0.11.6), your application is affected.

Note: Verify declared build manifests and deployed runtime container environments.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-862: Missing Authorization, where the product does not perform an authorization check when an actor attempts to access a resource or perform an action. In Github.com/charmbracelet/soft serve, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

### Summary An authorization flaw in `repo import` allows any authenticated SSH user to clone a server-local Git repository, including another user's private repo, into a new repository they control. This breaks the private-repository confidentiality boundary and should be treated as High severity. ### Details Repo import checks authorization only for the destination repository name, not for the source remote. The destination-side authorization comes from [`pkg/ssh/cmd/cmd.go:172`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/ssh/cmd/cmd.go#L172), which calls [`pkg/backend/user.go:46`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/backend/user.go#L46). If the destination repo does not already exist, any authenticated user is granted `ReadWriteAccess` at [`pkg/backend/user.go:94`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/backend/user.go#L94). The import command then passes the user-controlled `REMOTE` into [`pkg/backend/repo.go:102`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/backend/repo.go#L102). In vulnerable `HEAD`, `git.Clone(remote, rp, copts)` is reached without validating that `remote` is actually a network remote. As a result, a user can supply a server filesystem path such as `$DATA_PATH/repos/secret.git` and cause the server to clone its own local bare repository into a new repo owned by the attacker. The relevant vulnerable flow is: - [`pkg/ssh/cmd/import.go`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/ssh/cmd/import.go) - [`pkg/ssh/cmd/cmd.go:172`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/ssh/cmd/cmd.go#L172) - [`pkg/backend/user.go:94`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/backend/user.go#L94) - [`pkg/backend/repo.go:102`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/backend/repo.go#L102) ### PoC Configuration: - Default local test configuration is sufficient. - SSH must be enabled. - At least two users are needed: one owner/admin and one low-privilege authenticated user. Reproduction steps: 1. Start Soft Serve. 2. As an admin, create a private repo: ```sh soft repo create secret -p ``` 3. Create a second low-privilege user: ```sh soft user create user1 --key "$USER1_AUTHORIZED_KEY" ``` 4. Seed the private repo with secret content: ```sh git clone ssh://localhost:$SSH_PORT/secret secret echo 'top secret' > secret/SECRET.txt git -C secret add SECRET.txt git -C secret commit -m 'first' git -C secret push origin HEAD ``` 5. Confirm the low-privilege user cannot access the private repo directly: ```sh usoft repo info secret ``` Expected result: ```text Error: repository not found ``` 6. As the low-privilege user, import the server-local bare repo path into a new repo: ```sh usoft repo import stolen "$DATA_PATH/repos/secret.git" --lfs-endpoint http://example.com ``` 7. Clone the attacker-controlled imported repo and read the secret: ```sh ugit clone ssh://localhost:$SSH_PORT/stolen stolen-clone cat stolen-clone/SECRET.txt ``` Expected result: ```text top secret ``` Notes: - The `--lfs-endpoint` value is needed to avoid later LFS endpoint handling rejecting the local-path import. ### Impact This is an authorization bypass and confidentiality issue. Any authenticated SSH user on a multi-user Soft Serve instance can duplicate server-local Git repositories into new repositories they own, even when they are not a collaborator and direct access to the original private repo is denied. The primary impact is unauthorized disclosure of private source code and any secrets committed to those repositories. Impacted parties: - Operators hosting Soft Serve for multiple users or teams - Owners of private repositories on the same instance - Any deployment where untrusted authenticated users can use `repo import` Practical impact: - Theft of private source code - Disclosure of secrets committed to private repos - Exposure of unreleased or internal projects - Possible follow-on supply-chain risk if stolen code contains credentials or release material

CVE-2026-33353 Affected Github.com/charmbracelet/soft serve Versions

1 component(s)
Fixed Versions:
0.11.6
Product / Package Ecosystem Affected Versions Fixed Version
github.com/charmbracelet/soft-serve
Go
≥ 0.6.0
< 0.11.6
0.11.6

References

Frequently Asked Questions

What is CVE-2026-33353?
CVE-2026-33353 is a security vulnerability in Github.com/charmbracelet/soft serve involving In Soft Serve, an authenticated repo import can clone server-local private repositories under CWE-862: Missing Authorization.
Which Github.com/charmbracelet/soft serve versions are affected?
Affected versions include releases prior to 0.11.6 across affected packages: github.com/charmbracelet/soft-serve.
What version fixes CVE-2026-33353?
Upgrading to 0.11.6 (or the latest patched release for your respective branch) resolves the vulnerability.
Is github.com/charmbracelet/soft-serve affected?
Yes, github.com/charmbracelet/soft-serve is affected in releases prior to 0.11.6. Upgrade your dependency to 0.11.6 or later.
What CWE is associated with CVE-2026-33353?
CVE-2026-33353 is classified under CWE-862: Missing Authorization (The product does not perform an authorization check when an actor attempts to access a resource or perform an action.).
How can I check Go dependencies for CVE-2026-33353?
Run the dependency tree command: 'inspect dependencies for github.com/charmbracelet/soft-serve'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-xgxp-f695-6vrp",
  "modified" : "2026-03-27T21:58:26Z",
  "published" : "2026-03-19T19:27:58Z",
  "aliases" : [ "CVE-2026-33353" ],
  "summary" : "In Soft Serve, an authenticated repo import can clone server-local private repositories",
  "details" : "### Summary\nAn authorization flaw in `repo import` allows any authenticated SSH user to clone a server-local Git repository, including another user's private repo, into a new repository they control. This breaks the private-repository confidentiality boundary and should be treated as High severity.\n\n### Details\nRepo import checks authorization only for the destination repository name, not for the source remote. The destination-side authorization comes from [`pkg/ssh/cmd/cmd.go:172`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/ssh/cmd/cmd.go#L172), which calls [`pkg/backend/user.go:46`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/backend/user.go#L46). If the destination repo does not already exist, any authenticated user is granted `ReadWriteAccess` at [`pkg/backend/user.go:94`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/backend/user.go#L94).\n\nThe import command then passes the user-controlled `REMOTE` into [`pkg/backend/repo.go:102`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/backend/repo.go#L102). In vulnerable `HEAD`, `git.Clone(remote, rp, copts)` is reached without validating that `remote` is actually a network remote. As a result, a user can supply a server filesystem path such as `$DATA_PATH/repos/secret.git` and cause the server to clone its own local bare repository into a new repo owned by the attacker.\n\nThe relevant vulnerable flow is:\n- [`pkg/ssh/cmd/import.go`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/ssh/cmd/import.go)\n- [`pkg/ssh/cmd/cmd.go:172`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/ssh/cmd/cmd.go#L172)\n- [`pkg/backend/user.go:94`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/backend/user.go#L94)\n- [`pkg/backend/repo.go:102`](https://github.com/charmbracelet/soft-serve/blob/main/pkg/backend/repo.go#L102)\n\n### PoC\nConfiguration:\n- Default local test configuration is sufficient.\n- SSH must be enabled.\n- At least two users are needed: one owner/admin and one low-privilege authenticated user.\n\nReproduction steps:\n1. Start Soft Serve.\n2. As an admin, create a private repo:\n\n```sh\nsoft repo create secret -p\n```\n\n3. Create a second low-privilege user:\n\n```sh\nsoft user create user1 --key \"$USER1_AUTHORIZED_KEY\"\n```\n\n4. Seed the private repo with secret content:\n\n```sh\ngit clone ssh://localhost:$SSH_PORT/secret secret\necho 'top secret' > secret/SECRET.txt\ngit -C secret add SECRET.txt\ngit -C secret commit -m 'first'\ngit -C secret push origin HEAD\n```\n\n5. Confirm the low-privilege user cannot access the private repo directly:\n\n```sh\nusoft repo info secret\n```\n\nExpected result:\n\n```text\nError: repository not found\n```\n\n6. As the low-privilege user, import the server-local bare repo path into a new repo:\n\n```sh\nusoft repo import stolen \"$DATA_PATH/repos/secret.git\" --lfs-endpoint http://example.com\n```\n\n7. Clone the attacker-controlled imported repo and read the secret:\n\n```sh\nugit clone ssh://localhost:$SSH_PORT/stolen stolen-clone\ncat stolen-clone/SECRET.txt\n```\n\nExpected result:\n\n```text\ntop secret\n```\n\nNotes:\n- The `--lfs-endpoint` value is needed to avoid later LFS endpoint handling rejecting the local-path import.\n\n### Impact\nThis is an authorization bypass and confidentiality issue.\n\nAny authenticated SSH user on a multi-user Soft Serve instance can duplicate server-local Git repositories into new repositories they own, even when they are not a collaborator and direct access to the original private repo is denied. The primary impact is unauthorized disclosure of private source code and any secrets committed to those repositories.\n\nImpacted parties:\n- Operators hosting Soft Serve for multiple users or teams\n- Owners of private repositories on the same instance\n- Any deployment where untrusted authenticated users can use `repo import`\n\nPractical impact:\n- Theft of private source code\n- Disclosure of secrets committed to private repos\n- Exposure of unreleased or internal projects\n- Possible follow-on supply-chain risk if stolen code contains credentials or release material",
  "severity" : [ {
    "type" : "CVSS_V4",
    "score" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Go",
      "name" : "github.com/charmbracelet/soft-serve"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0.6.0"
      }, {
        "fixed" : "0.11.6"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/charmbracelet/soft-serve/security/advisories/GHSA-xgxp-f695-6vrp"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-33353"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/charmbracelet/soft-serve/commit/c147421caf234bcfc1570c79d728ecbbe5813e55"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/charmbracelet/soft-serve"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/charmbracelet/soft-serve/releases/tag/v0.11.6"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-200", "CWE-862" ],
    "severity" : "HIGH",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-03-19T19:27:58Z",
    "nvd_published_at" : "2026-03-24T20:16:29Z"
  }
}