Skip to content

authz: ctx.posture(B2 已算出)未 plumb 进 enforcement 的 ExecutionContext #2947

Closed

Description

@os-zhuang

背景

B2/B4(ADR-0095 D2/D3,#2938)在 resolve-authz-context.ts 算出并携带了显式 ctx.posture(PLATFORM_ADMIN > TENANT_ADMIN > MEMBER > EXTERNAL)。但在修复租户墙 org_admin 越墙(#2946 / Finding 2)时实测确认:该字段没有被 plumb 进 enforcement 中间件收到的 ExecutionContext——rest-server.ts(~L1197-1215)与 runtime/resolve-execution-context.ts(~L143-204)构建执行上下文时都丢弃了 authz.posture。

后果:任何 enforcement 侧插件若直接读 context.posture 会永远 undefined → 静默 no-op。#2946 因此改用「平台专属能力探针」(hasPlatformAdminPosture)绕开,而非用 posture 作豁免门。

缺口

posture 目前是一个「算出来但传输层丢弃、enforcement 拿不到」的半成品字段。它已被 explain 引擎消费(report 侧),但 enforcement 侧不可用。这也是 security review 发现的 explain-vs-enforcement posture 分叉的根因之一。

建议

若要让 enforcement 真正按 posture 裁决(ADR-0095 D2/D3 的完整意图),需在两处补 plumbing:

  • packages/rest/src/rest-server.ts 构建 ExecutionContext 时带上 posture: authz.posture
  • packages/runtime/src/security/resolve-execution-context.ts 同上(覆盖 runtime/MCP 入口)

并把 ExecutionContext 类型加上可选 posture 字段。之后 #2946 的 hasPlatformAdminPosture 能力探针可考虑收敛为读 ctx.posture(单一真相)。

注意:这是「posture 透传进 enforcement」的一部分——B2 刻意止步于解析器层。是否让 enforcement 全面按 posture 重写是更大的 ADR 级决策;本 issue 只跟踪「把已算出的 posture 传下去」这一具体 plumbing 缺口。

关联

ADR-0095 D2/D3 · #2938(B2/B4)· #2946(租户墙修复,用能力探针绕开)· tracking #2920

发现于 #2920 的安全审查。

Activity

  1. os-zhuang commented on Jul 15, 2026

    @os-zhuang
    ContributorAuthor

    已实现并合并于 #2956:ExecutionContextSchema 新增可选 posture 字段,rest-server 与 runtime resolveExecutionContext 两个入口都透传 authz.posture(此前被丢弃)。行为保持——enforcement 尚未按 posture 裁决(那是更大的 ADR 级决策,见 #2920 讨论)。关闭。


    Generated by Claude Code

  2. os-zhuang commented on Jul 15, 2026

    @os-zhuang
    ContributorAuthor

    已在 PR #2956(commit c11e24b,已合并 main)修复:ExecutionContextSchema 加可选 posture 字段;rest-server.ts 与 resolve-execution-context.ts 两个入口均透传 authz.posture(guest 不设)。纯加法、行为不变(当前无 enforcement 消费 posture,是否按 posture 重写 enforcement 属更大 ADR 级决策,不在本 issue 范围)。

    中文「关闭 #2947」未触发 GitHub 自动关联,故手动关闭。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions