progmune-runtime 3.7.58 → 3.7.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/dist/frameworks/express-detector.js +20 -5
- package/dist/sdk.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -22,6 +22,33 @@ external-ID)用 JSON 列 `.contains()` 做匹配——contains() 在 JSON 列
|
|
|
22
22
|
不可点亮:污点根是 DB 字段(跨请求存储污点),现有管线结构性够不着,
|
|
23
23
|
归入漏报根因新子类(详见 CAPABILITY_THREE_PROOFS_V1.md)。
|
|
24
24
|
|
|
25
|
+
### fr-014 点亮 + fr-015 关闭(2026-10-05)
|
|
26
|
+
|
|
27
|
+
- **fr-014(8/17,DETECTED-with-boundary)**:mockoon 管理 API 裸奔检出——
|
|
28
|
+
两处 Express 检测器可见性缺口修复:①`extractRoutes` 支持模板字符串路径
|
|
29
|
+
(库形态模块路径全是 `${prefix}/...` 变量拼前缀,此前整文件 0 路由);
|
|
30
|
+
②`app: Express` 形参的 setup 模块纳入整 app 无认证判定(此前落在
|
|
31
|
+
creator 门与 hasAnyAuth 门之间的盲区)。修复后残留归因到匿名中间件
|
|
32
|
+
函数体内的 bearer 校验超出名字级分类;AUTH_MIDDLEWARE_PATTERNS 补
|
|
33
|
+
timingSafeEqual/extractBearerToken(对具名形态有效)。express-realworld
|
|
34
|
+
回归 20 路由零新增误报。
|
|
35
|
+
- **fr-015 判定关闭(corpus_invalid)**:真值 sink 在虚拟模块
|
|
36
|
+
(#og-image-virtual/public-assets.mjs,pre 快照不存在),mini 切片无 sink;
|
|
37
|
+
且 pre-fix 已有 isBlockedUrl 守卫未接在 fonts 路径——fr-009 同族
|
|
38
|
+
「守卫存在但不足」。检测无从谈起,如实不覆盖。
|
|
39
|
+
|
|
40
|
+
### fr-012 复测点亮 + fr-004 判定关闭(2026-10-05)
|
|
41
|
+
|
|
42
|
+
- **fr-012(7/17,DETECTED-with-boundary)**:MCP 工具实参污点根(3.7.33 C 系列)
|
|
43
|
+
上线后修复前 markdownUpload 已命中路径穿越标记——此前未复测。修复后残留
|
|
44
|
+
2 条归因到 local 部署 by-design 分支(IS_REMOTE 拒绝 filePath 是修复,
|
|
45
|
+
local 保留文件读取是设计;提取器无分支语义,fr-009 同族边界)。
|
|
46
|
+
- **fr-004 判定关闭**:形态是闭包晚绑定(循环内 cookies 被内层函数晚绑定
|
|
47
|
+
捕获,多工具服务器时共享最后连接的 cookie jar)而非污点流——检测需变量
|
|
48
|
+
绑定分析,词形判据下 FP 爆炸,不硬做。根因归类修正为「作用域语义
|
|
49
|
+
(闭包晚绑定)」。注:fix_commit cd9db21c 是「重构形式的安全修复」
|
|
50
|
+
(fr-013 教训的镜像:fix 性质必须以公告摘要核对)。
|
|
51
|
+
|
|
25
52
|
## [3.7.57] — 2026-10-04(未发布)
|
|
26
53
|
|
|
27
54
|
### §51 held-out 验证 + §52-53 决策门禁 + 修冤枉第一刀(Data Mutation 族移除)
|
|
@@ -76,6 +76,11 @@ const AUTH_MIDDLEWARE_PATTERNS = [
|
|
|
76
76
|
/\bensureAuthenticated\b/,
|
|
77
77
|
/\bauthGuard\b/,
|
|
78
78
|
/\bAuthGuard\b/,
|
|
79
|
+
// 匿名中间件函数体内的 bearer 校验证据(2026-10-05 fr-014 mockoon 修复形态:
|
|
80
|
+
// app.use(`${prefix}*`, (req,res,next) => { hasValidAdminApiToken(...) })——
|
|
81
|
+
// 认证在函数体里,中间件名不可见)
|
|
82
|
+
/\btimingSafeEqual\b/,
|
|
83
|
+
/\bextractBearerToken\b/,
|
|
79
84
|
/\brequire\w*[Aa]uth\b/,
|
|
80
85
|
/\bcheckAuth\b/,
|
|
81
86
|
/\bprotect\b/,
|
|
@@ -161,17 +166,22 @@ function extractRoutes(code, appName) {
|
|
|
161
166
|
for (const method of methods) {
|
|
162
167
|
// Pattern: app.get('/path', middleware1, middleware2, handler)
|
|
163
168
|
// or: router.post('/path', handler)
|
|
164
|
-
|
|
169
|
+
// 2026-10-05(fr-014 mockoon):路径也支持模板字符串
|
|
170
|
+
// app.get(`${adminApiPrefix}/events`, ...)——库形态模块(app 经参数传入)
|
|
171
|
+
// 的路径几乎全是变量拼前缀的模板串,字符串字面量 regex 整文件 0 路由。
|
|
172
|
+
// 捕获组:1=单引号 2=双引号 3=模板串;path 取三者首个非空。
|
|
173
|
+
const routeRegex = new RegExp(`\\b${receivers}\\.${method}\\s*\\(\\s*(?:'([^']+)'|\"([^\"]+)\"|\`([^\`]+)\`)\\s*,([^;]+)\\)`, "gi");
|
|
165
174
|
let match;
|
|
166
175
|
while ((match = routeRegex.exec(code)) !== null) {
|
|
167
|
-
const
|
|
176
|
+
const routePath = match[1] ?? match[2] ?? match[3] ?? "";
|
|
177
|
+
const rawArgs = match[4].trim();
|
|
168
178
|
const args = rawArgs.split(",").map(a => a.trim()).filter(a => a.length > 0);
|
|
169
179
|
// Last arg is the handler, everything before is middleware
|
|
170
180
|
const handler = args[args.length - 1] || "anonymous";
|
|
171
181
|
const middlewares = args.slice(0, -1);
|
|
172
182
|
routes.push({
|
|
173
183
|
method,
|
|
174
|
-
path:
|
|
184
|
+
path: routePath,
|
|
175
185
|
handler,
|
|
176
186
|
middlewares,
|
|
177
187
|
line: code.slice(0, match.index).split("\n").length,
|
|
@@ -274,9 +284,14 @@ function analyzeExpressApp(code) {
|
|
|
274
284
|
const hasSession = globalMiddleware.some(m => m.type === "session") || /\bsession\s*\(/.test(code);
|
|
275
285
|
// ── Generate Issues ──
|
|
276
286
|
// 整 app 无认证:仅真 app(实例化 express())且自身有非公开 mutation
|
|
277
|
-
// 路由时报——main.ts 只挂载路由模块(真实认证在 controllers
|
|
287
|
+
// 路由时报——main.ts 只挂载路由模块(真实认证在 controllers 内)不算裸。
|
|
288
|
+
// 2026-10-05(fr-014 mockoon):库形态 setup 模块(app: Express 经参数
|
|
289
|
+
// 传入、在调用方 app 上挂载)同样报——此前「非 creator 且无 auth」落在
|
|
290
|
+
// 两条判定路之间(整 app 报要求 creator、逐路由报要求 hasAnyAuth),
|
|
291
|
+
// 管理 API 裸奔的系统性盲区。
|
|
292
|
+
const appIsParam = /\bapp\s*:\s*Express\b/.test(code);
|
|
278
293
|
const hasNakedMutation = routes.some(nonPublicMutation);
|
|
279
|
-
if (!hasAnyAuth && appIsCreator && hasNakedMutation) {
|
|
294
|
+
if (!hasAnyAuth && (appIsCreator || appIsParam) && hasNakedMutation) {
|
|
280
295
|
issues.push({
|
|
281
296
|
severity: "critical",
|
|
282
297
|
rule: "EXPRESS_NO_AUTH_MIDDLEWARE",
|
package/dist/sdk.js
CHANGED
|
@@ -20,7 +20,7 @@ const risk_model_1 = require("./risk-model");
|
|
|
20
20
|
const protocol_knowledge_1 = require("./protocol-knowledge");
|
|
21
21
|
const evidence_repository_1 = require("./evidence-repository");
|
|
22
22
|
/** Runtime version — stable public identifier. Internal layers evolve underneath. */
|
|
23
|
-
exports.RUNTIME_VERSION = "3.7.
|
|
23
|
+
exports.RUNTIME_VERSION = "3.7.59";
|
|
24
24
|
function verify(filePath) {
|
|
25
25
|
const cert = (0, certify_1.certify)(filePath);
|
|
26
26
|
const kb = (0, protocol_knowledge_1.buildKnowledgeBase)();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "progmune-runtime",
|
|
3
|
-
"version": "3.7.
|
|
3
|
+
"version": "3.7.59",
|
|
4
4
|
"description": "Progmune — AI Trust Decision Engine. Verify AI-generated code before it reaches production. Outputs APPROVED / NEEDS_REVIEW / BLOCKED with evidence.",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/",
|