flawopen.com/Incidents/moveit-transfer-sql-injection-may-2023
●
Progress Software · CVE-2023-34362 · May 2023 · CVSS 9.8 · 严重
安全研究 · FlawOpen
MOVEit Transfer:SQL 注入与大规模数据窃取
CVE-2023-34362 是 MOVEit Transfer 中可被未认证利用的 SQL 注入漏洞。Mandiant 观察到攻击自 2023 年 5 月 27 日开始,随后出现 LEMURLOOT Web Shell 和数据窃取。[4], [3]
💡 通俗易懂的原理解析 (ELI5)
想象一个表单有“文件夹编号”字段,但工作人员把字段内容直接复制进发送给归档系统的指令。如果字段内容能改变指令,而不只是指定文件夹,填写者就可能让系统执行超出预期的操作。SQL 注入跨越的也是这条边界:不可信输入被当作 SQL 语法,而不是普通值。[5]
核心概念与专有名词
SQL 注入(CWE-89)- 被拼接进数据库查询的输入改变了查询本身的行为,而不是被当作一个值来处理。[5]
托管文件传输(MFT)- 机构用来与合作伙伴交换大型或敏感文件的软件。一台服务器可能存有许多机构的数据。[3]
Web Shell- 攻击者植入 Web 服务器以维持访问的脚本。Mandiant 将本次使用的命名为 LEMURLOOT。[3]
参数化查询- 把值与查询文本分开发送的查询方式,数据库因此永远不会把数据当作 SQL 解析。[5]
受影响与已修复版本- Progress 指出,各分支中早于 2021.0.6、2021.1.4、2022.0.4、2022.1.5 和 2023.0.1 的版本受影响;上述版本包含修复。请根据 Progress 公告确认所用分支和当前升级路径。[1]
框架映射
- 本指南所述弱点的 CWE 参考: CWE-89
- CISA KEV — 收录日期 2023-06-02 — CVE-2023-34362
事件演进时间线
2023-05-27
Mandiant 报告称,其观察到的 MOVEit Transfer 最早利用迹象出现在 2023 年 5 月 27 日。[3]
2023-05-31
Progress 公开漏洞,并敦促客户在打补丁前切断 HTTP 和 HTTPS 流量。[1]
2023-06-02
CISA 将 CVE-2023-34362 列入已知被利用漏洞目录。[9]
攻击执行流程分解
源代码对比:漏洞与安全实现
这是示意性的 C# 代码,并非 MOVEit 源代码。加固后的方法先把标识符解析为该列实际存储的类型,拒绝其他输入,再以带类型的参数发送,因此该值不会成为 SQL 文本的一部分。两项控制中任意一项都能单独阻止这次注入;结合使用还会在执行查询前拒绝格式错误的标识符。[5]
存在漏洞的实现
using System.Data.SqlClient;
public static class FolderLookup
{
public static SqlDataReader Find(SqlConnection conn, string folderId)
{
// 查询文本与请求数据被拼接,因此数据库
// 无法判断开发者希望将哪一部分视为数据。
string sql = "SELECT id, name FROM folders WHERE id = '" + folderId + "'";
var cmd = new SqlCommand(sql, conn);
return cmd.ExecuteReader();
}
}加固后的安全修复
using System;
using System.Data;
using System.Data.SqlClient;
public static class FolderLookup
{
public static SqlDataReader Find(SqlConnection conn, string folderId)
{
if (!long.TryParse(folderId, out long id) || id <= 0)
throw new ArgumentException("folderId must be a positive integer");
// 该值作为带类型的参数单独传递,与查询文本分开。
var cmd = new SqlCommand("SELECT id, name FROM folders WHERE id = @id", conn);
cmd.Parameters.Add("@id", SqlDbType.BigInt).Value = id;
return cmd.ExecuteReader();
}
}工程与系统安全加固清单
- ✓为每个 SQL 值使用参数,并在不可信字符串被拼接进 SQL 命令 API 时让 CI 失败;MITRE
CWE-89将参数化查询列为预防措施。[5] - ✓FlawOpen 建议:发现一处注入缺陷后,检查所有查询构造路径是否存在相同的数据到 SQL 边界问题。除非后续公告证明根因相同,否则应把后续 CVE 视为独立问题。
- ✓按照 Progress 的厂商补丁指引修复所有已部署的 MOVEit Transfer 实例;先完成资产清点并记录修复版本,再恢复常规对外访问。[1]
- ✓怀疑遭到利用后,先调查主机再恢复服务:排查 LEMURLOOT 和受影响账户,然后轮换可能泄露的凭据或密钥。[3]
- ✓FlawOpen 建议:询问文件传输服务商哪些系统存放过你的数据,并用该清单界定通知范围和事件响应范围。
- ✓FlawOpen 建议:根据数据敏感度和合同需求制定保留期限,并验证删除情况;这样可以减少暴露,而无需臆测 MOVEit 受害者的数据保留时长。