欢迎进入Allbet官网。Allbet官网开放Allbet登录网址、Allbet开户、Allbet代理开户、Allbet电脑客户端、Allbet手机版下载等业务。

首页科技正文

choi baccarat(www.allbet6.com):58团体白盒代码审计系统建设实践1:手艺选型

admin2021-07-11168安全技术企业安全

USDT官网

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

原文链接:https://mp.weixin.qq.com/s/d9RzCFkYrW27m1_LkeA2rw

靠山

源代码平安检测是平安开发流程(SDL)中异常主要的一部门,在58团体的CI/CD流程中天天有数千次量级的构建及宣布,白盒检测的自动化能力显得极为主要。企业级的白盒代码审计系统就不仅仅面临破绽发现的需求,也需要顺应企业CI/CD流程。由于58团体大部门营业使用自研的Java框架,本系列文章会重点先容我们在Java白盒能力建设历程中的实践。

本文主要先容58团体 Java白盒能力建设中的手艺选型历程,分享我们对业内常见的商业、开源产物举行剖析的情形。

SAST简介

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

静态AST(SAST)手艺通常在编程和/或测试软件生命周期(SLC)阶段剖析应用程序的源代码,字节代码或二进制代码以查找平安破绽。

业内着名代码审计产物

着名商业产物

着名开源项目

手艺选型思索

手艺选型效果统计

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

产物 是否开源 是否支Java AST 是否支持跨文件 定制化需求难易度 是否Web项目友好 平安规则编写难度 是否支持代码质量检查 支持语言 可扩展性 是否侵入项目 是否支持Jar包扫描 是否支持移动端
Coverity 极难,需要厂商支持 相对难题 支持 常见语言都支持 低,需厂商支持
SonarQube 相对简朴 相对简朴 支持 常见语言都支持
FlowDroid 相对难题 相对难题 支持 Android/Java Android
ErrorProne 相对难题 相对难题 支持 Android/java Android
Infer 相对难题 相对难题 支持 Android/java Android
Soot 相对难题 相对难题 支持 Android/java Android
PMD 相对简朴 相对简朴 支持 java
CodeQL 半开源 中等 相对简朴 支持 除php外常见语言

商业产物剖析

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 <Android SDK平台目录路径> \
-s <污染源和Sink点的界说文件>

使用Maven构建FlowDroid

EXPORT ANDROID_JARS=<Android JAR folder>
EXPORT DROIDBENCH=<DroidBench folder>
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版本:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <encoding>UTF-8</encoding>
        <fork>true</fork>
        <compilerArgs combine.children="append">
            <arg>-XDcompilePolicy=simple</arg>
            <arg>-Xplugin:ErrorProne -Xep:DeadException:WARN -Xep:GuardedBy:OFF</arg>
            <arg>-J-Xbootclasspath/p:${settings.localRepository}/com/google/errorprone/javac/9+181-r4173-1/javac-9+181-r4173-1.jar</arg>
        </compilerArgs>
        <annotationProcessorPaths>
            <path>
                <groupId>com.google.errorprone</groupId>
                <artifactId>error_prone_core</artifactId>
                <version>2.4.0</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

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

    ,

    Usdt第三方支付接口

    菜宝钱包(www.caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

    ,

扫描调研

, 扫描前需先整理
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中央示意、Ja *** in低级中央示意

剖析功效支持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
规则集
  • 编写示例
<?xml version="1.0"?>

<ruleset name="Custom Rules"
    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">

    <description>
        My custom rules
    </description>
    <!-- 规则存放处 -->
    <!-- 这里使用了内置的java errorprone规则,检查空catch块 -->
    <rule ref="category/java/errorprone.xml/EmptyCatchBlock" />
</ruleset>
  • 规则分类

    所有 PMD 内置规则都根据以下八个种别举行分类

    Best Practices 最佳实践: 这些规则强制执行公认的最佳做法

    Code Style 代码气概: 这些规则强制执行特定的编码气概

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

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

    Error Prone 易失足: 用于检测损坏、极端杂乱或容易泛起运行时错误的组织的规则

    Multithreading 多线程: 这些规则在处置多个执行线程时符号问题

    Performance 事情显示: 这些规则符号未到达最佳尺度的代码

    Security 平安: 符号潜在平安缺陷的规则

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

  • Security内置规则

    Security相关的只有两个:

    • 硬编码密钥
    <rule ref="category/java/security.xml/HardCodedCryptoKey" />
    
    • 不平安的加密初始化向量
    <rule ref="category/java/security.xml/InsecureCryptoIv" />
    
优劣势
  • 优势
    • 可剖析多种语言的源码;
    • 不需要介入代码编译;
  • 劣势
    • 不支持剖析编译后文件;
    • 内置平安规则较为微弱,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语言界说破绽查询三元组<sources,sinks,sanitizers>(即污点追踪)可举行破绽查询建模,而且由于查询可以直接搜索AST元数据,可以对DataFlow以及ControlFlow举行更仔细的判断,以削减误报、漏报
  • 通过悬赏开源社区收录QL规则,保障了规则的迭代更新
  • 通过CodeQL的开源规则以及Github重大的开源代码及迭代数据,实现打标能力为后续LGTM平台的神经网络学习提供学习样本

总结

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

扫码关注58平安应急响应中央官方微信民众号,第一时间获得最新新闻

网友评论

3条评论
  • 2021-07-04 00:00:41


    我要看超甜的!!

    • 2021-07-06 04:37:34

      @新2会员手机管理端 【全球网报道 见习记者 张江平】据俄罗斯塔斯社、俄新社等媒体25日报道,俄罗斯国防部当天宣布新闻称,俄罗斯水师地中海常态化战争编队与空天军航空兵当地时间25日已最先在地中海东部开展团结军事演习。两架米格-31K战斗机被派往俄罗斯驻叙利亚赫梅米姆空军基地,以加入此次演习。俄新社称,这是俄罗斯首次向叙利亚派遣米格-31K战斗机,其可搭载“匕首” 高明音速导弹。妙不可言啊啊

      • 2021-07-08 07:57:12

        @新2网址大全

        USDT场外交易网www.usdt8.vip)是使用TRC-20协议的Usdt官方交易所,开放USDT帐号注册、usdt小额交易、usdt线下现金交易、usdt实名不实名交易、usdt场外担保交易的平台。免费提供场外usdt承兑、低价usdt渠道、Usdt提币免手续费、Usdt交易免手续费。U交所开放usdt otc API接口、支付回调等接口。

        给朋友看看

最新评论