开源白盒 静态代码分析对比

news2024/11/26 1:39:20


背景

源代码安全检测是安全开发流程(SDL)中非常重要的一部分,在58集团的CI/CD流程里面临每天几千数量级的构建及发布,白盒检测的自动化能力显得极为重要。白盒扫描从漏洞发现的需求转变为了需要适应企业CI/CD流程的白盒建设需求,由于58业务大部分使用自研的Java框架,本文会简单的介绍58 Java白盒能力建设过程中的技术选型过程

本文将从业内的一些知名商业及开源产品进行一些选型分析,并且重点分析Github开源产品CodeQL的特点及优劣势

SAST简介

静态代码分析是指在不实际执行程序的情况下,对代码语义和行为进行分析,由此找出程序中由于错误的编码导致异常的程序语义或未定义的行为。通俗的说,静态代码分析就是在代码编写的同时就能找出代码的编码错误。你不需要等待所有代码编写完毕,也不需要构建运行环境,编写测试用例。它能在软件开发流程早期就发现代码中的各种问题,从而提高开发效率和软件质量。

静态AST(SAST)技术通常在编程和/或测试软件生命周期(SLC)阶段分析应用程序的源代码,字节代码或二进制代码以查找安全漏洞。

业内知名产品

知名商业产品


知名开源项目


技术选型思考

技术选型结果统计

我们出于自身需求,对常见的开源方案以及部分商业方案进行了一些选型统计


商业产品

Coverity、Fortify、CheckMarx 作为白盒静态扫描领域的领头产品,拥有极其深厚的技术积累以及专业的产品技术团队。其产品能力都为业界翘楚。笔者曾经和Coverity的售前及售后团队有过一定的交流,可以总结以上商业产品的优点及缺点

优点
  • 深厚的技术积累,产品能力强大,在SAST领域内少有不支持扫描的漏洞类型
  • 售后团队专业,能较为理解用户需求
缺点
  • 定制化需求支持困难,引擎对用户不透明,需求提交给厂商响应时长为 Month ++
  • 规则学习成本高,规则学习文档不完善,自定义规则困难
  • 厂商以最大并发量授权license,弹性扩容能力差,存在成本浪费
  • 漏洞模型难以适配每个用户自己内部的漏洞模型,难以准确处理误报、漏洞修复复查等业务需求
  • 融入企业自身的CI/CD流程困难,数据模型需要企业自己转换
实际案例

1、Converity的C/C++安全扫描依赖本地编译环境,需要研发使用Converity下发的扫描脚本进行编译扫描,但是扫描脚本对MacOS的版本适配一般都会delay 2~3个月,这就会造成MacOS一更新,对C/C++的安全扫描业务就会中断。Convertiy也未提供编译机的方案进行统一编译(有很多原因,比如编译参数、平台不一致难以统一编译)

2、Converity对代码的安全扫描并不只上报安全漏洞,代码的质量问题也会上报。但是Converity并未明显区分代码质量问题和安全漏洞,每个项目数千计数的代码质量问题和安全漏洞难以修复落地

开源产品

SonarQube、FindBugs、Chechstyle都是一些老牌开源静态代码扫描工具,但是这些工具都更偏向代码质量检查而非安全性检查。我们可以总结这些老牌开源产品的优点及缺点

优点
  • 源代码开源
  • 适配Jenkins等持续集成软件
缺点
  • 没有跨文件AST能力,无法分析跨文件数据流和控制流
  • 漏洞匹配模式导致误报非常高,难以落地运营

其他开源产品分析

FlowDroid

现状分析

FlowDroid是一款使用Java实现的针对Android的静态污点分析框架,发表于PLDI’2014,截止撰文时间在Google Scholar上显示已有1200+的引用,目前为Android静态污点分析的主流框架,代码开源并提供于GitHub。

产品概要

Github仓库:https://github.com/secure-software-engineering/FlowDroid

技术分析及使用

命令行使用

  • github下载jar包soot-infoflow-cmd-jar-with-dependencies.jar;
  • 命令行调用分析
