From 288c73fd143051f4ed6740e5f3bc1b9623e546d4 Mon Sep 17 00:00:00 2001 From: iven Date: Fri, 26 Jun 2026 15:17:53 +0800 Subject: [PATCH] =?UTF-8?q?fix(server):=20B4=20JWT=20=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=AF=86=E9=92=A5=20release=20panic=20=E5=AF=B9=E7=A7=B0?= =?UTF-8?q?=E9=98=B2=E6=8A=A4=20+=20=E4=BF=AE=E6=AD=A3=20doc-code=20drift?= =?UTF-8?q?=20=E6=AD=BB=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原 config.rs 检查 'change-me-in-production',该常量仓库无注入源(dev.ps1 用 'dev-secret-key-change-in-prod',default.toml 用 '__MUST_SET_VIA_ENV__'),warn 永不命中,生产忘设 ERP__JWT__SECRET 时静默运行可伪造任意 token。改为 UNSAFE_JWT_SECRETS 集合检查,release panic 与 KEK/storage_key 对称。上线评估 B4。 --- crates/erp-server/src/config.rs | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/crates/erp-server/src/config.rs b/crates/erp-server/src/config.rs index 49e54b5..82d2166 100644 --- a/crates/erp-server/src/config.rs +++ b/crates/erp-server/src/config.rs @@ -188,9 +188,30 @@ impl AppConfig { .build()?; let app_config: Self = config.try_deserialize()?; - // 安全检查:禁止在生产使用默认 JWT 密钥 - if app_config.jwt.secret == "change-me-in-production" { - tracing::warn!("⚠️ JWT 密钥使用默认值,请通过 ERP__JWT__SECRET 环境变量设置安全密钥"); + // 安全检查:禁止在生产使用占位/默认 JWT 密钥。 + // 与 KEK(见 main.rs:453 `== "__MUST_SET_VIA_ENV__"`)/storage_key(见 default_secret_key) + // 的 release panic 防护对称。关键风险:生产忘设 ERP__JWT__SECRET 时,secret 取 + // config/default.toml 的占位符值并静默运行,任意 token 可被伪造。 + // 注:原检查常量 "change-me-in-production" 在仓库中无任何注入源(doc-code drift 死代码), + // 已改为覆盖全部已知不安全值。详见上线评估 B4 + 症状导航。 + const UNSAFE_JWT_SECRETS: &[&str] = &[ + "__MUST_SET_VIA_ENV__", // config/default.toml 占位符(与 KEK 检查一致) + "dev-secret-key-change-in-prod", // dev.ps1 注入的开发值 + "change-me-in-production", // 历史遗留默认值(向后兼容) + ]; + if UNSAFE_JWT_SECRETS.contains(&app_config.jwt.secret.as_str()) { + #[cfg(debug_assertions)] + { + tracing::warn!( + "⚠️ JWT 密钥使用占位/开发默认值(开发环境允许),生产环境将 panic;请通过 ERP__JWT__SECRET 设置安全密钥" + ); + } + #[cfg(not(debug_assertions))] + { + panic!( + "ERP__JWT__SECRET 必须设置安全密钥(生产环境不允许使用占位/默认 JWT 密钥,否则任意 token 可被伪造)" + ); + } } Ok(app_config)