带你读论文丨Fuzzing漏洞挖掘详细总结 GreyOne

本文分享自华为云社区《[论文阅读] (03) 清华张超老师 - Fuzzing漏洞挖掘详细总结 GreyOne》,作者: eastmount。

一.传统的漏洞挖掘方法

演讲题目: 数据流敏感的漏洞挖掘方法

内容摘要: 模糊测试近年来成为安全研究人员的必备的漏洞挖掘工具,是近年来漏洞披露数量爆发的重要推手。然而,模糊测试工具在种子生成、选择、变异、测试、评估、反馈等多个环节都存在一定的盲目性和随机性,其漏洞挖掘效率存在较大提升空间。我们通过分析经典模糊测试工具AFL的实现原理,找到了若干个制约其效率的瓶颈所在,包括数据流不敏感等,并针对性地提出了改进方案GreyOne(USENIX Sec’20)。本次报告将与大家探讨这一方案。

1.漏洞挖掘

漏洞大家都很熟悉了,是各大安全问题的根源。如下图所示的Stuxnet震网、WannaCry、心脏滴血等等。

image.png

我们在漏洞挖掘和攻防方面做了大量的研究,有人打的CTF,也有机器全自动的漏洞挖掘、攻击防御、二进制程序分析、CGC比赛等。下图是Blue-Lotus(清华蓝莲花)战队这些年的成绩。

image.png

image.png

我的研究主题是漏洞挖掘和攻击防御,今天的分享主要是我们在 漏洞挖掘(Vulnerability Discovery) 方面最近的工作,它是关于Fuzzing的一个工作,Fuzzing目前可能是漏洞挖掘最主流的方法。

漏洞挖掘发展几十年,前面有很多技术被提出来,大家最熟悉的应该是代码审计、逆向工程(无源码),它们仍然是企业发现漏洞的常用渠道;学术界提出的包括静态分析、动态分析、污点分析、符号执行等方法,这些技术或多或少都局限,没有最近流行的Fuzzing技术有效。

  • Code Review(10%)
  • Static Analysis
  • Dynamic Analysis
  • Taint Analysis
  • Symbolic Execution
  • Model Checking
  • Fuzzing(80%)

2.Fuzzing和AFL

Fuzzing也不是新技术,它是在90年的时候被提出来,已经有30年历史,但它真正大的发展是2013年以后,最近几年有个大的发展。它的基本思路如下图所示,它是一个动态测试的过程,需要想办法生成一大堆输入,扔给程序测试,如果测试过程中出现问题就可能有BUG,如果没有问题就接着测试,和软件工程中的测试流程类似。

  • Goal:Finding PoC samples that prove vulnerabilities
  • Solution:testing

image.png

整个过程的核心是怎样有效地生成输入去触发Bugs,因为对于程序来说,它输入空间是个无限的空间,能够触发漏洞是非常少的。那么,怎样在无限空间中有效找到少量能触发漏洞的输入,这是它的核心问题。

90年左右提出Fuzzing的问题基本是偏随机输入的,后面又提出方法告诉输入的格式,然后基于格式去生成,但相对来说它挖漏洞的效率仍然很低,让人去写这个输入格式工程量也比较大。

image.png

2013年以后,有一个叫AFL的重要方案被提出,这个方案有一个很重要的算法就是遗传算法,它把遗传算法放进来了。

  • A better strategy: Genetic Algorithm
  • Iterative testing,keep GOOD seeds, report bugs

我们刚才说到Fuzzing的核心是在无穷多个输入空间中去找有限的输入,去触发漏洞,那怎么在无穷空间中去有限探索呢?它用到了遗传算法。下图中间的核心循环,通过一轮一轮的迭代测试,测试过程中它会把上一轮测试比较好的测试用例留下来,作为种子进入下一轮,下一轮是在上一轮比较好的种子基础上进一步变异测试。它在无穷空间中探索时,不是盲目的去探索,而是在上一轮探索基础上去找比较好的方向,接着再这个方向上往下探索。该方法还是比较有效的。

image.png

具体分析,每轮测试保留好的测试例。那么,什么是好的测试例呢?这里有一个进化指标,这个进化指标也非常重要。我们目标是挖漏洞,很自然就有一个指标是漏洞数量,但是用漏洞数量作为指标来进化的效果很差,因为漏洞是个非常稀疏的,你可能挖了几个小时都没挖到一个漏洞。这意味着没有进化的信号,整个算法效果就很差。

  • 漏洞数量

2013年AFL工作使用的指标是代码覆盖率,测试工程中去监控程序的代码覆盖率情况,如果一个新的测试例提升了代码覆盖率,就认为它是好的种子就保留下来。通过这种方式就能不断提升代码覆盖率。

  • GOOD:coverage increases
  • Bug:sanitizers

代码覆盖率与漏洞有一定相关性,我们知道要触发漏洞的话肯定要走存在漏洞的那条路径,去触发代码,如果没走过那段代码,那个漏洞肯定不会触发。它们之间是有个关联性的,我们通过这种遗传算法不断提高代码覆盖率,它就有一定概率去发现代码中隐藏的漏洞,整体效果也不错。

为了支持做覆盖率跟踪以及在测试过程中发现代码漏洞是否被触发,通常会对程序进行插桩,做代码覆盖率收集和Security Sanitizers(安全检测工具),插桩完成之后在测试过程中,程序会自动收集Coverage信息以及检测是否触发安全问题。

image.png

