progmune-runtime 3.7.3 → 3.7.5

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.
@@ -722,28 +722,15 @@ async function collectProtocolViolations(ctx, callGraph) {
722
722
  }
723
723
  // ── SSG State Machine: load protocol rules once ──
724
724
  protocolRulesData = (0, ssg_bridge_1.loadProtocolRules)(ctx.projectPath);
725
- // ── Phase 1-5 Semantic Pipeline ──
726
- // 规则名集合作为展开的保留单元:规则函数不内联(调用名保留给匹配层)
727
- const callSequences = extractCallSequencesFromProject(ctx.projectPath, ctx.language, protocolRulesData ? new Set(protocolRulesData.rules.keys()) : undefined);
728
- const flaggedCount = { value: 0 };
729
- const cleanCount = { value: 0 };
730
- // ── P4.6.1: 词段匹配门控的项目函数集合(best-effort,与注解合并共用 ir.json) ──
731
- // 词段匹配只对项目函数适用(改名协议原语);外部库调用走 alias/关键词桥接。
732
- let projectFunctions;
733
- try {
734
- const fs = require("fs");
735
- const irPath = path.join(ctx.projectPath, "ir.json");
736
- if (fs.existsSync(irPath)) {
737
- const ir = JSON.parse(fs.readFileSync(irPath, "utf-8"));
738
- const functions = Array.isArray(ir) ? ir : (ir.functions || []);
739
- projectFunctions = (0, call_sequence_1.collectProjectFunctionNames)(functions);
740
- }
741
- }
742
- catch { /* best-effort */ }
743
725
  // ── P4.5: 合并项目 IR 注解协议(IR 优先,缺 namespace 继承内置 JSON) ──
744
726
  // 内置 protocols.json 的规则是通用弱约束(如 generate_jwt pre=[]),
745
727
  // 项目文件里的 @protocol 注解才是项目真实协议(如 pre=[PASSWORD_VERIFIED])。
746
728
  // planner 已用此合并语义,trust 引擎需对齐,否则项目级前置约束不生效。
729
+ // 合并必须在序列构建【之前】:规则名是展开的保留单元(不内联),若合并
730
+ // 晚于 extractCallSequencesFromProject,注解原语(有函数体、调项目函数的)
731
+ // 会被内联掉,其 post 状态永不生效——真实 redis ACL 演示暴露(
732
+ // checkPasswordBasedAuth 被内联 → AUTHENTICATED 未建立 → good 流误报)。
733
+ // 与盲测 harness(scan-protocol-python)先合并后建序列的语义对齐。
747
734
  if (protocolRulesData) {
748
735
  try {
749
736
  const fs = require("fs");
@@ -761,12 +748,40 @@ async function collectProtocolViolations(ctx, callGraph) {
761
748
  if (existing?.namespace && !protocol.namespace) {
762
749
  protocol.namespace = existing.namespace;
763
750
  }
751
+ // 修复路径渲染真实函数名(fixPath 输出项目原语而非通用规则名)
752
+ protocol.displayName = String(f.name);
764
753
  protocolRulesData.rules.set(String(f.name), protocol);
754
+ // CamelCase 真实命名(C 代码普遍,如 ACLCheckAllPerm)注册的规则
755
+ // 原样无法被任何匹配策略触达(normalize 只作用于调用名;词段匹配
756
+ // 要求 ≥2 个下划线词段)——同步注册规范化形态使注解原语可被按名命中。
757
+ // 加性改动:snake_case 注解(TS/Python 惯例)normalized === 原名,无变化。
758
+ const normalized = (0, ssg_bridge_1.normalizeName)(String(f.name));
759
+ if (normalized !== String(f.name)) {
760
+ protocolRulesData.rules.set(normalized, protocol);
761
+ }
765
762
  }
766
763
  }
767
764
  }
768
765
  catch { /* best-effort */ }
769
766
  }
