SAST-数据流分析方法-理论

这篇具有很好参考价值的文章主要介绍了SAST-数据流分析方法-理论。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

众所周知,数据流分析是实现污点分析的一种常用技术

数据流分析分为过程内的数据流分析与过程间的数据流分析。前者是对一个方法体内的数据流分析,主要是基于CFG分析,不涉及方法调用;后者是基于不同方法间的数据流分析,主要是基于ICFG+CG分析,会涉及方法调用。

一、过程内数据流分析

1. CFG的构建

1.1.把程序转换为IR(此处采用3AC)表示

3地址码中的地址可能有如下的几种类型:

  • 名字(Name),包括
    • 变量(Variable)
    • 标签(Label)
      • 用于指示程序位置,方便跳转指令的书写
  • 字面常量(Literal Constant)
  • 编译器生成的临时量(Compiler-Generated Temporary)

每一种指令都有其对应的 3 地址码形式,一些常见的 3 地址码形式如下:(x, y, z是变量的地址)

x = y bop z  // bop 是双目操作符(Binary Operator),可以是算数运算符,也可以是逻辑运算符
x = uop y  // uop 是单目操作符(Unary Operator),可能是取负、按位取反或者类型转换
x = y 
goto L  // goto 是无条件跳转,L 是标签(Label),是标记程序位置的助记符,本质上还是地址
if x goto L  // if... goto 是条件跳转
if x rop y goto L // rop 是关系运算符(Relational Operator),运算结果一般为布尔值

1.2.找程序的Leader集合L,进而划分Basic Block

  • 程序入口
  • 跳转指令的目标指令
  • 跳转指令的下一条指令

(一个Leader到下一个Leader之前就是一个BB)

1.3.连接Basic Block

程序控制流的产生来源于两个地方:

  • 天然的顺序执行
    • 这是计算系统天然存在的一种控制流
  • 跳转指令
    • 这是人为设计添加的一种控制流

示例

SAST-数据流分析方法-理论

二、过程间数据流分析

1.CG 方法调用图

1.1.Java中的方法调用类型

  • Static Call:调用静态方法 --> 编译时明确
  • Special Call:调用构造方法、私有方法、基类实例方法 --> 编译时明确
  • Virtual Call:调用其他实例方法 --> 运行时明确(多态,最常见)

所以在构建方法调用图时,最关键的是要处理好Virtual Call的情况

1.2.CG的构建方法

  • 类层级结构分析(Class Hierarchy Analysis,CHA)
  • 快速类型分析(Rapid Type Analysis,RTA)
  • 变量类型分析(Variable Type Analysis,VTA)
  • 指针分析(Pointer Analysis,k-CFA)

上面的四种方法自上而下精度(Precision)越来越高,但是效率(Efficiency)也越来越低。

本文只关注CHA的方式:

CHA

在方法调用点处,只关注caller的声明类型T及callee的方法签名sig,会把T及其子类中所有与sig匹配的方法都视为可能的目标方法,示例:

class A {
    void foo() { ... }
}

class B extends A { }

class C extends B {
    void foo() { ... }
}

class D extends B {
    void foo() { ... }
}

类层级结构如下:
SAST-数据流分析方法-理论

现有以下代码片段:

void resolve() {
    C c = ...;
    c.foo();A a = ...;
    a.foo();B b = new B();
    b.foo();
}

CHA算法会对于每一个接收变量的声明类型本身及其子类关于调用点处的函数签名进行方法派发的操作,将所有找到的目标方法加入结果之中。因此,结果如下:

  • Resolve(c.foo()) = {C.foo()}
  • Resolve(a.foo()) = {A.foo(), C.foo(), D.foo()}
  • Resolve(b.foo()) = {A.foo(), C.foo(), D.foo()}

我们需要注意一下的是第三个调用点, A.foo() 也在其结果之内,因为对于 B 类本身的方法派发得到的结果是 A.foo()

并且,CHA的Resolve算法只关心声明类型,因此 new B() 其实并没有在算法中发挥作用,从而我们 Resolve(b.foo()) 产生了两个虚假(Spurious)的目标调用 C.foo()D.foo()

CG构建示例:

class A {
    static void main() {
        A.foo();
    }

    static void foo() {
        A a = new A();
        a.bar();
    }

    void bar() {
        C c = new C();
        c.bar();
    }
}

class B extends A {
    void bar() { }
}

class C extends A {
    void bar() {
        if (...) {
            A.foo();
        }
    }
    
    void m() { }
}

CHA最终构建的CG如下:
SAST-数据流分析方法-理论

在上述例子当中需要注意的是,虽然 A a = new A() ,但是解析 a.bar() 的目标方法时候,依旧会对 A 以及 A 的所有子类作 Dispatch ,故而会有3条从 a.bar() 出发的边