java -jar soot-infoflow-cmd-jar-with-dependencies.jar \-al 500 -mc 500 -md 500-a <待分析的APK文件路径> \-p  \-s <污染源和Sink点的定义文件>

使用Maven构建FlowDroid

EXPORT ANDROID_JARS=EXPORT DROIDBENCH=mvn install
优劣势
  • 针对Android的开源框架,相比于跨语言的工具复杂性相对较低
  • 工具封装仅支持apk的分析
  • BenchMark强依赖于安卓相关的方法,用例也基于安卓的场景设计。安全相关的规则需要自行编写用例

ErrorProne

现状分析

由Google出品,使用ErrorProne接管compiler,在代码编译时进行检查,并抛出错误中断执行。常用于静态的Java和Android bug分析。

产品概要

官方文档:http://errorprone.info/

github仓库:https://github.com/google/error-prone

技术分析及使用

支持BazelMavenGradleAnt 、IDE扩展、命令行 等不同安装方式,以Maven为例,build时依赖maven-compiler-plugin 扩展,且需要关注JDK版本:

    org.apache.maven.plugins    maven-compiler-plugin    3.8.0            1.8        1.8        UTF-8        true                    -XDcompilePolicy=simple            -Xplugin:ErrorProne -Xep:DeadException:WARN -Xep:GuardedBy:OFF            -J-Xbootclasspath/p:${settings.localRepository}/com/google/errorprone/javac/9+181-r4173-1/javac-9+181-r4173-1.jar                                            com.google.errorprone                error_prone_core                2.4.0                        

bootclasspath 参数的javac版本依据实际环境需要调整。

编译执行

mvn clean && mvn compile -e

如果扫描后未发现缺陷点,则构建通过:


如果发现缺陷点,将抛出CompilationFailureException 异常,且导致mvn构建失败:


产品优劣势
  • 需要手动侵入Maven工程项目的POM文件,且需要关注及适配编译器和版本等细节;
  • 编译阶段扫描缺陷点,没有友好的导出方案,需要从compile failed异常中捞取信息及整理;
  • 无法拿到完整的AST信息;

Infer

现状分析

Infer 是 Facebook 开源的静态程序分析工具,用于在发布移动应用之前对代码进行分析,找出潜在的问题。目前 Facebook 使用该工具来分析 Facebook 的 App,包括 Android 、iOS、Facebook Messenger 和 Instagram 等等

产品概要

官方文档:https://fbinfer.com/docs/getting-started/

Github仓库:https://github.com/facebook/infer

安装较为简单,支持MacOSLinux ,以及Docker Image 部署:https://fbinfer.com/docs/getting-started

支持多语言,Java的Maven项目有专门支持:

  • ant
  • buck
  • cc
  • gradle
  • java
  • javac
  • make
  • mvn
  • ndk-build
  • xcodebuild

扫描调研

# 扫描前需先清理mvn clean && infer -- mvn package

结果文件默认输出在项目的infer-out/ 目录下,分析运行时间与项目相关(理想时间预计在10~20min)。


优劣势

官方最新版本放弃了对AL(AST Language)的维护,并在后续版本中会删除AL功能:

https://fbinfer.com/docs/checker-linters

**DEPRECATED__ On end-of-life support, may be removed in the future.

对于Github中用户提起的弃用原因,目前官方暂无正面回应:

https://github.com/facebook/infer/issues/1325

Soot

现状分析

soot是java优化框架,提供4种中间代码来分析转换 字节码:

  • Baf:精简的字节码表示,操作简单
  • Jimple:适用于优化的3-address中间表示
  • Shimple:Jimple的SSA变体
  • Grimple:适用于反编译和代码检查的Jimple汇总版本。
产品概要

github仓库:https://github.com/soot-oss/soot

技术分析及使用

支持分析的格式包含Java字节码(<=JDK9+)、Java源码(<=JDK7)、Android字节码、Jimple中间表示、Jasmin低级中间表示