767
+ // ── Phase 1-5 Semantic Pipeline ──
768
+ // 规则名集合作为展开的保留单元:规则函数不内联(调用名保留给匹配层)
769
+ const callSequences = extractCallSequencesFromProject(ctx.projectPath, ctx.language, protocolRulesData ? new Set(protocolRulesData.rules.keys()) : undefined);
770
+ const flaggedCount = { value: 0 };
771
+ const cleanCount = { value: 0 };
772
+ // ── P4.6.1: 词段匹配门控的项目函数集合(best-effort,与注解合并共用 ir.json) ──
773
+ // 词段匹配只对项目函数适用(改名协议原语);外部库调用走 alias/关键词桥接。
774
+ let projectFunctions;
775
+ try {
776
+ const fs = require("fs");
777
+ const irPath = path.join(ctx.projectPath, "ir.json");
778
+ if (fs.existsSync(irPath)) {
779
+ const ir = JSON.parse(fs.readFileSync(irPath, "utf-8"));
780
+ const functions = Array.isArray(ir) ? ir : (ir.functions || []);
781
+ projectFunctions = (0, call_sequence_1.collectProjectFunctionNames)(functions);
782
+ }
783
+ }
784
+ catch { /* best-effort */ }
770
785
  for (const seq of callSequences) {
771
786
  try {
772
787
  const semantic = await (0, api_semantic_mapper_1.mapSequenceToSemanticWithLLM)(seq.calls);
@@ -50,6 +50,7 @@ var __importStar = (this && this.__importStar) || (function () {
50
50
  };
51
51
  })();
52
52
  Object.defineProperty(exports, "__esModule", { value: true });
53
+ exports.normalizeName = normalizeName;
53
54
  exports.validateSequenceWithSSG = validateSequenceWithSSG;
54
55
  exports.ssgViolationsToTrustViolations = ssgViolationsToTrustViolations;
55
56
  exports.loadProjectAliases = loadProjectAliases;
@@ -421,6 +422,8 @@ projectFunctions) {
421
422
  let fixPath = [];
422
423
  try {
423
424
  fixPath = (0, ssg_validator_1.findFixPathStatic)(rules, ruleNamespace, rejection.currentState, rejection.requiredState);
425
+ // 修复路径渲染真实函数名:项目注解原语的 displayName 优先于通用规则名
426
+ fixPath = fixPath.map((n) => rules.get(n)?.displayName ?? n);
424
427
  }
425
428
  catch {
426
429
  fixPath = rejection.missingFunctions || [];
@@ -482,18 +485,20 @@ projectFunctions) {
482
485
  if (!cur.includes(hs.state))
483
486
  continue;
484
487
  violatedCalls++;
488
+ // 释放函数渲染真实名(项目注解原语的 displayName 优先)
489
+ const releaseDisplay = rules.get(hs.releaseFn)?.displayName ?? hs.releaseFn;
485
490
  violations.push({
486
491
  callName: "(end-of-sequence)",
487
492
  namespace: hs.namespace,
488
493
  currentState: cur,
489
494
  requiredState: [],
490
- fixPath: [hs.releaseFn],
495
+ fixPath: [releaseDisplay],
491
496
  matchedRule: hs.releaseFn,
492
497
  endState: true,
493
498
  explanation: `SSG end-state violation: resource state [${hs.state}] ` +
494
499
  `acquired in this function is still held at end of sequence ` +
495
500
  `(namespace ${hs.namespace}, current [${cur.join(", ")}]) — ` +
496
- `missing release call: ${hs.releaseFn}.`,
501
+ `missing release call: ${releaseDisplay}.`,
497
502
  });
498
503
  trace.push({
499
504
  call: "(end-of-sequence)",
@@ -346,7 +346,7 @@
346
346
  <div class="bar"><span class="bl">人工审查能力</span><div class="bt"><div class="bf" style="width:10%"></div></div><span class="bv">1x</span></div>
347
347
 
348
348
  <h3>3.2 问题本质:AI 写代码的原理决定了它"看不见"错误</h3>
349
- <p>大语言模型生成代码的方式是<strong>统计预测</strong>——根据训练数据猜"下一个最可能的词"。这一观点的代表性论述来自 Subbarao Kambhampati 等的立场论文《Stop Anthropomorphizing Intermediate Tokens as Reasoning/Thinking Traces!》(arXiv:2505.22285)及其 ICML 2026 关于 verifier 的主题演讲:LLM 输出的"逐步推理"是统计表演,中间 token 与真实推理之间没有可靠的因果对应。</p>
349
+ <p>大语言模型生成代码的方式是<strong>统计预测</strong>——根据训练数据猜"下一个最可能的词"。这一观点的代表性论述来自 Subbarao Kambhampati 等的立场论文《Stop Anthropomorphizing Intermediate Tokens as Reasoning/Thinking Traces!》(arXiv:2504.09762)及其 ICML 2026 关于 verifier 的主题演讲:LLM 输出的"逐步推理"是统计表演,中间 token 与真实推理之间没有可靠的因果对应。</p>
350
350
  <p>这意味着:AI 写出"看似合理的代码"和"实际正确的代码"是两件事。它会一本正经地调用不存在的函数、跳过关键的认证步骤——<strong>而且完全静默,不报错</strong>。</p>
351
351
 
352
352
  <h3>3.3 现有方案为什么不够</h3>
@@ -508,7 +508,7 @@ AI 生成: create_session(...) ← 当前状态 UNAUTHENTICATED
508
508
  <tr><td><strong>协议盲测</strong>(Python v1.2,38 项目)</td><td>8 违规类型 × 5 结构/命名风格、66 条可测金标、生产 SSG 桥接校验器(P4.6 跨函数传播)</td><td>召回 <strong>97%</strong> · 精确率 <strong>100%</strong> · 误报 <strong>0</strong>(2 漏检为注解依赖前置,已单列)</td></tr>
509
509
  <tr><td><strong>真实应用验证</strong>(PyGoat)</td><td>OWASP 故意脆弱 Django 应用、232 条检测逐条人工核实</td><td>标记精确率 <strong>100%</strong>(67 真阳性 / 0 误报);覆盖 14 个漏洞类别</td></tr>
510
510
  <tr><td><strong>良构应用</strong>(django/fastapi realworld、django-unicorn)</td><td>176 条检测</td><td>0 条误报真阳性;3 条框架内部边界 FP(已定性归档)</td></tr>
511
- <tr><td><strong>黄金基准</strong>(C 语言)</td><td>curl/libssh/nginx/openssl 等真实 CVE 案例</td><td>F1 16.5% —— <strong>研究阶段</strong>,诚实披露</td></tr>
511
+ <tr><td><strong>黄金基准</strong>(C 语言)</td><td>curl/libssh/nginx/openssl 等真实 CVE 案例;3.7.4 起 IR 提取接入注册表</td><td>应用级协议验证金标 v2:<strong>F1 95.7%</strong>(召回 100%);旧正则口径 F1=16.5% 为 TLS 级历史基线 —— <strong>研究阶段</strong>,诚实披露</td></tr>
512
512
  <tr><td><strong>PLSB v1.0</strong></td><td>13 类协议安全弱点、39 个手工验证缺陷案例</td><td>覆盖 <strong>13/13 全类别</strong>(业界唯一)</td></tr>
513
513
  </table>
514
514
  <div class="plain">
@@ -537,7 +537,7 @@ AI 生成: create_session(...) ← 当前状态 UNAUTHENTICATED
537
537
  <tr><th>能力</th><th>状态</th><th>说明</th></tr>
538
538
  <tr><td>TypeScript / JavaScript</td><td><span style="color:var(--green);font-weight:700">✅ 生产</span></td><td>盲测 100 项目:精确率 100%、召回率 98.5%</td></tr>
539
539
  <tr><td>Python</td><td><span style="color:var(--green);font-weight:700">✅ 生产</span></td><td>盲测 90 项目:精确率/召回率双 100%;15 条源码级检测规则;PyGoat 真实验证 67 TP / 0 FP</td></tr>
540
- <tr><td>C</td><td><span style="color:var(--amber);font-weight:700">⚠️ 研究</span></td><td>F1 16.5%,瓶颈已定位(规则覆盖),L3 实验已终止</td></tr>
540
+ <tr><td>C</td><td><span style="color:var(--amber);font-weight:700">⚠️ 研究</span></td><td>3.7.4 起 IR 提取 + 应用级协议状态机验证(金标 v2:P=91.7%/R=100%/F1=95.7%);TLS 级仍无覆盖(旧正则口径 F1=16.5% 为历史基线),L3/L4 结论不变</td></tr>
541
541
  <tr><td>Go / Java</td><td><span style="color:var(--ink-3)">❌ 未支持</span></td><td>路线图内</td></tr>
542
542
  <tr><td>框架适配</td><td><span style="color:var(--amber);font-weight:700">2/13</span></td><td>Express ✅、tRPC ✅、NestJS 部分;Next.js 版本感知已实现;Django/FastAPI 经 Python 源码级检测间接覆盖</td></tr>
543
543
  </table>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "progmune-runtime",
3
- "version": "3.7.3",
3
+ "version": "3.7.5",
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/",