
1. 项目概述当漏洞数据变得“稀疏”与“突发”在安全运营中心SOC或者漏洞管理团队里我们每天都会处理海量的告警和扫描数据。理想情况下我们希望看到平稳、有规律的趋势这样就能像预测天气一样预知下一个漏洞利用高峰何时到来提前调配资源进行加固。但现实往往骨感得多——你面对的数据很可能是这样的连续几天风平浪静日志里空空如也然后突然在某个深夜某个新曝出的高危漏洞被大规模扫描利用告警数量瞬间飙升形成一根陡峭的“尖峰”之后又迅速归于沉寂。这种数据特征我们称之为“稀疏性”与“突发性”。“基于稀疏与突发数据的漏洞活动预测”这个项目瞄准的正是这个安全运营中的经典痛点。它不是一个简单的“预测明天有多少攻击”的问题而是一个在数据极度不均衡、事件随机爆发场景下的建模挑战。传统的基于连续、平滑数据的预测方法在这里往往会失灵。想象一下你用预测股票日交易量的模型去预测一个偏远小镇的陨石坠落次数结果可想而知。这个项目的核心价值在于它试图从两种主流的统计学视角来攻克这个难题时间序列分析和计数模型。时间序列方法如SARIMAX擅长捕捉数据在时间维度上的依赖关系比如“昨天的攻击多今天可能也不会少”而计数模型如泊松回归及其变种则天生为处理非负整数如攻击次数、漏洞发现数而设计能更好地建模事件的随机发生过程。将它们放在一起对比不是为了分出绝对的胜负而是要回答在面对漏洞活动这种特殊数据时哪种方法的假设更贴合现实在什么场景下谁更稳健这对于我们构建可靠的威胁预测能力至关重要。2. 核心思路与模型选型背后的考量面对稀疏和突发的漏洞活动数据直接套用通用预测模型就像用一把大锤去修手表不仅费力还可能把问题搞得更糟。我们的选型必须基于对数据本质的深刻理解。2.1 理解数据的“稀疏”与“突发”首先我们需要量化这两个特征稀疏性大部分时间点的观测值为零或接近零。例如针对某个特定服务的漏洞利用尝试可能95%的时间里每小时次数为0。突发性在极短的时间窗口内观测值出现数量级上的跃升远超历史平均水平。这通常对应着PoC概念验证代码公开、漏洞利用工具包集成或大规模僵尸网络开始扫描。这种数据违反了传统时间序列预测如ARIMA的许多基本假设比如平稳性均值、方差不随时间变化和正态分布的误差项。零值过多会导致模型低估方差而突发尖峰则会被视为异常值严重影响模型参数估计。2.2 为什么选择时间序列模型SARIMAXSARIMAX是ARIMA模型的增强版包含了季节性S、自回归AR、差分I、移动平均MA以及外生变量X。我们考虑它主要基于以下几点时间依赖性的天然存在漏洞活动并非完全随机。一次成功的攻击可能引发同团伙的后续尝试短期自相关“工作日 vs. 周末”、“工作时间 vs. 深夜”的攻击模式可能不同季节性一个高危漏洞的披露其影响会持续数周长期趋势。SARIMAX能显式地建模这些模式。处理趋势和季节性的能力通过差分I可以消除数据中的长期趋势使其平稳。通过季节性参数S可以刻画以天、周为周期的规律。这对于识别背景噪音中的周期性攻击模式很有帮助。引入外生变量X这是SARIMAX的杀手锏。我们可以把可能影响漏洞活动的“信号”作为外生变量输入模型例如威胁情报指标来自公开或付费情报源的漏洞披露数量、相关漏洞讨论热度如Twitter、GitHub趋势。网络空间测绘数据暴露相关服务的全球IP数量变化。日历变量是否为节假日、周末。内部事件企业自身发布补丁、进行安全演练的时间点。注意SARIMAX的“X”部分极大地提升了模型的解释性和干预能力。例如我们可以模拟“如果明天有一个高危漏洞被披露预测的攻击量会增加多少”这样的场景。2.3 为什么选择计数模型泊松回归及负二项回归计数模型直接对非负整数的计数过程进行建模其假设更贴近漏洞事件发生的本质离散、独立或在一定条件下独立的发生。泊松回归的朴素假设它假设在给定的时间区间内事件发生的次数服从泊松分布其均值λ可以通过一组特征如时间、历史攻击数、威胁情报分数的线性组合来预测。它简单、高效是处理计数数据的基准模型。负二项回归的现实修正泊松分布有一个强假设均值等于方差。但在我们的场景中数据往往是“过离散”的——方差远大于均值这正是突发尖峰造成的。负二项回归在泊松回归的基础上引入了一个额外的参数来刻画这种过离散性从而能更好地拟合存在突发高峰的数据。模型的可解释性计数模型的系数可以直接解释为“在其他条件不变的情况下某个特征每增加一个单位预期事件发生次数的对数将增加多少”。这对于安全分析师理解不同风险因子的影响力非常直观。选型背后的核心权衡SARIMAX更擅长捕捉数据内在的时间动力学即“过去如何影响未来”。它更像一个基于历史轨迹的“趋势追踪器”。计数模型更擅长建立事件与外部特征之间的静态关联并处理计数的分布特性。它更像一个基于风险因子打分的“风险评估器”。在实际项目中我们往往不是二选一而是让两者同台竞技甚至考虑将它们结合例如用计数模型处理残差或用时间序列模型的结果作为计数模型的输入特征以找到最适合当前数据模式和业务目标的方案。3. 数据准备与特征工程为模型“备料”模型再强大没有高质量、针对性强的数据也是巧妇难为无米之炊。对于漏洞活动预测数据准备阶段往往决定了项目80%的成败。3.1 数据源聚合与时间对齐我们需要从多个源头聚合数据并统一到相同的时间粒度如1小时、4小时、1天。常见数据源包括内部安全日志IDS/IPS告警、WAF拦截日志、终端安全事件、漏洞扫描器结果。这是核心的“被预测”变量y。外部威胁情报CVE/NVD数据库更新流、开源情报OSINT订阅、商业威胁情报平台的IoC入侵指标推送。网络资产暴露面数据通过Shodan、ZoomEye等网络空间搜索引擎API定期查询自身相关资产或服务在全球的暴露情况变化。网络与系统性能指标可选流量异常、错误日志激增等有时可作为攻击活动的间接信号。关键操作所有数据必须严格按照时间戳对齐。例如将今天上午8点到9点的所有WAF拦截日志计数与同一时间段内新收录的、相关度高的CVE数量以及从情报源获取的相关漏洞讨论热度指数进行关联。这里需要使用pandas的resample和merge功能进行精细的时间窗口聚合。3.2 针对预测目标的特征构建特征工程的目标是创建能够帮助模型“理解”漏洞活动驱动力的变量。1. 时间滞后特征对于SARIMAX和计数模型都重要 这是捕捉时间依赖性的核心。我们需要创建目标变量如攻击次数的历史值作为特征。import pandas as pd # 假设df[‘attack_count’]是我们的目标变量 for lag in [1, 2, 3, 24, 168]: # 滞后1、2、3小时24小时日周期168小时周周期 df[f‘attack_lag_{lag}’] df[‘attack_count’].shift(lag)2. 滚动统计特征 用于描述近期活动水平平滑突发尖峰的干扰。df[‘attack_rolling_mean_6h’] df[‘attack_count’].rolling(window6, min_periods1).mean() df[‘attack_rolling_std_24h’] df[‘attack_count’].rolling(window24, min_periods1).std() # 衡量波动性 df[‘attack_rolling_max_72h’] df[‘attack_count’].rolling(window72, min_periods1).max() # 近期峰值3. 外部事件特征漏洞披露特征过去N小时内新CVE的数量、平均CVSS评分、是否有关联的Exploit代码如Metasploit模块。情报热度特征从Twitter、GitHub、安全论坛爬取或通过API获取的特定关键词如“CVE-2024-XXXX exploit”的提及频率或情感倾向简单可用词频复杂可用情感分析模型。周期性特征一天中的第几个小时、一周中的第几天、是否为节假日。使用独热编码或正弦/余弦转换来避免模型将第24小时和第0小时视为距离很远。4. 针对稀疏与突发的特殊处理零膨胀标识创建一个二元特征标记过去一段时间如24小时内攻击次数是否全为零。这有助于模型区分“真正的平静期”和“可能即将结束的平静期”。尖峰检测与标记使用简单的阈值法如3倍标准差或更复杂的算法如PeakUtils识别历史数据中的突发尖峰并将其作为一个二元特征。这可以告诉模型“历史上类似的时间点曾发生过爆发。”实操心得特征工程不是一蹴而就的。建议采用迭代方式先构建一组基础特征滞后、滚动统计、时间周期训练一个基线模型然后分析模型的预测错误残差思考哪些信息是模型缺失的再针对性构建新特征。例如如果模型总是在重大漏洞披露后预测不准那就需要加强外部事件特征的构建。4. 模型实现与核心参数解析数据准备就绪后我们进入核心的建模环节。这里我们将分别深入SARIMAX和泊松/负二项回归的实现细节与参数意义。4.1 SARIMAX模型实战我们使用statsmodels库来实现SARIMAX。其核心是确定(p,d,q)和(P,D,Q,s)这组参数。import pandas as pd import numpy as np from statsmodels.tsa.statespace.sarimax import SARIMAX from statsmodels.graphics.tsaplots import plot_acf, plot_pacf import matplotlib.pyplot as plt # 1. 数据准备与平稳性检验 # 假设 ts_data 是我们的时间序列如每日攻击次数 ts_data df[‘attack_count’].asfreq(‘H’).fillna(0) # 确保是等间隔时间序列用0填充缺失值 # 绘制ACF/PACF图初步判断p, q fig, axes plt.subplots(1, 2, figsize(12,4)) plot_acf(ts_data, lags40, axaxes[0]) plot_pacf(ts_data, lags40, axaxes[1]) plt.show() # ACF拖尾、PACF在滞后p阶后截尾提示AR(p)。反之提示MA(q)。 # 2. 模型拟合 # 假设通过上述图和单位根检验ADF Test我们确定d1, s24日周期。 # 外生变量矩阵假设我们有两个特征cve_count和_weekend exog_vars df[[‘cve_count‘ ’is_weekend‘]] # 划分训练集和测试集 train_size int(len(ts_data) * 0.8) train_y ts_data[:train_size] train_exog exog_vars[:train_size] test_y ts_data[train_size:] test_exog exog_vars[train_size:] # 尝试一组参数实际项目中应使用网格搜索Grid Search或自动定阶如auto_arima order (1, 1, 1) # (p, d, q) seasonal_order (1, 1, 1, 24) # (P, D, Q, s) model_sarimax SARIMAX(endogtrain_y, exogtrain_exog, orderorder, seasonal_orderseasonal_order, enforce_stationarityFalse, enforce_invertibilityFalse) result_sarimax model_sarimax.fit(dispFalse, maxiter200) print(result_sarimax.summary()) # 3. 预测 forecast_steps len(test_y) forecast_obj result_sarimax.get_forecast(stepsforecast_steps, exogtest_exog) forecast forecast_obj.predicted_mean conf_int forecast_obj.conf_int() # 置信区间核心参数解读与调优经验(p,d,q)p自回归阶数表示当前值受过去多少个时间点值的影响。ACF图拖尾、PACF图在p阶后截尾通常提示AR(p)。d差分阶数使序列平稳所需的差分次数。如果数据有趋势通常需要d1。可通过ADF检验判断。q移动平均阶数表示当前误差受过去多少个时间点误差的影响。ACF图在q阶后截尾、PACF图拖尾通常提示MA(q)。(P,D,Q,s)s周期长度这是最关键参数之一。对于小时级数据日周期s24周周期s168。需要根据业务判断和数据周期图确定。P, D, Q含义同p,d,q但是作用于季节性周期上。enforce_stationarity/invertibility设为False可以增加模型拟合的灵活性尤其在数据复杂时。调优建议手动分析ACF/PACF图结合自动定阶工具如pmdarima库的auto_arima是高效的方法。重点关注模型诊断摘要中的AIC/BIC越小越好和Ljung-Box检验残差是否自相关p值应大于0.05。4.2 泊松回归与负二项回归实战我们使用statsmodels的GLM广义线性模型或Poisson,NegativeBinomial家族。from statsmodels.genmod.generalized_linear_model import GLM from statsmodels.genmod.families import Poisson, NegativeBinomial import statsmodels.api as sm # 准备数据特征矩阵X和目标变量y # 假设我们已经构建好了特征DataFrame features_df并处理了缺失值 X features_df.drop(columns[‘attack_count‘]) y features_df[‘attack_count‘] # 添加常数项截距 X sm.add_constant(X) # 划分训练测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, shuffleFalse) # 时间序列注意不要随机打乱 # 1. 泊松回归 model_poisson GLM(endogy_train, exogX_train, familyPoisson()) result_poisson model_poisson.fit() print(result_poisson.summary()) # 2. 负二项回归 (NB2是常用形式) # 负二项回归需要处理过离散参数alpha model_nb GLM(endogy_train, exogX_train, familyNegativeBinomial(alpha1.0)) # alpha初始值可设为1 result_nb model_nb.fit() print(result_nb.summary()) # 注意statsmodels的NegativeBinomial家族默认是NB2。拟合结果中会给出alpha的估计值。 # 3. 预测 # GLM预测的是条件均值λ predictions_poisson result_poisson.predict(exogX_test) predictions_nb result_nb.predict(exogX_test) # 如果要预测具体的计数分布可以结合泊松/负二项分布生成随机样本 # 例如用预测的均值λ作为参数生成未来一段时间可能攻击次数的概率分布模型选择关键点检验过离散拟合泊松回归后检查其残差的Pearson chi-square统计量除以残差自由度。如果远大于1例如1.5则存在明显的过离散负二项回归是更合适的选择。零膨胀问题如果数据中零的比例异常高80%可能需要考虑零膨胀泊松回归ZIP或零膨胀负二项回归ZINB。这些模型假设数据来自两个过程一个过程决定是否发生事件逻辑回归另一个过程决定发生多少次泊松/负二项。可以使用statsmodels的ZeroInflatedPoisson和ZeroInflatedNegativeBinomialP。特征重要性查看模型摘要中的系数、z统计量和p值。p值小的特征通常0.05对预测有显著影响。系数的指数exp(coef)可以解释为发生率比IRR即该特征增加一个单位预期攻击次数变为原来的多少倍。5. 模型评估与对比不仅仅是看准确率在稀疏和突发数据上传统的评估指标如均方误差MSE或平均绝对误差MAE很容易被少数几个突发尖峰所主导从而失真。我们需要一套更细致的评估体系。5.1 多维度评估指标我们设计一个评估表格从不同角度衡量模型表现评估维度评估指标计算公式/说明侧重意义整体精度均方根误差 (RMSE)sqrt(mean((y_true - y_pred)^2))对大误差尖峰惩罚重衡量整体偏差幅度。平均绝对误差 (MAE)mean(abs(y_true - y_pred))对异常值不敏感衡量平均偏差。尖峰捕捉能力尖峰命中率 (Peak Hit Rate)(成功预测的尖峰数) / (总尖峰数)定义“尖峰”为超过历史95%分位数的值预测值超过阈值即算命中模型对关键安全事件的预警能力。这是安全场景的核心指标。尖峰预测的提前量从模型预测值首次超过预警阈值到实际尖峰发生的时间差。预警的及时性。平静期稳定性零值预测准确率(真实为0且预测接近0的样本数) / (真实为0的总样本数)“接近0”可定义为预测值 0.5模型是否在平静期产生大量误报“狼来了”效应。概率校准概率积分变换 (PIT) 直方图将每个观测值代入预测分布得到的累积概率这些概率应服从均匀分布。评估预测概率分布是否准确对于风险评估决策至关重要。5.2 对比分析实录在实际项目中我们可能会得到如下发现SARIMAX的优势趋势与周期捕捉强如果漏洞活动有明显的日/周模式SARIMAX能很好地刻画出来在平静期的预测非常稳定误报率低。外生变量增益明显当引入高质量的威胁情报作为外生变量时SARIMAX对由外部事件如CVE披露触发的尖峰预测其提前量和命中率往往显著优于纯计数的回归模型。劣势对纯粹的、无前兆的突发攻击如零日漏洞的首次利用浪潮反应可能滞后因为它严重依赖历史模式。参数调优相对复杂。计数模型负二项回归的优势处理过离散和突发能力强负二项回归天生能处理方差大于均值的情况对于随机性很强的突发尖峰其预测的概率分布而不仅仅是点估计更符合实际。特征解释直观可以清晰量化每个风险因子如“过去24小时有漏洞披露”对预期攻击次数的贡献度IRR便于生成可解释的威胁报告。对零膨胀数据友好ZINB模型能有效区分“永远为零”和“可能发生但当前为零”的状态大幅降低平静期的误报。劣势如果时间依赖性非常强即今天的攻击高度依赖于昨天、前天的攻击而特征工程中没有充分构建滞后特征其表现可能不如SARIMAX。模型更偏向于静态关联分析。一个典型的对比结论可能是SARIMAX在具有强时间规律和可获取高质量领先指标外生变量的场景下表现更优而负二项回归或ZINB在事件随机性强、突发性高、且需要概率化解释和风险评估的场景下更为稳健。6. 部署、迭代与避坑指南模型通过评估不是终点而是将其投入生产、创造价值的起点。6.1 部署模式选择批量预测模式每日或每小时运行一次脚本生成未来24小时或下一时间窗口的预测。结果写入数据库或推送到监控仪表盘。适用于对实时性要求不极高的态势感知。实时预测模式将模型封装为API服务如使用Flask/FastAPI。每当有新的日志或情报数据流入实时计算并更新预测。适用于需要即时预警的高敏感环境。混合模式使用轻量级模型如简单阈值或移动平均进行实时初筛再结合周期性运行的复杂模型SARIMAX、NB进行深度分析和预测校准。6.2 模型监控与迭代模型上线后性能会随着攻击者策略变化而衰减。必须建立监控闭环。预测性能漂移监测持续计算模型在最新数据上的评估指标如RMSE、尖峰命中率并与训练/验证期的基准线比较。设置阈值当性能下降超过一定范围时触发告警。概念漂移检测攻击模式可能发生根本性改变。定期进行分布检验如K-S检验比较预测特征和实际数据特征的分布是否一致。定期重训练设定固定的重训练周期如每周或每月使用最新的数据重新训练模型。对于SARIMAX可以采用滚动窗口训练对于计数模型可以增量更新或全量重训。人工反馈闭环允许安全分析师对预测结果进行标记“正确预警”、“误报”、“漏报”。这些反馈数据是优化模型和特征的无价之宝。6.3 常见“坑”与应对策略坑数据泄漏。在构建时间滞后特征或滚动特征时不小心使用了“未来”的数据。对策在特征工程和数据集划分时严格遵守时间先后顺序。使用.shift()函数创建滞后特征确保在时间点t使用的特征信息全部来自t或t之前。坑过度拟合平静期。模型在占多数的零值上表现完美但完全忽略了关键的尖峰。对策调整损失函数/评估指标使用更关注尖峰的指标如加权MSE给尖峰样本更高权重。采样策略在训练时对尖峰样本进行过采样或对平静期样本进行欠采样。使用专门模型直接采用对尖峰更友好的负二项回归或ZINB。坑外生变量的未来值未知。预测明天时我们无法知道明天会有几个新CVE。对策使用滞后值在预测时使用外生变量的历史值如过去24小时的平均值作为其未来值的估计。建立预测子模型为关键的外生变量如漏洞披露数单独建立一个预测模型。设计多种情景提供“乐观”、“中性”、“悲观”多种外生变量假设下的预测区间进行情景分析。坑模型输出难以被业务方理解。你告诉分析师“未来24小时预期攻击次数λ3.7”他可能不知道这意味着什么。对策概率化表达不只说“3.7次”而是说“有80%的可能性攻击次数在1到8次之间有5%的可能性超过15次”。风险等级映射将预测值或概率映射到“低、中、高、严重”等业务定义的风险等级。归因分析对于计数模型输出对本次预测贡献度最高的前三个特征例如“本次预测风险等级为‘高’主要原因是‘相关漏洞Exploit代码公开’和‘过去一周同类型攻击持续活跃’。”在我经历过的多个项目中最大的体会是没有一劳永逸的“银弹”模型。基于稀疏与突发数据的漏洞活动预测其核心价值不在于预测出精确的数字而在于通过建模过程系统地梳理和理解影响安全态势的各类因素并将这种理解转化为一个可量化、可迭代、可解释的决策支持工具。SARIMAX和计数模型的对比实质上是时间动态性与事件随机性两种视角的碰撞。最成功的部署往往是那些能够将模型预测与安全专家的经验知识深度融合并建立了持续优化机制的系统。开始时不妨从一个简单的模型如带滞后特征的负二项回归和一个明确的业务指标如尖峰命中率入手快速迭代让数据和业务反馈来驱动模型的进化。