Deno generatePrimeSync(1) 直接终止进程,检查小位数参数保护
Deno 的小位数素数输入曾进入 Rust panic,使 JavaScript catch 无法执行。2.9.7 包含错误返回保护,业务仍需验证合法参数范围。
Deno 中调用 crypto.generatePrimeSync(1),进程可能直接终止,外围 try/catch 没有机会执行。这个输入本应被拒绝,但拒绝参数与终止整个进程是两回事。
import crypto from 'node:crypto';
try {
crypto.generatePrimeSync(1);
} catch (error) {
console.log('caught:', error.message);
}
console.log('SURVIVED');
Deno 2.9.6 有这类明确案例。较早的修补材料已经同时列出一位素数生成和 DH 的过小 primeLength 输入,不能仅用后来的一行复现判断问题刚出现。
关键在 JavaScript 与 Rust 参数检查之间。JavaScript 的检查允许 size >= 1,随后把值交给素数生成库。库的 gen_prime 对小于两位的输入触发 Rust panic,而发行构建采用 abort 路径,于是进程退出。JavaScript 异常捕获无法拦截这一进程终止。
Deno 2.9.7 的正式源码包含小位数保护,将这种情况转换成错误返回,再交给兼容接口处理。这里称的是已确认包含保护的正式版本,不保证它是所有发行分支的首次修复。更新自己的安装来源后先核对真实运行版本:
deno --version
使用 Deno 内置升级方式的环境,可以按当前安装权限更新到指定版本;容器、包管理器或嵌入式运行环境,应更新它们真正提供的二进制,避免只更新终端中的另一个 Deno。
验收时在隔离进程运行最小例子,检查错误进入 catch、SURVIVED 被打印,以及退出状态与预期一致。再增加一个合法位数的对照,确认参数检查没有使正常调用全部失败。若应用还生成 DH 密钥,按它自己的参数范围另做检查,不把素数例子的结果直接当作所有密钥生成入口都已验收。
应用仍应在边界拒绝不合法输入。为了避开崩溃而把 1 随手改成 2,只能改变测试参数,不能满足实际密码用途的安全要求;业务需要的位数应按对应算法和使用场景选择。
这个修补针对小位数进入库 panic 的路径。生成合法大素数需要时间,耗时或资源不足是不同问题;同样不能因为错误变得可捕获,就把任意输入都当成可信参数。


