草庐IT

网络物理系统安全之​横切安全性之检测攻击

铸盾安全 2023-04-04 原文

保护CPS的第一步是识别这些系统可能存在的风险,然后确定如何通过深度防御方法解决这些风险的优先级。风险评估包括识别CPS中的资产[74],了解其安全风险,并实施对策以将风险降低到可接受的水平[13,75,76,77,78].渗透测试可能是了解系统风险级别的最常见方法,可用于设计漏洞管理和修补策略。供应链也是另一个风险因素,在风险管理与治理CyBOK知识领域[79]中进一步讨论。

CPS中的一个新领域是识别执行器或传感器,如果它们受到损害,它们为攻击者提供CPS的最大可控性[80,30,81,82,83],然后优先保护这些设备。

识别风险后,一般的纵深防御方法包括预防、检测和缓解机制。在本节中,我们将介绍用于防止、检测和缓解攻击的跨领域安全工作,下一节将介绍特定的CPS域,例如电网以及智能交通系统。本节分为三个部分:(1)防止攻击(第2.1节),(2)检测攻击(第2.2节)和(3)缓解攻击(第2.3节)。

2.2检测攻击

检测攻击可以通过观察CPS设备的内部状态、监控设备之间的交互以发现异常活动,甚至使用带外信道来完成。

在第一类中,远程证明是检测嵌入式系统中恶意软件而受到极大关注的领域,因为它们本身通常没有强大的恶意软件保护[101,102,103,104]。远程证明依赖于受信任的验证程序对不受信任设备的当前内部状态(例如RAM)的验证。远程证明有三种变体:基于软件的证明、硬件辅助证明和混合证明。基于软件的证明不依赖于设备中的任何特殊安全硬件,但它的安全保证较弱,通常需要无线范围在验证程序和正在检查的设备之间。相比之下,基于硬件的证明(例如,在TPM,TrustZone或SGX的支持下的证明)提供了更强的安全性,但需要在CPS设备中使用专用的安全硬件,这反过来又增加了其成本。这在某些低端嵌入式系统中可能负担不起。混合方法试图通过降低安全硬件要求来找到中间立场,同时克服纯基于软件的方法的安全限制[105,106]。最低安全硬件要求包括存储密钥的安全位置,以及对该密钥具有独占访问权限的安全代码。混合证明的一个挑战是,它必须是不可中断的和原子的(它必须从头到尾运行),并且(到目前为止)相对较长(5-7秒[105,106])嵌入式内存的安全测量可能不适用于安全关键型实时应用。除了学术工作外,工业界还在制定标准,以最小的硅要求增强嵌入式系统的安全性。例如,可信计算组(TCG)设备标识符组合引擎(DICE)正在努力结合简单的硬件功能来建立强身份,证明软件和安全策略,并协助部署软件更新。我们通过指出大多数用于初始化的证明的实用建议来结束我们对证明的描述,但构建实用的运行时证明解决方案仍然是一个艰巨的挑战。

网络入侵检测:用于检测攻击的第二类解决方案依赖于监视CPS设备的交互。与经典IT系统相比,简单的有限状态网络通信模型将失败,CPS表现出相对简单的网络行为:服务器更改频率较低,存在更稳定的网络拓扑、更小的用户群、常规的通信模式以及承载更少数量的协议的网络。因此,与传统的IT系统相比,入侵检测系统、异常检测算法和白名单访问控制更容易设计和部署[107]。如果CPS设计者可以给出网络预期行为的规范,那么任何未指定的流量都可以标记为异常[108]。由于CPS网络中的大多数通信都是在机器之间进行的(没有人为干预),因此它们会自动和定期发生,并且考虑到它们的规律性,这些通信是这些通信模式可以通过有限状态模型捕获,如确定性有限自动机[109,110]或通过离散时间马尔可夫链[111,112]。虽然与IT相比,CPS环境中的网络规范通常更容易,但维护起来仍然非常困难。

