【日更计划118】数字IC基础题【UVM部分】聚焦工业安全 | 可编程逻辑控制器代码安全缺陷分析综述

不想错过我的推送,记得右上角-查看公众号-设为星标,摘下星星送给我

导读

可编程逻辑控制器代码安全是确保工业控制系统安全运行的核心,本文围绕着可编程逻辑控制器的代码安全缺陷进行分析,首先阐述了工控代码安全的相关研究。接着,从可编程逻辑控制器代码逻辑缺陷、安全需求规约两个方面对工控代码缺陷进行分类,分析了针对梯形图语言的3种代码逻辑缺陷产生的机理,并结合梯形逻辑图,利用PLC代码逻辑缺陷,实现拒绝服务攻击、中间人攻击等。最后,本文提出了PLC代码形式化验证中面临的困难,并从中间语言翻译、模型构建和模型检测三方面综述了PLC代码形式化验证的相关研究。

【日更计划118】数字IC基础题【UVM部分】聚焦工业安全 | 可编程逻辑控制器代码安全缺陷分析综述(图1)【日更计划118】数字IC基础题【UVM部分】聚焦工业安全 | 可编程逻辑控制器代码安全缺陷分析综述(图2)

欢迎大家加入2022届数字IC交流群,QQ群号 1060380138

【日更计划118】数字IC基础题【UVM部分】聚焦工业安全 | 可编程逻辑控制器代码安全缺陷分析综述(图3)

上期答案[316] 什么是uvm_config_db?它的作用是?

uvm_config_db机制支持在不同的测试平台组件之间共享配置和参数。用名为uvm_config_db的配置数据库启用该功能。任何测试台组件都可以使用变量,参数,对象句柄等填充配置数据库。

1

引言

工业控制系统(Industrial control system,ICS)是国家基础设施的核心并广泛用于工业、交通、能源、水利、安防、食品以及大型制造等行业,工业控制系统的网络安全与国家安全息息相关。2010年“震网”(stuxnet)病毒造成了伊朗布什尔核电站重大损失,大量离心机报废,导致伊朗的核计划推迟,也促使工业控制系统安全逐渐成为网络安全领域的研究热点。随着工业控制系统由封闭走向互联,大量的控制器配备了以太网通信组件,使得攻击者可以直接访问PLC硬件及其编程软件。但PLC逻辑控制层缺少认证和监测等保护措施,PLC代码的安全缺陷成为工业控制系统的重要安全威胁之一。

【日更计划118】数字IC基础题【UVM部分】聚焦工业安全 | 可编程逻辑控制器代码安全缺陷分析综述(图4)

2

工控代码利用相关研究

其他测试平台组件可以从配置数据库访问这些变量,参数,对象句柄,而无需真正知道其在层次结构中的位置。

例如,顶层测试平台模块可以通过uvm_config_db储存虚接口句柄。然后,任何uvm_driver或uvm_monitor组件都可以查询uvm_config_db获取此虚接口的句柄,并将其用于通过接口实际访问信号。

[317] 如何使用uvm_config_db的get()和set()方法?

get()和set()是用于从uvm_config_db存储或检索信息的主要方法。任何验证组件都可以使用set()方法为config_db存储一些配置信息,还可以控制哪些其他组件对相同信息具有可见性。可以将其设置为具有全局可见性,或者仅对一个或多个特定测试平台组件可见。get()函数从数据库中检查与参数匹配的共享配置。

get()和set()方法的语法如下:

与传统的编程语言一样,PLC存在代码安全缺陷,而这些代码安全缺陷为攻击者攻击工业控制系统留下了后门。

2013年South Carolina大学的Sidney对PLC代码设计安全缺陷进行了深入的研究,并把PLC代码设计级缺陷主要分为基于硬件缺陷和基于软件缺陷两种。攻击者可以利用PLC代码缺陷破坏代码逻辑,进行中间代码插桩,实现任意代码执行等。

uvm_config_db#(<type>)::set(uvm_component context, string inst_name, string field_name,<type> value)
uvm_config_db#(<type>)::get(uvm_component context, string inst_name, string field_name, ref value)

context指定从中调用get / set的当前类或组件。inst_name是从中调用get / set的组件实例的名称。field_name是在config_db中设置/获取的对象或参数或变量的名称。<type>标识config_db中设置/获取的配置信息的类型。对于对象句柄,type是类名,而对于其他变量,type是数据类型名,代表了该变量的类型。

[318] 在验证平台层次结构中较低的组件是否可以使用get / set config方法将句柄传递给较高层次结构中的组件?

建议不要在UVM中这么做。通常,较高级别的组件使用句柄设置配置数据库,而较低级别的组件则使用get / set方法获取它们。

2014年北京科技大学李伟泽等提出和分析了一种针对SCADA系统的新型的网络物理攻击——伪逻辑攻击。

2015年在blackhat-US会议上Klick等在西门子S7-300中注入了一种新型的后门,通过注入工具实现了在S7-300上进行SNMP扫描及SOCK5代理功能。作者利用PLC程序中存在跳转指令的安全缺陷,成功在主程序OB1前嵌入恶意指令从而可以控制PLC的启停以及输出寄存器。

[319] 在UVM中,将虚接口分配给不同组件的最佳方法是什么?