分析功能支持CFG控制流图绘制、指针分析、Def/use chains、数据流分析、结合FlowDroid的污染分析

  • 安装在Maven Central 中下载所需版本的包:https://repo.maven.apache.org/maven2/org/soot-oss/soot/或者从java Doc的下载地址:

    https://soot-build.cs.uni-paderborn.de/public/origin/master/soot/soot-master/

  • 使用

# 变量声明# soot的jar包路径export SOOT_PATH=/path/to/soot/soot-4.2.1-jar-with-dependencies.jar# soot分析时所需扫描的依赖类文件路径,多个按":"分割# soot-class-path 只能精确到文件,不支持目录export SOOT_CLASS_PATH=/path1/jar1.jar:/path2/jar2.jar# 分析target/classes目录下的单个入口文件java -cp $SOOT_PATH soot.Main -pp \-cp .:$JAVA_HOME/jre/lib/rt.jar:$SOOT_CLASS_PATH org.packageName.MainClassName# 在字节码目录分析单个入口文件java -cp $SOOT_PATH soot.Main -pp \-cp .:$JAVA_HOME/jre/lib/rt.jar:$SOOT_CLASS_PATH ClassName# 分析当前目录java -cp $SOOT_PATH soot.Main -pp \-cp .:$JAVA_HOME/jre/lib/rt.jar:$SOOT_CLASS_PATH -process-dir .# 分析jar包java -cp $SOOT_PATH soot.Main -pp \-cp .:$JAVA_HOME/jre/lib/rt.jar:$SOOT_CLASS_PATH -process-dir /path/to/jarFileName.jar# 绘制入口文件的控制流图java -cp $SOOT_PATH soot.tools.CFGViewer -pp \ --soot-class-path .:$JAVA_HOME/jre/lib/rt.jar:$SOOT_CLASS_PATH \ --graph=BriefBlockGraph -d ./sootOutputGraphImg org.packageName.MainClassName# 绘制整个目录的控制流图 java -cp $SOOT_PATH soot.tools.CFGViewer -pp \ --soot-class-path .:$JAVA_HOME/jre/lib/rt.jar:$SOOT_CLASS_PATH \ --graph=BriefBlockGraph -process-dir .
输出格式参数

详细可参考https://www.sable.mcgill.ca/soot/tutorial/usage/

主要用到的几个参数:

  • -d 输出目录路径,为指定使用默认路径为终端当前所在目录下的./sootOutput 文件夹
  • -f 输出类型,默认输出.class文件
    • J, jimple ,也是我们需要关注的IR中间表示,它位于Java源码和字节码之间,是基于类型的3地址格式
    • X, xml
    • c, class 经soot分析后重新生成的字节码
    • t, template ,反编译还原的.java文件,也是基于Jimple生成的
  • -dump-cfg phaseName 导出控制流图
    • phaseName可指定导出阶段,如-dump-cfg jb -dump-cfg bb.lso 可导出 jb 和 bb.lso阶段的构建CFG。-dump-cfg ALL则导出所有阶段的
    • 导出控制流图会触发soot的bug抛NPE异常,目前可以使用CFGViewer来导出方法签名粒度的控制流图
优劣势
  • 优势
    • 支持Java字节码和源码的分析
    • 支持Android代码的分析
    • 可绘制可视化的控制流图
  • 劣势
    • soot的前端编译器已经过时,官方建议仅用作编译后文件的分析而不是源码分析
    • 当前维护版本(4.2.1)依赖高版本JDK(JDK11),且对JDK9+的字节码分析也存在bug,而旧版soot对JDK7及以下的源码分析更是缺乏维护
    • 控制流图绘制不支持跨文件串联,而是依据包结构对每个文件生成对应的控制流图

PMD

现状分析

PMD 是一个开源的静态代码分析工具。它用于分析一些常见的编程缺陷(未使用的变量、空捕获块、不必要的对象创建等)。

支持的语言:

  • Java
  • JavaScript
  • Apex 和 Visualforce
  • Modelica
  • PLSQL
  • Apache Velocity
  • XML
  • XSL
  • Scala
产品概要

官方文档:https://pmd.github.io/

Github仓库:https://github.com/pmd/pmd