A pioneer:AFL
下图是真正AFL的框架,真正的AFL会在过程中每一步都有一些策略,比如怎么选种子(Select Seed)、怎么变异(Mutate Seed)、变异后怎么测试(Test)、测试过程中怎么跟踪覆盖率(Coverage Tracking)、覆盖率怎么过滤保留新的种子(Filter Seeds)等等。该算法提出来之后非常有效,改变了大家在这块的研究。AFL的重要特点如下:

  • Evolving:filter out only GOOD samples contributing to code coverage
    遗传算法是个进化的特征。
  • Scalable:mutation-based, few knowledge required
    方案是可量化的,不需要知道目标软件太多的知识,给它一个软件就能测。
  • Fast:fork-server, persistent, parallel
    测试过程非常快,一秒钟平均能测上千个测试用例。
  • Sensitive: support different sanitizers to catch security violations
    捕获漏洞能力比较强,可以支持不同的Sanitizers,也可以扩展,比较有名的是谷歌写的AddressSanitizer,常用安全防护和漏洞挖掘。这个非常重要,有时候在测试过程中触发漏洞但程序并不一定会让崩溃,一个好的Sanitizers能够在程序未崩溃的情况下发现漏洞。

推荐资料:GitHub - google/sanitizers: AddressSanitizer, ThreadSanitizer, MemorySanitizer

image.png

AFL(American Fuzzy Lop)是由安全研究员Michał Zalewski(@lcamtuf)开发的一款基于覆盖引导(Coverage-guided)的模糊测试工具,它通过记录输入样本的代码覆盖率,从而调整输入样本以提高覆盖率,增加发现漏洞的概率。其工作流程大致如下:

  • ①从源码编译程序时进行插桩,以记录代码覆盖率(Code Coverage);
  • ②选择一些输入文件,作为初始测试集加入输入队列(queue);
  • ③将队列中的文件按一定的策略进行“突变”;
  • ④如果经过变异文件更新了覆盖范围,则将其保留添加到队列中;
  • ⑤上述过程会一直循环进行,期间触发了crash的文件会被记录下来。

    image.png

参考alphalab文章:AFL漏洞挖掘技术漫谈(一):用AFL开始你的第一次Fuzzing

二.Improvements to Fuzzing

所以,在整个流程中这些环节都可以去改进。这些年四大安全会议关于Fuzzing的论文大概有60~70篇,数量非常大,我们简单介绍下。

安全四大顶会:

  • CCS(ACM Conference on Computer and Communications Security)
    网址:https://www.sigsac.org/ccs.html
  • NDSS(Network and Distributed System Security Symposium)
    网址:https://www.ndss-symposium.org/
  • Oakland S&P(IEEE Symposium on Security & Privacy)
    网址:https://www.ieee-security.org/TC/SP-Index.html
  • USENIX Security(USENIX Security Symposium)
    网址:https://www.usenix.org/

1.Seed Generation

第一块是初始种子,它对Fuzzing的效率还是有很大影响的。如果你不给初始种子,它也会去测试,但是其效率比较低,很多学者去研究如何给一个好的初始种子,让Fuzzing更快地进入状态,更好地找到漏洞。

实践中怎么找到初始种子呢?可以从网上去爬取一些PDF文件作为初始种子,或者从网上找一些历史上的POC。而学术界的方法如下:
How to get/generate seeds?

  • 第一种是借用AI的方法
    基本思路是从程序的合法输入,网上爬取样本中学出一个模型,再用这个模型生成新的测试例,这样构造的初始种子相对来说更好。典型论文方法包括Skyfire、Learn&Fuzz、GAN、Neuzz等。

image.png

  • 第二种是通过符号执行(Symbolic Execution)来辅助
    这种辅助手段一般称为混合Fuzzing,其基本思路的核心还是Fuzzing来做,但Fuzzing有些代码过不去,比如一个复杂的数组检查,Fuzzing很难通过。对于这些过不去的分支,Drillers就提出用符号执行来辅助,遇到分支过不去的情况用符号执行来求解,并生成新的种子再丢给Fuzzing去通过分支,这是当时他们做CGC比赛的方案。符号执行和Fuzzing混合确实能提升过不去的分支。最近几年有进一步改进符号执行和Fuzzing的经典方法,比如QSYM、DigFuzz、HFL等。

image.png

  • 第三种是基于静态分析和动态分析的
    还有一些是基于静态分析、动态分析,以及去学习输入的规范,通过程序分析的技术手段去分析程序接受什么样的输入,再去指导测试例的生成。今年张老师他们有一篇针对Android服务的工作,也是这个思路,即FANS(USENIX Sec20)。

image.png

2.Testing Environments

上面介绍的是采用不同角度,有AI、符号执行,传统静态分析、动态分析来辅助识别或者生成初始种子的。还有一部分是针对不同测试目标的工作,包括针对二进制程序的,针对内核程序的,针对JAVA、IoT、SDN的,还有虚拟机、手机驱动、文件系统、数据库、智能音响等等。

针对不同的目标做Fuzzing,它其实会存在很大的差异。一个重要原因是这些目标很难有个较好的动态测试环境,测试环境有个要求是尽量在测试过程中做一些跟踪,而很多目标可能不适合做跟踪,所以需要解决这个问题。针对不同测试目标也是有很多工作的。

How to test targets?

image.png

3.Seed Selection

在遗传算法每轮的迭代中,它首先需要从现有的种子池(Seed Pool)中选择种子,该步骤也是有一些策略的。因为一个种子池中可能积累了很多种子,通过历史上不断测试留下来的,但每一轮可能只选择一个种子,而先选择哪一个的效率也是不一样的,虽然大家都是种子,但可能有些种子效率更好。

2016年发表在CCS上的AFLfast的策略是如果这个种子在之前测试中很少被选出来,就称为cold,这样的种子后面优先被选出来,或者这个种子搜索的路径在之前的测试中很少被测到,也会优先选择这个种子。还有其他的一些策略,比如VUzzer、AFLgo、QTEP等等,包括张老师他们2018年Oakland提出的CollAFL,这些策略其实没有哪一个是绝对的最好,各有千秋。

