JGTechVision VM 项目安全审计报告审计日期2026-06-06审计范围D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM全量源码2537 个文件审计方法静态代码分析 模式匹配扫描一、风险等级总览等级数量说明严重 (Critical)3可导致系统被完全控制或敏感数据泄露高危 (High)5在特定条件下可被利用中危 (Medium)5增加攻击面但不直接导致系统沦陷低危 (Low)3最佳实践违规累积风险二、严重风险 (Critical)C01 — 加密密钥硬编码在源代码中影响文件[DesEncrypt.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\01Main\VM.Start\Common\Helper\Encrypt\DesEncrypt.cs:14)[MD5Provider.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\01Main\VM.Start\Common\Helper\Encrypt\MD5Provider.cs:15)问题描述DES 加密密钥HZQ.!02192591和 MD5 盐值VM.!02192591以明文形式硬编码在源代码中。任何人获取到源码或反编译可执行文件后可以解密所有使用 DES 加密的敏感数据构造 MD5 碰撞或彩虹表破解所有用户密码代码证据// DesEncrypt.cs:14privateconstStringKEYHZQ.!02192591;// MD5Provider.cs:15strVM.!02192591;修复建议将密钥移至配置文件并通过环境变量或加密存储读取使用Data Protection API (DPAPI)或Azure Key Vault管理密钥。C02 — BinaryFormatter 反序列化远程代码执行 (RCE)影响文件[CloneObject.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\01Main\VM.Start\Common\Helper\CloneObject.cs:27)[SerializeHelp.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\01Main\VM.Start\Common\Helper\SerializeHelp.cs:82,105)[SerHelper.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\01Main\VM.Start\Communacation\Socket\SerHelper.cs:14,26,37)[RImage.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\03ThirdPartyDll\VM.Halcon\Config\RImage.cs:137)问题描述项目中6 处使用了System.Runtime.Serialization.Formatters.Binary.BinaryFormatter这是 .NET 中已知的不安全反序列化 API。攻击者可以构造恶意序列化数据在反序列化时执行任意代码。攻击面位置场景风险SerHelper.cs网络 Socket 通信中序列化/反序列化消息远程攻击者发送恶意数据包即可 RCESerializeHelp.cs项目文件 (.bin) 的保存和加载诱导用户打开恶意项目文件即可 RCECloneObject.cs对象深拷贝内部使用风险相对较低但仍不安全RImage.csHalcon 图像 .he 文件格式诱导打开恶意图像文件即可 RCE修复建议将 BinaryFormatter全部替换为安全的序列化器如System.Text.Json、Newtonsoft.Json、protobuf-net如果必须使用二进制格式使用BinaryWriter/BinaryReader手动序列化已知类型对于 Socket 通信使用Google.Protobuf或自定义二进制协议微软官方已声明 BinaryFormatter 为危险 API计划在未来 .NET 版本中移除C03 — 默认管理员密码硬编码 所有用户共用同一哈希影响文件[UserConfig.xml](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\00Exe\ConfigFile\UserConfig.xml:3-6)问题描述三个用户开发者、管理员、操作员的密码 MD5 哈希值完全相同4A0FFEDC0382B329DD6DB9B68D01B131且存储在明文 XML 文件中。结合 C01 中盐值硬编码攻击者可以通过彩虹表反查 MD5 哈希得到原始密码用一个密码登录所有三个角色代码证据UserUserId1000UserName开发者UserPwd4A0FFEDC0382B329DD6DB9B68D01B131/UserUserId1001UserName管理员UserPwd4A0FFEDC0382B329DD6DB9B68D01B131/UserUserId1002UserName操作员UserPwd4A0FFEDC0382B329DD6DB9B68D01B131/修复建议首次启动时强制要求修改默认密码为每个用户设置独立的初始密码使用 bcrypt/PBKDF2/Argon2 替代 MD5 进行密码哈希三、高危风险 (High)H01 — 使用已废弃的弱加密算法影响文件[MD5Provider.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\01Main\VM.Start\Common\Helper\Encrypt\MD5Provider.cs:14)[DesEncrypt.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\01Main\VM.Start\Common\Helper\Encrypt\DesEncrypt.cs:28,51)问题描述MD5已被证明存在碰撞攻击NIST 早在 2010 年已禁止用于密码哈希等安全场景DES56 位密钥可在数小时内被暴力破解NIST 已于 2005 年废弃修复建议密码哈希使用PBKDF2、bcrypt或Argon2id推荐 Argon2id对称加密使用AES-256-GCM带认证加密密钥通过Rfc2898DeriveBytes派生H02 — 通信收发数据以明文记录到日志影响文件[ECommunacation.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\01Main\VM.Start\Communacation\ECommunacation.cs:425,947,951)问题描述PLC/串口/TCP 通信的收发数据完整记录到日志文件中不区分敏感数据Logger.AddLog($[{Key}]接收数据:{str});// Line 425Logger.AddLog($[{Key}]发送数据:{str});// Line 947Logger.AddLog($[{Key}]发送数据失败,...);// Line 951如果通信中包含产品码、配方参数、工艺密码等敏感信息会被明文写入日志。修复建议对日志中的数据内容进行脱敏处理遮蔽关键字段为通信日志设置单独的日志级别如 Trace生产环境关闭或使用结构化日志标记敏感字段不记录H03 — 所有权限默认全部开启影响文件[RightControl.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\01Main\VM.Start\Common\RightControl\RightControl.cs)[IsEnableControl.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\01Main\VM.Start\Common\RightControl\IsEnableControl.cs)问题描述RightControl和IsEnableControl两个权限控制类中所有 60 个权限字段的默认值均为true全部开启。这意味着任何新用户登录后默认拥有管理员级别的所有操作权限。权限应该在登录后根据用户角色开发者/管理员/操作员动态设置而非默认全部开放。修复建议将默认值改为false登录后根据角色按需开启建立角色-权限映射表在OnUserChanged事件中统一设置H04 — 运行时 C# 脚本编译执行影响文件[ImageScriptViewModel.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\02Plugins…\ImageScriptViewModel.cs:206)[CSharpScriptViewModel.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\02Plugins…\CSharpScriptViewModel.cs:86)[IfViewModel.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\02Plugins…\IfViewModel.cs:135)问题描述项目支持运行时编译和执行 C# 脚本CompileScript()这是设计功能但如果脚本内容来自外部输入或可被操作员编辑未对脚本执行进行沙箱限制则操作员可能编写恶意脚本访问文件系统、网络或执行系统命令。修复建议限制脚本的 API 白名单只允许特定的安全方法使用AssemblyLoadContext或 AppDomain 沙箱隔离脚本执行仅允许管理员角色编辑脚本内容对脚本内容进行代码审查H05 — Process.Start 启动外部程序/文件影响文件[MainViewModel.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\01Main\VM.Start\MainViewModel.cs:814-819)[MainView.xaml.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\01Main\VM.Start\MainView.xaml.cs:50-56)问题描述System.Diagnostics.ProcessprocessnewSystem.Diagnostics.Process();process.StartInfo.FileNameHelpDecomentFullName;// 帮助文档路径process.StartInfo.VerbOpen;process.Start();帮助文档路径如果来自配置文件且可被低权限用户修改则可能被替换为恶意可执行文件。修复建议对文件路径进行签名验证或哈希校验限制Process.Start只能打开特定目录下的文件使用UseShellExecute false防止执行任意可执行文件四、中危风险 (Medium)M01 — BinaryFormatter 用于项目文件持久化调用链LoginView.xaml.cs→SerializeHelp.BinSerializeAndSaveFile(Solution.Ins, ...)MainViewModel.cs→SerializeHelp.BinDeserializeSolution(fileName)ToolView.xaml.cs→ 项目导入导出NPointCal.cs→ 标定数据序列化项目/方案的数据保存使用了BinaryFormatter虽无网络攻击面但恶意项目文件可能导致反序列化 RCE。M02 — SerHelper BinaryFormatter 用于 Socket 通信[SerHelper.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\01Main\VM.Start\Communacation\Socket\SerHelper.cs) 用于 TCP/UDP Socket 消息的序列化/反序列化网络数据直接通过BinaryFormatter.Deserialize()处理是最危险的反序列化攻击面之一。M03 — RImage 使用 BinaryFormatter 序列化图像[RImage.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\03ThirdPartyDll\VM.Halcon\Config\RImage.cs:137) 中的.he格式图像文件通过BinaryFormatter读写任何人可构造恶意 .he 文件导致 RCE。M04 — 路径拼接存在遍历风险[GlobalVarViewModel.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\01Main\VM.Start\ViewModels\GlobalVarViewModel.cs:418)File.Delete(FilePaths.RecipePathCurrentRecipe);CurrentRecipe如果来自用户输入且未经校验可能被构造为../../Windows/System32/xxx导致路径遍历删除任意文件。M05 — Cookie/凭据明文存储[LoginView.xaml.cs](D:\JGTechVision\GJTechVisionV1.0.0\01_Sourse - 0603-3\VM\01Main\VM.Start\Dialogs\Views\LoginView.xaml.cs) 中将当前登录用户名写入文件SetCurrentUserName(CurrentUser.UserName);存在自动登录功能若用户名被篡改为管理员可绕过登录界面。五、低危风险 (Low)L01 — 无 HTTPS 强制项目中存在硬编码的 HTTP URL如http://www.leibville.com/未配置 HTTPS。对于本地工控机场景风险较低但若有远程访问需求则需注意。L02 — 全局异常捕获可能隐藏攻击痕迹App.xaml.cs中注册了全局异常捕获过多的catch (Exception)可能使安全攻击的异常被吞掉无法被安全监控系统发现。L03 — 无会话超时机制用户登录后长期不操作不会自动登出增加了物理访问场景下被未授权操作的风险。六、修复优先级建议优先级编号风险预计工作量P0立即C02BinaryFormatter RCE3-5 天P0立即C03默认密码 / 共用哈希0.5 天P1本周H01弱加密算法替换1 天P1本周H03权限默认值修复0.5 天P1本周M02Socket 反序列化1 天P2本月C01密钥迁移到安全存储1 天P2本月H02日志脱敏1 天P2本月H04脚本沙箱2 天P2本月H05Process.Start 限制0.5 天P3下版本M01/M03/M04/M05其他中危项2 天P3下版本L01-L03低危项1 天七、附录扫描关键词清单类别搜索模式命中数硬编码密码password,pwd,secret,token30 (大部分为第三方库)SQL 注入Format(...SELECT,SELECT0项目使用 ORM 参数化弱加密DES,MD5,SHA1,RC24 (2 个核心文件)反序列化BinaryFormatter,XmlSerializer15命令注入Process.Start3路径遍历Path.Combine 用户输入1日志泄露Logger.*password,Log.*pwd0 (直接日志)HTTP 明文http://(非 localhost)1