技术分析及使用

安装运行:

  • 下载bin压缩包:https://github.com/pmd/pmd/releases
  • 执行命令:
./run.sh pmd \-d /path/to/待分析工程目录-R /path/to/规则集文件.xml-f text
  • -f 取值:默认 text ,支持如xmljsonhtml 等。详见: https://pmd.github.io/latest/pmd_userdocs_report_formats.html
规则集
  • 编写示例
    xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">        My custom rules                
  • 规则分类所有 PMD 内置规则都按照以下八个类别进行分类Best Practices 最佳实践: 这些规则强制执行公认的最佳做法Code Style 代码风格: 这些规则强制执行特定的编码风格

    Design 设计: 这些规则帮助发现设计问题

    Documentation 文档: 这些规则与代码文档有关

    Error Prone 易出错: 用于检测破坏、极度混乱或容易出现运行时错误的构造的规则

    Multithreading 多线程: 这些规则在处理多个执行线程时标记问题

    Performance 工作表现: 这些规则标记未达到最佳标准的代码

    Security 安全: 标记潜在安全缺陷的规则

    详见Java的内置规则清单:https://pmd.github.io/latest/pmd_rules_java.html

  • Security内置规则Security相关的只有两个:

    • 硬编码密钥
    
    
    • 不安全的加密初始化向量
    
    
优劣势
  • 优势
    • 可分析多种语言的源码;
    • 不需要参与代码编译;
  • 劣势
    • 不支持分析编译后文件;
    • 内置安全规则较为薄弱,SAST所需规则均需要自定义编写;

白盒静态扫描战斗机——CodeQL

简介

CodeQL是 Github 安全实验室推出的一款静态代码分析引擎,其利用QL语言对代码、执行流程等进行“查询”,以此实现对代码的安全性白盒审计,进行漏洞挖掘

整体流程

  • 通过适配各个语言的AST解析器,并将代码的AST解析结果按照预设好的数据模型将代码AST数据及其依赖关系存储到CodeDB里
  • 通过QL语言定义污点追踪漏洞模型
  • 执行QL时通过高效的搜索算法对CodeDB的AST元数据进行高效查询,从而在代码中搜索出漏洞结果


优点

  • 以CodeDB的模式存储源代码数据,并提供高效的搜索算法及QL语言对漏洞进行查询,支持数据流与控制流,使用者无需考虑跨文件串联的算法难度
  • 支持除PHP以外的常见语言类型
  • QL规则开源且正在迭代,有很非常强的可扩展性及支持定制化规则能力
  • QL规则有相应的文档学习,无需依赖厂商支持
  • 可以深入Jar包进行漏洞扫描

缺点

  • AST分析引擎不开源,无法针对AST的元数据进行调整修改,并且官方申明只用于研究用途,不允许企业集成至CI/CD流程
  • 不支持运行时动态绑定的重载方法分析(其他SAST产品的也不支持)
  • 不支持Resource文件的扫描,不做二次开发的情况下无法支持类似Mybatis XML配置的场景
  • 不支持软件成分分析,无法结合软件版本进行漏洞判断

评价

CodeQL为白盒漏洞扫描提供了一些新的思路

  • 通过格式化AST数据将它们进行结构化存储,再通过高效率的有向图搜索/裁剪算法支持对这些元数据进行基本查询
  • 通过对不同语言的适配,把一些常用的查询封装成QL语言,对AST数据进行一种类SQL的查询
  • 通过QL语言定义漏洞查询三元组(即污点追踪)可进行漏洞查询建模,并且由于查询可以直接搜索AST元数据,可以对DataFlow以及ControlFlow进行更细致的判断,以减少误报、漏报
  • 通过悬赏开源社区收录QL规则,保障了规则的迭代更新
  • 通过CodeQL的开源规则以及Github庞大的开源代码及迭代数据,实现打标能力为后续LGTM平台的神经网络学习提供学习样本

总结