最后我们会发现存在一个不可达的方法(Unreachable Method) C.m() ,那么这个方法中的代码就是死代码(Dead Code,即在任何情况下控制流都不能到达的代码)。

CHA的应用:IDE中的目标方法提示

2.ICFG 过程间控制流图

2.1.ICFG的构建

ICFG要在CFG基础上添加call Edges(调用边)、return Edges(返回边)

ICFG = CFGs + call & return edges ,连接调用边和返回边的信息可以从调用图中获得。因此,过程间控制流图的精度取决于调用图的精度。

示例:

static void main() {
    int a, b, c;
    a = 6;
    b = addOne(a);
    c = b - 3;
    b = ten();
    c = a * b;
}

static int addOne() {
    int y = x + 1;
    return y;
}

static int ten() {
    return 10;
}

构建的ICFG如下:
SAST-数据流分析方法-理论

从上图可以看出,在构建ICFG时,仍然保留了Call-to-return edges(调用点到返回点的边),虽然实际程序运行过程不会走这条边,但是这条边可以传递callee方法不需要的数据,这样就避免了在目标方法中始终维护其不需要的数据,可以提高效率

公主号推荐

id:CodeAnalyzer,名称:CodeAnalyzer Ultra

开源仓库推荐

https://github.com/HaHarden/CPGPractise文章来源地址https://www.toymoban.com/news/detail-844579.html

到了这里,关于SAST-数据流分析方法-理论的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ClickHouse 与 Kafka 整合: 实时数据流处理与分析解决方案

    随着数据量的不断增长,实时数据处理和分析变得越来越重要。ClickHouse 和 Kafka 都是在现代数据技术中发挥着重要作用的工具。ClickHouse 是一个高性能的列式数据库,专为 OLAP 和实时数据分析而设计。Kafka 是一个分布式流处理平台,用于构建实时数据流管道和流处理应用程序

    2024年02月22日
    浏览(51)
  • nvidia drive agx orin nvsipl camera数据流 驱动层分析

    背景:nvidia driveos中关于camera,自己封装了一层nvsipl框架,在linux应用层,可以直接调用nvmedia 库,即可操作摄像头,对于配置这一块,也提供了json文件,xml文件来进行serdes的配置开发,如:使用了哪路i2c,serdes max96712 i2c设备地址是啥,camera sensor的i2c设备地址是啥等,然后在

    2024年02月11日
    浏览(52)
  • 大数据流处理与实时分析:Spark Streaming和Flink Stream SQL的对比与选择

    作者:禅与计算机程序设计艺术

    2024年02月07日
    浏览(45)
  • 什么是Vue的数据流(单向数据流)?如何进行数据流管理

    在Vue中,数据流是指数据的传递和管理方式。Vue采用的是单向数据流,也就是说,数据是从父组件流向子组件,子组件不能直接修改父组件的数据。本文将介绍Vue的数据流机制,以及如何进行数据流管理。 Vue的数据流机制可以分为两类:props和events。 Props 在Vue中,父组件可以

    2024年02月08日
    浏览(62)
  • 银行储蓄系统的顶层数据流图及细化数据流图

    绘制出银行储蓄系统的顶层数据流图及细化数据流图; 银行储蓄系统存、取款流程如下: 1)业务员事先录入利率信息; 2)如果是存款,储户填写存款单,业务员将存款单键入系统,系统更新储户存款信息(存款人姓名、存款人账号、电话号码、身份证号码、存款金额、存

    2024年01月17日
    浏览(48)
  • Elasticsearch:将 ILM 管理的数据流迁移到数据流生命周期

    警告 :此功能处于技术预览阶段,可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。目前的最新版本为 8.12。 在本教程中,我们将了解如何将现有数据流(data stream)从索引生命周期管理 (ILM) 迁移到数据

    2024年04月29日
    浏览(46)
  • 数据流图(DFD)

    数据流图是用于表示系统逻辑模型的一种工具。从数据 传递和加工 的角度,以图形的方式描述数据在系统中流动和处理的过程 数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑等进行定义和描述,其目的是 对数据流图中的各个元素做出详细的说明 ,

    2024年02月04日
    浏览(51)
  • postman 数据流请求

    备注: Postman version : Version 9.21.3 Windows 版本 1.修改headers 2.Body 部分 选择raw 格式数据 3.最后执行请求

    2024年02月11日
    浏览(63)
  • Flink数据流

    官网介绍 Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink 被设计为在所有常见的集群环境中运行,以内存中的速度和任何规模执行计算。 1.无限流有一个开始,但没有定义的结束。它们不会在生成数据时终止并提供数据。必须连续处

    2024年02月17日
    浏览(48)
  • C# 数据流 FileStream

     

    2024年03月24日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包