低优先级 —— 从 #3878 的同类扫查里出来的最后一条。目前不是活着的洞 (仓库里没有任何地方自动挂 DevPlugin,只有 README 示例),但它把 fail-open 的实现注册进了 auth / security.* 这些正式槽位,且没有任何护栏阻止它出现在非开发环境。
现状
packages/plugins/plugin-dev/src/dev-plugin.ts:
:214 async verify ( ) { return { success : true , user : { id : 'dev-admin' , email : 'admin@dev.local' , name : 'Admin' , roles : [ 'admin' ] } } ; }
:216 async getCurrentUser ( ) { return { id : 'dev-admin' , ... roles : [ 'admin' ] } ; }
:239 checkObjectPermission ( ) { return true ; }
:246 compileFilter ( ) { return null ; }
verify() 不看 token ,任何请求都解析成 dev-admin / roles: ['admin']。packages/runtime/src/security/resolve-execution-context.ts:104,120 正是从 auth 服务解析请求身份的。
checkObjectPermission() 恒 true → plugin-hono-server/src/hono-plugin.ts:1112 生成的 GET /auth/me/permissions 会告诉客户端每个对象都可写。
compileFilter() 返回 null = "无行级谓词",即 RLS 关闭(真实现见 plugin-security/src/rls-compiler.ts:148,签名 (policies, executionContext?, clause?))。
maskResults(results)(:253)原样返回,字段级掩码关闭。
全文件没有 NODE_ENV 字样 ,也没有任何其它环境判断。
这些 stub 都带 _dev: true,所以 discovery 会照实报 status: 'stub'(D12 这部分是工作的,见另一条 issue 里的三个洞)—— 但报得诚实不等于拒绝服务 :路由该放行还是放行。
为什么还是想记一笔
它注册的是 auth / security.permissions / security.rls / security.fieldMasker —— 系统里安全语义最强的四个槽位,且四个的降级方向全部是放开 而不是关闭。
目前拦住它的唯一东西是"没人写这行代码"。一个 preset、一个 example、一次为了本地调试临时加上后忘了摘掉的提交,就够了。
这与 降级 analytics shim 把 ExecutionContext 丢在门口 —— /analytics/query 在没装 service-analytics 的装配里不注入 RLS/租户谓词,契约字段 where 也被静默忽略 #3891 是同一个模式的两端:那边是丢掉 身份导致中间件放行,这边是伪造 身份直接放行。
建议(任一即可)
DevPlugin 构造/start 时检查 NODE_ENV === 'production'(或复用 os serve 已有的环境判定),命中则拒绝启动并打印为什么 ,与 serve.ts:1606 那段 OS_ALLOW_DEGRADED_TENANCY 的处理方式对齐(那里是 process.exit(1) 而不是 warn,理由写得很清楚:throw 会被外层 catch 吞掉而静默降级启动);
需要在类生产环境用它时,走一个显式的 OS_ALLOW_DEV_STUBS=1,并在启动横幅上打标。
核对于 origin/main @ 93f267f 。已确认 packages/、examples/、apps/ 及 cloud 仓内均无 new DevPlugin( 的实例化(仅 plugin-dev 自身 README)。
低优先级 —— 从 #3878 的同类扫查里出来的最后一条。目前不是活着的洞(仓库里没有任何地方自动挂
DevPlugin,只有 README 示例),但它把 fail-open 的实现注册进了auth/security.*这些正式槽位,且没有任何护栏阻止它出现在非开发环境。现状
packages/plugins/plugin-dev/src/dev-plugin.ts:verify()不看 token,任何请求都解析成dev-admin/roles: ['admin']。packages/runtime/src/security/resolve-execution-context.ts:104,120正是从auth服务解析请求身份的。checkObjectPermission()恒 true →plugin-hono-server/src/hono-plugin.ts:1112生成的GET /auth/me/permissions会告诉客户端每个对象都可写。compileFilter()返回null= "无行级谓词",即 RLS 关闭(真实现见plugin-security/src/rls-compiler.ts:148,签名(policies, executionContext?, clause?))。maskResults(results)(:253)原样返回,字段级掩码关闭。全文件没有
NODE_ENV字样,也没有任何其它环境判断。这些 stub 都带
_dev: true,所以 discovery 会照实报status: 'stub'(D12 这部分是工作的,见另一条 issue 里的三个洞)—— 但报得诚实不等于拒绝服务:路由该放行还是放行。为什么还是想记一笔
auth/security.permissions/security.rls/security.fieldMasker—— 系统里安全语义最强的四个槽位,且四个的降级方向全部是放开而不是关闭。/analytics/query在没装 service-analytics 的装配里不注入 RLS/租户谓词,契约字段where也被静默忽略 #3891 是同一个模式的两端:那边是丢掉身份导致中间件放行,这边是伪造身份直接放行。建议(任一即可)
DevPlugin构造/start时检查NODE_ENV === 'production'(或复用os serve已有的环境判定),命中则拒绝启动并打印为什么,与serve.ts:1606那段OS_ALLOW_DEGRADED_TENANCY的处理方式对齐(那里是process.exit(1)而不是 warn,理由写得很清楚:throw 会被外层 catch 吞掉而静默降级启动);OS_ALLOW_DEV_STUBS=1,并在启动横幅上打标。核对于
origin/main@ 93f267f。已确认packages/、examples/、apps/及 cloud 仓内均无new DevPlugin(的实例化(仅 plugin-dev 自身 README)。