实例化DUT和接口的顶级testbench模块在uvm_config_db中例化虚接口。然后,测试类或UVM组件层次结构中的任何其他组件可以使用get()方法查询uvm_config_db,获得此虚接口的句柄并将其用于访问信号。

2016年11月在blackhat欧洲会议上Ali Abbasi等实现了对PLC输入/输出接口的新攻击,该攻击通过篡改输出输入引脚改变系统的运行逻辑。

下面栈是了如何进行此操作。为APB总线master实例化了DUT和物理接口,然后,将虚接口句柄设置到uvm_config_db。

module test;
    logic pclk;
    logic [31:0] paddr;
    
    //Instantiate an APB bus master DUT
    apb_master apb_master(.pclk(pclk),*); 
    
    //Instantiate a physical interface for APB interface
    apb_if apb_if(.pclk(pclk), *); 
    
    initial begin //Pass this physical interface to test class top //which will further pass it down to env->agent->drv/sqr/mon
        uvm_config_db#(virtual apb_if)::set(null, "uvm_test_top", "vif",apb_if); 
    end 

endmodule

下面是APB Env类,该类使用uvm_config_db中的get()方法检索在顶层测试模块中设置的虚接口。

class apb_env extends uvm_env;
    `uvm_component_utils(apb_env); 
    
    //ENV class will have agent as its sub component
    apb_agent agt;
    
    //virtual interface for APB interface
    
    virtual apb_if vif; //Build phase - Construct agent and get virtual interface handle fromtest and pass it down to agent
    
    function void build_phase(uvm_phase phase);
        agt = apb_agent::type_id::create("agt", this);
        if (!uvm_config_db#(virtual apb_if)::get(this, "", "vif", vif))begin 
            `uvm_fatal("config_db_err", "No virtual interface specified forthis env instance") 
        end 
        uvm_config_db#(virtual apb_if)::set( this, "agt", "vif", vif); 
    endfunction: build_phase 

endclass : apb_env
[320] 在UVM中,如何结束仿真?

UVM具有phase机制,由一组构建阶段,运行阶段和检查阶段组成。在run()阶段进行实际的测试仿真,并且在此phase中,每个组件都可以在开始时提出raise_objection和drop_objection。一旦所有组件都drop_objection,则run_phase完成,然后所有组件的check_phase执行,然后测试结束。

这是正常仿真结束的方式,但是如果某些组件由于设计或测试平台中的错误而挂起,则仿真超时也可以终止run_phase。当run_phase启动时,并行超时计时器也会启动。如果在run_phase完成之前超时计时器达到指定的超时限制,则将发出一条错误消息,然后将执行run_phase之后的所有phase,最后测试结束。

2017年3月,来自印度海德拉巴和新加坡的学者,演示了针对工业控制系统的PLC梯形图逻辑炸弹(Ladder Logic Bombs,LLB)。该逻辑炸弹是用梯形图语言编写的恶意软件,这种恶意软件可被攻击者注入到PLC现有控制逻辑中,通过改变控制动作或者等待特定的触发信号来激活恶意行为,以实现传感器数据篡改,系统敏感信息获取以及PLC拒绝服务攻击等。

【日更计划118】数字IC基础题【UVM部分】聚焦工业安全 | 可编程逻辑控制器代码安全缺陷分析综述(图4)

3

本期题目[321] 什么是UVM RAL(UVM Register Abstraction Layer)?[322] 什么是UVM Callback?[323] 什么是uvm_root类?[324] uvm_test的父级类是什么?[325] 什么是形式验证?

正确答案将在下一期公布,或者到下面的文章获取答案

面试攻略

PLC代码缺陷分类

不同于传统的IT系统,工业控制系统有其特殊的编程语言,根据国际电工委员会制定的工业控制编程语言标准(IEC61131-3),PLC的编程语言包括以下五种:梯形图语言(LadderLogicP r o g r ammi n g L a n g u a g e , L D)、指令表语言(In s t r u c t i o n L i s t , IL)、功能模块图语言(Function Block Diagram,FBD)、顺序功能流程图语言(Sequential function chart,SFC)及结构化文本语言(Structured text,ST)。本文中的代码缺陷研究也是基于上述编程语言展开的。

工业控制系统的入侵与传统互联网入侵虽然手段上大同小异,但工业控制系统的部署与其物理工艺流程紧耦合,因此利用工艺流程中的代码逻辑缺陷成为针对工业控制系统的有效打击手段之一,如陷阱门、逻辑炸弹、特洛伊木马、蠕虫、Zombie等,且这类新的恶意代码具有更强的传播能力和破坏性。本文主要研究基于软件的PLC代码缺陷,并从代码逻辑缺陷和违反安全需求规约两个方面对PLC代码缺陷进行分类研究。


END
【日更计划118】数字IC基础题【UVM部分】聚焦工业安全 | 可编程逻辑控制器代码安全缺陷分析综述(图6)

新一期的路科验证春季班已经开始了!扫描二维码联系路科验证MOMO,然后报出暗号摸鱼范式就能获得200优惠券!对于课程学习有任何问题,都可以扫描下面的二维码,加我微信咨询。

3.1 PLC代码逻辑缺陷

标签: 时序计时器

随便看看