APP下载

电力信息系统软件代码漏洞检测系统的设计与实现

2023-12-13王国峰唐云善徐立飞

微型电脑应用 2023年11期
关键词:线程引擎漏洞

王国峰, 唐云善, 徐立飞

(1.南瑞集团有限公司(国网电力科学研究院有限公司), 江苏, 南京 210003;2.南京南瑞信息通信科技有限公司, 江苏, 南京 210003)

0 引言

随着电力系统朝着数字化、智能化方向不断发展,电力电网与计算机、软件技术的结合越加紧密[1]。越来越多的电力终端设备接入电网,使得电网的封闭性受到了挑战,而以隔离为主的传统安全防控手段也逐渐难以满足当前智能电网日益增高的安全防控需求[2-3]。此时,若是电力系统软件内部存在固有的代码安全漏洞,一旦电网遭受外部网络攻击而被攻入时,这些软件中潜在的代码漏洞将会成为极大的安全隐患[4]。

此外,电力系统软件自身的代码缺陷也会诱发软件出现各种意外故障,如若出现故障的连锁反应,将会给整个电网带来不可估量的损失。例如,根据著名杀毒软件公司ESET证实,2016年乌克兰电网的大规模停电,正是黑客利用乌克兰电力系统的漏洞植入恶意软件[5-6],破坏电力系统的正常运行所导致制的。鉴于此,本文设计并实现了一套代码漏洞静态检测系统,来提升电力信息系统软件代码的安全水平,且通过测试验证了该系统的有效性。

1 系统总体设计

1.1 系统概述

电力信息系统软件代码的检测有两个特点:一是电力信息系统软件一般应用于封闭的电力信息系统环境中,软件代码漏洞修复的成本高、难度大;二是电力信息系统软件的功能、软件结构以及业务逻辑都十分复杂,使得其内部源码中可能存在的漏洞种类同样繁杂[7]。针对这两个特点,本文设计并实现了一套面向电力信息系统软件代码安全漏洞静态检测系统,命名为Asca-Java。

Asca-Java是一套以代码静态分析技术为基础,支持检测算法与检测引擎扩展、支持规则定制和多线程技术的代码漏洞静态检测系统。其中,采用代码静态检测技术是因为该技术可以在软件开发的周期内,尽早地发现并修复可能存在的代码安全漏洞,降低单个漏洞修复的成本[8]。检测算法与检测引擎的可扩展性和规则的可定制性能够提升Asca-Java对于复杂代码中安全漏洞的检测准确率。多线程技术的支持,则能够提高Asca-Java多任务检测的效率。

1.2 系统框架设计

本文设计的面向电力信息系统软件的代码漏洞检测系统总体框架如图1所示。该系统框架一共由7大模块组成,分别是交互模块、命令行解析模块、任务模块、线程管理模块、报告模块、规则定制模块和算法定制与引擎集成模块,每个模块功能的设计如下。

图1 Asca-java系统框架结构图

(1) 交互模块。该模块主要功能是接收用户的输入指令,并根据指令分情况启动漏洞检测任务。Asca-Java支持命令参数和配置文件两种方式启动检测,用户可以在交互的shell终端或者配置文件中,提供待检测项目的名称、路径、编码格式、JDK版本以及线程池的设置参数,即可进行代码安全漏洞的检测。检测过程中的日志流信息也会在终端显示台上打印出来,并在检测任务终止后存储在指定的日志文件中。

(2) 命令行解析模块。该模块主要用于解析用户输入的参数或者配置文件中填写的参数,根据参数加载对应的项目文件和规则文件,同时将一些项目的基本信息暂时写入内存缓冲池中。

(3) 任务模块。该模块的工序分为三步,首先是检测规则的解析,形成与每个项目相匹配的规则过滤文件,然后生成每个项目的检测任务,并给每个任务标上唯一的检测编号,最后启动任务线程池中的多个线程,异步并行启动所有检测任务。

(4) 线程管理模块。Asca-Java配置有2个线程池,分别是任务线程池和引擎线程池。该模块的主要任务是2个线程池的管理。例如,当用户同时输入5个检测项目时,线程管理模块则会根据任务模块的命令在任务线程池里启动5个任务线程,每个任务线程则会根据规则过滤文件在对应的引擎线程池中,启动对应的引擎线程来进行代码安全漏洞的检测,具体流程如图2所示。

图2 Asca-Java多线程任务执行流程图

(5) 报告模块。该模块的主要功能是收集每个任务的漏洞检测结果,并根据规则过滤文件,分类整理检测出的代码安全漏洞,同时给出漏洞整改的建议,最后将上述信息全部写入xml文件中,形成每个项目的检测报告。

(6) 规则定制模块。该模块用于将用户自定义的检测规则存入整个系统的规则库中。

(7) 算法定制与引擎集成模块。Asca-Java既支持集成用户自定义的漏洞检测算法,又支持集成新的检测引擎。用户只需在系统规则库中按照指定的API接口,添加与自定义算法或检测引擎相匹配的漏洞检测规则,即可在项目检测过程中完成调用。

此外,检测规则决定检测引擎的调用。为了提升整个系统的漏洞检测效率,本系统整理、归纳、预设了数百条安全漏洞的检测规则,且为每条漏洞检测规则制定了与检测引擎之间的映射关系表(见表1),最终形成一套完整的检测规则库。