How to select seed from the pool?

image.png

4.Seed Mutation

选好种子之后,接下来是做变异,在这个种子基础上变异生成一堆测试用例,AFL的做法是随机选择一些字节,对其进行增删改,做一些操作,但这个随机没法保证质量。这块就有一些工作尝试改进。
How to generate/mutate new testcases?

  • 第一种是偏AI的方法
    比如2017、2018年有尝试用AI来指导(LSTM、强化学习),去年张老师他们在USENIX Sec上有一篇Mopt,通过粒子群优化算法来选择最优的变异策略。同时CCS上有一篇ILF也是通过AI方法,先用符号执行去生成数据并作为训练数据,再通过AI模型来指导它变异,该工作适合于智能合约和区块链上。

image.png

  • 第二种偏程序分析的方法
    这些方法是通过程序分析的方法,经典的是2017年发表在NDSS的VUzzer,它通过污点分析来判断应该对哪些字节进行变异,以及怎么变异。后面还有一些通过符号执行、梯度下降,2019年Oakland人大一位老师的做法也非常有意思,它通过测试去观测测试的表现,来推断输入字段的划分及类型,基于字段类型来指导怎么变异。我们今天要分享的是USENIX SeC20的GreyOne,也是关于变异的工作。

image.png

5.Efficient Testing

编译好之后,就是测试工作(Optimizations)。测试过程中,第一个很重要的问题是性能,测得非常快,漏洞挖掘工具也会很强。这里有一些并行化、硬件辅助的工作。

How to efficiently test target application?

image.png

6.Coverage Metrics

下面一类工作是测试过程中需要跟踪代码覆盖率、安全等属性,代码覆盖率相对来说工作比较少,我们2018年关注的是代码覆盖率中的碰撞问题,让它更精确。今年有很多团队尝试用别的、不同的Coverage来做指标,这个代表性工作是2020年Oakland的IJON工作,非常有意思,包括我们团队也在尝试各种想法,它实际上自定义了很多不同的Coverage指标,比方说在走迷宫程序时,迷宫所在的位置作为指标。如果大家搞Fuzzing,建议大家去看看。还有一些做定向Fuzzing的,不是探索所有代码,而是优先探索我们想探索的,比如某个点可能有漏洞,这类也是有个Coverage的,通常是距离,比如离目标有多远。

A better/alternative coverage algorithm?

image.png

7.Security Tracking

还有一块是Sanitizer,刚才提到谷歌公司的AddressSanitizer是一个经典的工作。这部分和防护比较接近,去年也有Razar方法,引导它往race去发现特定的漏洞。

How to catch security violations during testing?

image.png

写到这里,我们就把这些年Fuzzing的一些方法介绍完毕了!可能不是很全,但大部分的方法都囊括了。

三.超神的方法-GREYONE

注意,这部分内容是结合张老师的分享以及作者的理解来叙述,所以和原文的框架有所差异。这里强烈推荐大家从下面的链接去下载原文进行学习,看看大佬们的前沿工作。

1.背景知识

下面开始讲解我们的工作,第一个工作是USENIX Security 2020的一篇文章,叫做《GREYONE:Data Flow Sensitive Fuzzing》,是一个数据流敏感工作。

image.png

简单介绍下背景知识,我们先看下图所示的一个例子,这是经典的magic number检查。

  • 第1个if:前面八个字节等于“MAGICHDR”
  • 第2个if:后面八个字节必须等于算出来的校验和
  • 第3个if:判断长度
  • 第4个if:输入数据做个变形
  • 第5个if:包含一些更复杂的是隐式依赖,比如第15行var1变量,它是跟第14行的控制相关
  • 第6个if:bug5隐性依赖于Input的20到24个字节

我们人去看这些知识很容易理解,但是Fuzzing过程中,如果想触发bug1,我们在变异时,其实是有一些知识可以获取的。输入前8个字节与“MAGICHDR”进行比较,变异时是要对前8个字节进行变异,而不是随机变异,变异取什么值呢?我们应该取“MAGICHDR”。接着校验和(checksum)也类似,它会把输入中的8个字节(8-16)与算出来的值某个校验和进行对比,我们就要对input[8:16]进行变异,变异所取的值是计算出来的值。

  • Where to mutate? input[0:8]
  • How to mutate?MAGICHDR
  • Seed prioritization:1 byte match vs 7 byte match

还有一点,比如“MAGICHDR”例子,只有全匹配上才能出发bug1,全部匹配上的概率还是比较低的,64个bit(2的64次方)。现在假设我们有两个用例,它们分别与“MAGICHDR”有1个byte和7个byte匹配,但从代码覆盖率上来说,它们都是一样的,都不满足这个检查,都会走这个flase的分支,但它们的测试效果或者对Fuzzing的作用一样吗?显然不是,明显7个byte匹配的测试例效果更好,因为下一次在7个byte基础上可能再变异一个byte就匹配上了“MAGICHDR”。

image.png

所以说这两个测试例得代码覆盖率是一样的,但是它的测试效果不一样。这个例子说明:Data flow information is useful for fuzzing。因此张老师他们提出了一种新的数据流敏感模糊解Greyone。

2.污点属性和分支匹配度

首先,data-flow features的类型是什么呢?

  • Taint attributes(污点属性)
    输入和变量之间的依赖性
  • Branch value conformance(分支匹配度)
    转移条件操作数间的距离,提出了一个分支匹配度的计算公式。一致性越高,距离越近,我们就认为它的匹配度越好。

image.png

基于上述观测,我们提出了如下图所示的模型,关注的是Taint部分,我们需要做数据流跟踪来识别刚才提出的两个特性。

image.png

image.png

