漏洞

一枚分号如何走过 Quarkus 授权门(CVE-2026-39852

Quarkus HTTP 安全曾用带矩阵参数的路径匹配权限,RESTEasy 随后用基础路径分派同一资源;生产环境应运行含六月完整路径规范化修复的受支持维护版,并以权限、目的地、副作用和运行制品四项证据完成验收。

手绘调查画面中,同一条石板路带着分号形标记经过两套装置:左侧安全闸门拿错了轮廓,右侧路由工作台清理装饰后,石板路继续通往受保护的档案门。
文章导航

研究依据复核 Quarkus 与 GitHub 公告、固定版本的漏洞与修复源码、回归测试、路径规范化后续补丁、版本范围和安全部署验收

来源Quarkus 安全公告 / GitHub Security Lab / Quarkus 固定源码与回归测试

匿名请求 GET /api/admin 在受影响的 Quarkus 应用中得到 401 Unauthorized;请求目标改为 GET /api/admin;bypass 后,同一个 Jakarta REST 资源却返回 200 OK。调用者没有提交凭据,也没有命中一条显式允许规则。HTTP 安全匹配器保留了 ;bypass,没有找到为 /api/admin 配置的权限;RESTEasy 随后把分号内容解析为路径段参数,仍按基础段 admin 选择资源。

矩阵参数位于路径段内部。/catalog/items?state=open 中的 state 属于整个查询组件;/catalog/items;state=open 中的同名值附着在 items 这一段上。Jakarta REST 可以把后者的基础路径当作 /catalog/items 来路由,同时把 state=open 交给资源方法。CVE-2026-39852 出现在授权和资源分派消费了这两个不同表示的时刻。

截至 2026 年 7 月 26 日,生产决定已经越过五月首修版本。Quarkus 六月又为编码和多重编码路径发布 CVE-2026-50559,完整修复由 HttpSecurityUtils.normalizePath() 承担。新部署优先选择官方推荐的 3.33 LTS 当前维护版 3.33.2.1,已有 3.27 LTS 部署至少使用 3.27.4.1,跟随最新非 LTS 流的部署使用 3.37.4;实际发布前仍应重新核对官方发布页。只含五月 pathWithoutMatrixParams() 的构建不再满足当前验收。

1 当前修复目标是受支持维护流中的完整规范化器

这项升级需要永久完成。入口过滤可以缩短暴露窗口,方法级注解可以保留另一道授权边界;旧运行时在各路径消费者上仍使用不同的目标身份。变更单应同时写入目标版本、构建来源、每条入口、权限和资源对照、回滚版本以及临时规则撤除条件。

1.1 代码位置与响应闭环

1.2 首修版本与当前验收版本分开管理

五月公告回答“CVE-2026-39852 的字面矩阵差异从哪个构建开始修复”;六月公告回答“编码路径后续问题从哪个构建开始完整收束”。官方发布页与安全政策再回答“今天仍承诺维护哪条线”。这三种时间语义进入同一张决策表后,历史回溯和生产批准就不会互相覆盖。

发布流五月字面矩阵首修六月完整规范化下限当前生产动作
3.20 LTS3.20.6.13.20.6.2社区维护已结束;有明确供应商支持时按其证明验收,否则迁移到受支持流。
3.27 LTS3.27.3.13.27.4.1仍受支持;已有部署至少运行 3.27.4.1,并保存最终制品与运行摘要。
3.33 LTS3.33.1.13.33.2.1官方推荐的生产 LTS;稳定性优先的新部署默认采用当前微版本。
3.34 / 3.353.34.7 / 3.35.2没有同流六月发布下限两条社区线已经结束维护;迁移到受支持流,不以五月首修作为长期批准。
3.36随分支继承3.36.3发布页仍列出该微版本;社区安全承诺以最新 3.x 为准,优先迁移到 3.37 或使用明确的供应商支持。
3.37随分支继承3.37.0最新非 LTS 流当前微版本为 3.37.4;选择这条线的部署使用当前微版本。

GitHub Advisory Database 曾把一段范围写成 >=3.34.0,<3.35.1.1,按跨 minor 的数值解释会把 Quarkus 明确列作五月修复的 3.34.7 重新算入受影响范围。历史调查应保留这项上游元数据冲突,并按项目的分支发布记录判断 3.34.73.35.2。生产批准直接使用六月完整规范化下限和当前支持状态,避免让这项历史冲突拖慢今天的升级。

2 授权阶段保留装饰,资源阶段恢复基础路径

最小配置把 authenticated 策略挂到 /api/adminquarkus.http.auth.permission.admin.paths=/api/admin,并令 quarkus.http.auth.permission.admin.policy=authenticated。普通匿名请求命中这条配置,Quarkus 选择权限检查器并启动认证挑战。装饰请求把运行值变成 /api/admin;bypass,精确键查找自然失败。

前缀查找也没有接住该值。受影响提交中的 ImmutablePathMatcher.match() 第 54–84 行先做精确查找;候选前缀比请求短时,下一字符通常必须是斜杠。这个边界阻止 /api/admin 错配 /api/administrator,也让紧跟其后的分号落到默认结果。随后 RESTEasy 解析同一交换,把 ;bypass 保存为段参数并用 /api/admin 继续分派。

2.1 空权限列表触发了公开路由的基础分支

findPermissionCheckers() 只把已经匹配到的记录转换为 HttpSecurityPolicy。装饰路径没有记录,列表长度为零。doPermissionCheck() 从索引零开始,立即满足 index == permissionCheckers.size(),返回允许结果;代码仅在索引大于零时写入 PATH_MATCHING_POLICY_FOUND。可靠遥测应同时记录权限列表、按顺序的权限标识和最终决定,这组字段也会显露重叠配置中“命中较弱规则”的结果。

空列表的基础语义服务于有意公开的路由。框架修复保留这个语义,调整的是受保护资源如何归入策略集合。把空列表统一改成拒绝会改变所有未配置路由的默认行为,也会把一次路径身份缺陷扩散成应用兼容性问题。

请求目标                   /api/admin;bypass
安全比较值                 /api/admin;bypass
配置策略键                 /api/admin
权限检查器                 空
HTTP 安全结果              允许继续
RESTEasy 基础路径          /api/admin
资源结果                   管理方法被选中

这个状态表也覆盖重叠规则。若 /api/admin 受严格角色策略保护,而较宽的 /api/* 绑定了较弱策略,装饰形式可能选到后者。最终响应仍可能成功,列表也不为空。验收必须断言具体权限名称与顺序,再核对选中的资源和方法。

2.2 RESTEasy 在安全决定之后写回基础路径

MatrixParamHandler 检查分号并调用 initPathSegments()。后者按斜杠拆分路径,为非空部分建立 PathSegmentImpl,再从每一段的 getPath() 组合新路径。/api;a=1/admin;b=2 因此以 /api/admin 参加资源匹配,而两组矩阵值继续保存在各自的段对象中供应用读取。

调用顺序决定了影响:Quarkus HTTP 安全先完成权限选择,RESTEasy 后生成基础路径;路径写回发生时,HTTP 安全决定已经结束。日志若只保存 CDN 原始目标或资源模板,就会把一次请求拆成两个看似无关的名字。调查与验收需要同一关联标识下的原始目标、Vert.x 路径、安全比较值、权限、REST 模板和 Java 方法。

合法矩阵参数属于兼容性验收。正确角色访问 /orders;view=open 时,应进入与基础路径相同的资源方法,并让 view=open 继续可见;匿名和错误角色面对两个表示都应被同一策略拒绝。安全结果和功能结果在同一条请求记录里成立,才说明修复统一了资源身份并保住业务语义。

上下两条手绘流程对比脆弱态和修复态:上方带分号装饰的路径没有通过安全轮廓匹配,空托盘导致闸门打开,随后 REST 路由去掉装饰并进入受保护抽屉;下方先得到统一基础路径,再交给安全和路由。
窄屏可横向滑动查看两种状态
图 1:脆弱顺序先用装饰路径做权限匹配,再由 RESTEasy 恢复基础路径;修复顺序在权限决定前得到统一比较值。

3 暴露范围由策略、消费者和剩余授权共同决定

版本命中只是资产优先级的起点。一条可产生影响的路径还需要以下事实同时成立:部署使用路径型 HTTP 权限或其他受影响的路径消费者;调用者能从至少一个入口送入相关表示;安全比较漏掉预期策略或选中较弱策略;后续消费者把该表示解析到受保护目标;敏感动作发生前没有独立授权拒绝调用者。每项都能用运行配置、请求 trace 或资源方法证据验证。

资源方法上的 @RolesAllowed@Authenticated 等独立检查仍在资源调用阶段执行。它们会收窄真实影响,HTTP 路径策略仍处于脆弱状态。匿名调用者、低权限已认证用户和正确角色应分别测试,具体身份边界取决于被跳过的是认证策略、角色策略还是自定义策略。

业务后果跟随资源方法。读取接口要核对实际返回记录、缓存和审计;写接口要查数据库事务、消息、Webhook、生成的凭据与配置变化;管理接口还要追踪持久会话、账户或密钥。公开源码覆盖授权绕过机制;某个真实组织的资源能力、在野利用状态和数据损失需要目标方法与副作用证据补齐。

3.1 二十三个改动文件归并成四类安全消费者

五月代表性修复横跨二十三个文件。这个数字来自固定提交的仓库复核,单位是被修改文件;应用暴露面则由实际启用的路径消费者决定。把文件按安全决定归并后,部署清点只需回答四类问题;未启用的扩展明确排除,已启用的扩展分别验证。

消费者路径决定修复证据部署验证
Vert.x HTTP 权限匹配选择 quarkus.http.auth.permission.*.paths 对应的检查器五月先移除矩阵内容,六月让配置端和请求端都使用完整规范值导出真实权限、方法限制与重叠顺序,断言每个等价表示命中同一权限
Keycloak 策略执行与 OIDC 静态租户选择策略执行路径或认证租户代表性提交把同一辅助函数应用于路径匹配和相关 facade记录实际租户、策略、主体和资源;多租户入口分别测试
CSRF、Servlet 与管理接口安全决定令牌处理、Servlet 权限或管理认证提交与扩展回归覆盖这些调用点只测试实际启用的栈,保留方法、状态与副作用对照
RESTEasy 资源分派解析段参数并选择基础资源受影响快照显示路径段重建写回请求上下文确认基础路径与矩阵形式进入同一模板,合法参数仍在正确段上

证据来源也按层分开。项目公告给出发布版本与升级动作;提交固定源码直接说明函数和状态变化;二十三文件的归并属于仓库复核;三身份金丝雀、入口矩阵和副作用账本是本文提出的本地验收设计。旧容器退出由运行摘要作证,代理转发由逐层请求字段作证,历史无权访问由日志、权限、目标和副作用的关联作证。

4 五月补丁修复字面分号,六月补丁统一完整路径

Quarkus 在 2026 年 4 月 7 日写成五月代表性修复,并于 5 月 4 日发布 CVE-2026-39852 的修复版本。这个阶段的设计很收敛:pathWithoutMatrixParams() 只关心字面分号和斜杠,普通路径直接返回,装饰路径逐字符删除每段矩阵区域,同时保留段边界。RESTEasy 继续向资源方法提供矩阵值。

5 月 11 日写成的后续提交扩大了安全比较契约;6 月 17 日,Quarkus 随 CVE-2026-50559 发布新的修复下限。完整规范化先反复百分号解码,直到值不再变化,再处理矩阵内容、空字节、反斜杠和点段。顺序让 %3B%253B 在矩阵清理前显露为分号,并让配置路径和请求路径在同一阶段比较。

4.1 五月辅助函数保留了路径段结构

函数遇到 ; 后进入矩阵区域,直到下一条 / 才恢复复制。因此 /a;/b;/a;a1=1;a2=2/b;b1=1 都得到 /a/b。连续斜杠、末尾斜杠和空段仍由后续匹配器处理。这个狭窄契约解释了原始漏洞,也说明为什么检测到函数符号只能证明五月阶段。

代表性提交同时增加配置守卫:普通路径权限中含字面分号会触发 ConfigurationException。有意让矩阵值参与授权的应用需要把语义写进自定义 HttpSecurityPolicy,再由方法层授权承担纵深控制。升级前搜索权限配置中的字面分号,可以把启动失败转化为计划内迁移。

上游测试把函数语义和请求结果分开。工具用例覆盖裸分号、参数名、键值、多段参数、额外等号和斜杠结构;RESTEasy Reactive、RESTEasy Classic 以及相关扩展用匿名与已认证身份验证权限和资源。回移植验收应记录实际运行的测试类、平台 BOM、扩展版本和构建摘要,由这些证据证明消费者覆盖完整。

4.2 完整规范化把编码形式纳入同一比较阶段

normalizePath() 的循环在字符串仍含百分号时调用解码器;一轮输出没有变化便停止。随后按固定顺序移除矩阵内容、移除空字节、把反斜杠转成斜杠并解析点段。维护版测试覆盖大小写编码分号和嵌套编码,也区分 REST 与静态资源消费者的结果。

后续调查确认,编码分号与多重编码可以延续原始路径身份差异;编码斜杠和反斜杠在相关受保护静态资源消费者上形成另一条可利用路径。非保留字符编码、%00、编码点段和 REST 端点的 %2F/%5C 进入回归负控。负控的作用是固定已调查消费者的结果,检测规则不应把这些输入统一升级成已确认绕过。

配置端和请求端都调用规范化器,是六月修复的关键。只清理请求会留下配置别名;只清理配置会让运行时别名继续存在。验收还应检查幂等性:同一个维护版规范值再次进入规范化器,不应得到另一个目标。出现二次变化时,说明回移植、代理流水线或测试装置仍有未对齐阶段。

5 验收同时观察权限、目的地、副作用和运行制品

验收必须同时覆盖四项事实,状态码只描述一次 HTTP 结果。CDN 返回 401 说明该入口的临时规则生效;所有装饰请求返回 404 可能掩盖合法矩阵 API 已经损坏;正确角色拿到 200 也可能落在兜底页面。金丝雀响应应带构建专用随机标记、资源模板和合法矩阵值,审计记录同时保存权限名称、主体和运行摘要。

5.1 一张矩阵覆盖等价、功能和部署

输入与身份权限结果目的地与功能副作用与部署证据
匿名或错误角色;基础路径、字面矩阵每种形式命中同一条受保护权限并被拒绝或挑战金丝雀方法不执行,不出现构建随机标记数据库、队列、外呼和审计序列保持在声明的拒绝状态;记录实例摘要
匿名或错误角色;%3B%3b、嵌套编码规范化后仍选择同一受保护权限不进入受保护方法每条入口和受控直连路径都通过;代理转换写入独立字段
正确角色;基础路径和合法矩阵形式两种表示命中同一权限并允许进入同一资源模板,参数值仍附着在正确路径段只产生声明过的业务或审计变化;响应随机标记绑定批准摘要
任意身份;无关公开路由原有公开或保护语义保持没有意外路由合并升级前后功能对照一致
静态资源专用候选与 REST 负控按消费者分别执行官方回归期望静态文件与 REST 模板分开记录负控留在语料中,禁止被检测流水线改写成确认利用

每行使用同一个关联标识收集客户端原始目标、边缘记录、转发请求行、Vert.x 值、规范安全键、权限、认证机制、主体、租户、REST 模板、Java 方法、状态、随机标记和制品摘要。代理做了解码或拒绝时,原始值与派生值分别保存;覆盖原始字段会让历史调查失去字节级起点。

副作用账本根据业务缩放。只读金丝雀至少记录审计事件序列;代表性业务测试还可记录测试数据库行数、消息数量、对象写入和模拟外呼。匿名与错误角色的账本保持不变,正确角色只产生预先声明的变化。破坏性动作留在隔离夹具或可事务清理的测试数据中。

5.2 回滚构建也必须保持完整修复

先在接收相同代理转换和认证集成的金丝雀部署,再扩大流量。每个区域、备用域名、服务网格、管理网络、灾备入口和受控直连路径都执行同一矩阵;负载均衡后的全部实例摘要必须属于批准集合。旧 native image、手工固定扩展、缓存容器和停止后仍可重新接流量的镜像需要单独退出。

兼容问题发生时,回滚目标提前写入发布计划,并固定为另一枚包含六月完整规范化器的构建。保存失败的矩阵行、代理配置摘要和响应证据,再在安全基线上修复兼容性。回到五月首修或更早版本会重新打开已公开表示,因此不进入批准回滚集合。

临时入口拒绝规则的撤除也是一次发布。所有实例和回滚镜像通过后,在受控流量下移除规则,重放字面与编码矩阵、合法业务参数和公开路由;权限、资源和副作用保持一致后完成撤除。失败时恢复临时规则,保留失败输入并回到应用或代理差异定位,运行时升级状态不随规则回退而改变。

手绘规范化工作台把多种抽象路径装饰清理成同一条带子;上方两条负控轨分别挡住匿名和错误角色标记,下方单独布置的正向控制轨让正确角色标记到达密封档案箱。
窄屏可横向滑动查看验收顺序
图 2:匿名与错误角色验证拒绝结果,正确角色单独验证资源和合法参数;三组请求都绑定同一规范路径与运行摘要。

6 历史调查从受保护目标反查路径表示

先导出运行期的 quarkus.http.auth.permission.*.paths、程序化 HttpSecurityPolicy、方法注解和已启用的路径敏感扩展,再把它们映射到真实 REST、Servlet、管理或静态目标。这个清单定义哪些请求值得调查。直接从全量日志搜索分号会混入合法矩阵业务、普通 URI 和未关联的扫描噪声。

保留 CDN、WAF、反向代理、服务网格和应用日志中的原始请求目标;在工作副本上派生字面分号、编码分号和嵌套编码候选。静态资源的编码斜杠与反斜杠单独处理,REST 负控继续保留。随后用请求 ID、时间窗口、连接元数据或 trace context 关联规范安全键、权限、身份、资源模板、方法、响应大小与状态变化。

6.1 证据从候选逐级收敛到业务影响

原始目标含相关语法时记录为候选;派生规范值落到受保护路径时升级为相关事件;相关事件缺失预期权限或只命中较弱权限时升级为可能绕过;同一请求还能连接到资源方法、响应内容或受保护副作用时,确认具体影响。这个分级让检索量、授权异常和受影响事务保持不同口径。

重定向与异常也要检查副作用顺序。重定向可能改变会话,异常可能发生在写入后,异步任务可能晚于响应。应用审计、数据库事务、消息、对象存储访问和下游 API 调用决定处置范围。确认无权执行后,撤销该方法签发的会话或令牌,轮换它实际暴露的秘密,回退配置变化,审查新建账户,并通知下游数据负责人。

合法矩阵流量留在证据集中,标注资源、参数用途、有权身份和预期结果。长期检测关注的是一个 trace 内的路径身份与授权不一致:请求解析到受保护目标却没有预期权限,或不同安全层得到不同基础路由。单独出现分号只适合作为候选筛选条件。

6.2 关闭条件绑定运行摘要和剩余未知项

一项部署完成需要同时满足:当前受支持分支含六月完整规范化器;平台、扩展、应用、容器和运行实例身份可追溯;所有入口与回滚镜像通过三身份矩阵;合法矩阵参数功能保持;拒绝请求的受保护副作用计数为零;临时规则已按验证结果撤除或保留为有到期日的例外。任何旧实例、旧镜像或未覆盖入口都会让结论保持开放。

无法立即迁移的服务应记录准确版本、供应商支持状态、可达路由、入口转换、剩余方法控制、临时拒绝规则、监控字段、负责人和到期日,并保持在批准摘要集合之外。每次续期重放补偿控制和后端直连路径。版本号达到六月下限只能说明代码起点,运行制品与真实策略仍需逐实例作证。

CVE-2026-39852 的决定性事实很简单:安全层曾把 /api/admin;bypass 当作配置之外的路径,RESTEasy 随后把它还原为 /api/admin。完整修复把等价转换移到安全决定之前,并扩展到编码路径与相关消费者。生产闭环的判断同样具体——每种等价输入都选中同一权限和目标,错误身份没有副作用,正确身份保留合法功能,所有运行实例都来自批准构建。

研究记录

7证据、对象与来源

下面保留本文实际使用的标识、时间和原始材料,便于继续调查。

7.1研究对象

报告涉及的产品、行为者、技术、受影响对象和控制点。

CVECVE-2026-39852

Quarkus 字面矩阵参数导致路径策略绕过

GHSA 公告GHSA-rc95-pcm8-65v9

原始矩阵参数表示差异的 GitHub 公告

组件包io.quarkus:quarkus-vertx-http

受影响的 HTTP 安全组件

配置quarkus.http.auth.permission.*.paths

需要逐路由复核的路径权限配置族

3.35 分支代表性修复361a287f530dfef8caf90e3048ba9294ed5b5d98

五月矩阵专用规范化实现;其他发布流使用不同的回移植 SHA

当前规范化器HttpSecurityUtils.normalizePath()

安全匹配前反复百分号解码、移除矩阵内容和空字节、统一斜杠并解析点段

六月修复版本3.20.6.2 / 3.27.4.1 / 3.33.2.1 / 3.36.3 / 3.37.0

后续公告的发布下限;生产环境使用受支持分支中的当前维护版本

正向候选形式; | %3B | %3b | %253B

字面与编码矩阵表示需要同受保护目标和身份差异关联

仅静态资源候选%2F | %5C

编码斜杠与反斜杠只在相关受保护静态资源消费者中形成可利用行为

回归负控非保留字符编码 | %00 | 编码点段 | REST %2F/%5C

Quarkus 调查这些表示后确认,在所列 REST 场景中没有形成可利用绕过

7.2事件时间

  1. 协调报告

    GitHub Security Lab 向 Quarkus 报告矩阵参数授权表示差异。

  2. 初始修复写成

    Quarkus 写成 3.35 分支代表性提交 361a287f530dfef8,加入矩阵专用辅助函数、跨扩展修改、文档与测试;其他发布流使用不同回移植。

  3. CVE-2026-39852 发布

    Quarkus 发布公告和字面分号问题的首批修复版本线。

  4. 技术公告发布

    GitHub Security Lab 发布 GHSL-2026-099,给出证明请求与受影响调用链。

  5. 后续规范化器写成

    Quarkus 写成提交 fc5c83aab65f62a2,加入完整路径规范化器和回归套件。

  6. CVE-2026-50559 版本发布

    Quarkus 发布编码路径后续公告和新的修复版本下限。

  7. 支持状态复核

    官方页面列出 3.33 与 3.27 LTS、最新 3.x 为支持流,3.37.4 为最新非 LTS 微版本。

7.3来源与材料

  1. Quarkus CVE-2026-39852 安全公告https://quarkus.io/blog/CVE-2026-39852/
  2. Quarkus GHSA-rc95-pcm8-65v9 公告https://github.com/quarkusio/quarkus/security/advisories/GHSA-rc95-pcm8-65v9
  3. GitHub Advisory Database 受影响范围记录https://raw.githubusercontent.com/github/advisory-database/main/advisories/github-reviewed/2026/05/GHSA-rc95-pcm8-65v9/GHSA-rc95-pcm8-65v9.json
  4. GitHub Security Lab GHSL-2026-099 技术公告https://securitylab.github.com/advisories/GHSL-2026-099_Quarkus/
  5. Quarkus 初始矩阵参数修复提交https://github.com/quarkusio/quarkus/commit/361a287f530dfef8caf90e3048ba9294ed5b5d98
  6. 初始 pathWithoutMatrixParams 实现https://github.com/quarkusio/quarkus/blob/361a287f530dfef8caf90e3048ba9294ed5b5d98/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/security/HttpSecurityUtils.java#L47-L64
  7. 修复前 HTTP 路径策略与空列表分支https://github.com/quarkusio/quarkus/blob/240ec34c6257f7c410b9ab90f4f8976029062bd6/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/security/AbstractPathMatchingHttpSecurityPolicy.java#L122-L208
  8. RESTEasy Reactive MatrixParamHandler 源码https://github.com/quarkusio/quarkus/blob/240ec34c6257f7c410b9ab90f4f8976029062bd6/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/handlers/MatrixParamHandler.java#L6-L12
  9. RESTEasy Reactive 路径段初始化源码https://github.com/quarkusio/quarkus/blob/240ec34c6257f7c410b9ab90f4f8976029062bd6/independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/ResteasyReactiveRequestContext.java#L838-L875
  10. Quarkus Web 端点授权参考https://quarkus.io/guides/security-authorize-web-endpoints-reference
  11. Jakarta RESTful Web Services 规范https://jakarta.ee/specifications/restful-ws/4.0/jakarta-restful-ws-spec-4.0.html
  12. RFC 3986 URI 通用语法https://www.rfc-editor.org/rfc/rfc3986
  13. Quarkus CVE-2026-50559 后续公告https://quarkus.io/blog/CVE-2026-50559/
  14. Quarkus 编码路径后续公告https://github.com/quarkusio/quarkus/security/advisories/GHSA-qcxp-gm7m-4j5v
  15. Quarkus 完整路径规范化后续提交https://github.com/quarkusio/quarkus/commit/fc5c83aab65f62a2d7c7c8f9fd6845b080f94f53
  16. Quarkus 发布分支与当前维护状态https://quarkus.io/releases/
  17. Quarkus 安全与受支持版本政策https://quarkus.io/security/