☰
电网FDIA攻击构造与检测:从直流到交流的仿真实验指南
2026/10/12 4:12:44 网站建设 项目流程

我最初接触虚假数据注入攻击(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(end+1) = 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(x+c) - 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^{(k+1)} = \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手段。这个属于管理层面的对策,但往往比加几台安全设备更管用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询