此时遇到3个问题:

  • 怎么去获取数据流特性呢?
    How to efficiently get data-flow features?——Traint attributes、branch value conformance
  • 如何利用数据流特性来指导变异?
    How to utilize data-flow features to guide mutation?
  • 怎么去进一步调整fuzzing进化的方向?
    How to utilize data-flow features to tune fuzzing direction?

接着我们先来回答这部分的问题。

(1) RQ1-1:Taint Attributes

Taint是非常经典的技术,很多地方都有,比如Libdft、DFSan等。基本思路是逐条解释指令,因为指令是有语义的,比如MOV移动EAX到EDX中去,它就会把EAX的污点属性转义到EDX污点属性中去,所以当它逐条解释语义它就可以分析这个输入的污点是怎么传播到程序中的各个变量上去的,一条条指令来解释。

但是这种做法很笨重,需要人去逐条写这个语义,非常麻烦,这些工具一般都需要人来写这个规则,很容易写错、写漏。那么去年NDSS有一篇做自动的,去推演Taint inst的工作,自动推演Taint的规则。

Traditional dynamic taint analysis

  • Libdft/DFScan…
  • Propagate taint inst. by inst.
  • Taint rules manually/automatically
  • Under-taint and over-taint issues

但所有这些工作都有一个问题,存在严重的Under-taint和over-taint的问题。这两类问题都很多,就会漏掉一些taint信息,或者造成错误地把一些不应该是taint而识别为taint。时间关系不展开讲解,不论是人工或机器来做都会遇到的问题,而且还比较严重。

image.png

我们提出了一个新的方案,叫fuzzing驱动污点推断(Fuzzing-driven Taint Inference,FTI)。基本想法很简单,我们要关注的不是一条条指令的传播,我们关注的是宏观的效果,比如输入的哪几个字节会影响我的某一个分支,分支这边涉及到变量,我想关心的就是变量与输入的哪个字节相关。通过做一个变化,观察变量var的值是否保持不变,如果它的值发生了变化,我们就知道,这个var和变量S[i](第i个字节)是相关的,换句话说,如果变量的值在输入字节发生变化时发生变化,我们可以推断前者受到了污染,并依赖于后者。所以,我们只需要对fuzzing做动态测试,调整输入的某些字节,然后看程序中哪些变量发生了变化,发生变化的值就认为它与输入字节有关。

  • Interference rule
    v(var, S) ≠ v(var, S[i])
  • Taint inference
    Byte-level mutation:逐个字节变异
    Branch variable monitoring:监控变量是否发生变化
    Deterministic fuzzing stage

由于AFL是可以逐个字节变异的,我们只需要在Fuzzing过程中增加个变量监控即可。它的优点包括:速度非常快,不需要人工写传播规则,没有Over-taint问题,可能有少量的Under-taint问题,出现没测试到的情况。

image.png

image.png

下图发现我们的漏报其实很少,左边这张图蓝色(最左边)是我们发现的污点,深蓝色(中间)是两者都发现的污点,浅蓝色(最右边)是IBM提供的污点。我们是没有误报的,它们可能会有Over-Taint的问题。所以我们的识别效果更准确,速度影响也非常小,只有25%的会overhead,对整体Fuzzing速度没有影响。

image.png

(2) RQ1-2:Constraint Conformance

第二个是识别数据流特征——分支匹配度。分支的地方两个变量有多少个匹配,通过程序插桩,就看分支在哪、有多少个bit相等,我们除了定义分支匹配度外,还进一步扩展了基本块的匹配度,扩展到路径的匹配度。

image.png

(3) RQ2:taint-guided mutation

① 识别完Taint信息和分支匹配度信息之后,怎么去进一步指导我们的mutation,怎么做变异呢?
前面其实已经提到了怎么做编译,比如Magic number、Checksum这些,直接拷贝这种。该编译很简单,通过Taint信息就知道要对哪里进行变异,然后获取的值是Magic number、Checksum,填进去就好了。

How to mutate direct copies of input

  • Direct copies
    Magic number、Checksum…
  • Execute twice
    First round:FTI taint analysis input offsets, expected value
    Second round:Mutate and test

还有一些是间接拷贝,输入的字节是通过一些运算之后来做检测,这种在变异的时候不能确定它准确的值,采用偏随机的方法,通过变量相关的字节进行随机的变异。

How to mutate indirect copies of input

  • Random bit flipping and arithmetic operations on each dependent byte
  • Multiple dependent bytes could be mutated together

然后taint有个问题,可能会有少量的under-taint问题,所以在变异过程中也不完全依赖于指导,可能也对那些我们认为不相关的字节也做一定小概率的编译。

Mitigate the under-taint issue

  • Randomly mutate their adjacent bytes with a small probability

image.png

② 接着我们需要确定对哪些字节变异?
我们有一个排序,目标是探索更多的代码,首先对没有探索的分支做一个排序;然后这些分支与某些输入字节相关,再对输入字节做一个排序,然后优先选某个字节。

  • Explore the untouched neighbor branches along this path one by one
    In descending order of branch weight
  • For specific untouched neighbor branch
    Mutating its dependent input bytes one by one
    In descending order of byte weight

③ 这些排序怎么计算呢?
我们有公式来计算,其实就是看输入字节与这个分支之间的依赖关系,输入字节会影响某些变量,有些变量会应用到不同分支中去,有些分支被探索过(Explored),有些分支没有(Unexplored)。所以先定义字节的权重,看这个直接会影响多少个没有测试的分支,图中所示,数量越高它的权重越大。

  • Input -> Variables -> Branches

image.png

那么,分支怎么做排序呢?都是没有探索过的分支。也是从这个图上说,反过来,一个分支(Branch)会依赖若干个字节,这若干个字节权重加起来越高,这个Branch的权重也就越高。

image.png

(4) RQ3:Conformance-guided evolution

