完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
摘要
在过去的十年中,多次网络攻击成功地破坏了SCADA系统和plc的正常运行。为了对付这些攻击,研究人员已经努力寻找能够保护网络和可编程逻辑控制器的防御机制。然而,由于供应商不提供有关其设备硬件和固件的可用信息,因此对可编程逻辑控制器进行网络安全研究变得具有挑战性。本文提出了一种符合IEC 61131-3国际标准的开源PLC的开发方案。介绍了系统的硬件结构、开发环境、支持的SCADA协议和一个附加的HMI编辑器包。此外,本文还提出了一种验证PLC逻辑执行、性能和SCADA连接的方法,并将OpenPLC在Modbus注入攻击下的行为与其他四种流行的商用PLC进行了比较,以支持OpenPLC是PLC网络安全研究的有效平台的说法。 一。介绍 封闭的工业环境隐藏着与专利、版权和商标背后的技术发展相关的关键信息。如何保护发明人的知识产权不受滥用是一个值得商榷的问题,但传统的知识产权保护模式会阻碍科学研究的信息流动。自1968年第一个可编程逻辑控制器(PLC)发明以来,供应商一直在开发针对工业环境的专用硬件和软件解决方案。近年来,随着通信网络和互联网的发展,这些系统已经变得容易受到各种各样的网络攻击。 鉴于可编程逻辑控制器也用于关键的基础设施,如电能系统、核能系统、水和污水处理厂、天然气/石油能源系统和运输系统,对这些系统的攻击会给国家带来灾难性的后果。Alcaraz和Lopez(2012)提出的工作确定了关键控制系统的5项要求,如果实施,可能会对控制系统环境的服务、资源、操作控制和敏感信息造成影响。 为了对抗这些攻击,研究人员已经把他们的力量放在寻找防御机制,可以保护监督控制和数据采集(SCADA)网络和plc。关于SCADA系统的漏洞和威胁的文献非常丰富。Alcaraz和Zeadally(2015, 2013)探讨了SCADA系统的漏洞和威胁,并提出了4个方面的保护机制:治理(安全策略和标准)、健壮的网络设计、自修复、建模和仿真。Rautmare(2011)识别了SCADA环境中的一些威胁向量,并使用良好的网络和操作安全实践来处理它们。 然而,由于供应商不提供有关其可编程逻辑控制器设备的硬件和固件的信息,因此对可编程逻辑控制器进行网络安全研究变得非常困难,通常必须依赖供应商提供任何安全更新。 开源技术可以改变这种模式。术语“开放源码”是指具有可公开访问的设计的技术,该设计可以根据需要进行修改而不受任何限制。通过将开源工具引入到研究中,结果可以被大量的人进行实验和验证。本文提出的OpenPLC平台正是针对这一问题而设计的。因此,这项工作的主要贡献是开发一个开源PLC平台,该平台包括一个程序开发环境,支持流行的SCADA协议,如Modbus/TCP(Modbus-IDA,2004)和DNP3(Curtis,2000),还包括一个名为ScadaBR的开源人机界面(HMI)编辑器。OpenPLC项目是根据IEC 61131-3标准(国际电工委员会,1993)创建的,该标准定义了plc的基本软件架构和编程语言。这意味着OpenPLC可以用五种标准语言中的任何一种进行编程:梯形图(LD)、功能框图(FBD)、结构化文本(ST)、指令列表(IL)和顺序功能图(SFC)。 此外,为了应对对SCADA系统的网络威胁,了解整个系统的行为非常重要。因此,许多研究人员依赖于建立能够精确模拟监控与数据采集系统的试验台。Holm等人的一项重要调查。(2015)分析了30个不同的监控与数据采集试验台,确定了创建试验台的最主要目标是使用它们进行脆弱性分析,然后是对防御机制的教育和测试。为SCADA创建一个高保真度的测试台通常意味着将PLC作为硬件在环,一旦在没有PLC内部行为信息的虚拟环境中模拟PLC真的很有挑战性。虽然PLC作为硬件在环为试验台提供了高保真度,但它降低了可移植性并增加了成本,开源PLC使研究人员无需访问专有代码就可以设计、测试和验证工业控制器的安全增强。经过验证后,这些增强功能可以由其供应商移植到封闭的商业系统中。此外,开源PLC使得SCADA虚拟化成为可能,因为PLC源代码也可以移植到虚拟环境中运行。通过对PLC进行虚拟化,可以创建虚拟SCADA试验台,而无需在回路中使用硬件。开源平台也为教育和SCADA培训提供了低成本的替代方案。 本文将在以下几个部分展开论述:相关工作、PLC体系结构、OpenPLC体系结构、PLC评估和基准、网络安全应用。 2.相关工作 Linux是开源的最大贡献者之一(Nagar,2017)。在科学界,它使学生、教育工作者和研究人员能够在很大程度上利用计算机。Linux上的大多数工具都是由教育工作者和学生开发的,这并不奇怪。Linux的重要性可以从它现在被用来运行大部分的互联网,包括硬件和软件来判断。 开源产品可以变得比商业产品更加可靠和安全,因为测试和纠正错误的志愿者数量之多。从这个意义上说,谷歌启动了一个项目,自动分析开源代码,以发现并纠正错误。该项目被称为OSS Fuzz(OSS Fuzz 2017)。协议变异测试,又称模糊测试,是一种识别软件中各种编程错误的著名技术。其中许多可检测的错误(如缓冲区溢出漏洞)都可能具有严重的安全隐患。因此,OSS Fuzz的目标是使用现代的fuzzing技术来发现和报告公共开源软件上的漏洞,使它们更加安全和稳定。OSS Fuzz不仅能发现与内存安全相关的错误,还能发现正确性或逻辑错误。 根据谷歌提供的一份报告(OSS Fuzz:5个月后,奖励项目2017),经过5个月每天处理约10万亿个测试输入,OSS Fuzz在47个项目上发现了1000多个bug,其中发现的1000个bug中有264个是潜在的安全漏洞。 因此,鉴于开源软件对于科学研究和开发的重要性,开发一个工业控制器是至关重要的。有人试图创建一个开源的PLC,其中最突出的一个由Souza提出,被称为MatPLC(de Sousa,2002)。MatPLC的行为类似于POSIX兼容操作系统上的软PLC,由几个模块组成,每个模块在不同的线程上执行。 虽然MatPLC奠定了一个开源PLC的基础,但它是不完整的。该项目网站上提供的最新稳定版本可追溯到2006年5月,根据该网站,目前仍处于早期阶段(de Souza,2017)。对于一些仍然缺少的东西,该项目缺乏与编程IDE的接口,缺乏一个硬件平台来运行它和内置的物理I/O以及对梯形逻辑的支持。 MatPLC提供的工具之一是matec编译器(de Sousa and Carvalho,2003),它是两种IEC 61131–3文本语言的编译器。此编译器分四个阶段执行:词法分析器、语法分析器、语义分析器和代码生成器。这种体系结构允许轻松地为所需的任何输出语言编写新的代码生成器,而无需重写所有的词汇、语法和语义解析器。OpenPLC使用MatIEC编译器从IEC 61131-3结构化文本代码生成C++代码。 (Tisserant等人。(2007)为IEC 61131-3框架开发了一个集成开发环境(IDE),称为PLCOpen编辑器。IDE由一个图形用户界面组成,该界面允许用IEC 61131-3中定义的任何编程语言开发程序。另外,IDE还有一个后端编译器,可以生成IEC 61131-3用户程序中的结构化文本代码。PLCOpen编辑器的创建主要是为了让学生在自己的个人计算机上使用IEC 61131-3编程环境并使用该语言进行实践,而无需支付现有供应商昂贵的许可协议。尽管目的是满足学生的需求,但作者希望并打算将PLCOpen编辑器项目也能在工业环境中用于实际的控制项目。OpenPLC通过在一个完整的PLC包上集成PLCOpen编辑器和MatIEC编译器来实现这一点,并支持开源硬件和流行的SCADA协议。 对SCADA系统的研究依赖于能够模拟真实SCADA环境的测试床的创建。考虑到PLC设备是基于专门的、有时是专有的硬件和软件,Holm等人分析的30个不同的SCADA试验台中没有一个包含虚拟的或仿真的PLC。因此,关于SCADA安全性研究的大部分工作仅依赖于带有模拟plc的测试床或带有硬件在环仿真的测试床。 有各种各样的PLC仿真工具可用,从简单的SCADA协议仿真器到完整的PLC系统仿真器。因此,为了便于对可用选项的分析,将PLC仿真工具分为三类: (1) PLC系统仿真器:PLC系统仿真器是一种软件,通常由PLC制造商提供,它可以模拟整个PLC系统,包括其内部行为、编程和网络通信。PLC系统模拟器的例子包括S7-PLCSIM(西门子2017)和RSLogix Emulator(罗克韦尔2017)。 (2) PLC核心仿真器:PLC核心仿真器通常使用脚本语言来模拟PLC控制逻辑程序和网络行为。可编程逻辑控制器核心仿真器的例子包括通用开放式研究仿真器(Core)(美国海军研究实验室,2017年)和AMIC(Genge等人,2012年)。 (3) PLC网络仿真器:PLC网络仿真器只关注模拟SCADA网络协议的应用层。因此,PLC网络仿真器可以作为一个常规的PLC来响应网络查询,但是没有内置的控制逻辑。可编程逻辑控制器网络模拟器的例子包括来自Witte软件的Modbus Rsim(Braam,2017)和Modbus Slave(Modbus T ools,2017)。 表1总结了上述方法的特点,并与OpenPLC进行了对比。 西门子S7-1200(Siemens,2017)被用作硬件在环的例子,因为它是工业中最受欢迎的可编程逻辑控制器之一。RSLogix仿真是一个例子,一个PLC系统模拟器从艾伦布拉德利。AM-ICI是一个在关键基础设施上进行多域安全实验的平台,它被用作一个可编程逻辑控制器核心模拟器的例子。最后,以开放源码Modbus Rsim作为PLC网络仿真器的实例。 使用硬件在环的试验台对实际SCADA环境中使用的设备具有高保真度,但成本要高得多。用商用可编程逻辑控制器建造大型试验台在金钱上是不可行的。 另一方面,PLC系统模拟器可以提供与硬件在环方法相同的软件环境,但没有真正的硬件。考虑到一台计算机可以运行一个PLC模拟器的多个实例,但不能提供任何硬件级的研究,对于大型SCADA试验台来说,这可能更具成本效益。 与PLC系统模拟器相比,PLC核心模拟器是一种更经济有效的将PLC集成到SCADA试验台的解决方案。然而,PLC核心模拟器通常过于具体,因为它们是为模拟单个PLC程序而构建的,并且由于它们不支持传统的PLC编程环境,因此很难重新编程。 PLC网络仿真器通常不那么复杂,因为它们只专注于在应用层上模拟监控与数据采集协议,除了网络通信之外没有PLC功能。因此,它们更适合于SCADA设备网络通信中更为关注的试验台。 OpenPLC是目前唯一允许在SCADA测试台上对现场设备进行虚拟化或仿真的PLC。与PLC核心仿真器和PLC网络仿真器不同,OpenPLC提供了一个完整的IEC 61131-3兼容系统,可以随意重新编程,同时仍然为常用的SCADA协议提供支持。此外,OpenPLC拥有完整的可用源代码,这一事实使研究人员能够探索OpenPLC的内部操作,并对硬件级别进行更改。 三。可编程逻辑控制器体系结构 可编程逻辑控制器(PLC)术语由IEC 61131-1定义为“设计用于工业环境的数字操作电子系统”。该标准还规定,可编程逻辑控制器应具有可编程存储器,用于面向用户程序的内部存储。这些程序必须能够实现特定的功能,如逻辑、排序、定时、计数和算术,以便通过数字或模拟输入和输出控制各种类型的机器或过程。此外,PLC必须具有编写PLC程序的开发环境,并支持用于监控和数据采集的工业通信协议。 3.1 PLC硬件架构 PLC的主要部件是处理器(或CPU)模块、电源和输入输出模块。紧凑型可编程逻辑控制器通常将所有这些组件放在一个机箱中,而较大的可编程逻辑控制器则具有模块化结构,并且是可扩展的。由于PLC是一种基于微处理器的设备,它的内部结构类似于许多嵌入式计算机和控制器。可编程逻辑控制器和其他嵌入式设备的一个主要区别是,可编程逻辑控制器通常经过加固以适应恶劣的工业环境。此外,可编程逻辑控制器具有输入和输出模块的标准化电压和电流额定值,使用常用的SCADA协议进行通信,并提供确定的实时响应。 CPU模块是PLC的核心部分,通常有一个微处理器来处理所有的程序任务,一个可编程存储器来存储用户程序,一个临时存储器来存储程序执行期间的数据。此外,CPU具有与外部和内部I/O模块通信的总线、与编程设备的接口以及与用于监视和控制的其他通信网络的接口。 由于可编程逻辑控制器是可编程的,它们可以执行用户定义的自定义逻辑程序。该用户程序由可编程逻辑控制器在无限循环中执行,循环的每次迭代称为扫描循环。在每个扫描周期,微处理器必须执行三个主要任务:读取物理输入、执行程序逻辑和写入物理输出。 为了读取物理输入,实际输入的状态被复制到通常称为输入图像表的CPU内存的一部分(Erickson,2016)。当程序逻辑被执行时,微处理器检查输入信息表以确定输出的状态。对输出的这些更改随后被写入CPU内存的另一部分,称为输出图像表。最后,在扫描周期结束时,将输出图像表的内容复制到物理输出。这种执行顺序意味着,除非存在与输入相关联的中断程序,否则可编程逻辑控制器在扫描周期内无法感知其输入的变化。 3.2 PLC程序开发环境 梯形逻辑最初是一种记录继电器机架设计和构造的书面方法,但后来发展成为可编程逻辑控制器的编程语言。它是在继电器逻辑硬件电路图的基础上,用图形化的方式表示程序的,这意味着编写程序就相当于画一个开关电路。这种方法有助于软化从中继机架到基于PLC的系统的过渡。 尽管梯形逻辑已经成为所有可编程逻辑控制器的事实编程语言,但在实现这一概念时,从一家供应商到另一家供应商之间存在一些分歧。这导致不同品牌和型号的软件不兼容。这些分歧最终导致了可编程逻辑控制器国际标准IEC 61131的诞生。本标准的第三部分涉及基本的软件体系结构,定义了5种编程语言:梯形图(LD)、功能框图(FBD)、结构化文本(ST)、指令表(IL)和顺序功能图(SFC)。大多数可编程逻辑控制器供应商至少支持一种IEC 61131-3语言。 3.3 PLC通信协议 第一代可编程逻辑控制器开发不久,就需要与远程输入/输出系统通信,然后再与其他可编程逻辑控制器通信。这种通信使可编程逻辑控制器能够控制远程设备并将数据报告回监控与数据采集系统。 Modicon于1979年推出了第一个PLC到PLC的协议,称之为Modbus。它很快成为了一个事实上的行业标准,并且由于其标准是公开的,而且实施不需要许可费,所以仍然受到SCADA的欢迎。此外,Modbus可以在电话、以太网、无线电和卫星等多种通信媒介上工作,这使得它非常适合大型SCADA系统。 另一个开放和流行的SCADA协议是分布式网络协议(DNP3)。它的主要用途是电力和自来水公司等公用事业。DNP3协议具有显著的特点,如提高了带宽效率、时间同步和面向点的对象,使得它比Modbus更加健壮、高效和可互操作,但代价是更高的复杂性。 IEC 60870-5-104,或者仅仅IEC 104(2006年远程控制设备和系统),也被广泛应用于水、气和电的控制通信,在欧洲公用事业和相关行业中尤为常见。经设计证明,IEC 104的安全性存在问题(Maynard等人,2014),Modbus、DNP3和许多其他SCADA协议的安全性也在同一时间开发。这些协议的关键漏洞是缺乏身份验证、完整性和保密机制。尽管有解决这些问题的解决方案,但由于运营问题、遗留问题和成本的原因,它们在现实世界中很少使用。 尽管Modbus、DNP3和IEC 104是一些最常见的SCADA协议,但一些供应商已经创建了自己的自定义协议,通常是专有协议。其他流行的工业协议包括PROFIBUS(DP、PA和PROFInet)(PROFIBUS 2015)、WorldFIP(CENELEC 1996)、ControlNet(ControlNet International 1998)、EtherNet/IP(ControlNet International 2001)和A-B DF1(Allen Bradley 1996)。 3.4 PLC人机界面(HMI) 在过去,控制系统的典型用户界面由一个带有按钮、开关、灯和仪表的物理面板组成,所有这些都硬连线到面板中的主控制器。随着低成本个人电脑的出现,更大的硬接线面板被电脑程序上的图形屏幕所取代。 PLC软件包的一个重要特性是用于开发人机界面屏幕的软件。该软件是SCADA系统的核心,采集过程中的数据显示在屏幕上,并向现场连接的设备发送控制命令。在较大的SCADA系统中,监控软件可以与运行在操作员工作站和客户机上的HMI软件分开。在这种情况下,数据采集系统可以运行在多个冗余服务器上,填充一个大型数据库。 HMI软件必须使用可编程逻辑控制器支持的网络协议之一才能与其通信。由于这个原因,PLC供应商通常提供他们自己的人机界面软件,与PLC使用的协议兼容。PLC供应商提供的一些HMI软件示例有:SIMATIC WinCC(Siemens,2017)、Rockwell RSView(Rockwell Automation,2011)、Schneider IGSS(Schneider Electric,2012)、Omron CX Designer(Omron,2018)和Melsoft GT SoftGOT(Mitsubishi Electric,2018)。尽管所述软件已优化为使用供应商可编程逻辑控制器协议运行,但所有所述示例也与其他供应商的协议兼容,并且所有这些示例都支持Modbus协议的至少一种变体。 4 OPENPLC体系结构 open PLC是一个开源的PLC平台,目前可以运行在各种流行的设备上,如Raspberry Pi、Arduino和ESP8266。尽管这些设备可以运行OpenPLC,但它们不能提供真正的PLC所需的相同级别的电气保护。Raspberry Pi平台的一些变体,如UniPi和PiXtend,经过加固,可以与工业级I/O兼容,也可以运行OpenPLC,但它们的硬件架构并不理想,影响了OpenPLC的实时性能。UniPi使用诸如MCP23008和MCP3422的端口扩展器来操作离散和模拟信号。这些集成电路使用I2C总线进行通信,比直接存储器存取慢约50倍。PiXtend使用AT-mega32A微控制器处理输入和输出信号,串行外围接口(SPI)总线连接mi-crocontroller和Raspberry Pi。微控制器运行一个自定义固件,当配置为最快模式时,该固件提供高达10赫兹的I/O更新。对于需要小于100 ms扫描时间的PLC应用程序来说,这太慢了。 因此,为了公平比较OpenPLC平台与其他商用plc的性能,提出了一种新的OpenPLC项目硬件板。OpenPLC Neo被设计成具有最佳性能的OpenPLC代码,同时仍然是低成本的。 考虑到项目的硬件和软件的复杂性,在这项工作中描述整个OpenPLC体系结构是不可行的。因此,下一节将对OpenPLC的硬件和软件体系结构进行广泛的概述。关于这个项目的更多信息,特别是它如何安装在开源平台上,比如Ar-duino和Raspberry Pi,可以在项目的网站上找到(Alves,2017)。最新版本的源代码可以在OpenPLC GitHub中找到(Alves,2017)。有关OpenPLC Neo硬件的信息,包括原理图和案例设计,位于OpenPLC Neo GitHub(Alves,2017)。 4.1 OpenPLC新硬件 OpenPLC Neo在机箱上提供11个隔离的直流离散输入、3个0-10v范围的模拟输入、8个隔离的离散输出(其中4个是基于晶体管的,另外4个是基于继电器的),以及3个基于PWM的模拟输出。此外,OpenPLC Neo还具有一个RS-485扩展总线连接器,允许CPU与外部I/O模块通信。 该CPU基于Allwinner H3,一款四核Cortex-A7 ARM处理器,最高运行频率可达1.2GHz。处理器模块有256 MB的DDR3 RAM和10/100位以太网端口,用于网络连接。可编程逻辑控制器通常被视为具有非常有限计算能力的传统设备。与大多数可编程逻辑控制器中的处理器相比,OpenPLC Neo架构提供了更好的性能。一个更强大的多核体系结构支持额外的安全增强,如机器学习算法和入侵检测系统,内置在设备中,与PLC应用程序一起运行。 CPU模块还有一个协处理器,负责I/O操作。协处理器是一个运行在16兆赫的AVR ATMega644P。两个处理器通过500 Kbps的UART链路相互通信。由于协处理器有两个UART端口,它使用第二个端口作为与RS-485扩展总线的接口。因此,来自主处理器的消息通过协处理器到达连接到扩展总线的外部I/O模块。 OpenPLC Neo运行Armbian Linux,这是一个针对嵌入式设备的改良的Debian发行版。OpenPLC软件运行在这个操作系统之上。图1显示了OpenPLC的内部结构及其当前模块:web服务器、MatIEC编译器、网络层、I/O图像表、硬件层和实时库。 OpenPLC web服务器是一个允许上传和编译PLC程序的实用程序。它一直在8080端口上运行,可以在大多数现代web浏览器中打开。可编程逻辑控制器程序作为单个文件上传,其中包含由OpenPLC提供的IEC 61131-3图形编辑器生成的代码。一旦文件被接收,它就被发送到MatIEC编译器。 MatIEC编译器将上传的PLC程序编译成等效的C程序。但是,这个C程序是不完整的,因为它只包含用户创建的逻辑。如图1所示,附加功能必须添加到系统中才能使用。OpenPLC提供额外的C文件,添加对网络连接、内部映像表、硬件接口(用于处理物理I/O)的支持,以及一个为OpenPLC添加实时行为的实时库。当与用户创建的逻辑相结合时,这些额外的C文件为PLC应用程序提供了整个环境。 网络层负责通过SCADA协议进行网络通信。目前,OpenPLC支持Modbus/TCP和DNP3。将来可以通过在网络层插入相应的源代码来添加更多的协议。为了响应来自SCADA协议的网络请求,该层必须能够访问输入和输出图像表。 输入和输出图像表是OpenPLC应用程序中定义的存储区域,用于存储所有输入和输出的当前状态。当执行用户程序时,它检查输入图像表,以便逻辑可以确定所有物理输出的下一个状态。一旦逻辑执行完成,所有输出的状态都将写入输出映像表。 硬件层模块必须读取物理输入,将其状态写入到输入图像表中,并根据输出图像表设置物理输出。要执行这些操作,硬件层必须包含负责处理硬件I/O的设备驱动程序。这种模块化架构使OpenPLC很容易与其他设备兼容。事实上,它已经有了硬件层驱动程序来处理许多不同的平台,如Raspberry Pi、UniPi、Arduino、ESP8266等。因此,为OpenPLC Neo编写了一个新的硬件层驱动程序,使OpenPLC能够处理板I/O。 为OpenPLC Neo板编写的设备驱动程序通过扩展总线与协处理器和外部设备进行通信。通过读取从协处理器接收到的所有输入点并将其写入输入图像表来处理输入。输出从输出图像表读取并封装到发送到协处理器的内部总线消息中。 实时库为OpenPLC进程提供了更好的实时响应。Linux以不具有良好的实时性而闻名,它极大地影响了依赖确定性响应的应用程序。Linux的实时性受到调度策略的影响。当一个正在运行的进程被调度出去时,很难准确地知道它什么时候会被调度回来。这种缺乏确定性的情况会影响需要实时响应的进程。OpenPLC的实时库通过在分离的内核上隔离OpenPLC进程、将OpenPLC主线程的调度策略更改为SCHED_FIFO并将其优先级设置为最大值来改进多核架构上的Linux响应。根据具有最大优先级的SCHED_FIFO策略调度的进程将始终立即抢占核心中当前运行的任何进程。此外,此策略下的进程没有时间切片,这意味着调度线程无限期运行,直到它产生处理器或被I/O请求阻止为止。由于没有其他进程在给定的核心上与OpenPLC竞争,因此它永远不会被调度出来。由于OpenPLC进程是不断运行的,它可以提供一个改进的确定性响应,特别是在系统处于重负载时。 4.2 OpenPLC程序开发环境 PLCOpen编辑器是用于为OpenPLC创建程序的开发环境。PLCOpen编辑器由一个图形界面组成,该界面允许创建带有多个IEC 61131-3程序组织单元(POU)的PLC项目。每个POU可以用五种IEC 61131–3语言中的任何一种编程。POU与PLC配置和资源一起列在左窗格的树状图中。通过双击POU,相应的语言编辑器将打开,其中包含程序的内容。 图形编辑器与PLCOpen规范紧密相连(PLCOpen技术委员会2005年6月)。此规范定义了描述五种IEC 61131-3语言的XML语法。根据此语法,在此环境中编写的所有程序都保存到XML文件中。因此,可以与其他符合PLCOpen XML标准的IEC 61131-3编辑器交换项目。 PLCOpen编辑器有一个模块负责将图形语言(LD、FBD和SFC)编译成结构化文本(ST)。因此,在将程序上载到OpenPLC之前,当前PLC程序的所有pou都被编译成一个ST程序,不管它们最初是用哪种语言编写的。 4.3 OpenPLC通信协议 OpenPLC在TCP/IP之上支持Modbus和DNP3-SCADA协议。来自任一协议的读写请求都可以直接访问所有物理I/O点。默认情况下,Modbus在502端口可用,DNP3在20000端口可用。但是,OpenPLC有可选的命令行参数,这些参数只允许在特定端口上运行Modbus,或者只允许在特定端口上运行DNP3,或者在非标准端口上同时运行两者。 Modbus实现是基于Modbus应用协议规范从头开始构建的。DNP3应用的实现基于opendnp3库(opendnp3 2017)。Opendnp3是用C++11编写的DNP3协议栈的可移植、可伸缩和经过严格测试的实现。该库是为具有许多并发TCP会话的高性能应用程序设计的,尽管它也可以很容易地嵌入到较小的平台上。 4.4 OpenPLC人机界面(HMI) 由于OpenPLC支持Modbus/TCP和DNP3协议,因此它与当前可用的大多数SCADA软件兼容。然而,OpenPLC还包括一个开源的SCADA软件ScadaBR。ScadaBR是一个基于Java的应用程序,运行在Windows、Linux或其他可以运行应用服务器(如Apache T omcat)的操作系统上。ScadaBR最初由MCA Sistemas(ScadaBR 2017)开发,并使用开放源代码许可证分发。一旦ScadaBR被部署,它将作为后台服务运行。 可以通过web浏览器访问用户接口,指向正确的地址和端口(默认端口为8085)。主界面易于使用,并提供变量可视化、图表、统计、协议配置、警报、人机界面屏幕创建和变量监控。 目前,ScadaBR支持多种SCADA通信协议,包括Modbus和DNP3。 ScadaBR提供数据源和数据点,以组织来自远程设备的数据。数据源表示通过特定协议进行通信的单个远程设备。一个数据源可以有多个数据点。每个数据点与来自远程设备的单个项相关联,例如模拟输入、离散输出或存储器位置。HMI屏幕是通过在屏幕上拖放元素并将它们与数据点关联来构建的。图2示出了使用ScadaBR构建的典型HMI。此屏幕的数据点通过Modbus从OpenPLC检索。 5. 可编程逻辑控制器评估和基准 在一个开源的PLC平台上进行研究,只有当这个平台可以被验证为可以像其他PLC一样工作时,才是有价值的。因此,为了支持OpenPLC是PLC网络安全研究的有效平台的说法,本节通过分析PLC系统的三个基本概念:扫描时间、梯形逻辑执行和SCADA连接,提出了验证PLC的方法。此外,还执行了Modbus注入攻击,以评估网络攻击期间每个PLC的响应。 创建了四个测试来评估上述每个概念:扫描时间测试、PLC梯形图逻辑执行测试、SCADA连接测试和Modbus注入攻击测试。 这些测试在OpenPlcNeo和其他四个流行的(Boyes和O’Brien,2009)(ARC咨询集团2001)商用PLC上进行:施耐德M221、西门子S7-1214C、欧姆龙CP1L-L20DR-D和艾伦布拉德利(A-B)MicroLogix 1400。 表2和表3列出了被测设备的特性。 5.1 扫描时间测试 PLC是实时系统的一个例子,因为输出结果必须在有限的时间内响应输入条件而产生,否则,将发生意外操作。PLC的实时行为通常与其扫描时间有关,扫描时间是PLC读取所有输入、执行逻辑程序和写回所有输出所需的时间。 考虑到逻辑程序的执行通常可以简化为条件语句的求值和一些算术运算,因此大部分扫描时间用于读取输入和写入输出。因此,如图3所示,所提出的扫描时间测试由具有一个输入和一个输出的单阶梯逻辑线组成。 这个程序根据输入的否定状态切换输出。因此,如果输入为false,则输出为true。否则,如果输入为true,则输出为false。通过运行该程序并将PLC上的输出和输入物理连接在一起,可以创建振荡器。这个振荡器输出一个方波,频率是PLC在软件中可以产生的最高频率。由于每次扫描时输出都会切换,所以扫描时间(以秒为单位)由公式(1)定义,其中f是以赫兹为单位生成的方波的频率。 图3中的梯形逻辑程序被上传到使用供应商编程软件测试的每个可编程逻辑控制器中,将扫描时间设置为最小的可用选项。此外,根据测试定义,程序中的输入和输出引用连接在一起。用单片机测量输出切换时间,每台PLC采集4000个采样。采样数受微控制器上可用内存量的限制。结果如下表4所示 扫描时间表示系统的响应时间。在PLC上,硬件性能、I/o数量、操作系统和库的复杂性以及梯形图逻辑解释器/编译器的实现将定义扫描时间。扫描时间的标准差表示系统保持实时响应的能力,换句话说,它定义了从可能的最小扫描时间可以预期的平均延迟。在分析的可编程逻辑控制器中,OpenPLC Neo获得了与其他可编程逻辑控制器相似的标准偏差,同时也具有最小的扫描时间。OpenPLC Neo的性能更好,因为它使用的是具有更高时钟频率的现代处理器。选择这个处理器是为了支持与未来网络安全增强相关的研究。 5.2 PLC梯形图逻辑执行测试 本试验的目的是根据IEC 61131-3标准验证梯形图的正确执行。IEC 61131-3定义了所有PLC编程语言通用的以下标准功能块:双稳态元件、边缘检测、定时器、计数器和比较器。该测试集中于评估使用IEC 61131-3中定义的所有标准功能块以及算术运算的测试程序的执行情况。测试程序通过供应商的编程软件上传到每个可编程逻辑控制器。提供一个随机输入向量,并对所有输出向量进行比较。 测试程序有4个离散输入和4个离散输出。每个输出负责评估一组特定的块。因此,测试程序分为四个部分,每个部分负责四个输出中的一个。 5.2.2 output O2-计时器的计算 第二个输出(O2)计算计时器。使用了TON和TOF类型,它们的过期时间不同。根据IEC 61,131 3的定义,在经过时间延迟PT后,在输出Q处,TON定时器提供输入的上升沿。如果输入脉冲短于PT,则不启动计时器,输出Q为false。TOF定时器执行与TON相反的功能,即它立即在输出Q处提供输入IN的上升沿,但延迟输入IN的下降沿到输出Q。 对于图5所示的梯形图测试程序段,如果其中一个平行TON计时器接收到大于PT值的输入脉冲,则输出O2被设置为true。定时器TON0到TON3由输入I1、I2、I3和I4激活。O2应保持激活状态,直到串联的TOF计时器过期。 5.2.3 output O3-计数器的计算 第三个输出(O3)验证计数器块。此测试同时使用向上(CTU)和向下(CTD)计数器。CTU计数器在输入CU的每个上升沿上递增内部计数变量CV。如果CV中的值与用户定义的PV变量匹配,则输出Q设置为true。当输入R出现上升沿时,内部计数变量CV被重置为零。类似地,CTD计数器在输入CD的第一个上升沿上从PV加载内部CV变量值,并在输入CD的每个后续上升沿上递减CV。一旦CV为零,输出图6-计数器测试。图7-算术和比较器测试。Q设置为true。在输入LD的上升沿上,原始PV值恢复为CV。 如图6所示,在从CTD0接收到复位脉冲之前,如果CTU0评估为真至少两次,则输出O3被设置为真。输入I1和I2连接到CTU0计数器的CU和R输入,而输入I3和I4连接到CTD0计数器的CD和LD输入。 5.2.4 output O4-算数的计算 最后,第四个输出(O4)计算算术和比较块。在这个测试中,CTU计数器被添加到四个输入中的每一个。每个CTU的CV变量连接到算术块,以便执行以下等式: 算术表达式的结果将转到两个并列块。如果结果大于3或小于-3,则输出设置为真。该试验段的梯形图如图7所示。 5.2.5 结果 这个测试程序的所有四个输入都是由一个随机生成的100字节长的输入向量刺激的。每个PLC上连接一个微控制器,提供输入矢量刺激,并读取运行测试程序的PLC产生的四个输出。该测试评估给定相同的程序和相同的输入向量,所有plc是否生成相同的输出向量。各PLC的输出矢量如表5所示。 表5中的值都是十六进制。每个十六进制数字代表一个字节(4位),与四个输入(用于输入向量)或输出(用于输出向量)直接相关。例如,输入向量上的十六进制数字A表示以下输入位 从最重要的开始,输入向量的每个半字节被发送到以100 ms间隔测试的所有可编程逻辑控制器的四个输入端。在100 ms间隔之间,从可编程逻辑控制器的输出端读取输出向量的每个半字节。 从表5所示的数据来看,OpenPLC和Siemens具有相同的输出矢量。Schneider和A-B也有相同的输出向量,但它们不同于OpenPLC和Siemens生成的第一组。欧姆龙有一个不同于其他所有的输出矢量。试验得出的结论是: (1) 所有测试的可编程逻辑控制器的输出O1和O2(双稳态元件、边缘检测和定时器)的结果相同。除欧姆龙外,所有可编程逻辑控制器的输出O3(计数器测试)结果相同。OpenPLC和Siemens对输出O4(算术和比较器测试)的结果相同。施耐德、A-B和欧姆龙对O4的输出也有相同的结果,但与OpenPLC和西门子的结果不同。 (2) 尽管A–B和Schneider对于输出O1有正确的结果,但它们在指令集中没有双稳态元素。因此,A-B和Schnei-der的双稳态元件必须使用单独的set和reset指令来实现。 (3) CTD计数器的A-B实施不符合IEC 61131-3标准。在第一次加载时,在输入的上升沿上,它应将预设值加载到accumu-lator。此外,在复位输入的情况下,它应该再次将预设变量的原始值加载到累加器中。对于这个特定的数据集,输出没有任何变化,但是,A–B可编程逻辑控制器的累加器在测试结束时的值与其他可编程逻辑控制器不同。 (4) 欧姆龙的编程软件(CX程序员)不是基于IEC 61131-3标准。欧姆龙的编程软件有一个不同的版本,叫做CX Programmer IEC,它符合标准。但是,CX程序员IEC只能与SYSMAC CS系列和CJ系列CPU单元一起使用。此外,Omron没有TOF定时器块,因此必须在测试程序中使用TON和一些梯形逻辑来实现它们。最后,欧姆龙的计数器与IEC 61131-3标准中定义的计数器非常不同。不可能使它们以与其他可编程逻辑控制器类似的方式工作。因此,欧姆龙公司在计数器测试中有不同的结果。 (5) 施耐德(Schneider)、A-B和欧姆龙(Omron)对零划分的解释不同于OpenPLC和西门子(Siemens)。对于Schneider、A–B和Omron,忽略零的除法,因此目的地保留上一个值。对于Siemens和OpenPLC,零除将零移到目标寄存器。这解释了为什么他们在算术和比较器测试中有不同的结果。 5.3 SCADA连接测试 可编程逻辑控制器和其他自动控制器设备是在工业通用互操作性标准(如IEC 61131)出现之前开发的。结果是,供应商创建了大量不可互操作的控制协议,作为一种激励,他们有自己的协议来锁定他们的客户群。 随着SCADA开放协议的到来,业界开始从专有的封闭网络转向开放源代码解决方案和支持TCP/IP的网络,允许不同的设备进行互操作。尽管DNP3和以太网/IP等协议正逐渐流行起来,但实际上所有主要的PLC制造商都提供了对Modbus的支持。从表2中的数据可以看出这一点。尽管DNP3和以太网/IP在一些可编程逻辑控制器设备中很常见,但Modbus是所有这些设备的通用协议。因此,拟议的监控与数据采集连接测试主要集中在Modbus协议中,因为它是监控与数据采集供应商之间的一个共同点。 Modbus是一种请求/应答协议,提供由功能代码指定的服务。Modbus应用协议规范定义了三类Modbus功能代码:公共、用户定义和保留。用户定义的和保留的功能代码不适用于此测试,因为它们是特定于设备的,并且可以从一个实现更改为另一个实现。另一方面,公共功能代码定义明确,公开记录,并且对于符合Modbus规范的每个设备始终相同 Modbus规范定义了19种不同的公共功能代码。SCADA连接测试评估每个被测PLC上所有Modbus公共功能代码的实现,以及每个功能代码可用的地址范围。测试程序用所有可能的Modbus公共功能代码发送消息,并检查响应,以评估被测设备是否支持特定的功能代码。此外,它还请求离散输入、线圈、输入寄存器和保持寄存器的数据,以评估设备上每种数据类型支持的地址范围。表6和表7分别显示了每个设备支持的功能代码列表以及每个数据类型支持的地址范围。 在执行SCADA连接测试之前,有必要向Omron PLC添加CP1W-MODTCP61扩展卡,因为该PLC没有内置以太网端口。该模块负责将以太网和Modbus TCP功能添加到Omron CP1L系列中。 SCADA连接测试的结果导致了一些观察结果: 1.尽管Modbus规范定义了许多公共功能代码,但该测试表明,可编程逻辑控制器仅关注与Modbus数据类型和诊断直接相关的公共功能子集。 2.除了诊断功能外,OpenPLC支持与其他测试设备相同的功能代码子集。但是,由于OpenPLC代码是开源的,因此如果需要,可以添加对诊断和其他功能代码的支持。 3.Modbus地址范围在每个ven-dor之间变化很大。一些设备的离散I/O范围较大,而另一些设备的寄存器范围较大。 4.OpenPLC和Schneider将Modbus地址空间直接映射到物理I/O,这意味着可以通过Modbus请求直接观察物理输入和输出的变化。西门子还将Modbus地址空间直接映射到I/O,但保留寄存器除外,其中,用户被迫创建一个单独的数据库,以与Modbus保持寄存器相关联。A-B和Omron对Modbus请求使用完全独立的地址空间。如果需要在Modbus上报告物理I/O,用户程序必须手动将每个Modbus地址链接到物理输入或输出。 5.根据Modbus规范,当设备接收到不支持功能代码的请求时,它必须以无效功能代码异常回答。Omron没有实现无效的函数代码异常。相反,它只是关闭与请求者的连接。这给测试增加了很大的困难,因为每次测试不支持的函数代码时都必须重置连接。 5.4 Modbus注入攻击测试 指令注入攻击是过程控制系统面临的主要威胁之一。鉴于可编程逻辑控制器是一种智能电子设备,可编程逻辑控制器可直接在远程站点自动监测和控制物理过程,通常有可编程逻辑控制器寄存器,用于保存过程的关键控制参数,如上限和下限、有效状态和当前操作模式。攻击者可以使用命令注入覆盖这些寄存器中的值,从而导致控制算法做出错误的决策。 此测试的目的是验证受到Modbus注入攻击时的每个PLC行为。对于测试,每个可编程逻辑控制器用图8中的梯形图逻辑程序编程。 图8中的梯形逻辑有一个主振荡器,其产生周期为40 ms的方波。第一定时器(TON)将脉冲保持在低状态20 ms,第二定时器(TOF)将脉冲保持在高状态20 ms。该方波用作计数从0到100的内部计数器的输入。一旦计数达到100,计数器自动复位,计数重新开始。每个可编程逻辑控制器被配置为允许内部计数在地址0处的Modbus保持寄存器中可用。 创建了一个监控程序,以持续读取和记录每个可编程逻辑控制器的Modbus保持寄存器0。注入攻击由另一个程序执行,该程序旨在尽可能快地将写消息发送到目标PLC上的Modbus保持寄存器0。这些消息的目的是用值99覆盖目标PLC上的内部计数。攻击每个PLC的结果可以在图9中看到。 结果表明,每个PLC在攻击过程中都有不同的行为。OpenPLC和Schneider也有类似的行为,即使攻击能够多次覆盖计数值,但它们都能够正确地保持内部计数,从而使注入期间的输出值在正确的内部计数和注入值99之间振荡。 A-B有一个不同的行为,攻击实际上改变了内部计数值,这样计数器就可以从注入的值继续计数。因此,喷射期间的输出值在值99、100和0之间振荡。 如第5.2节所述,欧姆龙计数器与其他平台不同。欧姆龙CP1L系列只有下行计数器指令(CTD),因此欧姆龙可编程逻辑控制器的测试是用递减计数器进行的。解释了为什么欧姆龙公司的曲线看起来是垂直的。此外,由于注入消息发送太快,Omron PLC无法处理许多读取请求消息,这导致注入攻击期间的读取点更稀疏。由此得出结论,该PLC可能比其他PLC更容易受到拒绝服务(DoS)攻击。 西门子是被测试的唯一一家对注射攻击免疫的PLC。经过仔细分析,可以看出西门子处理Modbus请求的优先级低于梯形图程序。此外,西门子PLC阻止了发送消息过快的连接,这迫使注入攻击以更慢的速度发生。因此,即使注入程序试图在Modbus寄存器中写入该值,由于梯形图逻辑周期的优先级较高,内部计数值立即恢复为正确值,因此在读数上看不到注入。 鉴于open PLC是一个开源PLC,因此可以修改其内部行为,使之与西门子PLC相匹配,以应对此攻击。如图1所示,网络层-w h i c h处理Modbus和DNP3连接,并且PLC逻辑可以直接访问内部图像表。这意味着Modbus写请求直接访问OpenPLC内部缓冲区,因此可以立即修改缓冲区中的任何变量。为了具有与西门子PLC相似的行为,在网络层和PLC逻辑之间添加了仲裁块,这样它们就不再直接访问内部图像表。仲裁器被编程为优先考虑可编程逻辑控制器逻辑,因此Modbus写入请求将在临时缓冲区上等待,直到所有梯形图逻辑写入内部图像表完成。如果Modbus写入和PLC逻辑写入之间存在冲突,则将保持PLC逻辑值。在OpenPLC上执行这些修改之后,Modbus注入攻击测试被重复。 从图10可以看出,修改了源代码的OpenPLC与Siemens PLC具有相同的行为。注入的消息无效,因为PLC逻辑优先于Modbus写入请求。在这种情况下修改open PLC以匹配最佳实践,或者在其他情况下击败特定攻击的能力,显示了开源PLC在网络安全研究中的价值。 虽然这种修改能够击败这种特殊的注入攻击,但它没有修复与Modbus协议相关的身份验证、完整性和机密性问题,这使得注入攻击最初成为可能。解决这个问题的一个更全面的解决方案是在协议中实际消除这些限制。阿尔维斯等人进行的一项研究。(2018)试图解决其中一些问题,方法是证明有可能通过使用机器学习识别和阻止可能的攻击的嵌入式入侵防御系统来增强OpenPLC。同样的研究还描述了一个嵌入式加密模块,为Modbus协议提供机密性。鉴于许多工业过程对实时性的严格要求,本研究还评估了采用加密和机器学习算法的ap的性能损失,并得出结论,这些改进不会影响OpenPLC的实时性。这种行为的原因在于OpenPLC的实时库,它受益于多核架构,为核心OpenPLC进程提供了更好的实时响应。 6 网络安全应用 与传统的集中式方法相比,开源PLC为边缘的嵌入式安全性创造了研究机会,可以提供更高的弹性。下面的章节列举了OpenPLC的三个重要的网络安全应用领域。 6.1 可开发PLC用于SCADA安全培训 出于各种原因,安全行业的人员一直在使用故意易受攻击的系统,如Metasploitable(Metasploitable:一种易受攻击的机器,用于测试Metasploit 2017),如网络开发培训、漏洞开发和软件测试。鉴于目前在可编程逻辑控制器层面上不存在此类系统,可以创建原始OpenPLC代码的分支,以实现在ICS-CERT咨询和报告(ICS-CERT咨询| ICS-CERT 2017)中披露的商业系统的安全漏洞。这个故意易受攻击的系统可以用来进行ICS安全培训,测试网络安全工具,并在不需要原始硬件的情况下实践常见的ICS渗透技术。 6.2 嵌入式入侵检测系统 虽然在提高入侵检测系统(IDS)的准确性和复杂度方面做了大量工作,但当攻击者攻击网络中的可信节点时,要保护工业系统免受受损节点的攻击,就面临着巨大的研究挑战。攻击者可以发起攻击,发送有害的控制命令,甚至从受信任的节点取消激活ID。可以修改开放源码的PLC代码以包含嵌入式id。嵌入式体系结构将ID暴露在网络中的可能性降到最低,这样受信任的节点就不能访问ID。另外,一个嵌入式IDS一旦只关心自己的节点,可以分析更小的数据流。这样可以提高入侵检测系统的准确性和训练时间。 在PLC中嵌入IDS还可以提供其他优点。基于机器学习算法的IDS通过网络遥测学习。机器学习IDS的性能和准确性依赖于正确的特征和属性的选择,这是一个非常复杂和领域特定的任务。嵌入式IDS可以直接访问由PLC执行的逻辑程序,从而获得有关该过程的领域特定知识,从而在最少的人工监督下自动选择正确的特性。 6.3 嵌入式加密 通过加密PLC与集中监控之间的通信通道,可以提高SCADA网络的安全性。IPsec为数据包提供加密和身份验证,从而保护它们不被窃听和篡改。由于IPsec在网络层(OSI第3层)运行,它对应用程序是完全透明的。研究人员一直致力于使用IPsec和其他加密技术(如SSL和TLS)包装SCADA协议(Patel et al., 2009;阿尔希罗夫和金姆;Patel和Sanyal, 2008)。 由于闭源商用可编程逻辑控制器的网络功能无法修改,在当前的监控与数据采集系统上使用加密技术需要额外的硬件,如可编程逻辑控制器与监控与数据采集网络其余部分之间的线路连接。这种方法的问题是PLC和加密设备之间的链接易受攻击,因为它没有加密。此外,网络上添加的节点会增加延迟,从而影响网络的实时响应。 OpenPLC的模块化架构允许修改网络层架构,而无需更改系统其他组件上的任何内容。另外,由于OpenPLC是完全开放源码的,它支持在设备中实现SSL、TLS或IPsec加密,而不需要任何外部硬件。将strongSwan(strongSwan简介2017)集成到OpenPLC中进行了初步测试,结果令人满意。StrongSwan是一个完整的IPsec解决方案,为服务器和客户端提供加密和身份验证。它使用因特网密钥交换协议(IKEv1和IKEv2)在两个对等点之间建立安全关联(SA)。IKE提供两个对等方的强身份验证,并派生唯一的加密会话密钥。OpenPLC能够使用strongSwan通过端到端加密通道成功地与ScadaBR HMI通信。不需要额外的硬件。 7. 结论 本文概述了一个通用的可编程逻辑控制器体系结构,并定义了一个符合IEC 61131-3国际标准的开源可编程逻辑控制器。这项工作的主要贡献是OpenPLC Neo的开发,它允许ICS研究人员在没有专有代码的情况下设计、测试和验证工业控制器的安全增强。一旦这些增强功能经过测试和验证,供应商就可以将它们移植到商业平台上。 此外,为了支持OpenPLC是PLC研究的有效平台的说法,本文提出了一种验证PLC的方法。创建了四个测试来分析可编程逻辑控制器系统的有趣概念及其在网络攻击期间的行为:扫描时间测试、可编程逻辑控制器梯形图逻辑执行测试、SCADA连接测试和Modbus注入攻击测试。应用该方法对OpenPLC Neo与其他四种商用plc进行了比较。结果是令人满意的,因为OpenPLC Neo实现了相似的扫描时间,IEC 61131-3可兼容的逻辑执行,与其他商业plc测试相同的SCADA连接。另外,在对OpenPLC源代码做了一些修改之后,OpenPLC能够模拟Modbus注入攻击期间的最佳行为。修改open PLC以匹配最佳实践或击败特定攻击的能力显示了开源PLC在网络安全研究中的价值。 除了提供低成本的可编程逻辑控制器环境外,开放式可编程逻辑控制器还为集成电路网络安全研究开辟了许多不同的领域。原始OpenPLC代码的一个故意易受攻击的版本可用于进行ICS安全培训和测试网络安全工具。嵌入OpenPLC代码中的IDS系统暴露于网络的程度较低,分析的数据流较小,提高了准确性和训练时间,并且可以根据PLC执行的逻辑程序自动选择要学习的特征。最后,OpenPLC使SSL、TLS和IPsec等加密技术能够嵌入到应用程序中。嵌入式加密为控制中心提供直接和安全的通信通道,而不需要增加网络延迟的外部硬件。 |
|
|
|
只有小组成员才能发言,加入小组>>
886浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 08:17 , Processed in 0.619649 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号