表1 Asca-Java内部规则映射表

表1中ID为每条检测规则唯一身份标识,通过它即可快速地识别出具体的规则内容。Name是规则的名称,Adopted表示该规则是否在检测过程中被采用,默认是False即未采用,Engine表示此条规则将会调用的检测引擎名称,MainType表示规则的大分类,SubType表示规则具体的小分类。从而,每个项目的规则过滤文件即可通过此规则映射表调用对应的检测引擎完成漏洞检测任务。

2 系统实现及其关键技术

2.1 漏洞检测实现

Asca-Java代码漏洞检测的实现流程如图3所示。首先当系统接收到用户提交的.java文件时,Asca-Java会通过词法分析和语法分析将.java文件转换成抽象语法树模型,然后通过遍历抽象语法树模型生成代码的中间表示,即三地址码。接着通过遍历三地址码来构建程序的控制流图(CFG)和调用图(CG)。最后在CF、CG和三地址码的基础上,结合设计的检测算法,即可分析出源码中的指定漏洞,并输出得到代码的检测报告。

图3 Asca-Java漏洞检测流程图

2.2 开发视图

Asca-Java的开发视图如图4所示。图中Service Logic指整个程序的服务逻辑,按照功能进行划分。main模块是框架的主函数入口,负责处理所有的外部请求,并调用util模块中的相关工具类进行处理,其中ArgsUtil类负责解析用户输入的参数,ConfigUtil类负责解析配置文件参数,RuleUtil类负责规则文件的解析。

图4 Asca-Java开发视图

另外main模块中的taskCallable类负责任务线程池的管理,它会根据预处理的项目信息调用util模块中的MultThreadToolUtil类去启动service模块中不同引擎实现类EngImpl去完成漏洞的检测工作。漏洞检测的结果会反馈给ReportImpl类,它会进一步调用util中的ReportUtil类完成检测报告的撰写工作,并把检测报告反馈给main模块。common为所有模块提供公共服务,例如xml文件的处理,源码的编译,命令交互的实现以及文件IO处理等服务。External Libraries指的是整个程序的外部依赖包,包含处理命令参数的jcommander包、提供日志服务的log4j包、解析xml格式文件的dom4j包等。

2.3 核心类实现

Asca-Java核心类是开发视图中各模块的具体实现,它们之间的关系如图5所示。

图5 Asca-Java核心类的关系图

图5中大部分核心类在上文已有说明,此处不再赘述。值得注意是engACallable类和engBCallable类,它们是检测引擎或者检测算法的2个具体实现,用户可在service模块中添加自定义的检测引擎类或者检测算法类,实现指定漏洞的精确检测。

2.4 系统实现

本文采用Java语言、Maven工具完成了检测系统的开发工作。Asca-Java的终端启动界面如图6所示。

图6 Asca-Java启动终端界面

3 系统应用测试

为了测试本文实现的代码漏洞静态检测系统的实际有效性,本文以美国国家安全机构(NSA)旗下的软件安全中心发布的Juliet test suite Java项目开源测试集为检测对象,同时为Asca-Java集成南瑞信通科技公司软件检测团队研发的3类漏洞检测算法,分别如下。

(1) 类型缺陷类检测算法。该检测算法可用于检测诸如密码硬编码、空的方法块等代码缺陷;

(2) 状态漏洞类检测算法。该检测算法可用于检测诸如空指针引用异常、变量未初始化等代码缺陷;

(3) 注入漏洞类检测算法。该检测算法可用于检测诸如SQL注入、命令注入等代码漏洞。

本次测试,需要检测的3种漏洞分别是:密码硬编码、空指针引用异常缺陷和SQL注入漏洞。此外,测试环境的配置:JDK版本为1.8,操作系统为Windows 10,CPU为因特尔-酷睿i9-10500六核十二线程处理器,主频3.1GHz,内存32 G,硬盘容量512 GB。

漏洞检测报告如图7所示,从图中可以看出Asca-Java能够有效、准确地检测出这3种漏洞。

图7 Asca-Java漏洞检测报告截图

4 总结

电力信息系统软件源代码的安全是整个电力信息系统软件安全的基石,而源代码的漏洞检测正是稳固此块基石的重要方式。为了提升电力信息系统软件源代码的安全性,本文设计并实现了一套代码漏洞静态检测系统Asca-Java,且详细阐述了该系统框架中各个功能模块的设计过程以及系统实现的过程和关键技术。

Asca-Java不仅支持检测规则、检测算法以及第三方检测引擎的自定义和扩展,还支持任务多线程提升代码检测的效率。最后本文通过系统测试验证了Asca-Java的有效性。本文的后续工作将从改进漏洞规则、优化漏洞检测算法和开展分布式代码漏洞检测等方向开展更深入的研究。

猜你喜欢

线程引擎漏洞
漏洞
蓝谷: “涉蓝”新引擎
浅谈linux多线程协作
三明:“两票制”堵住加价漏洞
漏洞在哪儿
高铁急救应补齐三漏洞
无形的引擎
基于Cocos2d引擎的PuzzleGame开发
基于上下文定界的Fork/Join并行性的并发程序可达性分析*
Linux线程实现技术研究