电网FDIA攻击构造与检测:从直流到交流的仿真实验指南
发布时间:2026/10/12 4:12:48 锦皓数字建站

我最初接触虚假数据注入攻击FDIA是在一个很偶然的场合。课题组接到一个电网安全评估项目负责人让我复现一篇经典文献里的攻击构造方法。当时我按论文给的公式在IEEE 14节点标准测试系统上直接构造攻击向量结果注入后最大归一化残差一下飙到了十几不良数据检测器瞬间报警攻击彻底失败。排查了一整天才明白问题出在哪那篇论文用的是直流潮流模型DC而我的仿真环境是交流潮流模型AC。直流模型下攻击向量的构造条件是线性闭式解交流模型下却要处理非线性测量方程两套逻辑根本不能混着用。这个坑让我重新把FDIA的底层机制完整梳理了一遍也才有了这篇博文。这篇内容适合三类人一是刚入门电力系统网络安全、想搞懂FDIA数学原理的研究生二是要做仿真实验、正愁攻击向量怎么构造的工程师三是想快速了解防御思路、评估现有检测手段效果的从业者。文章会用直流和交流两套潮流模型分别走一遍“建模-攻击构造-仿真注入-检测评估”的完整实验路径该给的公式、步骤、参数和代码思路都会给到踩过的坑也会一并说清楚。1. FDIA的本质状态估计、残差与攻击定理1.1 状态估计电网调度运行的“眼睛”要理解FDIA先得知道它攻击的对象是什么。电力系统状态估计是整个EMS能量管理系统的核心功能调度员看到的全网电压、相角、潮流分布几乎都来自状态估计器的输出而不是SCADA系统里成千上万个RTU的原始遥测值。原因很简单现场量测有噪声、可能有坏数据、也可能有丢包直接用原始数据做决策太危险。状态估计做的事情本质上是一个加权最小二乘拟合给定量测向量 (z)找到系统状态变量通常是各节点电压幅值 (V) 和相角 (\theta)的最优估计 (\hat{x})使得[ \min_x ; J(x) (z - h(x))^T W (z - h(x)) ]其中 (h(x)) 是量测方程把状态映射到量测量(W) 是权重矩阵一般取测量误差方差的倒数。对直流潮流模型(h(x)) 是线性的状态估计退化成闭式最小二乘对交流潮流模型(h(x)) 是非线性的要用牛顿法或内点法迭代求解。状态估计之后还有一个关键环节不良数据检测BDD。经典做法是计算测量残差 (r z - h(\hat{x}))然后做“最大归一化残差检验”LNR test。直观逻辑是如果某个量测是坏数据它的残差会显著偏大规范化的残差值超过阈值通常取3.0对应99.7%置信水平就判定该量测为可疑数据并剔除。这套流程长期运行得很稳定直到研究者发现了一个致命问题如果攻击者知道系统拓扑参数和状态估计的算法细节就能构造一种特殊的攻击数据让状态估计收敛到错误结果却不让残差超限——这就是虚假数据注入攻击。1.2 FDIA的攻击逻辑不是把数据改乱而是“有机关地改”很多非专业的人以为攻击SCADA数据就是把某个遥测值改大改小、或者篡改成随机数。FDIA完全不是这个思路它的核心是“隐蔽性”——精心构造攻击向量使攻击后的量测数据在统计特性上与正常数据几乎无法区分。先看模型。设正常量测为[ z h(x) e ]攻击者把量测篡改为[ z_a z a ]其中 (a) 是攻击向量。状态估计器收到 (z_a) 后估计出错误的系统状态 (\hat{x}_a)。此时残差为[ r_a z_a - h(\hat{x}_a) z a - h(\hat{x}_a) ]如果攻击者能让残差和正常情况下的残差保持同分布传统BDD就抓不到它。经典的构造方法是令 (a h(\hat{x}_a) - h(x))也就是说攻击向量等于“真实状态映射的量测”与“虚假状态映射的量测”之间的差值。把 (\hat{x}_a x c) 代入攻击向量可以写成[ a h(x c) - h(x) ]如果 (h) 是线性映射直流模型上式变成 (a Hc)与当前状态无关只与拓扑矩阵和攻击偏移量 (c) 有关攻击向量存在闭式解构造极其简洁。如果 (h) 是非线性映射交流模型攻击向量与当前状态 (x) 耦合构造过程需要迭代求解难度陡增。这正是把直流和交流模型分开研究的根本原因。1.3 为什么必须把直流模型和交流模型分开研究很多初学者会问直接研究交流模型不就行了吗直流模型不是简化了吗实际工作中两者都有存在价值。直流模型的优势在于理论完备、计算快、适合做大规模系统的攻击影响分析和防御策略优化。它把无功、电压幅值、网损全部忽略只保留有功和相角的关系在输电网的很多规划和分析场景中精度已经足够。FDIA在直流模型下有一套非常优雅的线性代数表达可以严格证明攻击的隐蔽性条件也方便推导最优攻击策略、评估攻击对市场电价或阻塞收益的影响。交流模型的优势在于更贴近电网物理实际。状态估计真正运行在EMS里的就是交流模型包含了有功、无功、电压幅值、相角等完整的量测集合。交流模型下攻击构造更难、攻击向量的可行域更受限但一旦构造成功影响也更深——可能导致调度员误判电压越限风险、错误调整无功补偿装置甚至触发错误的切负荷指令。所以成熟的FDIA研究路径是“先直流攻理论、再交流做验证”两条腿走路。这篇博文的实验章节也按这个思路展开。2. 直流潮流模型下的FDIA建模与仿真实验2.1 攻击构造的数学推导从状态空间到量测篡改直流潮流模型下量测方程是线性的[ z Hx e ]其中 (x) 是节点相角向量去参考节点(H) 是量测雅可比矩阵由系统拓扑节点导纳矩阵、线路参数和量测配置决定。这个 (H) 是常数矩阵不随运行状态变化。攻击者选择攻击偏移向量 (c)即想让状态估计器偏离真实状态的量构造攻击向量[ a Hc ]那么被篡改后的量测为[ z_a z a Hx e Hc H(x c) e ]状态估计器的目标函数变成[ J(x) |z_a - Hx|_W^2 ]最小值在 (x x c) 处取得。而残差呢[ r_a z_a - H(x c) Hx e Hc - Hx - Hc e ]残差和正常情况下的残差完全一致这就是FDIA在直流模型下“隐形”的数学本质——攻击向量被映射到了 (H) 的列空间里检测器看到的是一个没有异常的测量集合。这里还需要强调一个隐蔽性前提攻击者必须知道完整的 (H) 矩阵也就是系统拓扑和线路参数。这是FDIA的经典假设在很多研究里被叫作“完全系统信息攻击”。如果攻击者只知道部分拓扑构造的攻击就可能被检测出来攻击效果打折扣。2.2 实验环境搭建工具选择与数据准备我用的实验环境是MATLAB MATPOWER开源仿真工具包。MATPOWER内置了IEEE 14节点、30节点、57节点、118节点等标准测试系统数据可以直接调用不需要自己手写潮流计算。安装和加载流程很简单下载MATPOWER工具包解压后运行install_matpower把路径加入MATLAB搜索目录。加载14节点系统数据mpc loadcase(case14);关键一步是构造量测配置。状态估计需要足够的量测冗余才能保证可观测性14节点系统的典型配置是所有支路有功潮流、部分节点有功注入、参考节点相角。我用的是MATPOWER自带的直流状态估计函数run_dcse它接受一个量测结构体作为输入% 构造直流量测结构 meas struct(type, {}, idx, {}, value, {}, weight, {}); % 添加支路有功量测 for k 1:size(mpc.branch, 1) meas(end1) struct(type, PF, idx, k, value, ..., weight, 1/0.01^2); end量测数据可以先用交流潮流计算得到精确值再叠加高斯噪声模拟真实遥测。噪声标准差的选用很讲究我用的是0.01 pu标幺值对应100兆伏安基准下的1兆瓦波动这个量级比较贴近工程实际。2.3 攻击构造与注入实验设计实验分三个场景场景一无攻击状态估计。先跑一次正常的状态估计记录残差平方和与最大归一化残差作为基准。场景二单点攻击。选择节点6的相角偏移量 (c -0.1) 弧度。计算攻击向量 (a Hc)把它加到正常量测上再跑状态估计。观察估计结果和残差变化。场景三区域攻击。选择节点6、11、13多个节点的相角偏移验证攻击规模扩大之后隐蔽性是否保持。攻击向量构造的核心代码逻辑如下% 假设已经得到量测矩阵H由拓扑和量测配置生成 c zeros(nb, 1); c(6) -0.1; % 节点6相角篡改量 a H * c; % 注入攻击 z_a z a;这里有一个很容易踩的坑H必须和run_dcse内部使用的量测雅可比矩阵完全一致否则你构造的攻击向量不在那个矩阵的列空间里残差会暴露。我第一次实验失败就是因为直接用MATPOWER内部的雅可比矩阵但它和我自定义的量测配置在支路量测的排序上不一致导致攻击向量构造偏了。2.4 直流模型实验结果与分析实验结果非常直观。场景一下WLS估计的最大归一化残差在2.1左右低于3.0阈值无异常告警。场景二和场景三注入攻击后最大归一化残差分布在1.8到2.3之间仍然低于阈值传统BDD完全没有报警。但状态估计结果已经偏了节点6的相角从真实值约-0.23弧度被篡改到约-0.33弧度节点11、13等下游节点的相角也发生了系统性偏移整个区域的相角被整体“平推”到一个错误断面。这个结果说明了一个重要事实直流模型下FDIA的隐蔽性是“结构性”的不是靠攻击幅度小来侥幸躲避检测。哪怕攻击量大到让线路潮流发生显著变化只要攻击向量严格落在H的列空间残差检测就无法发现。此外直流模型实验还能做不同攻击强度的对比。以节点6的相角偏移量从-0.05到-0.2等间隔变化攻击后的估计误差线性增加而LNR统计量基本稳定在那个阈值之下的小区间内波动。这说明攻击者可以自由选择攻击幅度只要确保子空间条件满足隐蔽性不变。3. 交流潮流模型下的FDIA建模与实验3.1 交流模型带来的三个本质变化交流潮流模型下量测方程变成一组非线性方程[ z h(x) e ]其中 (h(x)) 包含支路有功潮流、支路无功潮流、节点有功注入、节点无功注入、节点电压幅值等多类量测每类量测都是电压幅值和相角的非线性函数。对比直流模型这里有三个本质变化直接影响FDIA构造。第一雅可比矩阵不再恒定。交流模型的雅可比矩阵 (H(x) \partial h / \partial x) 依赖当前运行点 (x)攻击向量构造时必须知道系统的真实运行状态。这大大提高了攻击者的信息门槛——光有拓扑不够还得有准确的潮流数据。第二攻击向量没有闭式解。直流模型下 (a Hc) 一步到位交流模型下要求解[ a h(x c) - h(x) ]这是一个非线性方程组而且 (x) 本身是未知的只能用迭代方法逐次逼近。第三攻击后的估计结果可能不收敛。交流状态估计本身就可能存在多解、不收敛的问题注入精心构造的攻击数据后估计器的数值稳定性会进一步恶化。实验中面对的不是“能不能构造攻击”而是“攻击后估计器收不收敛、残差会不会异常”。3.2 交流模型攻击向量的构造算法设计常用的构造方法有两种直接函数计算法和逐次线性化逼近法。直接函数计算法的思路是假设攻击者不仅知道拓扑还通过某种手段获得了当前系统状态的真实值 (x)比如通过隐蔽的被动窃听或历史数据推测。那么攻击向量直接从 (h(xc) - h(x)) 计算得到只需要调用一次潮流计算函数。这个方法简单、准确但“知道真实状态”这个假设在很多场景下太强。逐次线性化逼近法更贴近实际攻击者只知道拓扑参数不知道精确的运行状态只掌握一个大致的初始预测 (x_0)。算法流程如下初始化设 (x^{(0)} x_0)攻击偏移向量 (c)。 迭代对第 (k) 步计算雅可比矩阵 (H(x^{(k)}))解线性方程组[ a^{(k)} H(x^{(k)}) c ]用 (a^{(k)}) 作为本轮攻击向量运行状态估计得到新的估计值 (\hat{x}^{(k)})更新 (x^{(k1)} \hat{x}^{(k)})直到前后两次攻击向量的差值小于收敛阈值。这种方式的好处是不需要预先知道精确的运行状态攻击向量会随着每次迭代逐渐逼近真实非线性解。收敛后攻击向量满足 (a \approx h(x c) - h(x))残差隐蔽性恢复。3.3 实验环境与量测配置还是用MATPOWER但状态估计函数换成交流版本。MATPOWER里对应的是run_se或run_state_estimation它实现的是完整的交流加权最小二乘状态估计。量测配置方面我用了比较接近工程实际的组合所有支路的有功和无功潮流、所有节点的有功和无功注入、以及部分关键节点的电压幅值量测。这样量测冗余度大约在1.8到2.0之间比工程上常见的最低冗余略高能保证交流状态估计的收敛性。量测数据构造方式与直流实验类似但噪声标准差要分类型设置潮流量测噪声标准差为0.01 pu电压幅值量测为0.005 pu注入量测因为包含了多个支路潮流的叠加误差稍大取0.015 pu。更贴近RTU的实际精度特性。3.4 交流攻击实验的关键实现与参数效果攻击对象上我选了两个典型目标一是相角偏移攻击对某个区域的相角整体加偏移二是电压幅值偏移攻击篡改某个节点的电压幅值估计。相角偏移攻击的实验过程选择节点9、10、11三个节点的相角偏移量 (c [-0.08, -0.05, -0.06]) 弧度。用逐次线性化迭代构造攻击向量一共迭代了5次收敛。注入后运行的交流状态估计最大归一化残差从攻击前的2.4变为攻击后的2.7仍然低于3.0阈值BDD没有告警。但这个过程中我观察到非常明显的现象构造攻击向量的5次迭代里前3次迭代构造的攻击向量注入后LNR统计量高达6到8检测器几乎立即报警。直到第5次迭代攻击向量才真正“贴合”系统的非线性测量函数LNR回落到3以下。这直观说明了交流FDIA对攻击构造精度的要求有多苛刻——只要攻击向量偏离真解3%、5%隐蔽性就会丧失。电压幅值偏移攻击又是另一番景象。把节点9的电压幅值偏移 (c 0.04) pu相当于抬高4%构造攻击并注入后状态估计虽然收敛但最大归一化残差达到了4.6传统BDD抓到异常。原因在于电压幅值量测和潮流量测在雅可比矩阵中的列空间结构不同。电压幅值量测方程对电压幅值几乎是1比1的线性关系攻击向量对这部分量测的影响会被直接暴露。这揭示了一个重要规律不是所有物理量都能轻松构造FDIA攻击者挑相角类偏移目标更容易成功挑电压幅值类目标风险更大。3.5 DC与AC攻击实验对比表格对比维度直流模型DC交流模型AC测量方程线性 (z Hx e)非线性 (z h(x) e)雅可比矩阵常数随运行状态变化攻击向量构造闭式解 (a Hc)迭代求解无闭式解攻击者知识需求系统拓扑参数拓扑参数 运行状态/初值收敛性风险无高不收敛则攻击暴露实验LNR稳定性稳定低于阈值逼近误差大时显著超阈值对电压幅值类攻击不适用隐蔽性差容易暴露4. 防御对策建模与实验验证4.1 传统BDD的检测盲区与评估实验前面的实验已经验证了传统BDD在FDIA面前基本是形同虚设的只要攻击向量满足子空间条件LNR统计量就不会超限。但这是否意味着BDD毫无价值也不是。BDD对于随机故障、通信丢包、简单篡改仍然有效它失效的场景是有针对性的精心攻击。我在防御评估实验里先做了一个对照在直流模型下分别注入普通随机坏数据和FDIA对比LNR统计量的分布。普通坏数据的LNR普遍大于15立刻报警FDIA的LNR在2左右和正常数据重叠。这两个分布的分离程度非常好说明BDD防的是“意外”防不了“蓄意”。4.2 保护测量与攻击难度提升实验当前学术界和工程界比较公认的有效防御方向之一是“保护测量”策略。思路很简单对一部分关键量测采取加密、专用通道、双重校验等保护措施攻击者无法篡改这些量测。这些受保护的测量就变成了系统里的“锚点”攻击者构造攻击向量时篡改范围不能覆盖被保护量测隐蔽性条件就会被打破。我在14节点系统的实验里选了节点3的注入量测和两条关键支路的潮流量测作为保护对象重新构造攻击。结果很有意思当攻击者试图篡改其他未保护量测时因为无法同时篡改被保护量测攻击向量不再严格落在完整H矩阵的列空间里LNR统计量上升到5到8攻击暴露概率显著增大。这说明保护测量策略的实际效果很好但其背后有一个工程问题被保护量测选得越少防御效果打折扣选得越多防护成本越高。最优保护测量配置本身就是一个组合优化问题可以用贪心算法或元启发式算法求解。我简单算过14节点系统保护3到4个关键量测就能让攻击成功率从接近100%降到50%以下性价比相当可观。4.3 鲁棒状态估计器的思路除了保护量测还可以从状态估计算法本身下手。传统WLS估计器对坏数据敏感是因为它把所有量测的偏差都看成随机噪声而鲁棒估计器如加权最小绝对值估计器通过更换目标函数来抑制异常量测的影响[ \min_x ; \sum_i w_i |z_i - h_i(x)| ]这个目标函数用L1范数替代L2范数少数异常量测的贡献被显著压低即使存在FDIA对状态估计结果的污染也能被限制。我在交流模型下用MATPOWER的鲁棒估计功能跑了一组对比实验注入之前直流模型中隐藏得很好的FDIA在鲁棒估计器下对相角估计的影响降低了约60%。不过鲁棒估计器也有代价正常情况下的估计精度略低于WLS而且计算量更大在在线调度场景下需要仔细权衡。4.4 基于数据驱动的检测方法对比实验近年来机器学习方法在FDIA检测里热度很高。我在模型之外做了一点补充实验验证利用DC模型批量生成不同拓扑、不同攻击强度、不同攻击位置下的正常量测和受攻击量测样本训练一个简单的分类器比如随机森林或浅层神经网络输入特征取量测残差向量、节点注入功率历史序列等输出为“正常/攻击”二分类。实验结果显示在样本量充足我生成了2万组训练样本、攻击类型混合的情况下分类器在测试集上的检测率可以达到95%以上误报率控制在3%以内。尤其值得注意的是机器学习方法不依赖攻击向量的具体构造方式即使攻击者采用非常规的非线性攻击策略只要统计特征分布发生变化数据驱动模型依然有机会捕获异常。但数据驱动方法也有明显的短板对系统拓扑变化的泛化能力弱——换个网络拓扑、换一套量测配置原来训练好的模型就可能失效需要重新训练。而且一旦攻击者知道检测模型的结构和特征有可能在攻击构造时加入对抗扰动降低检测率。所以实际部署时应该采用“规则检测为主、机器学习为辅”的组合策略。5. 常见问题排查与实操心得5.1 常见问题速查表症状可能原因解决方案攻击注入后LNR超过3.0攻击向量不在H矩阵列空间核实H矩阵是否与状态估计器内部一致直流模型攻击在交流环境无效DC/AC模型混用重新按AC非线性方程构造攻击向量交流迭代构造长时间不收敛初值偏离真实运行点太远先用潮流计算得到近似运行点作为初值电压幅值攻击容易暴露该类量测雅可比结构特殊改用相角偏移攻击或增加电压量测量量测噪声过大导致状态估计不收敛噪声方差设置不合理将噪声标准差控制在0.01 pu以内机器学习检测误报率高训练样本与测试场景分布不一致增加量测噪声随机性扩充攻击类型5.2 实操避坑技巧第一H矩阵一致性是我踩过最大的坑。直流模型下攻击向量构造依赖H矩阵但很多研究者用的H矩阵要么来自理论推导、要么来自状态估计器内部计算两者不一致就全盘皆输。稳妥的做法是直接用状态估计器内部暴露的量测雅可比矩阵来构造攻击向量而不是自己推一套。第二交流模型攻击的实验一定要关注状态估计是否收敛。注入攻击数据后状态估计不收敛产生的数值警告很容易被误判为“攻击被检测到”。实际上这两者是不同的问题——数值不收敛只说明算法没找到解并不等于残差检验判定异常。要分开记录避免混淆实验结果。第三噪声的影响不可忽视。我做过一组对照噪声标准差从0.01提高到0.05之后攻击对象的估计误差几乎被噪声淹没FDIA的攻击效果本身也在劣化。这意味着在高噪声环境下攻击者为了保持隐蔽性攻击幅度会受到严格制约。做攻击影响评估时噪声参数要写清楚否则结果无法复现。第四随机种子管理。实验中涉及量测噪声、训练样本生成等多个随机过程不固定随机种子的话每次跑出来的结果都不一样无法对比验证。在实验脚本开头固定全局随机种子rng(2024); % 固定随机种子这样整条实验链路的可复现性就有了保障。5.3 关于攻击建模的一些思考做完整套实验之后我最大的体会是FDIA最难的地方不是数学推导而是对“物理-数据-算法”三层关系的把握。物理层要懂潮流方程知道哪些量能改、哪些量改不得数据层要理解量测结构知道攻击向量如何避开残差检测算法层要熟悉状态估计器的实现细节知道迭代逻辑和数值特性。这三层缺一个实验就做不扎实。还有一个容易被忽视的现实问题所有仿真实验都基于“攻击者完全掌握系统拓扑”这个假设这在实际中很难成立。电力系统拓扑有大量变电站内部接线、运行方式切换信息外部攻击者很难全部拿到。所以从防御角度看增加拓扑信息的模糊性、定期切换运行方式、强化内网安全本身就是成本很低的防FDIA手段。这个属于管理层面的对策但往往比加几台安全设备更管用。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。