Severity by source
AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N
Network-reachable API requires a user account (PR:L); scope changes because the server pivots to internal systems; C:H reflects cloud credential exfiltration potential via metadata endpoints.
Primary rating from Vendor (TuranSec).
CVSS VectorVendor: TuranSec
Lifecycle Timeline
2DescriptionCVE.org
go-shiori's DownloadBookmark() (internal/core/download.go) fetches a caller-supplied bookmark URL using a plain http.Client with no custom DialContext or destination-IP validation (no IsLoopback(), IsPrivate(), IsUnspecified(), or IsLinkLocalUnicast() checks). An authenticated user creating or updating a bookmark via POST /api/bookmark, PUT /api/v1/bookmarks/cache, or POST /api/bookmarks/ext can supply a loopback (127.0.0.1) or 0.0.0.0 (which Linux redirects to loopback) URL, causing the server to make outbound requests to internal-only services, cloud metadata endpoints, or other network-restricted resources.
AnalysisAI
Server-Side Request Forgery in Shiori's bookmark download function allows any authenticated user to force the server to issue HTTP requests to loopback addresses (127.0.0.1) and 0.0.0.0 - which Linux routes to the loopback interface - reaching cloud metadata endpoints, co-located databases, and internal-only APIs. The root cause is DownloadBookmark() in internal/core/download.go using a plain http.Client with no custom DialContext and no post-resolution IP validation (no IsLoopback(), IsPrivate(), IsUnspecified(), or IsLinkLocalUnicast() checks). No public exploit has been identified at time of analysis, but the attack path is trivially constructable given the well-documented SSRF pattern against Go's standard HTTP client.
Technical ContextAI
Shiori is an open-source self-hosted bookmark manager written in Go (CPE: cpe:2.3:a:go-shiori:shiori:*:*:*:*:*:*:*:*). The flaw is in DownloadBookmark() (internal/core/download.go), which accepts a caller-supplied URL and fetches it using Go's stdlib http.Client with no transport-layer restrictions. CWE-918 (Server-Side Request Forgery) is the root cause class: the server acts as an unguarded HTTP proxy for user-controlled destinations. Go's http.Client resolves DNS and connects to the resulting IP without any post-resolution filtering, meaning addresses in RFC-1918 private ranges, loopback (127.0.0.0/8), link-local (169.254.0.0/16), and the special 0.0.0.0 address (which the Linux kernel routes to the loopback interface) are all reachable. Three distinct API endpoints are affected: POST /api/bookmark, PUT /api/v1/bookmarks/cache, and POST /api/bookmarks/ext, giving the attacker multiple trigger surfaces.
RemediationAI
No vendor-released patch has been identified at time of analysis. The correct fix is implementing a custom DialContext in the http.Client used by DownloadBookmark() that resolves the destination address and then validates it with Go's net.IP methods - blocking IsLoopback(), IsPrivate(), IsUnspecified(), and IsLinkLocalUnicast() before the connection proceeds; the connection should be refused if any check triggers. As a compensating control while awaiting a patch, administrators should apply host-level firewall rules (iptables/nftables) blocking outbound connections from the Shiori process to 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, and 169.254.0.0/16 - note that iptables OUTPUT rules affect all processes unless constrained by uid/gid matching, so scoping the rule to Shiori's runtime user reduces side effects. In cloud environments, additionally enforce IMDSv2 (token-required mode) on EC2 instances to prevent credential theft via 169.254.169.254 even if SSRF is triggered. Restricting bookmark creation permissions to a minimal set of trusted accounts provides defense-in-depth. Monitor the upstream repository at https://github.com/go-shiori/shiori for patch releases.
Vertical privilege escalation in Shiori (go-shiori), the self-hosted Go bookmark manager, lets any authenticated low-pri
Privilege persistence in Shiori, the self-hosted bookmarks manager (go-shiori/shiori), allows a deleted or demoted owner
A lack of rate limiting in the login page of shiori v1.7.4 and below allows attackers to bypass authentication via a bru
Same weakness CWE-918 – Server-Side Request Forgery (SSRF)
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-53365
GHSA-5mx2-758c-cg2x