1、Microcomputer Applications Vol.39,No.11,2023文章编号:10 0 7-7 57 X(2 0 2 3)11-0 118-0 4电力信息系统软件代码漏洞检测系统的设计与实现王国峰1.2,唐云善1.2,徐立飞1(1.南瑞集团有限公司(国网电力科学研究院有限公司),江苏,南京2 10 0 0 3;2.南京南瑞信息通信科技有限公司,江苏,南京2 10 0 0 3摘要:电力信息系统软件代码的自身安全对整个电力信息系统的安全性、稳定性以及可靠性有着举足轻重的影响。为了提高电力信息系统软件代码的安全水平,设计并实现了一套代码漏洞静态检测系统。该系统以代码静态分析技术为
2、基础,支持漏洞检测规则定制、漏洞检测算法与检测引擎扩展以及多线程技术,并通过Java语言编程实现。系统测试结果表明,该系统能够准确、有效地检测出测试程序中的安全漏洞,验证了系统的有效性。关键词:电力信息系统;软件代码漏洞;代码静态检测中图分类号:TP309Design and Implementation of Code Vulnerabilities Detection System(l.NARI Group Corporation(State Grid Electric Power Research Institute),Nanjing 210003,China;2.Nanjing NAR
3、I Information&Communication Technology Co.,Ltd.,Nanjing 210003,China)Abstract:The security of power information system software code has a decisive impact on the security,stability and reliabilityof the whole power information system.In order to improve the security level of power information system
4、 software code,acode vulnerability static detection system is designed and implemented.Based on the static code analysis technology,the systemsupports the customization of vulnerability detection rules,the expansion of vulnerability detection algorithm and detection en-gine and multithreading techno
5、logy,and is programmed in Java language.The test results show that the system can accuratelyand effectively detect the security vulnerabilities in the test program,and the effectiveness of the system is verified.Key words:electric power information system;software code vulnerability;code static dete
6、ction0引言随着电力系统朝着数字化、智能化方向不断发展,电力电网与计算机、软件技术的结合越加紧密1。越来越多的电力终端设备接入电网,使得电网的封闭性受到了挑战,而以隔离为主的传统安全防控手段也逐渐难以满足当前智能电网日益增高的安全防控需求 2-3。此时,若是电力系统软件内部存在固有的代码安全漏洞,一旦电网遭受外部网络攻击而被攻入时,这些软件中潜在的代码漏洞将会成为极大的安全隐惠4。此外,电力系统软件自身的代码缺陷也会诱发软件出现各种意外故障,如若出现故障的连锁反应,将会给整个电网带来不可估量的损失。例如,根据著名杀毒软件公司ESET证实,2 0 16 年乌克兰电网的大规模停电,正是黑客利用
7、乌克兰电力系统的漏洞植人恶意软件 5-6 ,破坏电力系统的正常运行所导致制的。鉴于此,本文设计并实现了一套代码漏洞静态检测系统,来提升电力信息系统软件代码的安全水平,作者简介:王国峰(19 9 6 一),男,硕士,研究方向为代码静态分析;唐云善(19 7 5一),男,博士,研究员,研究方向为软件分析;徐立飞(19 9 7 一),男,硕士,研究方向为代码静态分析。研究与设计文献标志码:Afor Power Information System SoftwareWANG Guofengl-2,TANG Yunshan2,XU Lifeil1系统总体设计1.1系统概述电力信息系统软件代码的检测有两个
8、特点:一是电力信息系统软件一般应用于封闭的电力信息系统环境中,软件代码漏洞修复的成本高、难度大;二是电力信息系统软件的功能、软件结构以及业务逻辑都十分复杂,使得其内部源码中可能存在的漏洞种类同样繁杂7。针对这两个特点,本文设计并实现了一套面向电力信息系统软件代码安全漏洞静态检测系统,命名为 Asca-Java。Asca-Java是一套以代码静态分析技术为基础,支持检测算法与检测引擎扩展、支持规则定制和多线程技术的代码漏洞静态检测系统。其中,采用代码静态检测技术是因为该技术可以在软件开发的周期内,尽早地发现并修复可能存在的代码安全漏洞,降低单个漏洞修复的成本 8 。检测算法与检测引擎的可扩展性和
9、规则的可定制性能够提升Asca-Java.118.微型电脑应用2 0 2 3年第39 卷第11期且通过测试验证了该系统的有效性。Microcomputer Applications Vol.39,No.11,2023对于复杂代码中安全漏洞的检测准确率。多线程技术的支持,则能够提高Asca-Java 多任务检测的效率。1.2系统框架设计本文设计的面向电力信息系统软件的代码漏洞检测系规则定制模块图1Asca-java系统框架结构图(1)交互模块。该模块主要功能是接收用户的输入指令,并根据指令分情况启动漏洞检测任务。Asca-Java支持命令参数和配置文件两种方式启动检测,用户可以在交互的shell
10、终端或者配置文件中,提供待检测项目的名称、路径、编码格式、JDK版本以及线程池的设置参数,即可进行代码安全漏洞的检测。检测过程中的日志流信息也会在终端显示台上打印出来,并在检测任务终止后存储在指定的日志文件中。(2)命令行解析模块。该模块主要用于解析用户输入的参数或者配置文件中填写的参数,根据参数加载对应的项目文件和规则文件,同时将一些项目的基本信息暂时写人内存缓冲池中。(3)任务模块。该模块的工序分为三步,首先是检测规则的解析,形成与每个项目相匹配的规则过滤文件,然后生成每个项目的检测任务,并给每个任务标上唯一的检测编号,最后启动任务线程池中的多个线程,异步并行启动所有检测任务。(4)线程管
11、理模块。Asca-Java配置有2 个线程池,分别是任务线程池和引擎线程池。该模块的主要任务是2 个线程池的管理。例如,当用户同时输入5个检测项目时,线程管理模块则会根据任务模块的命令在任务线程池里启动5个任务线程,每个任务线程则会根据规则过滤文件在对应的引擎线程池中,启动对应的引擎线程来进行代码安全漏洞的检测,具体流程如图2 所示。(5)报告模块。该模块的主要功能是收集每个任务的漏洞检测结果,并根据规则过滤文件,分类整理检测出的代码安全漏洞,同时给出漏洞整改的建议,最后将上述信息全部写入xml文件中,形成每个项目的检测报告。(6)规则定制模块。该模块用于将用户自定义的检测规则存入整个系统的规
12、则库中。(7)算法定制与引擎集成模块。Asca-Java既支持集成用户自定义的漏洞检测算法,又支持集成新的检测引擎。用户只需在系统规则库中按照指定的API接口,添加与自定义研究与设计统总体框架如图1所示。该系统框架一共由7 大模块组成,分别是交互模块、命令行解析模块、任务模块、线程管理模块、报告模块、规则定制模块和算法定制与引擎集成模块,每个模块功能的设计如下。交互模块命令行解析模块:Shell解析输终端人参数配置文件加载配1.项目名称置文件2.项目路径3.编码格式4.JDK版本5.规则路径6.线程池配置微型电脑应用2 0 2 3年第39 卷第11期任务模块线程管理模块启动任任务线程池务线程执
13、行任务线程生成检测任务解析规则文件自定义规则规则库算法或检测引擎相匹配的漏洞检测规则,即可在项目检测过程中完成调用。主线程启动任务线程池里的一个任务线程获取任务线程1的结果任务结束图2 Asca-Java多线程任务执行流程图此外,检测规则决定检测引擎的调用。为了提升整个系统的漏洞检测效率,本系统整理、归纳、预设了数百条安全漏洞的检测规则,且为每条漏洞检测规则制定了与检测引擎之间的映射关系表(见表1),最终形成一套完整的检测规则库。表1Asca-Java内部规则映射表IDNameAdopted1ARule2CRule3BRulenNRule表1中ID为每条检测规则唯一身份标识,通过它即可快速地识
14、别出具体的规则内容。Name是规则的名称,A-dopted表示该规则是否在检测过程中被采用,默认是False即未采用,Engine表示此条规则将会调用的检测引擎名称,MainType表示规则的大分类,SubType表示规则具体的小分类。从而,每个项目的规则过滤文件即可通过此规则映射表调用对应的检测引擎完成漏洞检测任务。.119.报告模块报告生成引擎线程池执行检测引擎线程算法1算法定制与引擎集成模块FalseFalseFalseFalse结果收集分析合并算法检测:引擎任务线程池一个任务线程启动任务线程1启动擎线程池里的三个引擎线程获取3个引擎线程结果EngineAEngAEngBEngNEng引
15、擎线程池三个引擎线程启动引擎线程线程12O引擎线程3SubType代码注人SQL注人语句操控SQL注人基于 DOMXss注人规则小分类规则大分类MainTypeMicrocomputer Applications Vol.39,No.11,20232系统实现及其关键技术2.1漏洞检测实现Asca-Java代码漏洞检测的实现流程如图3所示。首先当系统接收到用户提交的.java文件时,Asca-Java会通过词法分析和语法分析将.java文件转换成抽象语法树模型,然后通过遍历抽象语法树模型生成代码的中间表示,即三地址码。接着通过遍历三地址码来构建程序的控制流图(CFG)和调用图(CG)。最后在CF
16、、CG 和三地址码的基础上,结合设计的检测算法,即可分析出源码中的指定漏洞,并输出得到代码的检测报告。java文件词法语法三地检测检测报告分析分析址码算法调用图控制流图图3Asca-Java漏洞检测流程图2.2开发视图Asca-Java的开发视图如图4所示。图中ServiceLogic指整个程序的服务逻辑,按照功能进行划分。main模块是框架的主函数入口,负责处理所有的外部请求,并调用util模块中的相关工具类进行处理,其中ArgsUtil类负责解析用户输人的参数,ConfigUtil类负责解析配置文件参数,RuleUtil类负责规则文件的解析。另外main模块中的taskCallable类负
17、责任务线程池的+callo研究与设计管理,它会根据预处理的项目信息调用util模块中的Mult-ThreadToolUtil类去启动service模块中不同引擎实现类EngImpl去完成漏洞的检测工作。漏洞检测的结果会反馈给ReportImpl类,它会进一步调用util中的 ReportUtil类完成检测报告的撰写工作,并把检测报告反馈给main模块。common为所有模块提供公共服务,例如xml文件的处理,源码的编译,命令交互的实现以及文件IO处理等服务。Exter-nal Libraries指的是整个程序的外部依赖包,包含处理命令参数的jcommander包、提供日志服务的log4j包、解
18、析xml格式文件的dom4j包等。抽象common语法树AntCompileUtilCommandLineUtilArgsUtilConfigUtillog4jjcommander图4Asca-Java开发视图2.3核心类实现Asca-Java核心类是开发视图中各模块的具体实现,它们之间的关系如图5所示。engACallableengBCallable+engACallable(TaskEntity)+engBCallable(TaskEntity)+calloBoolen微型电脑应用2 0 2 3年第39 卷第11期Service LogicFileUtilXMLUtiutilReportU
19、tilRuleUtilExternal LibrariesspringReportServicelmplBoolenserviceReportlmplEnglmplmainMultThreadCodeScannerToolUtiltaskCallablecommonsdom4j+getReportTaskEntity)BoolenMultiThreadToolUtil+MultiThreadToolUtil(TaskEntity,ThreadPoolExcutor,DetectResult)bollenRuleResolveUtil+LoadUserRule(TaskEntity)+RuleR
20、esolve(TaskEntity)RulelncludeUtil+RuleFiltering(TaskEntity)图5中大部分核心类在上文已有说明,此处不再赞述。值得注意是engACallable类和engBCallable类,它们是检测引擎或者检测算法的2 个具体实现,用户可在 service模块中添加自定义的检测引擎类或者检测算法类,实现指定漏洞的精确检测。2.4系统实现本文采用Java 语言、Maven工具完成了检测系统的开taskCallable+taskCallable(TaskEntity,ThreadPoolExcutor,DetectResult)+CalloBoolen4
21、4ConfigUtil+ArgsInitializingO+getPropertiesOCodeScanner+main(Stringll)void图5Asca-Java核心类的关系图3系统应用测试为了测试本文实现的代码漏洞静态检测系统的实际有效性,本文以美国国家安全机构(NSA)旗下的软件安全中心发布的Juliet test suite Java项目开源测试集为检测对象,同时为Asca-Java集成南瑞信通科技公司软件检测团队研发的.120.ArgsUtil+ArgsInitializing(Stringl)发工作。Asca-Java的终端启动界面如图6 所示。Microcomputer A
22、pplications Vol.39,No.11,2023研究与设计微型电脑应用2 0 2 3年第39 卷第11期(base)jady-mac-miniAsca-java jadysjava-jar/Users/jady/Documents/Asca-java/target/va/Asca-java-e.1.1.jar2021-188815:12:38.229INFO-Asca-java支持【配置文件】启动,和【命令行】启动,两种启动方式Asca-iava可以通过【编详】和【检测】两个步暖,执行任务只有【编译】通过的文件,才能进行漏洞【检测】Asca-java也可以一步到位,直接检测项目【命令
23、行】启动方法如下:编译命令:compi1e-pnargs1-pp args2-jvargs3-ecargs4检测命令:analysis-pn args1-cpp args2-jvargs3-ec args4-rp args5-fd args6一步直接检测命令:-pn args1-ppargs2-jvargs3-ec args4-project-name【必须填写】待测项目的名称-project-path,-pp【必须填写】待测项目的路径-jdk-version,-jv-encode-charset,-ec【必须填写】待测项目的的JDK版本,支持JDK6JDK15,直接填写对应版本的数字即可s-
24、rules-path,【必须填写】待检测项目的编码格式,如;GBK,U T F-8【必须填写】用户自定义的(XML检测规则文件)的路径-force-detection,【选择填写】用户是否开启强制检测,献认不开启-fd-compiled-project-path,【必须填写】已编译项目的路径CPF-help/Documents/Asca-ava/targe/Asca-java-88-88-8-8-F!-8-8-3类漏洞检测算法,分别如下。(1)类型缺陷类检测算法。该检测算法可用于检测诸如密码硬编码、空的方法块等代码缺陷;(2)状态漏洞类检测算法。该检测算法可用于检测诸如空指针引用异常、变量未初
25、始化等代码缺陷;(3)注入漏洞类检测算法。该检测算法可用于检测诸如SQL注人、命令注入等代码漏洞。本次测试,需要检测的3种漏洞分别是:密码硬编码、空指针引用异常缺陷和SQL注入漏洞。此外,测试环境的配置:JDK版本为1.8,操作系统为Windows10,CPU为因特尔-酷睿i9-10500六核十二线程处理器,主频3.1GHz,内存编译命令:compile-cpargsi【配置文件】启动方法如下:检测命令:analysis-cpargs1一步直接检测命令:-Cpargs1-config-path,-cp【必须填写】特测项目配置文件的地址图6 Asca-Java启动终端界面Rsca-iva-Rep
26、or.xpl*eversion1,e.a/version36teste1/name99.4KB/filesizex11772021-10-1121:22:461011131235.88DLine6,Columm324总结电力信息系统软件源代码的安全是整个电力信息系统软件安全的基石,而源代码的漏洞检测正是稳固此块基石的重要方式。为了提升电力信息系统软件源代码的安全性,本文设计并实现了一套代码漏洞静态检测系统Asca-Java,且详细阐述了该系统框架中各个功能模块的设计过程以及系统实现的过程和关键技术。Asca-Java不仅支持检测规则、检测算法以及第三方检测引擎的自定义和扩展,还支持任务多线程提
27、升代码检测的效率。最后本文通过系统测试验证了Asca-Java的有效性。本文的后续工作将从改进漏洞规则、优化漏洞检测算法和开展分布式代码漏洞检测等方向开展更深入的研究。1傅质馨,李潇逸,袁越.泛在电力物联网关键技术探讨J.电力建设,2 0 19,40(5):1-12.2 蒋南允,程光.智能电网入侵检测综述 J.网络空间32G,硬盘容量512 GB。漏洞检测报告如图7 所示,从图中可以看出Asca-Java能够有效、准确地检测出这3种漏洞。DAsca-java-Report.xml/Users/jady/Documents/Asca-ava/temp/task1/teste1totalTine3
28、274/totaLTime/Users/jady/Documents/Asca-java/workspace/task1/teste1/classessdescription代码中创建数据库的时用了写死的明文此代码使用写死的常量密码创建数据库连接。任何可以访问源代码或编译代码的人都可以轻检地知道密码/details:文a码温润介绍(CWE-259:UseofHard-codedPassword)参考网址:https:/cwe.mitre.org/data/definitions/259.htmL硬编码密码通常会导致系统管管理员很难检测到的严重身份验证失败。一旦检测到,就很难修复,固此管理员可能
29、会被追完全禁用该产品,主要有两种变化:入站:软件包含一个验证机制,用于检宣硬端码密码,2 出站:软件连接到另一个系统或组件,并且它包含用于连接到该组件的硬编码密码,在入站变量中,将创建一个默认的管理账户,并将一个简单的密码硬编码到产品中并与该帐户关联。的组织中,这使得诸如端虫之类的大规模攻击得以发生,出站变体适用于通过后端服务进行身份验证的端系镜。后端服务可能需要品的每次安装都是相同的,系统管理员通常无法在不手动修改程序或修补软件的情况下更改或禁用此密码,如果发现或发布了密码(这在互联网上很常见),那么任何知道该密码的人都可以访间该产品,最后,由于软件的所有安装都将具有相同的密码,即使是在不同
30、/rule硬编码到前端软件中。该程序的任何用户都可以提取密码。具有硬编码密码的客户端系统构成了更大的减助。因为从二进制文件中提取密码通常非常简单。ctraceListtrace locationtestcode/password/onstantasswords.Java.Linemessagetypedefault/idefectss/bugCollectionz该方法以字特申的形式来调用SQLstatemcdescription传遂给SQL语句上的execute或addBatch方法的非常量字符串/descriptionecom七10 nsD输入验证:检意用户辅入的合法性,尽量的限制用户输入
31、特球的号,确信输入的内容只包含合法的数据。数据检意应当在客户端和服务器端都执行之所以要执行服务器端验证,是为了弥补客户端验证机制貌弱的安全性。了就不一定会解密成功,尽量不要用一些常见的加密算法,就算用也要使用32 位以上的加密算法,将用户登录名称、密码等数据加密保存,加密用户输入的数据,然后再特它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒“处理,用户输入的数不再对数存储过程来执行所有的查询:SQL参数的传递方式将防止利用单引号和连字符实施注入。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行。所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入
32、式了。Web编程语言(如PHP、Ja v a)提供了用于构建和执行SQL语句的各种方法,开发人员通常依靠动态字特事辨接来构造SOL语句,在执行期间,系统直接使用从外部源接收的输入形成置询,这种方法可以根据用户设置的不同条件构建不同的意询。又由于SQL语言具有丰富多样性,且包含不同的都有很大概率被攻击。而且由于缺乏经验,开发者常常对用户输入过滤不充分,当攻击者通过认真构造的URL参数或表单提交的参数,拼接到事先定义好的SQL重询时,就可以改变开发者预期的SQL结构,执行该语句得到结果己不是开发者期望的,就形成SQL注入攻击。参考文献。最常用的方法是对密码进行模糊化(例如:要先经过hash处理再存
33、储),并将密码存在外部资源文件中进行管理。gua:ggge-3AvALevel-3”type安全”,mainType=SQL注入 subType学特注入 一些详细的错误消息,因为可以利用这些消息,要使用一种标准的输入确认机制来验证所有的输入数据的长度、类型、语句、企业规则等3加密处理:在ment的execute方法,它似乎是动态生成SQL请句的方法,这会更睿易爱到sL注入攻击,/details硬瑞码密码对于产个易于发现的固定密码,程序员可以简单地将那些后端免证一开始的CDNS例子中没有加密的数据就直接被利用了,但是加密图7 Asca-Java漏洞检测报告截图安全,2 0 18,9(1):9 3
34、-9 8.3丁斌,袁博,郑焕坤,等基于大数据分析的电力信息系统安全状态监测技术研究 J电测与仪表,2 0 2 1,58(11):59-66.4王琨,杜亮,马来对山拜,等。面向智能电网应用的电力大数据关键技术研究 J.微型电脑应用,2 0 2 1,3 7(8):123-126.5刘家男,翁健.智能电网安全研究综述J.信息网络安全,2 0 16(5):7 8-8 4.6 陆申明,左志强,王林章.静态程序分析并行化研究进展J.软件学报,2 0 2 0,31(5):12 43-12 54.胡强新,纪鑫,杨俊伟,等.基于电力软件缺陷模式的代码检测技术研究 J.电力信息与通信技术,2 0 17,15(5):92-96.8 徐家宁,陈齐瑞,张维,等.基于消息列队的电力信息平台安全漏洞智能检测 J.微型电脑应用,2 0 2 1,3 7(6):91-94.(收稿日期:2 0 2 2-0 1-2 1).121.