基于物理的攻击检测:控制系统相对于其他IT系统的主要区别在于控制系统与物理世界的交互。与专注于监控“网络”模式的CPS入侵检测工作相反,另一项工作研究如何使用监测来自物理观察的传感器(和驱动)值以及发送到执行器的控制信号检测攻击;这种方法通常称为基于物理的攻击检测[72]。系统中物理变量的模型(它们在时间和空间上的相关性)可以是纯粹的数据驱动的[113],也可以基于系统的物理模型[30]。物理异常主要分为两类:历史异常和物理定律异常。

历史异常:识别我们以前从未见过的物理配置。一个典型的例子是对变量的观察到的行为进行限制[114]。例如,如果在学习阶段,水箱中的水位总是在1m到2m之间,那么如果水位高于或低于这些值我们可以发出警报。变量历史行为的机器学习模型也可以捕获这些变量的历史相关性。例如,他们可以捕获这样一个事实,即当水位较高的水箱时,过程中第二个水箱的水位始终较低[115]。历史异常的一个问题是它们可能会生成大量误报。

物理定律异常:对历史观察的一种补充方法是创建系统物理演化的模型,这种方法可能具有较少的误报。例如,我们有一个传感器来监控弹跳球的高度,那么我们知道这个高度遵循牛顿力学定律的微分方程。因此,如果传感器报告的轨迹在物理定律下是不合理的,我们可以立即识别出传感器有问题(故障或攻击)。同样,水系统的物理特性(流体动力学)或电网(电磁定律)可用于创建时间序列模型,然后我们可以使用这些模型确认发送到现场的控制命令已正确执行,并且来自传感器的信息与系统的预期行为一致。例如,如果我们打开进气阀,我们应该期望水箱中的水位应该上升,否则我们的控制、执行器或传感器可能会有问题。系统物理演化的模型已被证明在限制隐形攻击的短期影响方面更好(即攻击者创建恶意信号的攻击在我们的物理模型的误差范围内)[116]。但是,如果攻击持续很长时间并通过仔细选择物理上合理的轨迹将系统驱动到不安全的区域,则历史模型可以帮助检测这种以前看不见的状态[117]。

除了被控制系统的物理特性外,设备(如致动器)还具有动力学特性,这些物理特性也可用于监测设备的正常行为[118]。

带外检测:被动监控物理系统的另一种方法是通过带外通道[119]。例如,基于射频的分布式入侵检测[120]监测电网变电站的射频发射,以检查是否存在恶意电路断路器开关、变压器抽头更换或任何保护继电器的激活,无需从SCADA服务器发送的直接请求。基本思想是将SCADA服务器发送的控制命令与变电站中观察到的射频发射相关联。这种方法的一个潜在缺点是攻击者可以发起模仿各种电气系统激活的射频攻击,这可能导致安全分析师对警报。

主动检测:除了被动监控CPS外,入侵检测系统还可以主动查询设备,以检测设备如何响应这些请求的异常[121]。除了网络查询之外,入侵检测系统还可以发送物理质询来改变系统的物理行为。这种方法也称为物理证明[122,123,115],其中控制信号用于改变物理世界,作为响应,它期望看到物理世界中所做的更改反映在传感器值中。例如,我们可以发送信号来改变电网的网络拓扑结构,以查看传感器是否报告了这种预期的变化[124],使用摄像头视野的变化来检测被黑客入侵的监控摄像头[125],或者在控制算法中使用水印信号[126]。主动探测的概念与应用于网络物理系统的移动目标防御研究有关[127,128,129,130]。然而,主动探测和移动目标防御都可能通过出于安全目的改变物理世界而在系统中造成不必要的干扰。因此,这些技术可能过于侵入性和昂贵。因此,其中一些方法的实用性尚不确定。


有关网络物理系统安全之​横切安全性之检测攻击的更多相关文章

  1. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  4. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  5. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  6. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  7. ruby-on-rails - 安全地显示使用回形针 gem 上传的图像 - 2

    默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同

  8. ruby - 检测由 RSpec、Ruby 运行的代码 - 2

    我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题

  9. ruby - 使用 Ruby Daemons gem 检测停止 - 2

    我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe

  10. ruby - 检查网络文件是否存在,而不下载它? - 2

    是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby​​不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案

随机推荐