free-fs BOPLA VULNs Report

📅 2026/7/11 4:10:31 👁️ 阅读次数 📝 编程学习
free-fs BOPLA VULNs Report

下面是整理后的Issue 1:文件分享创建越权(跨用户文件绑定)

1. 风险分析

攻击者只需获取任意他人 fileId,即可将该文件加入自己的分享中并对外传播,最终导致跨用户文件泄露、未授权下载,甚至形成稳定的二次扩散链路。

2. 漏洞信息

  • 接口: POST /apis/share/create

  • 缺失校验: file_info.user_id

3. 核验细节

  • 入口仅校验登录态
    FileShareController.java:58-63

  • 创建分享时,直接将 cmd.fileIds 写入 file_share_item,未校验归属
    FileShareServiceImpl.java:115-156

  • 落库仅执行 (share_id, file_id) 插入
    FileShareItemServiceImpl.java:18-26

  • 后续读取/下载直接信任该绑定关系
    FileShareServiceImpl.java:247-287

本质问题:入口只验证“能否创建分享”,未验证“是否有权限分享这些文件”。

4. 安全建议

  • 入库前批量校验:file_info.user_id == currentUserId

  • 校验文件状态(可分享性)

  • 读取/下载路径增加防御性归属校验

  • 校验失败整体拒绝并记录审计日志


Issue 2:分享读取未执行约束(口令/过期/次数失效)

1. 风险分析

所有分享约束(提取码、过期时间、访问次数、scope)均未在读取路径生效,导致受限分享退化为无保护公开分享

2. 漏洞信息

  • 接口: GET /apis/share/{shareId}/items

  • 缺失校验:

    • file_share.shareCode

    • file_share.expireTime

    • file_share.maxViewCount

    • file_share.scope

3. 核验细节

  • 入口为公开读取接口
    FileShareController.java:85-89

  • 仅校验分享存在
    FileShareServiceImpl.java:247-267

  • verifyShareCode 未产生持久验证状态
    FileShareServiceImpl.java:205-222

  • 前端提示字段未参与授权决策
    FileShareServiceImpl.java:225-243

4. 安全建议

  • 统一实现“分享访问授权校验逻辑”

  • 强制校验:

    • 提取码验证状态

    • 是否过期

    • 访问次数限制

    • scope 合法性

  • 校验结果必须绑定服务端状态(session/token)


Issue 3:分享下载未执行约束(直接文件流泄露)

1. 风险分析

攻击者仅凭 shareId 即可绕过所有分享限制直接下载文件,导致受限分享完全失效,可被批量枚举与下载。

2. 漏洞信息

  • 接口: GET /apis/share/{shareId}/download/{fileId}

  • 缺失校验:

    • shareCode

    • expireTime

    • maxDownloadCount

    • scope

3. 核验细节

  • 仅校验 fileId 属于 shareId
    FileShareServiceImpl.java:270-295

  • 未校验任何分享约束字段

4. 安全建议

  • 下载路径必须复用统一授权校验逻辑

  • 严格执行所有分享限制条件

  • 禁止直接基于 (shareId, fileId) 返回文件流


Issue 4:分享详情与访问记录越权读取

1. 风险分析

任意登录用户可读取他人分享详情、提取码及访问记录,造成敏感信息泄露与用户隐私暴露。

2. 漏洞信息

  • 接口:

    • GET /apis/share/{shareId}

    • GET /apis/share/{shareId}/access/records

  • 缺失校验: file_share.user_id

3. 核验细节

  • 仅按 shareId 查询
    FileShareServiceImpl.java:92-110

  • 返回包含 shareCode

  • 访问记录未校验归属
    FileShareAccessRecordServiceImpl.java:32-35

4. 安全建议

  • 强制校验 file_share.user_id == currentUserId

  • 非所有者禁止返回:

    • shareCode

    • 访问日志

  • 敏感字段最小化暴露


Issue 5:文件读取全链路越权(含未认证读取面)

1. 风险分析

攻击者可通过猜测或枚举 fileId/dirId 获取文件元数据、下载地址或直接读取文件内容,部分接口甚至无需认证。

2. 漏洞信息

  • 接口:

    • /apis/file/{fileId}

    • /preview/**

    • /api/file/stream/**

  • 缺失校验: file_info.user_id

3. 核验细节

  • 所有路径均:

    • getById → 直接返回

  • /preview/**/stream/** 无认证保护

4. 安全建议

  • 所有读取统一校验:
    file_info.user_id == currentUserId

  • 分享场景必须走独立授权链路

  • 预览与流接口纳入认证与授权控制


Issue 6:文件写操作越权(删除/重命名/移动)

1. 风险分析

攻击者可越权修改他人文件,导致目录结构破坏、文件丢失或数据篡改。

2. 漏洞信息

  • 接口:

    • 删除、重命名、移动接口

  • 缺失校验: file_info.user_id

3. 核验细节

  • 先查询再更新,未校验归属:

    • 删除:批量更新

    • 重命名:直接 update

    • 移动:批量 update

4. 安全建议

  • 所有写操作强制校验归属

  • 改为:
    WHERE id = ? AND user_id = currentUserId

  • 校验失败拒绝操作


Issue 7:SSE 通道劫持(未认证用户订阅)

1. 风险分析

攻击者无需登录即可订阅任意用户 SSE 通道,实时获取文件传输信息,造成隐私泄露与任务情报暴露。

2. 漏洞信息

  • 接口: GET /apis/transfer/sse

  • 缺失校验: request_user.id → sse.userId

3. 核验细节

  • 明确绕过登录拦截

  • userId 由客户端直接传入

  • 作为 SSE 连接标识使用

4. 安全建议

  • 强制认证

  • userId 必须由服务端派生

  • 推送时校验用户绑定关系


Issue 8:文件传输任务接管(taskId 越权)

1. 风险分析

攻击者获取 taskId 后可完全接管传输任务,实现数据篡改、劫持或泄露。

2. 漏洞信息

  • 接口: 所有 transfer 相关接口

  • 缺失校验: file_transfer_task.user_id

3. 核验细节

  • 所有操作均仅依赖 taskId

  • 查询任务未按用户过滤

  • Issue 7 可提供 taskId 泄露

4. 安全建议

  • 所有操作改为:
    taskId + currentUserId

  • 强制校验任务归属

  • 禁止将 taskId 作为唯一凭据


Issue 9:订阅套餐管理权限缺失

1. 风险分析

若接口未限制为管理员使用,攻击者可篡改全局计费策略,造成业务与资金风险。

2. 漏洞信息

  • 接口: 订阅套餐 CRUD

  • 缺失校验: 管理员权限

3. 核验细节

  • 无角色/权限校验

  • 仅校验业务约束

4. 安全建议

  • 增加管理员角色校验

  • 关键操作记录审计日志


总体结论

该系统存在一类高度一致的安全问题模式:

对象级访问控制缺失(Broken Object-Level Authorization / IDOR)

核心问题可以归纳为三点:

  1. 入口只做“是否登录/是否有功能权限”校验

  2. 未在 sink 处校验对象归属(user_id / tenant_id)

  3. 将 ID(fileId / shareId / taskId)当作授权凭据