在调研了大量的开源SAST的产品方案后,我们发现CodeQL作为Github安全实验室的产品,基本上代表了开源产品的在SAST领域的最佳实践(LGTM平台化及平台里AI训练场景暂不讨论),但由于官方申明不支持企业集成到CI/CD流程,于是我们选择参照CodeQL的设计思路,使用Spoon(Java AST解析器)加上自研跨文件串联能力作为扫描引擎的自研方案。后面的文章我们将详细分析SAST的技术原理以及58基础安全团队学习CodeQL的过程及教程输出,敬请期待

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/724719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Win2008 IIS TLS1.0升级到TLS1.2或TLS1.3

最近chrome和Edege浏览器已经把TLS 1.0标记为不安全了。 如果是开发网站&#xff0c;而使用的TLS 1.0&#xff0c;则直接打开不网站&#xff0c;也没有醒目的提示&#xff0c;你很难知道问题所在&#xff0c;总以为是SSL安装失败了&#xff0c;其实是TSL版本太低了。 如果是开…

密码学学习笔记(六):Hash Functions - 哈希函数2

哈希函数是怎么构成的&#xff1f; Merkle–Damgrd结构 哈希函数需要能够处理任意长度的输入。许多散列函数&#xff0c;例如MD5、SHA-1、SHA-2&#xff0c;都是由构建块&#xff08;称为压缩函数&#xff09;组成的&#xff0c;这些构建块可以处理特定的块大小&#xff0c;并…

SSM 整合 Shiro 安全框架【快速入门】

一、搭建ssm工程&#x1f349; 1.创建工程&#x1f95d; 更改web路径 创建所需目录 2.引入依赖&#x1f95d; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"h…

LVS+Keepalived负载均衡高可用群集

目录 一、Keepalived高可用详解 1.应用场景 2.介绍和原理简介 3.主要模块和作用 二、LVSkeepalived配置实例&#xff08;抢占模式&#xff09; 1.配置NFS共享存储器 2.配置节点web服务&#xff08;两台的配置相同&#xff09; 3.配置主备LVSkeepalived负载调度器 三、非…

JAVA判断当前时间是否为节假日、周末、工作日,简单有效!

JAVA判断当前时间是否为节假日、周末、工作日 需求 有这么个需求&#xff0c;需要判断拿到的这个日期是否为节假日&#xff0c;周末&#xff0c;工作日&#xff0c;然后做剩下的操作。 话不多说&#xff0c;上代码 1.首先需要拿到节假日api 节假日API地址 2.拿到接口&…

Open3d计算点云切片

computePlane()给出三个点计算平面方程参数 设通过P1&#xff0c;P2&#xff0c;P3三点的平面方程为A(x - x1) B(y - y1) C(z - z1) 0 。化简为一般式&#xff1a;Ax By Cz D 0。 将P1(x1,y1,z1)点数值代入方程Ax By Cz D 0。 即可得到&#xff1a;Ax1 By 1 Cz1 D…

css之文字宽度自适应、width、fit、content

文章目录 效果图htmlcss解析width 效果图 html <div><div class"width_600"><div class"d_f ai_c bc_1296db padding_7 radius_8 cursor_pointer" style"width: fit-content;"><img class"width_26 height_26" …

ps通道抠图

相信我们在抠图的时候都遇到过这种问题&#xff1a; 在扣取一些像树木、毛发等类似图像的时候&#xff0c;用魔棒或者快速选择工具根本抠不完整&#xff08;图1&#xff09;&#xff0c;而且就算抠出来也是毛毛刺刺的&#xff0c;使用效果很拉跨。而通道抠图&#xff08;图2&a…

真的不想知道文档翻译在线翻译怎么弄才简单吗

从前有一个小明&#xff0c;他是一名国际商人。他需要将公司的商业计划书翻译成多种语言&#xff0c;以便在海外市场推销。但是&#xff0c;他并不会所有需要的语言&#xff0c;于是他开始寻找一种方法来进行文档翻译。终于&#xff0c;他找到了一种文档翻译的有效方法&#xf…

Dynamsoft Barcode Reader crack

