当前位置: 首页 > news >正文

JGTechVision VM 项目安全审计报告

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:14privateconstStringKEY="HZQ.!02192591";// MD5Provider.cs:15str+="VM.!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 通信中序列化/反序列化消息远程攻击者发送恶意数据包即可 RCE
SerializeHelp.cs项目文件 (.bin) 的保存和加载诱导用户打开恶意项目文件即可 RCE
CloneObject.cs对象深拷贝内部使用,风险相对较低但仍不安全
RImage.csHalcon 图像 .he 文件格式诱导打开恶意图像文件即可 RCE

修复建议

  • 将 BinaryFormatter全部替换为安全的序列化器(如System.Text.JsonNewtonsoft.Jsonprotobuf-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 中盐值硬编码,攻击者可以:

  1. 通过彩虹表反查 MD5 哈希得到原始密码
  2. 用一个密码登录所有三个角色

代码证据

<UserUserId="1000"UserName="开发者"UserPwd="4A0FFEDC0382B329DD6DB9B68D01B131"/><UserUserId="1001"UserName="管理员"UserPwd="4A0FFEDC0382B329DD6DB9B68D01B131"/><UserUserId="1002"UserName="操作员"UserPwd="4A0FFEDC0382B329DD6DB9B68D01B131"/>

修复建议

  • 首次启动时强制要求修改默认密码
  • 为每个用户设置独立的初始密码
  • 使用 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 年已禁止用于密码哈希等安全场景
  • DES:56 位密钥可在数小时内被暴力破解,NIST 已于 2005 年废弃

修复建议

  • 密码哈希:使用PBKDF2bcryptArgon2id(推荐 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)

问题描述RightControlIsEnableControl两个权限控制类中,所有 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.Processprocess=newSystem.Diagnostics.Process();process.StartInfo.FileName=HelpDecomentFullName;// 帮助文档路径process.StartInfo.Verb="Open";process.Start();

帮助文档路径如果来自配置文件且可被低权限用户修改,则可能被替换为恶意可执行文件。

修复建议

  • 对文件路径进行签名验证或哈希校验
  • 限制Process.Start只能打开特定目录下的文件
  • 使用UseShellExecute = false防止执行任意可执行文件

四、中危风险 (Medium)

M01 — BinaryFormatter 用于项目文件持久化

调用链

  • LoginView.xaml.csSerializeHelp.BinSerializeAndSaveFile(Solution.Ins, ...)
  • MainViewModel.csSerializeHelp.BinDeserialize<Solution>(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.RecipePath+CurrentRecipe);

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,"SELECT"+0(项目使用 ORM 参数化)
弱加密DES,MD5,SHA1,RC24 (2 个核心文件)
反序列化BinaryFormatter,XmlSerializer15+
命令注入Process.Start3
路径遍历Path.Combine+ 用户输入1
日志泄露Logger.*password,Log.*pwd0 (直接日志)
HTTP 明文http://(非 localhost)1
http://www.jsqmd.com/news/961724/

相关文章:

  • 用 myKG 构建 LLM Wiki
  • 结合AI大模型+可追踪+场景贴合 知影-API风险监测系统通用行业解决方案
  • 2026黄金回收门店避坑|宁波海曙实测排行,靠谱变现首选禹竞名奢汇 - 奢侈品交易观察员
  • 工程师技术博客写作指南:从电源设计到个人品牌构建
  • 终极宝可梦随机化指南:Universal Pokemon Randomizer ZX 完全教程
  • 3分钟快速上手Translumo:Windows平台最专业的实时屏幕翻译工具终极指南
  • QKeyMapper终极指南:Windows全能按键映射工具,免费开源的键鼠手柄互通方案
  • 三菱FX系列PLC对接实战:C#原生SLMP协议通信(零第三方依赖)
  • 2026 镇江卫生间厨房阳台地下室漏水维修商家测评,多家防水企业综合评分横向对比,帮本地业主甄选靠谱堵漏维保团队 - 吉修匠
  • 2026 洛阳卫生间厨房阳台地下室漏水维修商家测评,多家防水企业综合评分横向对比,帮本地业主甄选靠谱堵漏维保团队 - 吉修匠
  • 串口猎人V31:嵌入式开发与物联网调试的瑞士军刀级工具
  • EOS与ESD失效分析:从概念到实战的硬件可靠性设计指南
  • 终极SPT-AKI存档编辑器:5分钟学会如何修改离线版逃离塔科夫角色数据
  • 继电器线圈浪涌电压抑制:原理、方案对比与工程实践
  • MuleSoft驱动的企业级LLM编排:安全、可审计、可集成的AI落地实践
  • 空调维修培训怎么选?靠谱机构挑选技巧与避坑指南——湖南阳光技术学校实地解析 - 湖南阳光技术
  • Android应用保活终极方案:高效稳定兼容Android 16的进程永生技术
  • 遗传算法工程化实战:27个真实问题调参路径与避坑指南
  • Sched_ext 回调深度解析(一):sched_ext 框架总览——前言
  • 论文投稿救星:Word公式一键转MathType的保姆级教程(附omml2mml.xsl报错终极解法)
  • IMX6ULL_主界面
  • 深圳本地黄金回收收的顶靠谱,三十年实体老店,水贝源头价高价收金 - 奢侈品回收测评
  • Figma中文界面汉化终极指南:3步实现设计工具无障碍化
  • FPGA入门:从50MHz时钟分频到1秒LED闪烁的完整设计解析
  • 掌握池化的原理
  • Altium Designer极坐标栅格实战:环形PCB布局效率提升指南
  • 讲真的2026年淄博保险纠纷律师推荐 5位实战经验丰富 - 本地品牌推荐
  • 2026年6月郴州贵金属奢侈品回收指南:郴奢汇万宝店领衔,正规机构推荐清单 - 小仙贝贝
  • MATLAB一键实现正态信息扩散与核密度拟合(含可视化与参数调节)
  • Matlab图像去噪效果量化评估工具:PSNR/SSIM/RMSE一键计算脚本合集