Descripción
PinePods es un sistema completo y autoalojado de gestión de podcasts escrito en Rust. En versiones anteriores a 0.9.0, un usuario autenticado puede suscribirse a un feed RSS controlado por un atacante mediante `POST /api/data/add_podcast` en `rust-api/src/handlers/podcasts.rs`. `get_podcast_values` y `add_episodes` en `rust-api/src/database.rs` analizan el feed con `feed-rs` y almacenan el `<enclosure url>` literalmente en `Episodes.episodeurl` sin validar el host o la IP de destino. `POST /api/data/download_podcast` invoca `spawn_download_podcast_episode` y `download_episode_and_wait()` en `rust-api/src/services/tasks.rs`, que envía una solicitud GET con `reqwest` a la URL almacenada y guarda y registra la respuesta en `DownloadedEpisodes` para su posterior recuperación. La ruta `estimate_duration_from_audio_url_async()` en `rust-api/src/database.rs` también envía una solicitud HEAD sin validar al agregar o actualizar el feed. El seguimiento de redirecciones por defecto permite que una URL de enclosure inicialmente externa redirija a un destino interno. Un usuario con privilegios bajos puede realizar solicitudes GET/HEAD del lado del servidor hacia servicios accesibles de loopback, de red privada y de metadatos en la nube, y leer las respuestas internas descargadas, lo que permite enumerar servicios internos, divulgar datos confidenciales y posiblemente robar credenciales de metadatos. La descarga de episodios requiere que las descargas en el servidor estén habilitadas, lo cual es la opción por defecto; además, se admite el registro autónomo de usuarios. Este problema está corregido en la versión 0.9.0.
Qué hacer
Revisa si usas el producto afectado y en qué versión, y aplica la actualización o la mitigación que indique el aviso del fabricante. CISA no ha confirmado que se esté explotando; si eso cambia, esta ficha pasa a «explotada» y te avisamos en el boletín.
Versiones afectadas
- PinePods Afectadas: < 0.9.0
Según el registro de la vulnerabilidad en CVE.org, tal como lo publicó el fabricante. Confirma tu versión exacta en el aviso del fabricante.
Referencias
- Referencia en github.comgithub.com/madeofpendletonwool/PinePods/security/advisories/GHSA-j876…
- Referencia en github.comgithub.com/madeofpendletonwool/PinePods/commit/34843d37168c37bbf23ed6…
- Referencia en github.comgithub.com/madeofpendletonwool/PinePods/tree/0.9.0
Ver el texto original en inglés (CVE.org)
PinePods: Authenticated SSRF via podcast RSS enclosure URL (server-side fetch of attacker-controlled URL, no host validation)
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.