---
id: CVE-2026-55598
title: >-
  PinePods: Authenticated SSRF via podcast RSS enclosure URL (server-side fetch
  of attacker-controlled URL, no host validation)
summary: >-
  PinePods is a complete, self-hosted podcast management system written in Rust.
  Prior to 0.9.0, an authenticated user can subscribe to an attacker-controlled
  RSS feed through `POST /api/data/add_podcast` in
  `rust-api/src/handlers/podcasts…
severity: critical
cvss: 9.1
cvssVector: 'CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:L'
cvssSource: cna
cwe:
  - CWE-918
vendor: madeofpendletonwool
product: PinePods
affected:
  - PinePods < 0.9.0
ssvc:
  exploitation: poc
  automatable: 'no'
  technicalImpact: partial
  timestamp: '2026-10-30T19:53:56.579652Z'
exploitAvailable: true
published: '2026-10-30'
updated: '2026-10-30'
sourceUpdated: '2026-10-30T19:54:47.327Z'
source: CVEORG
sourceUrl: 'https://www.cve.org/CVERecord?id=CVE-2026-55598'
references:
  - url: >-
      https://github.com/madeofpendletonwool/PinePods/security/advisories/GHSA-j876-2282-p4hg
    label: >-
      https://github.com/madeofpendletonwool/PinePods/security/advisories/GHSA-j876-2282-p4hg
  - url: >-
      https://github.com/madeofpendletonwool/PinePods/commit/34843d37168c37bbf23ed6dbbf403f351bd64755
    label: >-
      https://github.com/madeofpendletonwool/PinePods/commit/34843d37168c37bbf23ed6dbbf403f351bd64755
  - url: 'https://github.com/madeofpendletonwool/PinePods/tree/0.9.0'
    label: 'https://github.com/madeofpendletonwool/PinePods/tree/0.9.0'
tags:
  - cve.org
  - exploit-available
epss: 0.00326
epssPercentile: 0.25839
ingestedAt: '2026-11-05T16:24:31.424Z'
---

## Overview

PinePods is a complete, self-hosted podcast management system written in Rust. Prior to 0.9.0, an authenticated user can subscribe to an attacker-controlled RSS feed through `POST /api/data/add_podcast` in `rust-api/src/handlers/podcasts.rs`. `get_podcast_values` and `add_episodes` in `rust-api/src/database.rs` parse the feed with `feed-rs` and store the `<enclosure url>` verbatim in `Episodes.episodeurl` without destination host/IP validation. `POST /api/data/download_podcast` invokes `spawn_download_podcast_episode` and `download_episode_and_wait()` in `rust-api/src/services/tasks.rs`, which sends a `reqwest` GET to the stored URL and saves and records the response in `DownloadedEpisodes` for later retrieval. The `estimate_duration_from_audio_url_async()` path in `rust-api/src/database.rs` also sends an unvalidated HEAD during feed add/refresh. Default redirect following permits an initially external enclosure URL to redirect to an internal target. A low-privilege user can make server-side GET/HEAD requests to reachable loopback, private-network and cloud metadata services and read downloaded internal responses, enabling internal-service enumeration, confidential-data disclosure and possible metadata credential theft. Episode downloading requires server downloads to be enabled, which is the default; self-service signup is supported. This issue is fixed in version 0.9.0.

## Affected

- `PinePods < 0.9.0`

## Remediation

Refer to the linked advisories for vendor-supplied fixes and affected version ranges.
