摘要
网络物理系统(CPSE)广泛应用于智能家居和医疗设备等安全核心场景。不幸的是,这些系统的连通性和其间缺乏安全措施,成为攻击目标。基于规范的入侵检测系统(IDS)被证明是有效的保护CPS。不幸的是,导出不变量捕获CPS系统的规范是一个麻烦且容易出错的过程。因此,动态监控CPS系统以学习一般行为,开发安全攻击检测不变量非常重要。传统的不变挖掘技术只包括数据和事件,而不包括时间。但是时间是大多数CPS系统的核心,所以除了数据和事件外,时间对低假阳性和假阴性的实现至关重要。
本文介绍了利用时间作为系统的主要属性来挖掘动态系统功能的ARTINALI。我们建立了基于ARTINALI的入侵检测系统(IDSES)的CPS,即智能电表和智能医疗设备,并测量了其功效。基于ARTINALI的IDS发现假阳性和假阴性减少了16%至48%。与其他动态不变检测工具相比,分别为89%至95%。
关键词
多维模型、安全性、网络物理系统、CPS、软件工程
介绍
网络物理系统(CPSES)易受网络攻击,因为智能医疗设备[23,34]、智能电网[35]、智能汽车[9]、无人机航空车辆(无人机)[18不幸的是,这些系统缺乏相互关联和相对保护。对CPS的攻击很多,包括汽车[21]、智能医疗设备[23,27]、智能仪表[36]等。
入侵检测系统(IDSes)被广泛应用于监控计算机系统和检测安全攻击。典型的IDS分为三类:基于签名、基于例外和基于规范。基于签名的检测技术将系统的运行时行为与已知的安全攻击进行比较,因此[30]无法检测到未知攻击。后者对CPSES特别重要,因为后者通常很难在现场修补或升级。相反,基于例外的技术和基于规范的技术都可以使用行为模型与可疑行为进行比较,并检测未知攻击。基于异常的技术是在运行时观察系统的运行情况,建立模型来学习系统的行为,而基于规范的技术则依靠对系统行为的先验知识来检测攻击。不幸的是,基于例外的系统在他的系统模型运行时,要经历高概率的假阳性,需要花费很大的成本。(大卫亚设,Northern Exposure(美国电视),)这些因素抑制了在CPSES中的使用,这些CPSES往往资源有限,长期自主运行。因此,基于规范的系统被认为是最适合CPS安全性[8]的系统。
基于规范的技术根据开发人员定义的代码和规范对系统建模。但是,开发者解释的内容之间经常存在不一致。也就是说,系统做了什么,系统实际做了什么[11,31]。此外,代码本身不提供操作环境中系统运行时行为的信息。另一方面,基于动态分析的技术提供了通过观察运行时行为来理解系统的替代方法。使用动态分析来寻找程序理解和调试的可能不变性,进行了大量工作[14、16、19、22、24、25、28、32、33、42和44]。这些系统挖掘用于导出数据的不变量、事件或两者的系统的执行轨迹。但是,在IDS的上下文中使用时,我们发现这些系统中出现了很多错误的选择或错误的否定,因此很难部署。
本文通过对基于规范的IDS系统的动态分析,介绍了可用于挖掘可能不会改变的ARTINALI的AR Tinali。我们的主要革新是,除了传统的数据和事件不变之外,还将时间结合到发掘出的不变概念中。这很重要,有两个原因。首先,大多数CPSes都有实时约束,因此操作的准确性取决于逻辑准确性和正确的计时行为[20,41]。因此,时间是必不可少的。这些系统有许多常见的安全攻击。其次,CPSes具有可预测的一阶近似定时行为,因此可以利用这种可预测性来提高准确度(即低假阳性和假阴性)。但是,向动态不变检测技术添加时间会增加学习的复杂性,因为状态空间要大得多。为了缓解这个问题,我们将三维学习不变问题分解为二维学习不变问题,即数据事件和通风口-时间,然后将其结合为数据事件-时间不变。据我们所知,ARTINALI是第一个沿着数据、事件和时间三个维度挖掘不变的动态不变检测系统,并利用挖掘出的不变量进行入侵检测的系统。我们的贡献如下。
设计了ARTINALI,这是一种通过沿数据、事件和时间维度挖掘不变量来生成CPSes多维模型的算法(第3节)。
我们创建了基于ARTINALI的IDS原型,并将其用于两个新的CPS系统:I)高级测量基础设施和II)智能人工系统(第4节)。
我们评估了ARTINALI对这两个系统的第六次定向攻击的效果。我们发现,基于ARTINALI的IDS可以检测到所有6次攻击。
其他动态不变检测系统这样做(第 5 节)。
我们还在两个系统上评估了基于 ARTINALI 的 IDS 原型,并将其与现有的几种最先进的动态不变检测技术进行了比较。 总的来说,我们发现基于 ARTINAL 的 IDS 与其他技术相比,通过故障注入模拟的任意攻击的假阳性和假阴性显著降低(第 6 节)。 此外,它还带来了约 32%的性能开销,这与其他不变检测技术相当。
背景
我们首先调查了动态不变检测领域的相关工作,以及 ARTINALI 与它们的不同之处。 然后,我们从智能仪表中给出了一个激励性的例子,以说明为什么我们需要数据时间-事件不变量,如 ARTINALI 生成的事件不变量。
2.1 相关工作
建立软件系统行为模型的基于动态分析的相关技术可分为四类,基于它们生成的模型:(一)数据不变量,(二)事件关系,iii)数据和事件关系,iv)事件的时间依赖关系。 图 1 显示了主要的基于动态分析的技术,以及它们在数据、事件和时间中的位置。
Daikon 是第一个基于动态分析的技术,可以导出(可能的)关于数据价值关系[14]的不变量,并且属于第一类技术。 Daikon 可以放在数据公理上 因为它生成了一个数据约束模型,而不考虑系统的事件或时间。 Dy Sy[10]使用符号执行来派生不变量,这是另一个例子。
第二类通过从一组跟踪中推断有限状态机来捕获程序执行路径中的事件序列。 相关的例子包括 Percotta[44]和 Texada[25], 两者都导出了时间逻辑命题,并通过跟踪动态跟踪来捕获事件序列。 这些工具沿着事件轴下降,因为它们只捕获事件关系上的约束,独立于数据或定时信息。
第三类技术生成集成模型,捕捉数据和事件之间的关系。 例如,GK-Tail 算法合并了时间规范和数据不变量 进入扩展有限状态机模型[28]。 它表示用数据注释的方法调用序列,因此仅限于对方法调用之间出现的数据不变量。 Quarry 在每个程序点找到数据不变量,然后找到不变量[24]之间的时间关系。 然而,这两种技术都不考虑时间信息。
第四类由单一技术——Perfume 组成,Perfume 是一种基于资源(时间和存储)消耗[32]的建模系统属性的规范挖掘工具。 一般的事件关系及其时间约束的集成模型。 虽然香水认为时间是模型的一部分,但它没有考虑数据和时间之间的关系。
总的来说,目前的技术都没有考虑时间、事件和数据之间的相互作用来制定不变量,我们认为这是 CPS 系统的一个基本特征。
2.2 激励示例
我们考虑了一个智能仪器的例子,以说明为什么现有的基于动态分析的技术往往不足以捕获 CPS 系统关键特性。 我们稍后也使用这个作为一个激励的例子来说明 ARTINALI。
我们使用一个名为 SEGMeter 的开源智能仪表作为我们实现和评估的测试平台之一(见 4.1 节)。 SEGMeter 由两个主要部件组成:仪表部件还有控制器。 仪表组件负责测量和收集通过其串行端口的功耗数据,并将它们存储在内存中。 控制器充当通信器 仪表板与服务器之间的桥梁,负责将服务器命令传递给仪表板,以及在特定时间将功耗数据发送到服务器 阿尔斯。 智能电表控制器程序中的 Serial-Talker()功能负责接收功耗数据(在特定的时间间隔)并缓冲它们进行计费计算 (Lua 代码如图 2 所示)。
图 3 显示了 Serial-Talker()的执行路径。 参数 seg-data 可以在预定的时间间隔内接受两个不同的值:a 或 b。调用的事件序列根据参数(seg-data)中传递的值而变化。 如果 a 被传递(图 2 中的第 6 行),那么程序将发送事件,然后是 read。
我们研究了这个例子中不同的基于动态分析的工具所推断的不变量。 在正常执行过程中,Daikon 在 Serial-Talker()中输入变量 seg-data 的值设置为{a,b},即 seg-data:[a,b]。 典型的时态规范挖掘,如 Texada,识别事件的合法序列,例如 G(send →XFread),这意味着在事件发送发生时,它总是跟着事件读取。Perfume 推断的不变量(发送 → 接收,0.1,3.6)通过在事件之间添加时间边界,然后在 0.1 至 3.6ms 的时间间隔内读取。
假设对手的目标是实施能源欺诈并降低他们的能源账单。 一个可能的攻击是攻击者篡改发送和重新之间的同步智能仪表中的 CEIV 模式。 因此,部分能源使用将不会写入内存缓冲区,该缓冲区用于未来的能源使用计算和计费。 例如,值 b 被传递给函数而不是 a,然后它将导致执行接收和写入而不是发送和读取;因此计费信息将是不正确的。
上述技术中没有一种能够检测到攻击,因为序列的不正确发生是由在错误时间发生的 seg-data 触发的(例如 seg-data(T1)=b)。 如果是这样的话,Daikon 会注意到 seg-data 的有效值,Texada 会注意到正常的接收和写入事件序列,而 Perfume 也会观察到事件接收之间的有效时间间隔并在执行的路径中写入。 因此,他们中没有人能察觉到攻击。 即使这三种模型都是联合使用的,它们仍然不会检测到入侵。相互作用对于探测攻击至关重要。
技术路径
在本节中,我们介绍了 ARTINALI 使用的安全模型,并解释了它的设计。 我们首先定义了我们的多维模型和不同类的不变量。 然后,我们解释如何将不同的维度关联起来生成实时数据不变量。 最后给出了 ARTINALI 的工作流程和算法。
3.1 多维模型
我们将 CPS 建模为三个维度,如下所示:
数据是指分配给程序变量的数据值。 它既不包括进程的时间安排,也不包括 seq 进程的连续性和并发。
事件是指系统对外部刺激作出反应所采取的行动。
时间是指实时约束,既包括对各种操作的物理定时的约束,也包括系统必须保证在指定时间框架内响应的约束。
我们通过推断在运行期间要保存的不变量集来模拟 CPS 的安全策略。 不变量,或可互换的属性,是一个逻辑条件,在一个部分保持正确的一组程序点。 与以前的工作[14,25,44]一样,我们使用不变量一词作为可能不变量的快捷方式,这是我们观察到的真实属性跨越了一组动态执行跟踪。 对应于上面定义的维度,我们定义了构成 CPS 模型的基础的六大类不变量,如下:
数据不变捕获程序正常执行过程中选定数据变量的预期值范围。
事件不变捕获系统事件中的常见模式,例如事件发生的顺序。
时间不变捕获事件的正常时间边界(如持续时间或频率)。
每个事件(D|E)的数据不变地捕捉数据和事件之间的时间关系。它允许 IDS 根据事件检查数据不变量的有效性。
每次事件(E|T)不变捕获事件和时间的约束。 它表示事件序列中从一个事件到另一个事件的转换时间的边界。
每次数据(D|T)不变捕获时间和数据不变的关系约束。 它表示数据不变,作为时间的函数。
3.2 Data-Event-Time Interplay
在 CPS 中,事件被定义为导致条件[40]变化(例如消息发送/接收、传感器数据读取或激活 insuli)的动作的实例 注射)。 事件有三个关键特征。 首先,它们反映了系统组件和观测之间的相互作用,而不是内部状态。 第二个特征是事件是 s 的概念 在空间和时间[12,13,40]中,因此,事件执行之间没有并发性。 此外,在依赖事件(即一个事件触发另一个事件)的情况下,一旦第一个事件 任务完成后,它触发第二个事件的执行。 第三,触发事件的代码中的位置通常是攻击者可以访问的系统调用。 从保安那里 从这个角度来看,事件是很重要的,因为它们扮演着与 CPS 恶意通信的输入通道的角色。 例如,从传感器或交流中读取新测量的点状态命令被发送到物理组件,更容易受到欺骗攻击[15]。
从学习和检测的角度来看,寻找时间和数据之间的直接关系是具有挑战性的。 由于时间是一个连续的现象,我们不能定义一个尖锐的时间瞬变 数据值或系统状态变化中的 ONS;相反,必须学习时间值的分布。 由于执行时间的变化可能是由输入集的差异或不同引起的 结果流,而不是恶意活动,不变推理技术应该学习系统的正常时间变化。 IDS 还必须区分合法的时间变化 表示入侵的任何时间偏差。
为了克服这些挑战,我们利用 CPS 的基于事件的性质,其中每个事件都发生在一个独特的时间框架中。 我们根据事件离散时间,并使用这些来学习 变体。 在这样做之后,我们首先检查数据和事件维度之间的关系,以产生将事件信息与数据值约束(D|E 不变量)集成在一起的不变量)。其次,我们发现了随着时间和事件维度的关系约束,以独立地(时间不变量)或在关系中计算事件的物理时间边界。 最后,我们结合前面步骤的结果推断 D|T 不变量。 在下面的讨论中,我们说明了我们如何推断 D|T 不变量,给出了条件 具有数据 D 给定事件 E 不变(P(D|E)的概率,以及具有事件 E 给定时间 T 不变(P(E|T)的条件概率))。 考虑数据 D,事件 E 和时间 T 为随机变量,方程 1 表示变量 D、E 和 T 的联合概率分布。 我们改写得到方程 2。 从这两个方程中,我们导出了方程 3,它解释了给定 T 的 D 和 E 的概率。
利用方程 4 所示 D 的边际概率质量函数,我们将方程 5 中的 P(D|T)(具有 D 给定 T 的概率)形式化为数据 D 和事件 Ej 的概率之和 给定所有事件 Ej 的时间 T,然后可以重写为方程 6(使用方程 3)。
例如,假设在 T 时,事件 Ej 发生;并且在 Ej 发生时,变量 D 被分配一个特定的值。 这意味着 T 是 Ej 的原因。 因此,变量 D 在条件上与给定事件 Ej 的时间变量 T 无关。 因此,D 和 T 在条件上是独立的,P(D|Ej,T)=P(D|Ej)。 因此,我们可以简化形式。对 P(D|T)的评价如下:
根据 CPS 的基于事件的语义,任何给定的事件都发生在唯一的时间框架中。 这意味着两个或多个事件不能同时发生 T;即 P(Ej|T)>0⇒P(Ei|T)=0,∀Ei,Ej。 给定这个假设,我们首先重写方程 7,得到方程 8。 然后,我们将其简化为得到方程 9,它捕获了数据 D 和时间 T 之间的关系。利用数据和时间在同一事件 Ej 上的关系约束,该事件发生在时间 T。
换句话说,对于给定的事件 Ej,当且仅当相应的 D|E 不变和 E|T 不变都成立时,D 不变保持为真(即发生在高概率下。
3.3 ARTINALI 工作流
ARTINALI 是一种基于动态分析的技术,它生成动态系统行为模型,并提出了一种多维模型。基于上一节介绍的设计概念的模型。 图 4 显示了 ARTINALI 工作流的关键块。
为了生成用于挖掘不变量的日志,我们手动测量事件及其相关数据变量 1。 我们假设 CPS 源代码是可用的,并且它可以修改为仪器事件-这是合理的,因为我们设想我们的技术将被 CPS 开发人员使用(如果没有,可以使用二进制仪器引擎)。 在我们的技术中,事件是系统调用。 因此,我们 捕获所有系统调用作为事件。 然而,用户可以根据系统的需求指定重要的系统调用,从而选择性地修剪事件空间。 我们对这件事进行调查 通过插入对 ARTINALI API 函数的调用,我们开发用于收集事件前后的日志。 在无攻击运行时执行期间,这些函数是在单独的日志文件(即 DE 日志和 TE 日志)中与被测事件相关的 ECT 数据和时间信息)。 记录的信息作为挖掘不变量的基础。
第 1 组。 ARTINALID|E
Miner ARTINALID|E Miner 学习变量值的不变量,以及这些值如何使用三步过程与系统中的特定事件相关。 首先,是 D|E Miner 获取记录的信息,并在每个跟踪中将它们分组为带有事件标记的不同类。 然后它在 DE 日志中合并类。 第二,在每个类中,使用 Fre 量化项集挖掘算法[17],它在计算每个变量的置信度和支持度的同时,合并数据变量。 与以前的工作[14]一样,支持是跟踪的分数 其中 Ej 类中的变量 x 被看到,置信度是支持类的分数,其中变量 x 被分配给相同的值)。
最后,D|E Miner 填充与每个类(事件)关联的数据不变量)。 D|E 不变量是多命题数据不变量,因为它们在同一观测事件(在 t 处)中都成立。 其中 D|E 不变量以(Ei:D1=[]、D2=[]、DN=[])的形式表示,其中 EI 表示(I)事件的名称,D1∞DN 表示 n 个数据变量的具体值范围 映射到事件 Ei 的 Ables。 例如 2.2 节中的示例。
第 2 块。
ARTINALI E|T Miner ARTINALI 的 E|T Miner 分四步填充 E 和 T 不变量。 首先,它在一个带有时间差异注释的跟踪中创建所有连续的事件对。 第二,它对标记为相同对名称的一对事件进行分组。 第三,ARTINALI 的 E|T Miner 寻找在 TE 日志中以相同顺序观察到的成对事件,并计算紧急支援。 最后,它合并了每个类内的时间变量来计算配对事件的时间边界,以及每个事件执行的频率和平均持续时间。 将 E|T 不变量分为三种类型,如表 1 所示。 类型 I 表示事件 Ei 每 1 秒重复一次。 类型 II 表示事件 Ei 和 Ej 的对是 rep 以相同的顺序排列在所有的痕迹中,它们的时差在 tjimax 和 ∆tjimin 内是有界的。 类型 III 表示事件 Ei 的最大和最小持续时间。 例如 2.2 节中的示例 发送(T)⇌ 发送(T60)显示系统中发送事件的频率,不变发送 ⇌ 接收:14.3,1.5 表示时间边界(1.5 至 14.3)和逻辑 ODE 事件环(即接收前发送),都是 E|T 不变量的例子。
第 3 块。
根据 D|T 不变量的公式,ARTINALI 将 D|E 和 E|T 挖掘的输出结合起来,生成实时数据不变量(D|T 不变量)。 我们定义了两种类型的数据不变量(表 1),并使用 2.2 节中的示例解释了每种类型。 类型 I 表示变量 dm 在时隙 Ti 内有效数据值的分布。 例如,seg-data(T1≤t≤T2)=一种方法,即变量 seg-data 的唯一有效值是在时间间隔 T1≤T2 期间的 a。 请注意,我们在这里不同于 Daikon 数据不变量,因为它们只表示数据不变量的有效值,而不考虑时间。 类型 II 捕获两个连续事件之间的数据不变量关系作为解释。在上一节中,每两个连续事件都有有界时间差(Ti∆tjimin≤Tj≤Ti∆tjimax)。 因此,与这些事件相关的数据不变量具有相同的 ti。 换句话说,数据不变 dj=[]保持为真,直到数据不变 di=[]变为真,而 ∆tjimax 和 tjimin 指定了这些数据不变之间的时间差边界。 在上一个示例(图 3)中,ARTINALID|T Miner 生成这种类型的一个不变量,如下所示:seg-data=⇌seg-datab:14.3,1.5;即 seg-data=a 直到 seg-data 为真,时间间隔为 1.5 至 14.3 秒。
第 4 块。 IDS 原型正如前面部分所解释的,ARTINALI 挖掘导出了三类不变量,它们构成了最终的 CPS 模型。 使用 CPS 模型作为我们的输入用于监视攻击的 IDS 原型。 我们的 IDS 原型由两个组件组成:跟踪模块和入侵检测器。 追踪模块负责收集所需的信息 从程序的执行和日志记录。 该模块与 ARTINALI 日志记录器相同,该记录器用于检测代码并收集日志,但与部署在 Productio 上的模块不同。系统将收集到的信息反馈给入侵检测器,该检测器定期处理日志文件,并根据从 CPS 模型导出的不变量对其进行检查。
实验设计
本节首先介绍了两个 CPSES 的详细信息,然后介绍了在两个平台上评估 IDS 的实验过程,给出了攻击模型进行评估,最后是评估指标。
4.1CPS 平台
我们选择两个 CPS 平台作为案例研究,以评估 ARTINALI 和其他工具生成的不变量的有效性。 请注意,与通用应用程序不同的是,很少 公开可用的开源 CPS 平台也是安全关键的。 此外,在建立 CPS 平台和生成执行跟踪方面还需要付出大量努力 这是来自它。 因此,我们将自己限制在 2 个 CPS 平台上。 高级计量基础设施(AMI):高级计量基础设施(AMI)系统部署在智能电网上。仪表是 AMI 的关键部件,它提供与实用程序提供商[35]的双向通信。 智能仪表的大规模部署以及在这些 s 中发现了许多漏洞 系统[38,43],让他们成为评估我们工作的好候选人。 通用智能电表由两个主要部件组成,即电表和控制器。 仪表组件接收功率控制 通过模拟前端传感器获取数据,并将其存储在内存中。 控制器组件是仪表与实用程序提供者服务器之间的通信桥,传递服务器 CO 向仪表发送命令,并在特定的时间间隔将消耗数据发送回服务器([38]中有更多详细信息)。 我们使用开源智能电表 SEGMeter[1]来评估我们的 IDS 原型。
智能人工胰腺(SAP):糖尿病患者正在从传统的葡萄糖计和手动胰岛素注射系统迁移到持续的葡萄糖监测和自主胰岛素分离设备[27],称为智能人工胰腺(SAP)。 由于对 SAP 的攻击可能威胁患者的生命,这些系统是高度安全的关键[34]。 因此,我们选择了 SAP 作为我们评估 ARTINALI 的第二个案例研究。 通用 SAP 的主要构建块是连续葡萄糖监视器(CGM)、胰岛素泵和控制器。 胰岛素泵是一种可穿戴医疗设备,用于通过皮下输注自动注射胰岛素。 控制器控制 SAP 中的闭环。 它接收来自 CGM 的测量 BG,并发出适当的驱动命令来校正糖水平。我们使用人工胰腺系统(OpenAPS)[26],一个开源的 SAP,作为第二个用例来评估我们的 IDS 原型。 在 Java 脚本中,OpenAPS 实现了 SAP 的控制器组件,由 2000 行代码(不包括库)。 我们模拟了一个简单的 CGM 和胰岛素泵来关闭循环,因为我们无法接触到一个真正的胰岛素泵和葡萄糖计的病人。我们给出了一组以不同 BG 值为输入的测试用例,并对其进行处理,以计算胰岛素的基础速率,我们将其作为实验的基线。
4.2 实验过程
图 5 显示了我们所遵循的整个过程。 除了使用 ARTINALI 生成 CPS 模型外,我们还使用 Daikon 生成另外三个模型(不变量集, 德克萨斯和香水的比较目的。 我们已经公开了 ARTINALI 的[4]。 我们[2,3,5]从他们各自的网站下载了这些工具的最新版本。 我们不经营 仪表前端的 Daikon(即 Kvasir),因为我们的目标是根据我们记录的事件跟踪生成数据不变量。 我们选择这三种工具来表示第 2 节中描述第一、第二和第四的不变量类。 我们不选择第三类中的工具,即 GK 和 Quarry,因为我们使用 Daikon 来查找我们识别的事件的数据不变量 系统中的 IED。 因此,Daikon 产生的不变量涵盖了我们实验中的第三类不变量(即 D|E 不变量)。 在 SEGMeter 的代码中有 22 个系统调用,4 个系统调用 在 OpenAPS 代码中调用 EM。 我们认为所有这些都是事件。 表 2 和表 3 列出了三种工具和 SEGMeter 的 ARTINALI 生成的不变量类型和不变量数 并分别打开 APS 平台。 可以看出,ARTINALI 在时间、D|E、E|T 和 D 中生成不变量,而 DAICON、Texada 和 Perfume 只在 D|E 中生成不变量,甚至 分别为 T 类和 E 类|T 类。 由于这些其他工具生成的不变量的格式可能与 IDS 预期的格式不同,所以我们编写了脚本来转换不变量 以 IDS 接口期望的格式。 ARTINALI 以适当的格式直接生成不变量。 如果一个工具没有产生某种不变量(例如,D|E),我们就留下这种不变量 NT 文件空白。 生成的不变集都作为输入输入输入到 IDS 中,并在不同的平台上评估它们的有效性。 我们将实验分为训练阶段和测试阶段。 我们首先从两个平台获取正常运行下的执行痕迹,并随机分为一组训练痕迹(训练)和测试痕迹(测试)。 我们接着为每个不变检测系统选择不同的训练集大小,以优化该系统的假阳性(FP)和假阴性(FN)比值。 最后,我们使用测试跟踪来评估不变量的 FP 比值,以及使用下一节中描述的攻击模型来评估 FN 比值。
IDS 是用 Python 实现的,由大约 1000 行代码组成。 由于 IDS 是在 CPS 平台上运行的,而 CPS 平台往往受到资源限制,因此必须尽量减少其开销。在第 6 节中测量 SEGMeter 平台的 IDS 的时间和空间开销。因为我们运行 OpenAPS 平台模拟器,我们没有访问它的硬件,我们不测量开放 APS 上的 IDS 开销。
4.3 攻击模型
传统上,安全技术是使用少量的目标攻击(手工制作)来评估的。 不幸的是,由于三个原因,这对 CPS 系统来说是不够的。 首先,CPSES 是一种新的系统,几乎没有真正的攻击-因此它们需要保护,以防止 zero-day 或未知的攻击。 对于安全关键的 CPSes(如 Smart)尤其如此。其次,与一般的计算机系统不同,CPSES 可能难以频繁升级和补丁。 第三,与通用计算不同,CPSes 没有标准的攻击集 系统,所以我们将不得不手工个别攻击这些系统,这可能会引入偏见的评估。
目标攻击为了评估我们的 IDS 对已知攻击,我们使用三个攻击的每个系统,我们发现基于手动分析的 CPS(第 5 节)。我们模仿任意攻击(即突变测试。 在以往的工作[38]中,故障注入被用来研究攻击的影响。 请注意,这些不是完全攻击,而是形成攻击的基石。我们在程序的代码中部署不同类型的突变,如下所示。
数据突变,改变代码中数据变量的运行时值;
分支翻转,通过翻转分支条件改变程序的正常执行流程;
人工延迟插入,从而修改程序的正常定时行为;
上述每个类别都模拟不同的安全问题。 通过执行数据突变,攻击者可以将程序中的关键数据更改为其优势。 这样的攻击是可以完成的 通过利用程序中的内存损坏漏洞或种族条件。 同样,分支翻转可以导致程序中采取的非法控制流路径,以完成 a 结尾。 这种攻击可能由于代码注入或语义漏洞而发生。 最后,人为延迟可以允许攻击者改变系统操作的时间,并延迟功能,或导致其他功能被抑制,再次对他们的优势。 通过这些突变,我们可以模拟各种各样的攻击,没有预定义的目标,从而避免偏见并允许对迄今未知的攻击进行建模。 表 4 显示了 SEGMeter 和 OpenAPS 在每个类别中执行的突变数。 我们手工播种了这些突变 各自系统的 RCE 代码,通过随机抽样程序代码中相应的程序点。 虽然这可以通过故障注入工具(例如,LLFI[6]),即实现自动化 在这两个系统的实现中,Java 脚本和 Lua 没有得到现有工具的支持。 因此,我们必须手动执行突变。 然而,我们试图在进行实验之前随机选择程序点,以避免损害我们的评估。 在修改代码之后,我们可以观察到四种结果之一。
崩溃,其中程序被中止(异常);
挂起,其中程序进入无限循环或死锁;
SDC(无声数据腐败),其中程序的结果是不同的 来自无故障执行的 ENT;
无中断,在这种情况下,程序的结果不会对故障掩蔽或非触发故障显示任何明显的影响。 内部状态可能被腐蚀了。
请注意,在本文的背景下,我们只对 SDC 和无中断结果感兴趣,因为在没有 IDS 的情况下,可以很容易地检测到崩溃和挂起的结果。 因此, 我们只给出了导致 SDC 和无中断结果的故障注入实验的结果,并且需要 IDS(这些结果平均占结果的 75%)。
4.4 评估度量准确性:
我们使用三个度量来从准确性的角度来衡量 IDS 的有效性。
假阴性比(FN),即攻击由 IDS 检测到攻击的总数;
假阳性比(FP),即作为攻击报告的执行跟踪与正常跟踪总数的比率;·
F-Score(β), TP、FP 和 FN 的平均值。
在 F-Score(β)中 β 的参数的变化允许我们对上述度量进行不同[37]的加权,并根据系统需求在 FP 和 FN 比率之间获得不同的权衡。 一个值 β>1 说明 FNS 更高,而 β 的值<1 说明重 FPs 高。 β=1 使他们两个都同等重要。 我们假设 FPs 在智能仪表中更重要,因为这是一种虚假的警报引线 需要部署服务人员来调查虚警的实用程序提供者的成本。 偶尔的 FN 在智能仪表中可能是可以接受的,因为其结果只是轻微损失。另一方面,即使是一个单一的 FN 也可能对病人致命,而 FP 可能是可以接受的,如果有其他检查来过滤 FPs(例如,病人干预),因此,对于 SEGMe 我们选择 F-Score(0.5),对于 OpenAPS,WechooseF-评分(2)作为我们的参考度量。
过载:除了精度外,我们还测量 IDS 的内存和性能开销。 记忆开销定义为 IDS 的实际内存使用。 它取决于 IDS 的大小、CPS 模型的不变量数以及不变量的复杂性(例如不变量 Ej ⇌:∆tjimax,tjimin 携带的信息比不变的 Ej⇌Ei 更多,因此更复杂)。 性能开销是由于在目标上运行 CPS 而增加的执行时间。 该度量反映了跟踪模块和入侵检测器的开销。 由于 CPSES 连续运行了很长一段时间,我们测量了每个周期的性能开销。其中,循环是指 CPS 主环的一个完全分解。
目标攻击
在本节中,我们将讨论潜在的目标攻击以及如何将它们结合到两个平台上。 然后,我们评估由 ARTINALI 和其他工具种子的 IDS 对攻击的影响。 请注意,我们使用基于对类似系统的先前攻击的攻击树来生成攻击,以最小化偏差并模拟现实攻击。
5.1AMI 攻击
能源欺诈是 AMI 攻击的一大类,可能导致电力消耗数据(PCD)丢失和不适当的计费[29]。 我们在 AMI(sh)找到了一棵能源欺诈攻击树 在图 6 中拥有),基于以前的工作[29,35,39,43]中引入的攻击。 这棵树有三个主要分支,即 I)测量篡改,II)存储篡改,III)网络篡改。对应于每分支,我们开发了具体的攻击动作作为树的叶子如下。
同步篡改(块 A1∞A4)发生是由于修改了 AMI 中的发送和接收模式的时间。 我们发现 AMI 和服务器之间的通信由控制器单元中的脆弱函数(get-data-timer())同步。 控制器经常用服务器检查时间,以决定何时请求由仪表测量的数据。 如果恶意用户修改服务器上的时间,控制器将无法在预期的时间内接收数据,从而导致数据丢失,以及最终 PCD 计算不当。
电表螺线(块 B1∞B5):在智能电网中,AMI 使用唯一的名称或 ID 与服务器通信。 控制器单元能够连接到一米以上,收集 PCD,AN 我会把它们连同仪表的 ID 一起发送到服务器。 由于控制器不能区分正常消息和异常消息,它可以通过攻击者发送的伪造输入而不是 t 来欺骗 他是米。 这种攻击称为米欺骗攻击。 我们发现欺骗仪表只需要在仪表铭牌上打印的仪表 ID。
信息下降(块 C1∞C5):一个攻击可能能够删除消息(即部分能源使用)后,绕过仪表和删除记录的 PCD 历史。 安装这种攻击的一个简单方法是拦截通信 在仪表和控制器之间,并控制要阻塞的流量和通过的流量(例如,通过防火墙)。 因此,阻塞的流量将不包括在 PCD 计算中。
5.2 检测 AMI 攻击
我们在示例攻击上运行了基于 ARTINALI 的 IDS,并发现它检测到了所有这些攻击。 表 5 显示了由 ARTINALI 导出的重要不变量 检测上一节中提出的攻击。 同步篡改作为同步篡改攻击修改了 SEGMeter 的发送和接收操作的时间,我们选择了事件作为相关事件发送和接收以解释此攻击。 我们可以在表 5 的第 1 行中看到,ARTINALI 不变量在正常操作期间捕获这些事件的序列,即发送操作 每 60 秒就发生一次,然后接收每 1 秒重复一次。 因此,这个不变量检测攻击,因为事件的时间被攻击违反。 如果我们假设攻击者从 m 中删除一个或多个消息 因此,控制器将不会在预期的时隙接收丢弃的消息。 因此,控制器中接收消息的频率会发生变化。 这一攻击打破了(2)表示接收函数的时间频率,在一个完整的执行路径内为 1003 毫秒。 因此,这种攻击也被检测到。为了检测仪表欺骗攻击,我们从连接到同一控制器的两个不同的仪表(节点 A 和节点 B)中选择了两个接收事件(recvA 和 recvB),并对各自的 I 进行了分析。 例如,节点名称(T0N*60)=节点 B,∀N≥0 指定节点名称在 T0 的有效值第 60∗N 为节点 B。 如果节点 A 的身份被节点 B 窃取,则发送其消息在名称节点 A 下 60 秒。 因此,附加到事件 recvB 的变量节点名称成为节点 A。 因此,违反了表 5 中的不变数。
5.3SA 攻击
糖尿病治疗篡改是患者最严重的威胁之一,因为它可能导致死亡或严重的健康并发症。 我们开发了糖尿病患者的攻击树。基于对 SAP[27,34]攻击的公开可用报告的 APY 篡改,如图 7 所示。 我们考虑基于树的三类攻击。
CGM 欺骗攻击(块 A1∞A4)注入假信息,干涉 CGM 与控制器之间的通信通道,使控制器认为葡萄糖水平高于或低于实际水平。 有两种方法可以是 CGM 欺骗。 首先,如果传感器数据格式未知,则可以使用重放攻击。 在这种情况下,可以将过去读取的传感器值(例如,通过 RF 模块[27])重新发送到控制器。 这将导致控制器单元保存过时的葡萄糖水平,而不是实际的葡萄糖水平。 第二,如果黑客知道传感器数据的格式,她可以随机发送虚假数据 我的间隔误导了控制器。
基底篡改(块 B1∞B5)基底篡改攻击可以在两种不同的场景中完成。 攻击者可能会发出命令,为 I)。当病人需要时,基底注射(例如,基底速率=0),或 II)在必须停止时恢复基底注射(基底速率>0。为了完成攻击,攻击者需要欺骗控制器的 PIN 号码和传输 PAC 的格式 凯特-这两个都可以通过窃听攻击来完成。
5.4 检测 SAP 中的示例攻击
我们将攻击示例安装在我们考虑的 SAP 系统(即 Open APS)上,并发现基于 ARTINALI 的 IDS 能够检测所有这些攻击示例。 有的 SAP 中的四个事件,即 1)通过 CGM 发送(BG)或发送血糖,2)通过控制器读取(BG)或读取 BG,3)通过控制器发送)或发送基本速率到泵,4) ECV(基准速率)或通过泵接收基准速率。 我们使用这些事件作为挖掘 OpenAPS 的 IDS 模型的 51 个不变量的基础。 由于空间限制,我们不会呈现所有推断的不变量,只有那些检测示例攻击的(表 6)。 我们选择控制器中的读取(BG)作为相关事件,并分析了该事件的推断不变量进行分析 CGM 欺骗攻击。 在正常情况下,测量的血糖(BG)传递到 CGM 发生在确定性的、周期性的时间(例如,每五分钟一次)。 此属性表示我们的模型作为事件读取(B G)的时间频率,即读取(T)⇌ 读取(T5)。 使用上述属性,可以从执行的任何外部源检测恶意传感器读取 当控制器读取数据的频率发生变化时,攻击或在随机时间间隔内向控制器发送错误数据。 基底篡改攻击如前所述,基底攻击可以在两种不同的情况下完成:一)在需要时停止基础注射(基准速率=0),二)在不需要时恢复基础注射(基准速率>0。攻击破坏表 6 所示的不变量。 不变数(2)表明,如果 BG 高于正常范围,患者需要胰岛素(即基底速率>0)。 然而,停止注射攻击使基底速率值为 0,从而破坏不变数(2)。 同样,表 6 中的不变数(3)显示,对于低 BG 范围(例如 BG=45),患者不需要胰岛素(即基底速率必须为 0),但恢复基底注射攻击向 SAP 发送命令(基底速率>0)以注射胰岛素。 从而违反不变数(3)。
评估
在本节中,我们给出了模拟任意攻击的故障注入实验的结果,以及开销测量。 我们首先提出研究问题。 然后,我们在一个单独的子节中寻址每个 RQ。
6.1 研究问题(RQs)
RQ1 如何选择训练集大小以获得每个工具的最佳 F-Score
RQ2 使用 ART 导出的不变量,IDS 产生的 FN 比值是多少
RQ3 使用 ARTINALI 和其他工具导出的不变量,IDS 产生的 FP 比值是多少?
RQ4 使用 invaiants 时 IDS 的内存开销是多少?
RQ5 使用 ARTINALI 和其他工具导出的不变量时,IDS 的性能开销是多少?
6.2 RQ1。
如第 4 节所述,我们从每个系统中获得两组跟踪,即训练和测试。 在这个 RQ 中,我们询问每个系统的最优训练集大小应该是什么 最大化相应的 F-Score 值。 为了回答这个问题,我们总共获得了 40 个训练痕迹,每个系统有 50 个测试痕迹。 然后我们将训练集大小从 5 到 40, 以 5 的增量。 然后,我们在同一训练集上运行每个不变检测工具,包括 ARTINALI,以导出不变量。 然后,我们测量 FP、FN 和 F-Score 值 每个不变检测工具和系统,作为训练集大小的函数。 图 8 和图 9 显示了假阳性(FP)、假阴性(FN)和 F-ScoreCOMP 的分布 对于 SEGMeter 和 OpenAPS,分别用 β=0.5、1、2 与训练痕迹的数量有关,对应于包括 ARTINALI 在内的四种不变检测工具中的每一种。 像预期的那样 随着训练痕迹数量的增加,FP 比降低,因为提取了更广泛的不变量集;因此,较低数量的合法行为被标记为潜在攻击。 一位同事 序列是更多的攻击是未被发现的(FN 增加),因为一组更受限制的不变量可能导致一些攻击未被发现。 总的来说,训练量增加了,首先增加 F-Score,在这一点上找到了一个最优的训练痕迹(对于给定的 β 值)。 表 7 和表 8 显示了最佳数量 每个不变检测工具的训练轨迹(最优 F-核心),分别用于 SEGMeter 和 OpenAPS。 回想一下,我们选择 F-Score(0.5)作为 SEGMeter,F-Score(2)作为 OpenAPS,因此这些 是我们为最优迹数选择的 F 分值。 例如,在 SEGMeter 中,20 的训练集大小导致 ARTINALI 的 F-Score(0.5)值的最大值,而对于 APS,训练集大小为 15,结果最大值为 F-Score(0.5)。 同样,我们计算了两个平台上其他三个工具的最优训练集大小。 这些值在本节的其余部分中,我们用于导出每个工具的不变量的训练集大小。 换句话说,我们在每个平台上找到每个工具的最佳配置,并生成 invariant 使用此配置的 NTS 比较相应的 IDS。
6.3 RQ2。 在本节中,我们使用 ARTINALI 和其他工具提取的不变量来比较 IDS 产生的 FN 比值的变化。 表 7 和表 8 也显示了分别用于 SEGMeter 和 OpenAPS 系统的每个工具的 IOS。 总的来说,ARTINALI 能够检测到大约 97.5%的攻击,这意味着它的平均 FN 比为 2.5%。 相反,在 Perfume、Texada 和 Daikon,FN 比分别为 38.5%、60.5%和 60.5。这两个平台平均有 59。 因此,与其他动态不变检测工具相比,基于 ARTINALI 的 IDS 将假阴性率降低了 89%至 95%(平均 93.4。 图 10 和图 11 说明了三种攻击类别(代码突变)的 IDS 的 FN 比,以及 SEGMeter 和 OpenAPS 中每个工具的聚合 FN 比。
数据突变:ARTINALI 数据突变的 FN 率最低(2%至 3%)。 其次是 Daikon,它在数据突变攻击中提供了比 Perfume 低得多的 FN 比值(SEGMEeter 为 15%,OpenAPS 为 17 (SEGMEeter53%,开放 APS78%)和 Texada(SEGMEeter52%,开放 APS87)。 这是因为 DAIKON 专注于数据不变量,而 Texada 和 Perfume 在 th 中不包括数据不变量 艾尔模型。 然而,Daikon 数据模型不包括像 ARTINALI 这样的其他属性,导致 FNs 比 ARTINALI 高得多。
分支翻转:在其他三种工具中,ARTINALI 有 t 分支翻转攻击的 FN 率最低(1%)。 Perfume,Texada 和 ARTINALI 表现出较低的 FN。因为这些攻击会影响顺序和顺序在执行实例中的事件中,Daikon 没有事件不变量,它显示出较少的敏感性。
人工延迟:同样,ARTINALI 的 FN 比(2-3%)比所有三种工具 f 都低得多 或者人工延迟攻击,然后是 Perfume。 这是因为他们都在模型中包含了时间。 然而,Daikon 和 Texada 仍然能够检测到影响数据变量的攻击 更改程序的执行流程。 总的来说,结果支持了我们的假设,即一个更全面的不变模型,如 ARTINALI,它可以找到不变量及其约束,可以检测到大量的攻击(因此有较少的 FNS)。
6.4 RQ3
在本节中,我们比较了使用 ARTINALI 导出的不变量时 IDS 产生的 FP 比值与其他工具生成的不变量(Daikon,Perfum 和 Texada)。 结果如表 7 和表 8 所示,用于 SEGMeter 和 OpenAPS 系统分别。 我们可以观察到,在两个 CPSES 中,使用 ARTINALI 生成的不变量与其他工具生成的不变量相比,导致的假阳性明显减少
更准确地说,ARTINALI 为 SEGMeter 提供了 FP 比值的 20%至 48%的改进,开放 APS 的 FP 比值的 16%至 39%的改进。 这些结果可以解释为,ARTINALI 在正确的系统行为中利用数据、事件和时间维度之间的相关性来生成更稳定的不变量。 ARTINALI 插入事件不变量,精确地描述执行流中序列中事件的顺序,然后将数据和时间约束关联每条路径 (D|E 和 E|T)。 因此,在正常运行期间,在给定的执行中,系统不太可能遵循具有不同关联数据和时间值的相同路径,降低假阳性的概率。 虽然 IDS 对所有工具都使用相同的跟踪,但除了 ARTINALI 之外,没有其他工具查看数据和时间的关系约束 沿着事件的路径,导致更高的假阳性比率。 虽然基于 ARTINALI 的 IDS 的 FP 比值低于其他工具,但这两个平台的 FP 比值仍然很高。 以减少 FP 比值,可以部署代码的多个变体,并在检测到攻击时切换到不同的变体。 如果在第二个版本中不违反不变量,则可能是假阳性 。 另一种解决方案是去除[7]表现出较高 FP 比值的不变量,但这也可能增加 FN 比值。
6.5 RQ4 内存开销
我们使用不同工具生成的不变量来测量在 SEGMeter 平台上运行的 IDS 的内存消耗。 我们还计算了不变量的数量 为这两个平台推断的 ARTINALI 和其他工具。 我们的结果如表 9 所示。 通常,涉及两个或多个维度的不变量(例如 E|T 不变量) 携带比一个维度的不变量(例如,事件不变量)更多的信息,因此更复杂。 我们观察到,内存使用随着不变量的数量和复杂性的增加而增加。 例如,IDS 在使用香水生成的不变量时消耗最大内存使用量),该不变量跨越两个维度,并且具有最大不变量数。 总的来说,我们发现具有 ARTINALI 生成不变量的 IDS 的内存消耗低于具有 Perfume 或 Texada 生成不变量的 IDS,但高于具有 Daikon 的 IDS 迭代不变量。 然而,所有工具的内存使用都远远低于 SEGMeter(16MB)中的可用内存)。
6.6 RQ5
在本节中,我们将讨论在 SEGMeter 平台上运行的 IDS 的性能。 回想一下,IDS 由两个组件组成,即跟踪模块和入侵检测器模块。 表 9(中间部分)显示了该系统的开销 每个工具分别有两个模块。 这些度量中的每一个都是每个工具 10 个执行跟踪的平均开销,其中一个执行跟踪被定义为一个完整执行。我们发现 ARTINALI 和 Perfume 的总开销最高,其次是 Daikon,然后是 Texada。 开销的差异是由于跟踪的差异模块,它需要为 ARTINALI 和香水收集事件和数据/时间信息,与 Texada(仅事件)和 Daikon(仅数据)进行比较)。 除了性能开销外,还有 IDS 执行时间应低于系统周期的执行时间,否则将跟不上系统。 我们在表 9(l)中测量了整个周期的原始执行时间 AST 部分)。 从表格中可以看出,整个周期大约需要 60 秒(1 分钟)。 然而,对于每个工具,IDS 的执行需要不到 20 秒,即使在最坏的情况下(对于 Per 烟雾),这只是整个周期执行时间的三分之一。 因此,IDS 在四个系统中的任何一个都不是瓶颈,并且很容易跟上系统。
请注意,不变挖掘过程是脱机进行的,因此不会 CPS 平台上运行的 IDS 的性能开销。 尽管如此,我们还是测量了挖掘的时间不变量使用 ARTINALI,在标准桌面系统(英特尔核心 I7 处理器与 32GB RAM)。 我们发现在 SEGMeter 中的时间范围为 8 到 96 秒,在 OpenAPS 中的时间范围为 6 到 36 秒。 虽然对于较大的系统来说,这一开销可能更高,但这个过程只需要在代码更新时完成。
讨论
在这一节中,我们首先研究了对我们实验有效性的威胁,然后是对 ARTINALI 通用性进行了反思。 对有效性的威胁:外部威胁有效性是有限数量的 CPS 平台考虑(两个)。 然而,正如我们已经提到的,寻找公开可用和安全至关重要的 CPS 平台是一个挑战。 我们有调度 通过选择两个相当不同的平台来减轻这一威胁,在 FP 和 FN 比率方面有不同的权衡。 我们承认这些平台表现出一些简单的行为,很多 CPSes 都属于这一类[12]。 对有效性的一个内部威胁是我们通过故障注入实验不变量对攻击检测的有效性。 而不是作为所有安全攻击的代表,故障注入允许我们模拟潜在攻击者的行为,而不会将评估偏向已知的漏洞。 我们试图通过使用在先前的工作[38]中用于模拟攻击的突变算子来减轻这种威胁。 最后,一个结构对有效性的威胁是用于测量疗效的度量。 然而,FP 和 FN 比值已经被用于许多先前的入侵检测工作,F 分值也是如此,因此我们不认为这是一个重要的问题
t.另一个潜在的构造威胁是我们使用的工具的选择,与 ARTINALI 进行比较,但我们通过首先系统地分类不变检测的空间,在一定程度上减轻了这一点,然后选择每个类别中的工具。 ARTINALI 的通用性:ARTINALI 依赖于两个特征,即基于事件的语义和时间和数据的条件独立性 (第 3.2 节)。 事件是涉及与外部世界互动的操作。 基于事件的语义意味着每个事件都发生在一个独特的时间框架中,因此不存在一致。 其次,ARTINALI 假设事件发生在特定的时间间隔,然后将数据变量分配给特定的值。 因此,时间和数据是对应的特定事件在条件上是独立的,而不管事件之间的依赖关系如何。 这两个特征是 CPSES 的共同范式,因此 ARTINALI 可以推广到其他 CPS 平台。 然而,ARTINALI 不适用于非 CPS 平台有两个原因。 首先,事件的非并发不存在于手机等非 CPS 平台。 第二,CPS 的功能有限,因此为每个事件推断不变量是简单的。 与 CPSes 不同,在一般的实时系统中,任务可能具有无限的复杂性。 此外,一般具有完全抢占(即非实时)操作系统的目的计算机具有很大的行为空间。 因此,学习这些系统的不变量具有挑战性。
结论
网络物理系统由于其相互联系和相对缺乏保护而日益受到安全攻击。 本文尝试使用 dynamic 用于构建 CPSES 入侵检测系统的 AMIC 不变检测技术。 我们的关键洞察力是,时间是 CPS 系统中的第一类约束,因此除了数据和事件之外,我们将时间纳入。 我们设计了一个在数据、事件和时间三个维度上学习不变量的有效算法,并在一个名为 ARTINALI 的工具中实现了它。 我们在两个 CPS 平台上使用 ARTINALI 进行入侵检测。 我们发现 ARTINALI 的假阴性和假阳性明显低于其他动态不变检测工具。.
1.文章《【奥迪q3显示死锁怎么解】ARTINALI:网络物理系统安全的动态不变检测》援引自互联网,为网友投稿收集整理,仅供学习和研究使用,内容仅代表作者本人观点,与本网站无关,侵删请点击页脚联系方式。
2.文章《【奥迪q3显示死锁怎么解】ARTINALI:网络物理系统安全的动态不变检测》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
相关推荐
- . 现代买票为什么带上携程保险
- . 潮阳怎么去广州南站
- . 湖南马拉河怎么样
- . 烧纸为什么到三岔路口
- . 百色为什么这么热
- . 神州租车怎么样
- . 芜湖方特哪个适合儿童
- . 护肤品保养液是什么类目
- . 早晚的护肤保养有哪些项目
- . 女孩护肤品怎么保养的最好