最后一部分是去调整进化方向,通过分支匹配度,一个字节匹配和七个字节匹配的效果是完全不一样的。

image.png

① 那么,怎么把这个增加进去呢?
我们在原来代码覆盖率基础上增加了一个新的指标,即分支匹配度。原来大家是把这个分支,有好的代码覆盖率,就把它放到种子池中去,种子池是一个线性列表,现在把种子池修改,它还是个列表,但是每个节点不再是一个种子了,它每个节点可能是多个种子。

  • Updating seed queues
    the higher conformance, the better
    together with AFL’s policy: converage-guided

② 怎么做的呢?

  • 如果有新的代码覆盖率(New coverage),即有新的测试例(每个小圆圈就是测试例),就会在种子池中新建一组节点,里面就是新的测试例。如下图右边黄色部分,种子编号41。
  • 如果没有新的代码覆盖率(Same coverage,higher path conformance),它的代码覆盖率与之前某组测试例是一样的,但是它的路径匹配度更好,那我就取代了刚才的两个测试例。如下图左下角部分,种子编号21。
  • 如果没有新的代码覆盖率或更高的路径匹配度(Same coverage, same path conformance, different branch conformance),路径匹配度是由基本块匹配度构成的,但是基本块匹配度或分支匹配度组合不太一样,我们就往里面添加一个。如下图所示的右下角部分,种子编号23。

image.png

最后我们的种子池就修改成如下图所示,变成了二维的,后面取种子变异就从这个种子池中完成。该方法有很多好处,这里不详细讲解,具体如下图所示:

image.png

3.实验结果

接着我们看看实验结果,我们和AFL、CollAFL、Angora进行了对比,我们比它们中最好的代码覆盖率也提升了20%左右。

image.png

下图是进化曲线,代码覆盖率增长的曲线。

image.png

在挖漏洞这边,我们评价有两个指标——Crashes和漏洞。Crashes和之前三个中最好的相比,提升了5倍,增长曲线也非常快。

image.png

挖漏洞方面(Vulnerabilities),我们比之前的方案都要多,多2倍的效果,最后申请了41个CVE。

image.png

image.png

这次分享基本把GreyOne介绍了一遍,其实我们在Fuzzing方面还有以下这几个方面的工作,前面也提到过,推荐大家去阅读这些文章。

image.png

四.总结

简单做个总结,Fuzzing目前是最流行的漏洞挖掘方法,有很多的工作在研究。我们讲解的GreyOne方法是根据数据流敏感的思路来做的,在Fuzzing中更精确地通过很多的数据检查,该方法的亮点在于用了一个清亮的污点跟踪机制,用污点信息来指导进化,同时用分支匹配度来调整进化方向。当然,fuzzing这块还有很多工作可以去做的。

  • Fuzzing is the most popular vulnerability discovery solution
    Coverage-guided fuzzing is popular
  • Data-flow sensitive solution Greyone
    Infers taint attributes during fuzzing
    Performs taint-guided mutation
    Performs conformance-guided evolution
  • Many more topics to explore in fuzzing

问题:这里主要针对有源码的挖掘吗?这套方案和源码有什么关联呢?

回答: 有源码的时候效果会更好,因为需要做污点分析、监控变量的取值,然后来做程序插桩。当然这些工作在二进制中也可以做,其实反汇编都很难做种,更何况需要做插桩或其他的,可以做,但是效果会差一些,准确性、包括提取的分支会少一些,我们的方案可以移植过去,但是目前没有数据会说移植过去的效果会怎样,相比其他二进制方案会有提升,但效果不会很高。

问题:漏洞挖掘方案它挖掘的漏洞类型会不会偏向哪一类呢?比如哪一类较多或哪一类没有效果。

回答: 现在Fuzzing方案基本挖的内存破坏漏洞比较多,还有一些定制的适用于算法复杂度的漏洞,有一小部分是其他漏洞。它能挖什么类型漏洞,主要能力在于Sanitizer这部分,写什么样的检测工具,如果不写检测工具,只能看程序是否崩溃。很多时候漏洞触发后,它也不一定崩溃,所以大家会定制Sanitizer,比如BufferFlow监控,定义规则出来,比如谷歌的AddressSanitizer,它的漏洞类型和我们检测器有关。

问题:您挖出来的这些未知漏洞,怎么去验证它是不是真实的漏洞呢?是通过手动的方式呢?还是自动化方式呢?

回答: 这是个很好的问题,目前我们Paper中基本是人工来做,AFL提供了一些过滤功能,把显然是重复的这些Crashes去重了,剩下的还有一定数量,几十个、上百个,通常会人工写一些脚本工具来判断和验证。学术界现在也是有Paper在研究这些,怎么做自动的Crashes分析和归类。

问题:论文假设分支匹配度越高,输入的种子越优,这个假设怎么处理函数变化,如Hash变化再input呢?一个好的Hash函数它的输出应该是均匀的,这时的假设感觉就不太需要了,请问下这是怎么处理的。

回答: 我们现在没有处理这种特殊情况,其实遇到这种情况现在的方案可能大家都做得不好,这是一个很经典的例子。比如前面说的间接数据拷贝,做了一个变换再来判断,我们的方案效果也不好。我们的方法识别出来它和18到20字节相关,重点变异这几个字节,此时分支匹配度策略可能就不是很有效,比如foo可能是Hash变换函数后均匀分布了,确实是存在问题的。

image.png

点击关注,第一时间了解华为云新鲜技术~

相关推荐

鸿蒙案例上新啦 | 购物、听歌、健身:15个模板带你一键激活社交娱乐