Dynamsoft Barcode Reader crack SDK经过重构&#xff0c;与DynamsoftCaptureVision(DCV)体系结构集成&#xff0c;该体系结构包括&#xff1a; ImageSourceAdapter(ISA)-标准输入接口&#xff0c;用于将来自不同来源的图像数据转换为标准输入图像数据。此外&#xff0c;ISA结合…

2023第七届河南省高等学校信息安全对抗大赛-御网杯-ISCC2023线下赛-misc(详解-思路-脚本)

芜湖~ 是真累呀 原本一天的时间 硬打了一天半 还是那句话 不评价 各位道友心中自有公论 我misc手又发现一个小小的非预期 哎 没想到线下也有这种情况 欧克 以下是我自己的一些思路和解析 有什么问题或者建议随时都可以联系我 2023第七届河南省高等学校信息安全对抗大赛-御…

医疗设备中的直线导轨使用哪种润滑脂?

直线导轨属于滚动功能部件&#xff0c;看似普通&#xff0c;却是大多数医疗设备的核心功能部件之一&#xff0c;也是保障医疗设备精度的基础&#xff0c;需要具备高精度、高耐磨、高顺畅等性能&#xff0c;对生产企业的研发实力、制造工艺及技术水平提出相当大的挑战&#xff0…

计算机体系结构基础知识介绍之缓存性能的十大进阶优化之关键词优先和提前重启以减少失误处罚、合并写入缓冲区以减少惩罚(五)

优化五&#xff1a;关键词优先&#xff0c;提前重启&#xff0c;减少漏判 处理器通常一次只需要缓存块中的一个字&#xff08;word&#xff09;。不要等待整个块被加载&#xff0c;而是在请求的字到达后就立即发送给处理器&#xff0c;并让处理器继续执行&#xff0c;同时填充…

安装TESSY测试软件,装D盘就没问题,装C盘就报这个错误了

环境&#xff1a; Win10 专业版 TESSY4.3 问题描述&#xff1a; 安装TESSY测试软件&#xff0c;装D盘就没问题&#xff0c;装C盘就报这个错误了 解决方案&#xff1a; 1.看了报错说明&#xff0c;之前安装的文件夹名字有空格 2.在C盘重新建立一个文件夹&#xff0c;文件夹…

android设备树理解

一、根据lunch 查找具体的dts文件 比如&#xff1a;lunch msm8953_64-userdebug 下面的1 和 2 借鉴自&#xff1a; 如何找到kernel所用的dtsi_百度知道 1、找具体本系统需要的dts文件 然后在out/target/product/msm8953_64/obj/KERNEL_OBJ的.config 里去找这个CONFIG_ARC…

Mybatis XML文件转换SQL

toSQL Mybatis XML 转换为 SQL语句 源码地址: https://github.com/huxuekuo/toSQL 使用方法 可以在IDEA plugin 中搜索 toSQL使用源码编译后的jar, 在IDEA plugin 中添加在releases中下载jar文件 转换效果展示 <select id"findPage" parameterType"map&…

【正点原子STM32连载】 第五十章 FATFS实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第五…

国产显卡主机也能畅玩游戏,支持8K分辨率售价8K

NVIDIA RTX 40 系列显卡上至 4090&#xff0c;下至 4060&#xff0c;不同定位代表型号如今基本都已发售。 要说性能强劲提升明显的买不起&#xff0c;买得起的又毫无诚意&#xff0c;大写的发布了个寂寞。 还真就应了网友口中那句&#xff1a;整个 40 系纯纯一「天使」&#…

node包管理器nvm的安装与使用,以及安装遇到的问题和解决方案

前言 随着vue3.0的普及&#xff0c;公司的新项目也都开始使用vue3.0typescriptvite的模式了&#xff0c;但是有的老项目还在有vue2.0&#xff0c;所以在开发不同项目的时候就会遇到因为node版本不同带来的各种不兼容&#xff0c;这个时候就需要用到nvm管理node版本&#xff0c;…

STL好难(4):list的使用

和列表很像 1.list的介绍 点击这里查看 list 的官方文档 list类似数据结构中的链表 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独…