关键信息 漏洞类型: Scada-LTS Zip Slip Arbitrary File Write 提交者: sh7err@vEcho 测试修订: commit 1cfaed4b35117e4871bc3dfeae073f61d8e3bb3d (branch: develop) 摘要: - Scada-LTS在其项目导入功能中存在Zip Slip风格的路径遍历漏洞。 - 通过提供特制的ZIP存档,经过身份验证的管理员可以诱导服务器在预期目录之外(如uploads/和graphics/目录之外)写入攻击者控制的文件。 - 该问题源于ZIPProjectManager.restoreFiles中的不充分规范化和验证,以及PathSecureUtils和SafeZipFileUtils中的宽松路径检查。 - 成功利用该漏洞可以实现任意文件覆盖在Common.getHomeDir()下的任何位置(通常是Tomcat基本目录)。 - 攻击者可以破坏用户界面,植入恶意SVG以实现存储型XSS,或修改向其他用户提供的资源。 产品与版本: - 产品: Scada-LTS - 受影响版本: 所有在commit 1cfaed4b35117e4871bc3dfeae073f61d8e3bb3d及之前发布的版本。 - 修复版本: 未修复 漏洞详情: - 根本原因分析: 1. ZIPProjectManager.java的源代码在导入期间遍历ZIP入口,并委托给UploadFileUtils.filteringUploadFiles/filteringGraphicsFiles在调用restoreFiles之前进行过滤。 2. restoreFiles(line 179)最终通过PathSecureUtils.toSecurePath()解析文件路径,并写入文件,如果存在可选的结果不会进一步检查。 3. PathSecureUtils.toSecurePath()构造绝对路径,如果提供的路径包含遍历段(如uploads/../../../webapps/Scada-LTS/assets/logo.png),函数会简单地在返回前将输入连接到Common.getHomeDir(),允许文件被写入该基础目录下的任何位置。 4. SafeZipFileUtils.validate()中的预防性检查依赖于ValidationPaths.validatePath(),该方法总是报告成功,因此无法阻止遍历序列。 5. UploadFileUtils.isToUploads()仅仅确认文件的MIME类型(如PNG, SVG, info.txt),并不阻止目录遍历。 - 概念验证: 1. 以管理员身份登录到Scada-LTS。 2. 创建一个ZIP存档,包含预期目录之外的有效负载文件。 3. 在网页界面中,导航到System → Import并上传恶意ZIP存档。 4. 导入后,检查文件被攻击者控制的图像所覆盖,验证任意文件写入。 影响: - 可以通过替换UI资产实现持续的破坏或网络钓鱼。 - 如果恶意SVG或其他可解释的资源放置在网页可访问的位置,则可能产生存储型XSS。 - 通过重写配置、模板文件或其他静态资源交付给操作员,促进进一步的利用。 修复指导: - 将所有ZIP入口名视为不可信的输入。解析规范路径(File#getCanonicalPath())后,确保其以预期的uploads/graphics基础目录开头再写入文件。 - 加强SafeZipFileUtils/ValidationPaths,拒绝遍历令牌(..、绝对路径、驱动器字母)而不是盲目接受normalize()的结果。 - 可选地维护一个允许子目录和文件类型的显式白名单。 发现者: sh7err@vEcho