页面层级如何组织、跨页共享状态如何同步、列表与详情及个人中心如何形成稳定闭环。鸿蒙开发实践中心将这些高频消费与互动场景沉淀为可参考的标准模板,提供从业务架构到界面实现的快捷实践入口。更多实战案例欢迎前往鸿蒙开发实践中心案例中心查看并开启云端体验。

华为云官方博客 332

鸿蒙案例上新啦 | 出门打车、到家上课:25个模板带你一屏打通日常生活

如何合理拆分页面组件、如何建立单一可信的状态源、如何让用户在每一步操作中都获得明确反馈。鸿蒙开发实践中心以标准化的应用与元服务模板为入口,将清晰的业务架构与可复用的代码结构直观呈现。不妨立即挑选一个感兴趣的方向进入云端环境,从页面布局、组件封装、状态管理到路由组织,亲手跑通你的鸿蒙实战项目。

华为云官方博客 320

LakeAgent:DWS数据仓库的第二大脑,告别 “翻译式运维”,迈入智能自治时代

和普通 SQL 改写工具不同,LakeAgent 自动做多方案代价对比,主动规避负优化陷阱:补充分区键过滤实现剪枝,扫描分区由 37 收敛至 1,执行代价从 758.28 降至 113.74;未来的数据仓库,将不止能算、能存,更能看懂自己、诊断自己、理解自己。长久以来,数仓的智能都依附于人:信号需要人解读,瓶颈需要人研判,经验困在个体里,无法随底座永续生长。CPU 高、CPU 告警、CPU 诊断、CPU 使用率过高、CPU 满。语法、错误码、计费、性能调优、最佳实践、故障处置等全场景内容。

华为云官方博客 551

如何使用RDS Supabase后端BaaS能力:文件存储(File Storage)

• product-images(公开桶,允许公共读取):策略名称"Public read for product-images",允许SELECT,目标角色anon,策略定义bucket_id = 'product-images'。上传/删除需另配INSERT/DELETE策略,详见SQL。• product-specs(私有桶,仅认证用户访问自己的文件夹):建议拆为上传、读取、删除三条策略,策略定义均为 bucket_id = 'product-specs' 且仅限本人文件夹(详见下文 SQL)。

华为云官方博客 470

如何使用RDS Supabase后端BaaS能力:实时订阅与推送(Realtime)

Realtime 把数据库的每次变更同步到客户端:表里增、删、改一行,订阅者无需刷新页面或主动请求即可秒级收到。三大能力各司其职:• Postgres Changes — 监听表的 INSERT/UPDATE/DELETE,变化即通知• Broadcast — 客户端之间直接互发,适合瞬时通知、协同编辑• Presence — 跟踪频道里“谁在线”典型场景有实时数据展示(订单、库存、监控指标即时刷新)、即时通讯(消息收发、在线名单、“对方正在输入”)、协同编辑与实时通知。

华为云官方博客 462

AI Agent如何通过MCP连接到华为云RDS Supabase应用平台

Schema元数据列出所有可访问的表(按schema分组)。Schema元数据列出表的列及元数据(类型/默认值/约束)。Schema元数据列出所有约束(PK/FK/UNIQUE/CHECK/EXCLUDE)。可按schema/表/类型过滤。Schema元数据列出所有外键关系。可按schema/表过滤。Schema元数据列出所有索引及定义和大小。可按schema/表过滤。Schema元数据列出已应用的数据库迁移记录。Schema元数据列出已安装的PostgreSQL扩展。

华为云官方博客 471

华为大数据Flink让每一 CU 算力,跑出开源 5.74 倍的性能

1. 开源Apache Flink 已成为业界流计算事实标准,但在极端重负载场景下存在性能瓶颈。2. 华为大数据Flink通过多项自研深度优化,在执行计划、算子执行、状态存储三个层面构建协同的优化体系。3. Nexmark Benchmark 测试结果:整体性能提升 5.74 倍,极端重负载场景性能领先最高 18.3 倍。4. 100% 兼容 Apache Flink 1.20,业务代码零改造,无缝迁移。

华为云官方博客 377

LakeAgent实战 | 业务分析篇从一句提问到业务分析

本文以“订单金额变化”分析为例,展示LakeAgent如何通过自然语言提问,结合DataArtsStudio的数据资产与专业技能,帮助业务人员快速定位数据、生成SQL、追踪血缘、生成报告。从问题出发,逐步实现数据发现、变化洞察、原因追溯与团队协作,最终形成可复用的分析流程与企业规则,显著提升数据分析效率与一致性。

华为云官方博客 387

华为云RDS Supabase AI应用已开放公测 :30分钟搭建AI应用后端

认证、存储、实时推送、数据库API——4个后端模块,传统开发需要数周。今天,你只需要30分钟。AI创业公司的全栈开发工程师。上周老板说"下周要上线的AI对话应用,后端你来搞"——认证鉴权、数据库接口、文件存储、实时推送,每一个模块都需要数周搭建,而市场不会等你。小张打开华为云RDS Supabase,30分钟搭好认证、数据库API、对象存储,剩下的时间全用来打磨AI交互体验。基于开源Supabase+华为云RDS PostgreSQL全托管能力,为开发者提供。

华为云官方博客 395

如何使用RDS Supabase后端BaaS能力:数据库函数(Database Function)

上一篇介绍了 Database Data API——建表即自动生成增删改查接口,解决单表读写,但聚合统计、跨表事务、字段自动维护等逻辑已超出其能力边界。本篇推进到数据库函数(Database Function):把业务逻辑封装进数据库,前端通过 .rpc() 调用,由触发器自动响应数据变更。上一篇中,小张基于 Data API 完成了产品目录的建表与基础读写。但新需求随之而来:按分类统计产品数与价格区间、上架新品同时写产品表与定价表、产品修改后自动刷新更新时间。

华为云官方博客 463

如何使用RDS Supabase后端BaaS能力:创表即生成API(Database Data API)

