1.本技术涉及人工智能技术领域,尤其涉及一种源代码审计方法和装置、电子设备及存储介质。
背景技术:2.源码审计作为软件安全开发流程的重要一环,着力于在程序员开发完源码后进行源码扫描,这些扫描后的源码缺陷极有可能被攻击者利用,同时在此阶段的缺陷修复也极大程度地保障了业务系统的安全性。因此,商用的解决方案成本及维护成本普遍比较昂贵,如fortify sca,checkmarx等,它们提供了一套全面的源码审计解决方案,帮助企业在软件开发过程中查找、识别、追踪各大主流漏洞,提升企业抵御网络入侵、数据泄漏等安全问题的能力。
3.商业工具的漏洞检测能力精确率高,但同时带来了软件费用昂贵,学习成本高,使用环境及部署不够灵活,在创新型小企业如雨后春笋般出现的时代,往往这类企业因为种种原因对源码审计的投入的资金有限,未使用合适的工具,系统发布后才发现存在许多外部安全风险。另外商业工具漏洞规则迭代周期慢,在信息安全领域中每天都有新的漏洞出现,这种与时间竞赛的漏洞修复作业,商业工具可能还未及时推出新版本进行覆盖,出现没有及时识别出新型漏洞告警的情况,导致缺陷容易被不法分子利用,造成业务系统存在较大的风险。
技术实现要素:4.本技术实施例的主要目的在于提出一种源代码审计方法和装置、电子设备及存储介质,能够降低购买商业软件所带来的昂贵费用以及维护费用,可部署在内部服务器上,操作方便灵活,可移植性强,而且可以极大降低业务系统的风险。
5.为实现上述目的,本技术实施例的第一方面提出了一种源代码审计方法,应用于服务器,所述方法包括:
6.获取源代码文档和漏洞信息;
7.识别所述源代码文档的源代码信息;
8.根据所述漏洞信息生成漏洞审计规则;
9.根据所述漏洞审计规则对所述源代码信息进行漏洞匹配,以识别出源代码漏洞;
10.根据所述源代码漏洞生成漏洞审计结果。
11.在一些实施例,所述获取源代码文档,包括:
12.通过命令行界面cli或应用程序接口api进行源代码扫描来获取所述源代码文档。
13.在一些实施例,所述源代码信息包括源代码的文档类型、语言类型和框架类型,所述识别所述源代码文档的文档类型和源代码信息,包括:
14.通过所述源代码文档的后缀识别所述源代码的文档类型;
15.通过所述源代码的文档类型识别所述源代码的语言类型;
16.通过所述源代码文档的依赖关系识别所述源代码的框架类型。
17.在一些实施例,所述根据所述漏洞审计规则对所述源代码信息进行漏洞匹配,以识别出源代码漏洞,包括:
18.根据所述漏洞审计规则对所述框架类型进行漏洞匹配,以识别出第一源代码漏洞,其中,所述第一源代码漏洞用于表征cve安全漏洞;
19.根据所述漏洞审计规则对所述源代码信息进行漏洞匹配,以识别出第二源代码漏洞,其中,所述第二源代码漏洞用于表征用户自身编写源代码的安全漏洞。
20.在一些实施例,所述根据所述漏洞审计规则对所述源代码信息进行漏洞匹配,以识别出第二源代码漏洞,包括:
21.对所述源代码进行词法分析和语法分析,生成所述源代码的抽象语法树;
22.遍历所述抽象语法树,将所述抽象语法树的参数与所述漏洞审计规则中的语言参数漏洞规则进行匹配;
23.在所述抽象语法树的参数与所述漏洞审计规则中的语言参数漏洞规则相匹配的情况下,确定所述源代码文档存在所述第二源代码漏洞。
24.在一些实施例,所述根据所述漏洞审计规则对所述源代码信息进行漏洞匹配,以识别出第二源代码漏洞,包括:
25.识别所述源代码文档的后缀;
26.将所述源代码文档的后缀与所述漏洞审计规则中的后缀漏洞规则进行匹配;
27.在所述源代码文档的后缀与所述后缀漏洞规则相匹配的情况下,确定所述源代码文档存在所述第二源代码漏洞。
28.在一些实施例,所述根据所述漏洞审计规则对所述源代码信息进行漏洞匹配,以识别出第二源代码漏洞,包括:
29.识别所述源代码文档中包含的关键字;
30.将所述源代码文档的关键字与所述漏洞审计规则中的关键字漏洞规则进行匹配;
31.在所述源代码文档的关键字与所述后缀漏洞规则相匹配的情况下,确定所述源代码文档存在所述第二源代码漏洞。
32.为实现上述目的,本技术实施例的第二方面提出了一种源代码审计装置,所述装置包括:
33.获取模块,用于获取源代码文档和漏洞信息;
34.识别模块,用于识别所述源代码文档的源代码信息;
35.生成模块,用于根据所述漏洞信息生成漏洞审计规则;
36.匹配模块,用于根据所述漏洞审计规则对所述源代码信息进行漏洞匹配,以识别出源代码漏洞;
37.输出模块,用于根据所述源代码漏洞生成漏洞审计结果。
38.为实现上述目的,本技术实施例的第三方面提出了一种电子设备,所述电子设备包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现上述第一方面所述的方法。
39.为实现上述目的,本技术实施例的第四方面提出了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述第一
方面所述的方法。
40.本技术提出的源代码审计方法和装置、电子设备及存储介质,通过获取源代码文档和漏洞信息;识别源代码文档的源代码信息;根据所述漏洞信息生成漏洞审计规则;根据所述漏洞审计规则对源代码信息进行漏洞匹配,以识别出源代码漏洞;根据源代码漏洞生成漏洞审计结果。基于此,本技术通过自动识别源代码文档的源代码信息,并根据漏洞信息生成漏洞审计规则,利用生成的漏洞审计规则以漏洞匹配的方式对源代码信息进行审计,以识别出源代码漏洞,再将识别出的源代码漏洞生成漏洞审计结果,以实现对源代码文档的审计,从而能够极大降低业务系统的风险。而且,本技术可部署在内部服务器上,具有操作简单、方便灵活、可移植性强的优势。
附图说明
41.图1是本技术实施例提供的源代码审计方法的流程图;
42.图2是图1中的步骤s102的流程图;
43.图3是图2中的步骤s104的流程图;
44.图4是图3中的步骤s302的流程图;
45.图5是图3中的步骤s302的流程图;
46.图6是图3中的步骤s302的流程图;
47.图7是本技术另一实施例提供的源代码审计方法的流程图;
48.图8是本技术实施例提供的源代码审计装置的结构示意图;
49.图9是本技术实施例提供的电子设备的硬件结构示意图。
具体实施方式
50.为了使本技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本技术进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本技术,并不用于限定本技术。
51.需要说明的是,虽然在装置示意图中进行了功能模块划分,在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于装置中的模块划分,或流程图中的顺序执行所示出或描述的步骤。说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。
52.除非另有定义,本文所使用的所有的技术和科学术语与属于本技术的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本技术实施例的目的,不是旨在限制本技术。
53.首先,对本技术中涉及的若干名词进行解析:
54.人工智能(artificial intelligence,ai):是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学;人工智能是计算机科学的一个分支,人工智能企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能可以对人的意识、思维的信息过程的模拟。人工智能还是利用数字计算机或者数字计算机控制的机器模拟、延伸和扩展人的智能,感知环境、获取知识并使用知识获得最
佳结果的理论、方法、技术及应用系统。
55.源代码:也称源程序,是指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令。在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,通过编译器完成。
56.漏洞:是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。具体举例来说,比如在intel pentium芯片中存在的逻辑错误,在sendmail早期版本中的编程错误,在nfs协议中认证方式上的弱点,在unix系统管理员设置匿名ftp服务时配置不当的问题都可能被攻击者使用,威胁到系统的安全。因而这些都可以认为是系统中存在的安全漏洞。
57.源代码审计:顾名思义就是检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过自动化工具或者人工审查的方式,对程序源代码逐条进行检查和分析,发现这些源代码缺陷引发的安全漏洞,并提供代码修订措施和建议。
58.通用漏洞披露(common vulnerabilities&exposures,cve):cve就好像是一个字典表,为广泛认同的信息安全漏洞或者已经暴露出来的弱点给出一个公共的名称。使用一个共同的名字,可以帮助用户在各自独立的各种漏洞数据库中和漏洞评估工具中共享数据,虽然这些工具很难整合在一起。这样就使得cve成为了安全信息共享的“关键字”。如果在一个漏洞报告中指明的一个漏洞,如果有cve名称,你就可以快速地在任何其它cve兼容的数据库中找到相应修补的信息,解决安全问题。
59.命令行界面(command-line interface,cli):是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。也有人称之为字符用户界面(cui)。通常认为,命令行界面(cli)没有图形用户界面(gui)那么方便用户操作。因为,命令行界面的软件通常需要用户记忆操作的命令,但是,由于其本身的特点,命令行界面要较图形用户界面节约计算机系统的资源。在熟记命令的前提下,使用命令行界面往往要较使用图形用户界面的操作速度要快。所以,图形用户界面的操作系统中,都保留着可选的命令行界面。
60.应用程序接口(application programming interface,api):是预定义的函数集合,程序可以利用它访问操作环境的其他部分,也就是与操作系统进行通信。网络协议栈就是api概念的典型应用,网络api提供了程序与协议栈的接口,应用程序利用api的函数打开和关闭连接、从网络读取和写入数据。
61.框架(framework):指的是实现了某应用领域通用完备功能的底层服务。使用这种框架的编程人员可以在一个通用功能已经实现的基础上开始具体的系统开发。框架提供了所有应用期望的默认行为的类集合。具体的应用通过重写子类(该子类属于框架的默认行为)或组装对象来支持应用专用的行为。
62.后缀:也叫文件扩展名,是用来表示某种文件格式所采用的机制。文件扩展名是加在主文件名后面的,用“.”分隔。不同的软件要求不同的文件格式,后缀名可以帮助用户了解文件是应该使用哪种软件打开文件。
63.词法分析(lexical analysis):是计算机科学中将字符序列转换为单词(token)
序列的过程。进行词法分析的程序或者函数叫作词法分析器(lexicalanalyzer,简称lexer),也叫扫描器(scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器。完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器。从左至右地对源程序进行扫描,按照语言的词法规则识别各类单词,并产生相应单词的属性字。
64.语法分析:是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.语法分析程序可以用yacc等工具自动生成。完成语法分析任务的程序称为语法分析器,或语法分析程序。按照源语言的语法规则,从词法分析的结果中识别出相应的语法范畴,同时进行语法检查。
65.抽象语法树(abstract syntax tree,ast):是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。
66.关键字:是用来标识文件中各个记录的特定数据项目的值,是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字。
67.源代码扫描:是指在软件工程中,程序员在写好源代码后,无需经过编译器编译,而直接使用一些扫描工具对其进行扫描,找出代码当中存在的一些语义缺陷、安全漏洞的解决方案。静态扫描技术已经从90年代时候的,编码规则匹配这种由编译技术拓展过来的分析技术向程序模拟全路径执行的方向发展,由此,这种模拟执行相对的执行路径比动态执行更多,能够发现很多动态测试难以发现的缺陷。
68.网络爬虫:又称为网页蜘蛛,网络机器人,在foaf社区中间,更经常的称为网页追逐者,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
69.基于此,本技术实施例提供了一种源代码审计方法和装置、电子设备及存储介质,通过获取源代码文档和漏洞信息;识别源代码文档的源代码信息;根据所述漏洞信息生成漏洞审计规则;根据所述漏洞审计规则对源代码信息进行漏洞匹配,以识别出源代码漏洞;根据源代码漏洞生成漏洞审计结果。基于此,本技术通过自动识别源代码文档的源代码信息,并根据漏洞信息生成漏洞审计规则,利用生成的漏洞审计规则以漏洞匹配的方式对源代码信息进行审计,以识别出源代码漏洞,再将识别出的源代码漏洞生成漏洞审计结果,以实现对源代码文档的审计,从而能够极大降低业务系统的风险。而且,本技术可部署在内部服务器上,具有操作简单、方便灵活、可移植性强的优势。
70.本技术实施例提供的源代码审计方法和装置、电子设备及存储介质,具体通过如下实施例进行说明,首先描述本技术实施例中的源代码审计方法。
71.本技术实施例可以基于人工智能技术对相关的数据进行获取和处理。其中,人工智能(artificial intelligence,ai)是利用数字计算机或者数字计算机控制的机器模拟、延伸和扩展人的智能,感知环境、获取知识并使用知识获得最佳结果的理论、方法、技术及应用系统。
72.人工智能基础技术一般包括如传感器、专用人工智能芯片、云计算、分布式存储、大数据处理技术、操作/交互系统、机电一体化等技术。人工智能软件技术主要包括计算机视觉技术、机器人技术、生物识别技术、语音处理技术、自然语言处理技术以及机器学习/深
度学习等几大方向。
73.本技术实施例提供的源代码审计方法,涉及人工智能技术领域。本技术实施例提供的源代码审计方法可应用于终端中,也可应用于服务器端中,还可以是运行于终端或服务器端中的软件。在一些实施例中,终端可以是智能手机、平板电脑、笔记本电脑、台式计算机等;服务器端可以配置成独立的物理服务器,也可以配置成多个物理服务器构成的服务器集群或者分布式系统,还可以配置成提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、cdn以及大数据和人工智能平台等基础云计算服务的云服务器;软件可以是实现源代码审计方法的应用等,但并不局限于以上形式。
74.本技术可用于众多通用或专用的计算机系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络pc、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。本技术可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本技术,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
75.需要说明的是,在本技术的各个具体实施方式中,当涉及到需要根据用户信息、用户行为数据,用户历史数据以及用户位置信息等与用户身份或特性相关的数据进行相关处理时,都会先获得用户的许可或者同意,而且,对这些数据的收集、使用和处理等,都会遵守相关国家和地区的相关法律法规和标准。此外,当本技术实施例需要获取用户的敏感个人信息时,会通过弹窗或者跳转到确认页面等方式获得用户的单独许可或者单独同意,在明确获得用户的单独许可或者单独同意之后,再获取用于使本技术实施例能够正常运行的必要的用户相关数据。
76.图1是本技术实施例提供的源代码审计方法的一个可选的流程图,图1中的方法可以包括但不限于包括步骤s101至步骤s105。
77.步骤s101,获取源代码文档和漏洞信息;
78.步骤s102,识别源代码文档的源代码信息;
79.步骤s103,根据漏洞信息生成漏洞审计规则;
80.步骤s104,根据漏洞审计规则对源代码信息进行漏洞匹配,以识别出源代码漏洞;
81.步骤s105,根据源代码漏洞生成漏洞审计结果。
82.在一些实施例的步骤s101中,对于获取源码文档的路径,可以是仓库路径也可以是本地存储的文档,源代码扫描可以提供cli模式和api模式两种模式,以便满足实际业务场景。
83.在实际软件开发流程中,往往使用数据仓库进行源码存储,通过持续集成工具进行软件的打包、发布、部署,同时也提供以web形式部署在服务器上,供相关人员通过页面形式访问使用,也可以通过api集成到ci或发布系统中。
84.对于漏洞信息的获取方式,可以由用户输入或者编辑而形成的漏洞列表,也可以是导入使用网络爬虫自动抓取历史发布的漏洞数据。
85.在一些实施例的步骤s102中,识别源代码文档的源代码信息,例如,识别出源代码的语言类型及框架类型,方便后续扫描处理。具体地,可以通过文档后缀,比如.java/.php/.py等识别项目涉及的语言类型;可以通过依赖识别框架类型,比如spring/laravel/django等。
86.在一些实施例的步骤s103中,根据漏洞信息生成漏洞审计规则,相比于采用商业工具迭代周期慢,不能及时覆盖新漏洞存在风险,本技术可以由用户自身即可对漏洞信息进行实时编辑和维护,可以及时将新漏洞纳入到漏洞信息,并根据最新的漏洞信息生成漏洞审计规则,利用漏洞审计规则以漏洞匹配的方式对源代码信息进行审计,再根据识别出的源代码漏洞生成漏洞审计结果,从而能够极大降低业务系统的风险。
87.在一些实施例的步骤s104中,利用生成的漏洞审计规则以漏洞匹配的方式对源代码信息进行审计,漏洞审计规则文档可以采用如html、xml的格式,以便于日常维护,方便增加新规则。漏洞匹配可以包括但不限于源代码框架类型匹配、源代码语言参数匹配、文档后缀匹配和关键字匹配,以识别出源代码漏洞,从而能够极大降低业务系统的风险。例如,当用户发现新安全漏洞,则可迅速地编辑漏洞信息,并转换成漏洞规则文档,可以添加至漏洞扫描器中,极大降低业务系统的风险。因此,本技术为企业自研静态的源码审计技术或工具提供了解决方案。
88.在一些实施例的步骤s105中,根据识别出的源代码漏洞生成漏洞审计结果,以实现对源代码文档的审计,从而能够极大降低业务系统的风险。需要指出的是,漏洞审计结果能够以漏洞结果报告的形式输出,漏洞结果报告需要较完整的信息以及可追溯的能力,其可以包括但不限于各等级漏洞数量、扫描文档总数、扫描漏洞总数、漏洞位置、修复建议、自动发送功能等,支持历史查看,时间段搜索,便于企业内部查看和参考报告汇总的漏洞审计结果。
89.需要说明的是,本技术可以在中小企业内网中进行集成开发,降低购买商业软件所带来的昂贵费用以及维护费用,可部署在内部服务器上,操作简单,方便灵活,可移植性强。
90.本技术实施例所示意的步骤s101至步骤s105,获取源代码文档和漏洞信息;识别源代码文档的源代码信息;根据所述漏洞信息生成漏洞审计规则;根据所述漏洞审计规则对源代码信息进行漏洞匹配,以识别出源代码漏洞;根据源代码漏洞生成漏洞审计结果。基于此,本技术通过自动识别源代码文档的源代码信息,并根据漏洞信息生成漏洞审计规则,利用生成的漏洞审计规则以漏洞匹配的方式对源代码信息进行审计,以识别出源代码漏洞,再将识别出的源代码漏洞生成漏洞审计结果,以实现对源代码文档的审计,从而能够极大降低业务系统的风险。
91.在一些实施例中,步骤s101可以包括但不限于如下步骤:
92.通过命令行界面cli或应用程序接口api进行源代码扫描来获取源代码文档。
93.在本技术的一些实施例中,对于获取源码文档的路径,可以是仓库路径也可以是本地存储的文档,源代码扫描可以提供cli模式和api模式两种模式,以便满足实际业务场景。其中,cli模式为命令行运行模式,api模式为应用程序接口模式,api是操作系统中最常用的接口,也是计算机与软件之间的交互。
94.请参阅图2,在一些实施例中,步骤s102可以包括但不限于包括步骤s201至步骤
s203:
95.步骤s201,通过源代码文档的后缀识别源代码的文档类型;
96.步骤s202,通过源代码的文档类型识别源代码的语言类型;
97.步骤s203,通过源代码文档的依赖关系识别源代码的框架类型。
98.在本技术的一些实施例中,源代码信息可以包括但不限于源代码的文档类型、语言类型和框架类型。可以通过源代码文档的后缀识别源代码的文档类型,通过源代码的文档类型识别源代码的语言类型,通过源代码文档的依赖关系识别源代码的框架类型。例如,识别源代码文档的源代码信息,例如,识别出源代码的语言类型及框架类型,方便后续扫描处理。具体地,可以通过文档后缀,比如.java/.php/.py等识别项目涉及的语言类型;可以通过依赖识别框架类型,比如spring/laravel/django等。
99.请参阅图3,在一些实施例中,步骤s104可以包括但不限于包括步骤s301至步骤s302:
100.步骤s301,根据漏洞审计规则对框架类型进行漏洞匹配,以识别出第一源代码漏洞,其中,第一源代码漏洞用于表征cve安全漏洞;
101.步骤s302,根据漏洞审计规则对源代码信息进行漏洞匹配,以识别出第二源代码漏洞,其中,第二源代码漏洞用于表征用户自身编写源代码的安全漏洞。
102.在本技术的一些实施例中,源代码审计可以分为如下两大类:
103.一类是第一源代码漏洞,即公开的cve已知的漏洞,都是基于在特定软件产品中发现的特定漏洞或暴露,如cve-2021-44228的log4j2组件漏洞,涉及版本apache log4j 2.x《=2.14.1,这种类型的漏洞可以通过项目依赖文档进行识别,开发者只需编辑cve对应框架类型规则文档。每一个cve通常对应一种组件类型漏洞,比如cve-2021-25735对应的是kubernetes的验证绕过漏洞;cve-2021-44228对应的是log4j2的反序列化漏洞。漏洞审计规则文档可以是一份漏洞列表,里面存有cve编号以及对应涉及的组件加版本号,例如
104.《cve i d="cve-2021-44228"》
105.《product》log4j:2.6《/product》
106.《product》log4j:2.7《/product》
107.《product》log4j:2.4《/product》
108.《product》log4j:2.0《/product》
109....
110.《/cve》
111.假定项目依赖文档中使用的是log4j:2.6,就意味着匹配到漏洞审计规则。
112.另一类是第二源代码漏洞,即用户自身编写源码本身的安全漏洞,基于一般类别或类型的漏洞,如sql注入、csrf跨站请求伪造、命令注入等。这种安全漏洞分三小类可以通过如下三种漏洞匹配方式进行区分识别,第一小类为源代码抽象语法树参数匹配,第二小类为文档后缀匹配,第三小类为关键字匹配。
113.需要说明的是,在实际软件开发中为了实现某单一功能,往往可以利用外部官方的或者第三方的程序模块进行实现,也可称为组件,此时本地代码工程需要正常运行,就需要从外部导入的一些组件,这种关系就是依赖。项目依赖文档就是描述这种关系的一个文本,每个软件源码文件夹都会有这个文件,也用作于项目部署发布时自动下载依赖提供依
据。这个文件通常是自动生成的,比如java使用的项目管理工具maven,它会根据项目自动产生一个pom.xml的文件,里面就存放着依赖项,用户就可以从中获取到依赖组件的名称以及版本,再与用户自身维护的规则文档的组件名称和版本进行比对,所以规则文档里必须维护存放有漏洞的组件,包含名称和版本。
114.请参阅图4,在一些实施例中,步骤s302可以包括但不限于包括步骤s401至步骤s403:
115.步骤s401,对源代码进行词法分析和语法分析,生成源代码的抽象语法树;
116.步骤s402,遍历抽象语法树,将抽象语法树的参数与漏洞审计规则中的语言参数漏洞规则进行匹配;
117.步骤s403,在抽象语法树的参数与漏洞审计规则中的语言参数漏洞规则相匹配的情况下,确定源代码文档存在第二源代码漏洞。
118.在本技术的一些实施例中,需要使用词法分析和语法分析生成源代码抽象语法树,基于此抽象语法树进行参数规则匹配,为什么需要对入参进行判断,因为漏洞的利用都是因为外部输入导致的,所以只需对参数进行确认。每一种编程语言都其对应的词法和语法分析,才能让工具知道源码说的话。例如,如果工具要支持java的,必须要有针对java的语法和词法分析;要支持php的,则必须要有php的语法和词法分析,从而生成对应的语法树,类似于人类的语言含义。遍历语法树,判断入参是否可控,可控代表攻击者无法通过外部进行漏洞攻击,参数不可控则代表此源码有被攻击者从外部环境攻陷的可能性。
119.请参阅图5,在一些实施例中,步骤s302可以包括但不限于包括步骤s501至步骤s503:
120.步骤s501,识别源代码文档的后缀;
121.步骤s502,将源代码文档的后缀与漏洞审计规则中的后缀漏洞规则进行匹配;
122.步骤s503,在源代码文档的后缀与后缀漏洞规则相匹配的情况下,确定源代码文档存在第二源代码漏洞。
123.在本技术的一些实施例中,对于文档后缀匹配,是指当检测到某些特定的文档的后缀与漏洞审计规则中的后缀漏洞规则内容相匹配,则认为存在漏洞。例如,在配置不当的情况下,可能把存在风险的文件直接部署到线上环境。举例:比如版本控制目录.git,如果其他人能访问到.git文件夹,就可以通过手段获取到源码,还有.svn/.ds_store等都是有源码泄漏的风险。又如.certificate/.log这种里面可能有账号密码id等敏感数据,有被利用的风险。因此,这类不必要的且对业务没影响的文件不应该存在于源码文件中。又如.log日志文档/.thumb缓存文档等,此类文档通常含有敏感数据,不应存在与源码工程里,减少信息泄漏的风险。
124.请参阅图6,在一些实施例中,步骤s302可以包括但不限于包括步骤s601至步骤s603:
125.步骤s601,识别源代码文档中包含的关键字;
126.步骤s602,将源代码文档的关键字与漏洞审计规则中的关键字漏洞规则进行匹配;
127.步骤s603,在源代码文档的关键字与后缀漏洞规则相匹配的情况下,确定源代码文档存在第二源代码漏洞。
128.在本技术的一些实施例中,对于关键字匹配,是指当检测到源代码文档的关键字与漏洞审计规则中的关键字漏洞规则内容相匹配,则认为存在漏洞。在程序中一般采用硬编码的方式处理密码,软件投入使用后,无法修改密码,如果被有源码权限的人无意中误用密码,或是被攻击者利用反编译工具阅读到源码,会对系统的访问权限造成严重的破坏,一旦被利用,此安全问题一般无法轻易修正。需要说明的是,硬编码就是将数据写到代码中进行开发编译,而不是数据和代码解耦,那么如何才能发现源码中哪些是硬编码,这往往需要利用关键字:类似key/password/pwd这种特殊的变量名称进行搜索,比如源码中定义了pwd=’123456’,如果有关键字
‘
pwd=’进行过滤,这样就能找到硬编码的地方了;又或者利用加密算法后位数的特性进行筛选,比如md5加密后有32位,那么在源码中如果含有连续32位的英文数字的关键字,很大可能就是硬编码数据。
129.以下结合附图和具体实施例进一步说明本技术的源代码审计方法。
130.如图7所示,源代码审计方法具体流程如下:
131.①
获取源码文档,可以是仓库路径或者本地存储的文档,扫描方式提供cli模式和api模式两种,以便满足实际业务场景。
132.在实际软件开发流程中,往往使用数据仓库进行源码存储,通过持续集成工具进行软件的打包、发布、部署,同时也提供以web形式部署在服务器上,供相关人员通过页面形式访问使用,也可以通过api集成到ci或发布系统中。
133.②
识别出源码语言及框架类型,方便后续扫描处理,可通过文档后缀,比如.java/.php/.py等识别项目涉及语言;通过依赖识别框架类型,比如spring/laravel/django等。
134.③
源码审计主程序主要分为两大类:
135.一类是公开的cve已知的漏洞,都是基于在特定软件产品中发现的特定漏洞或暴露,如cve-2021-44228的log4j2组件漏洞,涉及版本apache log4j 2.x《=2.14.12.15.0-rc1,这种类型的漏洞可以通过项目依赖文档进行识别,开发者只需编辑cve对应框架类型规则文档。
136.一类是自己编写源码本身的安全漏洞,基于一般类别或类型的漏洞,如sql注入、csrf跨站请求伪造、命令注入等。这种安全漏洞分三小类进行区分识别:
137.第一小类为源码分析,需要使用词法分析lex和语法分析yacc生成源码语法抽象树,基于此抽象树进行参数规则匹配,为什么需要对入参进行判断,因为漏洞的利用都是因为外部输入导致的,所以只需对参数进行确认。每一种编程语言都其对应的词法和语法分析,才能让工具知道源码说的话,所以如果工具要支持java的,必须要有针对java的语法和词法分析;要支持php的,则必须要有php的语法和词法分析,从而生成对应的语法树,类似于人类的语言含义。遍历语法树,判断入参是否可控,可控代表攻击者无法通过外部进行漏洞攻击,参数不可控则代表此源码有被攻击者从外部环境攻陷的可能性。
138.第二小类为文档后缀匹配,如.certificate的证书文档/.log日志文档/.thumb缓存文档等,此类文档通常含有敏感数据,不应存在与源码工程里,减少信息泄漏的风险。
139.第三小类为关键字匹配,最常见的就是程序中采用硬编码的方式处理密码,软件投入使用后,无法修改密码,如果被有源码权限的人无意中误用密码,或是被攻击者利用反编译工具阅读到源码,会对系统的访问权限造成严重的破坏,一旦被利用,此安全问题一般
无法轻易修正。
140.④
漏洞结果报告需要较完整的信息以及可追溯的能力,应包含各等级漏洞数量/扫描文档总数/扫描漏洞总数/漏洞位置/修复建议/自动发送功能等,支持历史查看,时间段搜索。
141.基于此,本技术可以在中小企业内网中进行集成开发,降低购买商业软件所带来的昂贵费用以及维护费用,可部署在内部服务器上,操作简单,方便灵活,可移植性强。漏洞审计规则都由根据用户确定的漏洞信息转换而得到,如cve漏洞,可使用爬虫将历史发布数据转换成规则文档,安全漏洞则需长期维护,如发现新安全漏洞,则可迅速地更新漏洞审计规则文档,并添加至扫描器中,从而极大降低业务系统的风险。
142.请参阅图8,本技术实施例还提供一种源代码审计装置,可以实现上述源代码审计方法,该装置包括:
143.获取模块810,用于获取源代码文档和漏洞信息;
144.识别模块820,用于识别源代码文档的源代码信息;
145.生成模块830,用于根据漏洞信息生成漏洞审计规则;
146.匹配模块840,用于根据漏洞审计规则对源代码信息进行漏洞匹配,以识别出源代码漏洞;
147.输出模块850,用于根据源代码漏洞生成漏洞审计结果。
148.在本技术的一些实施例中,获取模块810获取源代码文档和漏洞信息,识别模块820识别源代码文档的源代码信息,生成模块830根据漏洞信息生成漏洞审计规则,匹配模块840根据漏洞审计规则对源代码信息进行漏洞匹配,以识别出源代码漏洞,输出模块850根据源代码漏洞生成漏洞审计结果。
149.在本技术的一些实施例中,对于获取模块810获取源码文档的路径,可以是仓库路径也可以是本地存储的文档,源代码扫描可以提供cli模式和api模式两种模式,以便满足实际业务场景。
150.在实际软件开发流程中,往往使用数据仓库进行源码存储,通过持续集成工具进行软件的打包、发布、部署,同时也提供以web形式部署在服务器上,供相关人员通过页面形式访问使用,也可以通过api集成到ci或发布系统中。
151.对于漏洞信息的获取方式,可以由用户输入或者编辑而形成的漏洞列表,也可以是导入使用网络爬虫自动抓取历史发布的漏洞数据。
152.在本技术的一些实施例中,识别模块820识别源代码文档的源代码信息,例如,识别出源代码的语言类型及框架类型,方便后续扫描处理。具体地,可以通过文档后缀,比如.java/.php/.py等识别项目涉及的语言类型;可以通过依赖识别框架类型,比如spring/laravel/django等。
153.在本技术的一些实施例中,生成模块830根据漏洞信息生成漏洞审计规则,相比于采用商业工具迭代周期慢,不能及时覆盖新漏洞存在风险,本技术可以由用户自身即可对漏洞信息进行实时编辑和维护,可以及时将新漏洞纳入到漏洞信息,并根据最新的漏洞信息生成漏洞审计规则,利用漏洞审计规则以漏洞匹配的方式对源代码信息进行审计,再根据识别出的源代码漏洞生成漏洞审计结果,从而能够极大降低业务系统的风险。
154.在本技术的一些实施例中,匹配模块840利用生成的漏洞审计规则以漏洞匹配的
方式对源代码信息进行审计,漏洞审计规则文档可以采用如html、xml的格式,以便于日常维护,方便增加新规则。漏洞匹配可以包括但不限于源代码框架类型匹配、源代码语言参数匹配、文档后缀匹配和关键字匹配,以识别出源代码漏洞,从而能够极大降低业务系统的风险。例如,当用户发现新安全漏洞,则可迅速地编辑漏洞信息,并转换成漏洞规则文档,可以添加至漏洞扫描器中,极大降低业务系统的风险。因此,本技术为企业自研静态的源码审计技术或工具提供了解决方案。
155.在本技术的一些实施例中,输出模块850根据识别出的源代码漏洞生成漏洞审计结果,以实现对源代码文档的审计,从而能够极大降低业务系统的风险。需要指出的是,漏洞审计结果能够以漏洞结果报告的形式输出,漏洞结果报告需要较完整的信息以及可追溯的能力,其可以包括但不限于各等级漏洞数量、扫描文档总数、扫描漏洞总数、漏洞位置、修复建议、自动发送功能等,支持历史查看,时间段搜索,便于企业内部查看和参考报告汇总的漏洞审计结果。
156.本技术实施例的源代码审计装置,获取模块810获取源代码文档和漏洞信息,识别模块820识别源代码文档的源代码信息,生成模块830根据漏洞信息生成漏洞审计规则,匹配模块840根据漏洞审计规则对源代码信息进行漏洞匹配,以识别出源代码漏洞,输出模块850根据源代码漏洞生成漏洞审计结果。基于此,本技术通过自动识别源代码文档的源代码信息,并根据漏洞信息生成漏洞审计规则,利用生成的漏洞审计规则以漏洞匹配的方式对源代码信息进行审计,以识别出源代码漏洞,再将识别出的源代码漏洞生成漏洞审计结果,以实现对源代码文档的审计,从而能够极大降低业务系统的风险。而且,本技术可部署在内部服务器上,具有操作简单、方便灵活、可移植性强的优势。
157.该源代码审计装置的具体实施方式与上述源代码审计方法的具体实施例基本相同,在此不再赘述。
158.本技术实施例还提供了一种电子设备,电子设备包括存储器和处理器,存储器存储有计算机程序,处理器执行计算机程序时实现上述源代码审计方法。该电子设备可以为包括平板电脑、车载电脑等任意智能终端。
159.请参阅图9,图9示意了另一实施例的电子设备的硬件结构,电子设备包括:
160.处理器901,可以采用通用的cpu(centralprocessingunit,中央处理器)、微处理器、应用专用集成电路(applicationspecificintegratedcircuit,asic)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本技术实施例所提供的技术方案。
161.存储器902,可以采用只读存储器(readonlymemory,rom)、静态存储设备、动态存储设备或者随机存取存储器(randomaccessmemory,ram)等形式实现。存储器902可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器902中,并由处理器901来调用执行本技术实施例的源代码审计方法,通过自动识别源代码文档的源代码信息,并根据漏洞信息生成漏洞审计规则,利用生成的漏洞审计规则以漏洞匹配的方式对源代码信息进行审计,以识别出源代码漏洞,再将识别出的源代码漏洞生成漏洞审计结果,以实现对源代码文档的审计,从而能够极大降低业务系统的风险。而且,本技术可部署在内部服务器上,具有操作简单、方便灵活、可移植性强的优势。
162.输入/输出接口903,用于实现信息输入及输出。
163.通信接口904,用于实现本设备与其他设备的通信交互,可以通过有线方式(例如usb、网线等)实现通信,也可以通过无线方式(例如移动网络、wifi、蓝牙等)实现通信。
164.总线,在设备的各个组件(例如处理器901、存储器902、输入/输出接口903和通信接口904)之间传输信息。
165.其中处理器901、存储器902、输入/输出接口903和通信接口904通过总线实现彼此之间在设备内部的通信连接。
166.本技术实施例还提供了一种计算机可读存储介质,该计算机可读存储介质存储有计算机程序,该计算机程序被处理器执行时实现上述源代码审计方法。
167.存储器作为一种非暂态计算机可读存储介质,可用于存储非暂态软件程序以及非暂态性计算机可执行程序。此外,存储器可以包括高速随机存取存储器,还可以包括非暂态存储器,例如至少一个磁盘存储器件、闪存器件、或其他非暂态固态存储器件。在一些实施方式中,存储器可选包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至该处理器。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
168.本技术实施例提供的源代码审计方法、源代码审计装置、电子设备及存储介质,通过自动识别源代码文档的源代码信息,并根据漏洞信息生成漏洞审计规则,利用生成的漏洞审计规则以漏洞匹配的方式对源代码信息进行审计,以识别出源代码漏洞,再将识别出的源代码漏洞生成漏洞审计结果,以实现对源代码文档的审计,从而能够极大降低业务系统的风险。而且,本技术可部署在内部服务器上,具有操作简单、方便灵活、可移植性强的优势。
169.本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统可以被实施为软件、固件、硬件及其适当的组合。某些物理组件或所有物理组件可以被实施为由处理器,如中央处理器、数字信号处理器或微处理器执行的软件,或者被实施为硬件,或者被实施为集成电路,如专用集成电路。这样的软件可以分布在计算机可读介质上,计算机可读介质可以包括计算机存储介质(或非暂时性介质)和通信介质(或暂时性介质)。如本领域普通技术人员公知的,术语计算机存储介质包括在用于存储信息(诸如计算机可读程序、数据结构、程序模块或其他数据)的任何方法或技术中实施的易失性和非易失性、可移除和不可移除介质。计算机存储介质包括但不限于ram、rom、eeprom、闪存或其他存储器技术、cd-rom、数字多功能盘(dvd)或其他光盘存储、磁盒、磁带、磁盘存储或其他磁存储装置、或者可以用于存储期望的信息并且可以被计算机访问的任何其他的介质。此外,本领域普通技术人员公知的是,通信介质通常包含计算机可读程序、数据结构、程序模块或者诸如载波或其他传输机制之类的调制数据信号中的其他数据,并且可包括任何信息递送介质。
170.本技术实施例描述的实施例是为了更加清楚的说明本技术实施例的技术方案,并不构成对于本技术实施例提供的技术方案的限定,本领域技术人员可知,随着技术的演变和新应用场景的出现,本技术实施例提供的技术方案对于类似的技术问题,同样适用。
171.本领域技术人员可以理解的是,图中示出的技术方案并不构成对本技术实施例的限定,可以包括比图示更多或更少的步骤,或者组合某些步骤,或者不同的步骤。
172.以上所描述的装置实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,即可以位于一个地方,或者也可以分布到多个网络单元上。
可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
173.本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统、设备中的功能模块/单元可以被实施为软件、固件、硬件及其适当的组合。
174.本技术的说明书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本技术的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
175.应当理解,在本技术中,“至少一个(项)”是指一个或者多个,“多个”是指两个或两个以上。“和/或”,用于描述关联对象的关联关系,表示可以存在三种关系,例如,“a和/或b”可以表示:只存在a,只存在b以及同时存在a和b三种情况,其中a,b可以是单数或者复数。字符“/”一般表示前后关联对象是一种“或”的关系。“以下至少一项(个)”或其类似表达,是指这些项中的任意组合,包括单项(个)或复数项(个)的任意组合。例如,a,b或c中的至少一项(个),可以表示:a,b,c,“a和b”,“a和c”,“b和c”,或“a和b和c”,其中a,b,c可以是单个,也可以是多个。
176.在本技术所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,上述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
177.上述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
178.另外,在本技术各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
179.集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括多指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本技术各个实施例的方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-only memory,简称rom)、随机存取存储器(random access memory,简称ram)、磁碟或者光盘等各种可以存储程序的介质。
180.以上参照附图说明了本技术实施例的优选实施例,并非因此局限本技术实施例的
权利范围。本领域技术人员不脱离本技术实施例的范围和实质内所作的任何修改、等同替换和改进,均应在本技术实施例的权利范围之内。