认证、存储、实时推送、数据库API——4个后端模块,传统开发要数周。本系列逐个拆解,首篇聚焦数据库API(Database Data API):建表即得 API,无需手写后端。小张,AI创业公司的全栈工程师。老板让他做个产品目录页,展示产品与价格、支持上下架。传统做法要搭后端、写接口、配权限,工期少说1-2周;而在华为云RDS Supabase,建两张表、应用 SDK 直连,几分钟增删改查全跑通。

华为云官方博客 478

从一句话到一个能出去的链接,AI开发者空间做了什么

自行搭建的 Agent、正在使用的开源项目、团队既有的工具,都可以接入,可以通过AI创建或者手动搭建环境;华为云 AI开发者空间——面向开发者的云端一站式开发平台,做的就是把这段路接上:环境免安装,浏览器打开即为完整的 Linux 运行环境,预置的 AI 智能体开箱即用。第一个任务建议选能出结果的:做一个游戏、生成一个页面、创建一台实例,从需求走到可访问的链接,一次就能看清这个环境在做什么。沙箱是一个完整的 Linux 环境,依赖、服务、端口都是真实的,不是模拟。环境释放后,权限随之失效。

华为云官方博客 425

华为云码道配置自定义大模型,四种方式完整实操

案例介绍。

华为云官方博客 620

图数据库:实现穿透式监管的数据基座

穿透式监管标志着国企监管从“管企业”向“管资本”转型过程中的关键一跃。而图数据库正是这一跃的技术支点。从股权穿透到资金链穿透,从供应链穿透到数据穿透,华为GES图数据库正在将“穿透式监管”从理念变为可落地、可操作的实践。无论是天眼查式的全量链路查询,还是某集团财经的税务规则判断,抑或是芯片供应链式的部件风险分析,乃至通过Palantir构建决策知识图谱,其底层逻辑都是一致的——用图的力量,穿透一切形式的“隔离层”,直抵风险本质与责任核心。

华为云官方博客 664

《公共云三十问》正式收官,奔赴企业AI百场景新征程

今年6月底,公共云产业联盟重点推出《公共云三十问》专栏,以每周三问的节奏,连载十周,解读《先进公共云》白皮书,分享国计民生系列案例,旨在凝聚共识、推动落地实践。同时,专栏分析公共云在产业升级、民生福祉、科技创新、全球发展等方面的作用,梳理中国特色公共云发展路径:以普惠云拓展用云广度,以智算云提升用云深度,以自主云夯实用云厚度,以全球云打开用云跨度。这十问从专属云、行业云切入,深入政务、金融、交通、电力、钢铁、化工、油气、制造等国计民生场景,回答公共云“怎么用”。

华为云官方博客 472

开发者小技巧|IAM配置,让码道代码智能体连续30天免登录

案例介绍。

华为云官方博客 644

码道深度对接CodeArts,让需求自动落地为代码

案例介绍。

华为云官方博客 719

【公共云三十问 之三十】拥抱AI,企业如何建设面向智能体的专属云?

企业可分阶段建设覆盖开发、运行、运营及安全的一体化智能体平台——从构建一站式、高低码协同的智能体开发平台,到打造高性能、极致弹性的运行时环境,再到搭建AgentOps驱动的持续运营与运维体系,同时构建端到端、多层次的全链路安全防护体系。在数据湖建设方面,遵循“存量复用、平滑演进、AI导向、分步迭代”原则,分三阶段推进——打造AI多模数据湖核心能力、完成存算分离与统一元数据管理、实现闭环赋能全面支撑智能体规模化落地,在保护既有投资的前提下将传统数据平台转型为AI数据专属供给平台。

华为云官方博客 823

【公共云三十问 之二十九】国计民生之制造:制造云如何重塑数智时代的新质生产力?

平台打通软件交付的完整路径,覆盖需求管理、代码托管、代码检查、编译构建、制品仓库、部署、测试等关键环节,支持大模型能力融入研发全流程,实现从需求到交付的端到端管理。通过构建“研发一朵云”,方案打破地域与组织壁垒,实现跨团队协同开发,有效缩短软件交付周期,助力工业制造企业从“传统研发”走向“敏捷研发”,加速数智化转型进程。当制造云真正成为数据流通的平台、AI创新的底座,公共云的社会价值将从基础设施层向生产场景层持续延伸,为新型工业化建设和制造强国战略注入源源不断的动力,重塑数智时代的中国制造新质生产力。

华为云官方博客 789

告别重复手工迁仓,码道MCP+Skill实现仓库批量迁移

案例介绍。

华为云官方博客 790

【公共云三十问 之二十八】国计民生之油气:智算云如何叩响数智时代的“地心蓝金”?

西南油气田以“向地球深部要资源”为战略方向,联合以华为云Stack为代表的公共云服务商共同打造统一算力底座,建设西南区域数据湖与通用技术平台,构建“勘探开发工程技术、天然气生产过程管控、天然气产运储销”等三个一体化协同应用场景,支撑油气勘探、开发生产、管输储运等全业务链的数智化转型。当智算云真正成为数据流通的平台、AI创新的底座,油气田得以将算力效能、数据价值与智能技术深度融入勘探开发全链条,将“看不见的算力”转化为“摸得着的储量”,以智能化手段持续降低勘探风险、缩短发现周期、提高采收效率,确保生产安全。

华为云官方博客 613

【公共云三十问 之二十七】国计民生之化工:数智云如何重塑传统化工新范式?

在架构方面,方案构建云边协同的统一体系,涵盖AI协同、数据协同与运营协同三大维度——总部集中训练大模型,边缘节点负责推理执行,云边持续迭代,实现“边用边学”的智能闭环,模型平均精度提升20%以上。此外,方案提供一站式企业级工业物联网平台、数据湖与数据治理平台,覆盖工业数据分析“采、存、算、管、用”全流程,打通生产现场与管理系统间的数据壁垒,有效消除数据孤岛。层面,方案充分发挥软硬协同优势,实现计算、存储、网络与云平台的深度协同,训练线性度超95%,为大模型训练推理提供强劲算力支撑。▲化工“数智”新模式。

华为云官方博客 663

【公共云三十问 之二十六】国计民生之钢铁:数智云如何淬炼中国钢铁新力量?

同时,构建云边端协同的统一架构,支撑集团总部与各生产基地两级协同发展——总部集中训练大模型,边缘节点负责推理执行,云边持续迭代,实现训推一体化的资源调度与高效协同,为钢铁行业的数智化转型构建了坚实的算力底座。层面,方案构建覆盖“工业数采→边缘IT/OT融合→统一数据湖→数据治理平台→数据应用”全链路的一站式数据治理与流通平台,打通生产现场与管理系统间的数据壁垒,让数据“采得到、流得动、用得好”,加速数据价值从生产现场向经营决策层流动释放。湘潭钢铁集团的钢铁数智云,是钢铁工业智能云建设的标杆案例。

华为云官方博客 526

LakeWatch——MRS 智能运维Agent

从资源池、队列、作业等多个维度,对集群CPU与内存资源进行精细化分析与对比,直观呈现不同时间段的空闲、满载等使用状态,识别资源浪费,指导治理优化,为扩缩容决策提供数据支撑。对HDFS存储进行多维度深度分析(目录、用户、用户组等),涵盖使用量、增量、文件大小分布及数据热度等指标,帮助快速识别增长较快的目录、长期未访问的文件,统计目录文件数量与小文件占比,评估HDFS总存储量与扩缩容需求,为存储治理与资源规划提供全面数据支撑。Agent主动巡检,识别异常趋势并提前预警,让运维从"事后处理"转向"事前预防"。

华为云官方博客 515

华为云专题文档发布:丰富的AI案例、选型指导和概念解读

发布 “云服务选型”、“云计算概念”专题,提供云服务选型指导,助您选择匹配业务的云服务,解读云计算相关概念,开启云上学习之路。开发者工具和文档专区上线,提供从学习、实践到反馈的全链路支持。帮助中心新增100余篇AI案例。

华为云官方博客 286

一个人,也能用AI做点“星东西”

华为云星耀创想者大赛-2026华为云OPC创意大赛等你来~

华为云官方博客 290

从需求到可执行工作项:MCP+Skill 让智能体规划真正落地

回顾整个体验,以前让智能体帮我拆需求,它是洋洋洒洒给我列了一大篇 Markdown,看着挺像那么回事,但最后还是得我一条条往 CodeArts Req 里搬,搬完再手动挂父子关系、排日期,拆需求五分钟,搬运两小时。现在好了,MCP 给智能体接上了"手",Skill 给它装上了"项目经理的脑子",一句话下去,34 个工作项连带排期、层级关系全给我建好了,甘特图一拉,齐刷刷都在两周内,节省了多少工作量啊,美滋滋。本次实操在码道代码智能体基础上,构建了一套"需求→可执行工作项"的自动化规划方案。

华为云官方博客 574

华为云码道「码力续航计划」更新!

✅上新GLM‑5.3‑Flash,高速响应,代码生成、工程解析、Agent调试高效输出。新增GLM‑5.3‑Flash福利模型,每日解锁1000万免费Tokens。● 本次活动共发放总量价值100万元Tokens,发完即止!把耗算力的编码重活,交给华为云码道代码智能体🚀🚀。● 每日额度准时刷新,当日清零、次日满血重置。✅复杂算法、大项目解析、批量代码生成随便跑。✅不用抠额度、不用算消耗,放开调试大胆迭代。✅无需额外操作,登录即送,直接切换模型使用。● 把算力交给码道,让撸码不再内耗👏🏻。

华为云官方博客 684

【公共云三十问 之二十四】国计民生之交通:交通云如何铺就数智通衢新坦途?

交通行业作为支撑实体经济的关键基础设施,涵盖公路、铁路、机场、港口、地铁等众多子领域,其中,公路网络作为综合交通运输体系的基础骨架,承担着全国超过70%的客货运量,其数字化、智能化转型的需求尤为迫切。方面,提供Agent开发框架、知识库管理、RAG工程、意图识别、静态应用编排及模型评测等能力,支持客户将行业知识、业务流程与AI能力深度融合,快速构建面向收费稽核、路网调度、应急处置等场景的智能应用。开发并实现落地应用,全面覆盖建设、管理、养护、运营、服务、安全、办公七大业务领域。

华为云官方博客 461

【公共云三十问 之二十五】国计民生之电力:电力云如何点亮数智电力新引擎?

方案构建了覆盖数据获取、质量评估到标准化处理的全链路能力。基于公共云服务商智算底座及气象大模型,通过时空图神经网络重新建模产流机制,中国华电建成超50TB多源融合数据集,突破时空建模与机理融合等五大关键技术,短期径流预测精度较传统机理模型提升5个百分点以上,实现15天中期径流预测精度超85%,推理效率达秒级。基于气象大模型的基础架构与预训练能力,客户可直接在大模型之上开展增量训练与微调,充分利用场站所在区域的高精度历史数据(如3公里、1公里分辨率),针对不同场站和区域的地形地貌与气候特征进行模型调优。

华为云官方博客 381
上一篇: 【HCDG城市行东莞站】松山湖开发者村助力企业释放数字新动能
下一篇: 用案例带你认识决策树,解锁洞察力
华为云开发者联盟
华为云开发者联盟 企业官方账号 企业官方账号
博客等级 码龄10年 72万+粉丝 5985原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值