万字带你熟悉静态分析工具的评估测试

本文分享自华为云社区《静态分析工具的评估测试》,作者: Uncle_Tom。

1. 垂直极限

还是先说故事。那是 2014 年参加的一个测试驱动(TDD)的培训,培训是 TDD 推广的志愿者组织的,在一个咖啡馆里搞的周末两天的免费培训。

培训过程中的一张图和一个电影然我至今记忆尤新。

1.1. 一张图

cke_142.png

上面的两个图(原来培训的那个图找不到了,自己随手涂鸦了一下)。

左边是经过完整的系统的测试的软件产品,每个节点都通过测试,这样一层层的搭建起来的系统。看着就坚实可靠。

右边的测试则是随意的,很多地方都缺失了。任何一个风吹草动,一个异常都可能造成整个大厦倾覆。

不用说大家立刻就可以看懂,那个软件产品更可靠,更让人放心。

1.2. 一段影像

影像是电影《垂直极限》中的一段。虽然过去 20 多年了,但这部电影仍然被奉做山难电影的经典之作,有兴趣的朋友还是可以找来看一看的。

cke_143.png

电影讲的是一个风和日丽的日子里,老爸带着儿子、女儿在一个高耸陡峭的山峰上攀岩。他们已经来到了山峰的一半,在他们的上面个还有另一群攀岩爱好者。

老爸一边整理着自己的安全栓(攀岩过程中打在岩石中,用于固定自己的安全扣),一边对儿子说:“检查下你妹妹的安全栓。”

儿子看向下面的妹妹,妹妹说:“告诉他我们已经不是小孩子了。”

儿子打趣的对老爸说:“爸,她还需要一个安全栓。”

爸爸看向下面的兄妹两人说:“万一出事,那样可撑不住。安妮,我不管你有多老练,聪明的攀岩者都会做好安全措施,两个栓才安全,三个更好。在岩壁上再放个安全栓,我们才继续攀。”

女儿生气的对爸爸说:“爸,你别听哥哥的,他在开玩笑,我放了三个安全栓。”

电影总是这样,一段舒缓的节奏后面,总会有段紧张的让人喘不过气来的场面。不出意外,意外就会发生。

话音未落,先是一个登山包从山上面坠落下来,快速的经过三人。上面的菜鸟在登山的过程中背包意外脱落,造成一连串的连锁反应,两个登山者也不幸地被连带着坠落下去。老爸、儿子也被着一连串的变故拖累到挂在了半空中,女儿的三个安全栓在崩飞了两个后,只靠着最后的一个安全栓勉强的维持着女儿,以及挂在半空的老爸和儿子。最后在老爸的要求下,儿子不得不割断了绳索,女儿和儿子看着老爸坠了下去。

看到这里,大家都不禁须臾不已,再看看上面的图,对系统的完整的测试有了更深刻的认识。

1.3. 思考

在软件的开发过程中,每一个节点的测试都是在为系统增加一个安全栓。由这样一层层搭建起来的系统,整个系统才是安全、可靠的。否则任何一个意外都可能将整个系统带飞。

那么对于静态分析工具,我们该如何构建一个稳定、可靠的静态分析工具?如何评价一个静态分析工具的检查能力?

自从程序的诞生,程序分析便紧随其后,人们视图通过一个程序来分析编制的程序,保证编制程序运行结果的正确性。尽管后面的莱斯定语给出了这个问题的“不可判定性”,但并不会妨碍程序分析在这方面的卓越表现。

cke_144.png

尽管现在大模型能够帮助我们生成程序代码和对已有程序进行问题检查,这似乎可以绕过我们一值以来使用的模式匹配的检查方式,可以简化模式的提炼,和根据模式再编写检查规则。 但如何保障生成代码的安全性和可靠性,以及如何评估大模型的能力,仍然将是人工智能在今后很长一段时间需要解决的问题。

通过下面对三组测试用例的分析,希望能够给静态分析工具的测试和评估给大家一个指导性的启发。

2. Juliet Java、C/CPP 测试用例集

2.1. 创建背景

2005 年美国国家标准与技术研究院(National Institute of Standards and Technology (NIST)),简称NIST,下属的软件质量组,成立了软件保障指标和工具评估项目(Software Assurance Metrics And Tool Evaluation (SAMATE)),简称SAMATE项目。项目组的主要目的是通过开发支持软件工具评估的方法、衡量工具和技术的有效性以及识别工具和方法中的差距来改善软件保障,主要工作包括定义错误类,收集具有已知错误的程序语料库,以及更好地了解工具的有效性。

围绕这个目标,软件保障指标和工具评估项目(SAMATE)建立了两个子项目:

  • 软件保障参考数据集(Software Assurance Reference Dataset (SARD)),简称SARD,用于收集整理C、C++、Java、PHP 和 C#针对软件弱点的测试用例集;
  • 软件工具博览会(Static Analysis Tool Exposition (SATE)),简称SATE,用于工具制造商对用例进行测试和工具研讨。截至 2021 年,已经举办了六场 SATE 活动。

2.2. Juliet 用例集简介

Juliet 测试用例集就是软件保障参考数据集(SARD)下的一个是用于检测 C/C++ 和 Java 程序已知缺陷的集合。

  • 2010 年 12 月 1.0版本

    Juliet 测试用例集最早的 1.0 发布于2010 年 12 月,由软件保障指标和工具评估项目(SAMATE)的开发团队完成,名字选取了当时软件保障参考数据集(SARD)的第十个贡献者:国际无线电(International Radiotelephony)的字母表中的第十个单词 “Juliet” 而的得名。

  • 2011 年 1.1 - 1.1.1 版本

    Juliet 1.1 版本 是 Juliet 的开发团队根据多个因素为选定的缺陷创建了测试用例,包括团队的经验、缺陷的重要性或严重性以及其出现的频率。测试用例涵盖了 2011 年 CWE/SAN TOP 25 个最危险的编程错误中的 14 个。剩下的 11 个缺陷是设计问题,例如 CWE-862 授权机制缺失 和 CWE-250 带着不必要的权限执行,这些问题不适合用静态分析的方式来检测,所以未包含在测试用例中。

  • 2012 年 1.2 版本

    2012 年的 Juliet 1.2 版本。基本形成了现在使用版本。是我们现在使用最多的版本,程序分析、自动修复、深度学习的论文基本上都使用了这里面的用例,用于证明理论、工具的有效性。

  • 2017 年 1.3 版本

    只对1.2 版本的个别错误进行了修正。

    • Juliet C/C++ 涵盖 118 个 CWE 问题,1689 个场景,用例数: 181,140, 其中正例:117,041, 反例:64,099。
    • Juliet Java 涵盖 112 个 CWE 问题,933 个场景,用例数: 96,537, 其中正例:67,656, 反例:28,881。
  • 2022 年 1.3.1 版本

    增加了SARIF 的支持,试图通过SARIF 精确的给出告警的位置信息,但对数据流的支持的并不好,不能完全依靠现有的SARIF版本。

注:关于 SARIF请参考:

2.3. Juliet 用例构造的特点

2.3.1. 统一明确的命名方式

测试用例使用CWE作为命名和组织的基础。测试用例力求对目标缺陷使用最具体的CWE条目。每个测试用例文件与一个CWE条目相关联。

2.3.1.1. 测试用例文件名命名规范
  • 测试用例名由四个元素的组合唯一标识:

组成部分

描述

是否强制

CWE

字符

是

CWE ID

CWE的编号

是

_

分隔,下划线

是

CWE短描述

CWE英文名称的缩短版本,单词之间用下划线"_"连接

是

__

分隔,两个下划线"_"

是

问题场景

表示用例场景。场景描述单词之间用下划线"_"连接

是

_

分隔,下划线,问题场景和案例编号之间进行连接

是

案例编号

基础案例编号采用“01”

是

一个案例多文件定义

对同一个案例,如使用多个文件,可采用a,b等进行区别,或采用下划线加不同的作用定义,例如_good或_bad,表示正例或反例

否

例如:

  • 单文件用例:
    • CWE190_Integer_Overflow__byte_console_readLine_add_01.java
      • CWE190: CWE 的编号,可以在CWE网站上查询到这个编号对应的问题:https://cwe.mitre.org/data/definitions/190.html;
      • Integer_Overflow:CWE190 描述的简写,整型溢出。CWE190 的完整描述是:整型溢出或越界折返;
      • byte_console_readLine_add: 场景描述:通过readLine函数从控制界面读取字节流;
      • 01:代表基础用例。
  • 多文件用例, 下面的一组文件构成了一个用例:
    • CWE190_Integer_Overflow__byte_console_readLine_add_81_bad.java
    • CWE190_Integer_Overflow__byte_console_readLine_add_81_base.java
    • CWE190_Integer_Overflow__byte_console_readLine_add_81_goodB2G.java
    • CWE190_Integer_Overflow__byte_console_readLine_add_81_goodG2B.java
    • CWE190_Integer_Overflow__byte_console_readLine_add_81a.java
      • CWE190: CWE 的编号,可以在CWE网站上查询到这个编号对应的问题:https://cwe.mitre.org/data/definitions/190.html;
      • Integer_Overflow:CWE190 描述的简写,整型溢出。CWE190 的完整描述是:整型溢出或越界折返;
      • byte_console_readLine_add: 场景描述:通过readLine函数从控制界面读取字节流;
      • 81: 数据流案例,案例将参数传递给通过引用调用的抽象方法;
      • _bad: 表示这是个反例的文件;
      • _base: 表示这个是用例的主文件;
      • _goodB2G: good 表示这是个正例的文件,同时 B2G 表示污点(Bad)会经过清洗到达(2(to))爆发点,但由于做了清洗,变成了无污染的,不会引起问题(Good);
      • _goodG2B: good 表示这是个正例的文件,同时 G2B 表示污点经过清洗变成无污染(Good)到达(2(to))爆发点(Bad),但由于是无污染的数据,也不会引起问题;
      • a: 表示这是个辅助文件。
2.3.1.2. 测试用例函数名命名规范
  • 有问题(反例)函数,通常以bad命名, 并可使用正则表达式匹配:^bad$;
  • 没问题(正例)的函数,通常以good命名, 并可使用正则表达式匹配:^good$;
  • 对于用例中存在多个正例的函数,有以下三种命名方式,可使用正则表达式匹配:^good(\d+|G2B\d*|B2G\d*)$;
    • 默认或通用的方式,采用例如: good1()、good2()、good3()的命名方式;
    • 当一个好的源将安全数据传递到一个潜在的坏接收器时,采用例如:goodG2B()、goodG2B1()、goodG2B2()、goodG2B3() 的方式命名;
    • 当不良源将不安全或潜在不安全的数据传递给良好源时,采用例如:goodB2G()、goodB2G1()、goodB2G2()、goodB2G3()的方式命名;
  • 对于数据流用例还遵守以下命名方式,
    • 有问题的污染源,采用正则表达式:^badSource$;
    • 有问题的爆发点,采用正则表达式:^badSink$;
    • 无问题的污染源,采用正则表达式:^good(G2B\d*|B2G\d*)?Source$;
    • 无问题的爆发点,采用正则表达式:^good(G2B\d*|B2G\d*)?Sink$。
2.3.1.3. 命名规则在测试中带来的好处
  • 从文件名就能判断出检测问题、场景、适用的案例类型,有的还可以知道文件是正例、还是反例;
  • 从发生问题的函数名就可以知道,所处的函数是正例,还是反例;
  • 通常检测工具都会给出问题所在的文件和函数,这样在查看问题的时候能够立刻判断出检测结果的有效性;
  • 严格的命名方式,也便于使用程序自动化的检查结果做出快速的判断。

2.3.2. 每个问题给出发生问题的可能场景

Juliet 还为每个问题(CWE)枚举了一些发生场景,一些场景还使用模板结合控制流和数据流进行了枚举,从而测试更加广泛的问题发生的可能性,以提高问题的覆盖率。

  • Juliet 一共采用了三类模板:
    • 控制流模板(point-flaw)
    • 单一污点源和爆发点模板(source-sink);
    • 多污点源和爆发点模板(sources-sinks);
  • Juliet Java
    • Juliet Java 一共 122 个 CWE, 覆盖 933 个场景。
    • 用模板生成的场景 823 个,这包括:
      • point-flaw: 92 个场景;
      • sources-sink: 197 个场景;
      • sources-sinks: 534 个场景;
    • 单一场景 110 个。
  • Juliet C/C++
    • Juliet C/C++ 一共 118 个 CWE, 覆盖 1689 个场景。
    • 用模板生成的场景 1509 个,这包括:

Template

C

CPP

Total

point-flaw

259

18

277

sources-sink

499

233

723

sources-sinks

357

152

509

Total

1106

403

1509

  • 而单一场景 180 个。

2.3.3. 每个场景使用不同的案例进行覆盖

Juliet 用例还真对每个场景结合控制流和数据流进行了枚举,以达到每个场景在不同代码条件下的检测能力的覆盖。

从下表我们看到类型基本上涵盖了编程语言通常所需要的基本语法,例如条件判断(if),条件分支(swith),循环(while,for),函数间和程序间不同层数的调用,以及不同类型的参数传递方式。

  • 案例类型明细

案列编号

案例类型(流类型)

类型描述

C

CPP

JAVA

01

无

基线——最简单的缺陷形式

Y

Y

Y

02

控制流

if(true) 和 if(false)

Y

Y

Y

03

控制流

if(5==5) 和 if(5!=5)

Y

Y

Y

04

控制流

if(PRIVATE_STATIC_FINAL_TRUE) 和 if(PRIVATE_STATIC_FINAL_FALSE)

Y

Y

Y

05

控制流

if(privateTrue) 和 if(privateFalse)

Y

Y

Y

06

控制流

if(PRIVATE_STATIC_FINAL_FIVE==5) 和 if(PRIVATE_STATIC_FINAL_FIVE!=5)

Y

Y

Y

07

控制流

if(privateFive==5) 和 if(privateFive!=5)

Y

Y

Y

08

控制流

if(privateReturnsTrue()) 和 if(privateReturnsFalse())

Y

Y

Y

09

控制流

if(IO.STATIC_FINAL_TRUE) 和 if(IO.STATIC_FINAL_FALSE)

Y

Y

Y

10

控制流

if(IO.staticTrue) 和 if(IO.staticFalse)

Y

Y

Y

11

控制流

if(IO.staticReturnsTrue()) 和 if(IO.staticReturnsFalse())

Y

Y

Y

12

控制流

if(IO.staticReturnsTrueOrFalse())

Y

Y

Y

13

控制流

if(IO.STATIC_FINAL_FIVE==5) 和 if(IO.STATIC_FINAL_FIVE!=5)

Y

Y

Y

14

控制流

if(IO.staticFive==5) 和 if(IO.staticFive!=5)

Y

Y

Y

15

控制流

switch(6) and switch(7)

Y

Y

Y

16

控制流

while(true)

Y

Y

Y

17

控制流

for 循环

Y

Y

Y

18

控制流

goto 语句

Y

Y

N

21

控制流

流由私有变量的值控制。所有方法都包含在一个文件中。

Y

Y

Y

22

控制流

流由公共静态变量的值控制。source和sink在两个不同的文件里。

Y

Y

Y

31

数据流

在同一方法中使用数据副本流动

Y

Y

Y

32

数据流

在同一个函数中使用两个指向同一个值的指针的数据流

Y

Y

N

33

数据流

在同一函数中使用对数据的 C++ 引用

N

Y

N

34

数据流

使用包含两个访问相同数据的方法的联合(在同一函数内)

Y

Y

N

41

数据流

作为参数从一个方法传递到同一类中的另一个方法

Y

Y

Y

42

数据流

在同一类中从一个方法返回到另一个方法

Y

Y

Y

43

数据流

数据使用 C++ 引用从同一源文件中的一个函数流向另一个函数

N

Y

N

44

数据流

数据作为参数从一个函数传递到通过函数指针调用的同一源文件中的函数

Y

Y

N

45

数据流

作为私有类成员变量从一个方法传递到同一类中的另一个方法

Y

Y

Y

51

数据流

在同一个包的不同类中作为参数从一个方法传递到另一个方法

Y

Y

Y

52

数据流

在同一个包的三个不同类中作为参数从一个方法传递到另一个方法

Y

Y

Y

53

数据流

在同一个包的四个不同类中作为参数从一个方法传递到另一个方法

Y

Y

Y

54

数据流

在同一个包的五个不同类中作为参数从一个方法传递到另一个方法

Y

Y

Y

61

数据流

在同一个包的不同类中通过一个方法的返回值传递到另一个方法

Y

Y

Y

62

数据流

使用 C++ 引用从不同源文件中的一个函数到另一个函数的数据流

N

Y

N

63

数据流

指向不同源文件中从一个函数传递到另一个函数的数据的指针

Y

Y

N

64

数据流

void 指向不同源文件中从一个函数传递到另一个函数的数据的指针

Y

Y

N

65

数据流

数据作为参数从一个函数传递到通过函数指针调用的不同源文件中的函数

Y

Y

N

66

数据流

在同一个包中的不同类中通过数组从一个方法传递到另一个方法

Y

Y

Y

67

数据流

在同一个包中的不同类中通过类从一个方法传递到另一个方法

Y

Y

Y

68

数据流

在同一个包中的不同类中通过类的成员变量从一个方法传递到另一个方法

Y

Y

Y

71

数据流

在同一个包中的不同类中通过类的引用从一个方法传递到另一个方法

N

N

Y

72

数据流

在同一个包中的不同类中将向量从一个方法传递到另一个方法

N

Y

Y

73

数据流

在同一个包中的不同类中将LinkedList 从一个方法传递到另一个方法

N

Y

Y

74

数据流

在同一个包中的不同类中将HashMap从一个方法传递到另一个方法

N

Y

Y

75

数据流

将序列化对象从一个方法传递到同一包中不同类中的另一个方法

N

N

Y

81

数据流

将参数传递给通过引用调用的抽象方法

N

Y

Y

82

数据流

将参数传递给通过指针调用的虚函数的数据

N

Y

N

83

数据流

通过在堆栈上声明类对象将数据传递给类构造函数和析构函数

N

Y

N

84

数据流

通过在堆上声明类对象并在使用后将其删除来传递给类构造函数和析构函数的数据

N

Y

N

2.3.4. 缺点

Juliet 可以说是堪称完美的测试用例集,但随着时间的推移,编程语言的迭代,它也显现出一些缺点:

  • 一些用例的写法开始变得老旧,可能不能胜任新的场景;
  • 没有对语言的所有语法特点做覆盖,特别是新的一些语法类型;比如:lamda 表达式;
  • 用例的设计存在大量的重叠,特别是对数据流的检测,每个场景都使用了相同的模板,产生了大量的用例。其实对于数据流的处理,完全可以分成:污染源、污染传递、污染清理、以及爆发四个不同的维度进行分别测试,这样可以大大提升测试效率。

3. OwaspBenchmark 测试用例集

3.1. 用例背景

OWASP(Open Worldwide Application Security Project (OWASP)) 基金会致力于通过其社区主导的开源软件项目、全球数百个分会、数万名成员以及举办当地和全球会议来提高软件的安全性。

3.2. 用例简介

OWASP Benchmark Project 是一个 Java 测试套件,旨在评估自动化软件漏洞检测工具的准确性、覆盖率和速度。

  • 1.0 版本于 2015年4月15日发布,共有 20983 个测试用例。
  • 1.1 版本于 2015年5月23日发布。1.1版本在前一版本的基础上进行了改进,确保每个漏洞区域都有真阳性和假阳性。
  • 1.2 版本于 2016年6月5日首次发布(1.2测试版于2015年8月15日发布)。自那以后,v1.2版本一直在不断调整。1.2 版本将测试用例数量控制在小于3000个测试用例,以便快速得到测试结果。

3.3. 用例设计和组成方式

下面以 1.2 版本为例进行说明。

3.3.1. 用例问题的覆盖

从下面这个表可以看出 Benchmark 更多的注重覆盖 Web 类的问题的检查,同时重点覆盖了 OWASP TOP 10 中的主要能够通过静态检查工具检查的问题。关于 OWASP TOP 10 可以参考:CWE 4.6 和 OWASP TOP10(2021)。

Benchmark 用例集主要以加密问题,以及注入类问题为主,这也巧合的与静态检查技术相互匹配。加密问题多用抽象语法树(AST)的遍历来返现加密函数,并对其做出判断。而注入类问题多用数据流的污点分析技术来追踪外部输入是否会对爆发点形成可达的路径。有关污点分析技术,可以参考:使用污点分析检查log4j问题。

检测问题

CWE TOP 25(2023)

OWASP TOP 10(2021)

正确用例

错误用例

用例总数

CWE-22 对路径名的限制不恰当(路径遍历)

8

A01:2021-中断访问控制

135

133

268

CWE-327 使用已被攻破或存在风险的密码学算法

-

A02:2021-加密故障

116

130

246

CWE-328 可逆的单向哈希

-

A02:2021-加密故障

107

129

236

CWE-330 使用不充分的随机数

-

A02:2021-加密故障

275

218

493

CWE-501 违背信任边界

-

A04:2021-不安全的设计

43

83

126

CWE-614 HTTPS会话中未设置’Secure’属性的敏感Cookie

-

A02:2021-加密故障

31

36

67

CWE-643 XPath表达式中数据转义处理不恰当(XPath注入)

-

A03:2021-注入

20

15

35

CWE-78 OS命令中使用的特殊元素转义处理不恰当(OS命令注入)

5

A03:2021-注入

125

126

251

CWE-79 在Web页面生成时对输入的转义处理不恰当(跨站脚本)

2

A03:2021-注入

209

246

455

CWE-89 SQL命令中使用的特殊元素转义处理不恰当(SQL注入)

3

A03:2021-注入

232

272

504

CWE-90 LDAP查询中使用的特殊元素转义处理不恰当(LDAP注入)

-

A03:2021-注入

32

27

59

3.3.2. 问题场景的覆盖

Benchmark 用例对每个问题采用: 场景枚举 + 组合的方式完成用例的设计,并通过此方法形成问题的覆盖。

这里以我们熟悉的:CWE89 SQL注入问题来说明这种用例的设计方式。用例集中CWE 89 SQL注入问题一共有 232 个正例,272 个反例,共计504 个用例。

因为 SQL 是注入是通过外部不可信数据,传播到 SQL 脚本执行的位置而导致的安全问题。这个外部数据传播的过程可以分为:

  • 接收数据

用例使用了我们常用的从 http 请求中得到外部数据,然后将数据以不同方法存入不同类型的字段。用例中列举了下面 9 种不同的方法。例如放入:字符串、枚举、数组等。

cke_145.png
  • 数据传递

用例接收到数据后,使用不同的传递方式,向程序内传递,并对信息采用不同的操作方式进行加工。用例中列举了下面 10 种不同的方法。例如:通过 创建一个新类然后调用函数传递、if 条件表达式、内部类等。

cke_146.png
  • 问题爆发

最终数据会拼装成 SQL 语句,并通过不同的调用方式执行。用例中列举了 3 类,28 种不同的执行方式。

cke_147.png
  • 场景组合

得到上面三种基本节点后,通过组合的方式形成用例。下表列举了 CWE89 SQL注入 272个反例组合的场景:

cke_148.png

3.3.3. OwaspBenchmark 用例集的缺点

OwaspBenchmark 应为涵盖了Web应用的主要安全问题,使用例集基本上成为了Web 应用安全测试的基本用例集。但它也存在一些缺点。

  • 用例名只采用了简单的编号方式,从用例看不出测试目标:用例反应的问题、场景、正例、反例这些基本信息,而不得不给每个用例加了一个xml文件来说明这些用例的基础信息。
  • 用例缺少场景的描述,工具测试后,无法得到覆盖场景和非覆盖场景的统计信息,只知道覆盖率。具体哪些场景缺失,要一个个用例去自己分析。
  • 缺少检测语言语法级别的场景的覆盖,例如lamda表达式,工具在数据流的分析过程中,任何一个语法的不适配都会导致分析中断。

4. Alipay 测试用例集

4.1. 用例背景

针对xAST领域缺乏有效衡量技术能力标准的业界痛点,蚂蚁安全团队联合蚂蚁程序分析团队、浙江大学网络空间安全学院的20余位专家学者,共同设计了xAST评价体系及其测试样本套件Benchmark,致力于成为应用安全测试工具的“度量衡”。

  • 目标:打造具备行业共识的xAST能力评价体系技术标准
  • 价值:衡量xAST产品技术能力,指引xAST技术发展方向,辅助企业产品选型

4.2. 用例设计和组成方式

用例设计的核心思想是:分层设计,降低评价复杂度。

从底层到上层分成引擎能力、规则能力和产品化能力这三层。对这三层分别设计评价体系和测试样本,既降低了每一层评价的复杂度,又使测试结果可以直接反映问题出在哪一层。

看的出,用例集的设计者试图希望结合Juliet、Owaspbenchmark 的优点,在形成一种分层的评估测试方式。来完善前面两个用例集在语法层面的不足。

目前用例集只推出了一个雏形,还在建设中。

5. 理想的测试用例集

最后再来总结下,理想的测试用例集应该是怎样的。

  • 能够从用例的命名上,清楚的反映:测试问题、场景、正例、反例;或从目标函数上明确知道在这个函数内的告警是正确的告警,还是误报;
  • 能够覆盖业界主要的安全问题,例如:CWE TOP 25、OWASP TOP 10等常见的问题;
  • 能够覆盖检测语言的主要语法和语言的主要使用方式;
  • 能够有一定的场景枚举和组合,以增加测试用例的复杂度,这有点类似 fuzzy 测试了。

写在最后,测试用例集的结果,只能反映一个工具的基础能力,并不能取代通过实际的工程来打磨检查工具。

一般的程序员只需要在问题和实现上建立一条通道就好,但程序分析的程序员却需要考虑各种程序员实现问题的可能性。

6. 参考

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

相关推荐

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

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

华为云官方博客 364

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

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

华为云官方博客 343

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

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

华为云官方博客 567

如何使用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)。

华为云官方博客 491

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

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

华为云官方博客 484

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

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

华为云官方博客 484

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

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

华为云官方博客 388

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

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

华为云官方博客 399

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

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

华为云官方博客 407

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

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

华为云官方博客 471

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

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

华为云官方博客 487

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

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

华为云官方博客 431

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

案例介绍。

华为云官方博客 637

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

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

华为云官方博客 671

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

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

华为云官方博客 474

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

案例介绍。

华为云官方博客 650

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

案例介绍。

华为云官方博客 723

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

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

华为云官方博客 825

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

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

华为云官方博客 792

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

案例介绍。

华为云官方博客 791

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

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

华为云官方博客 613

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

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

华为云官方博客 664

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

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

华为云官方博客 526

LakeWatch——MRS 智能运维Agent

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

华为云官方博客 515

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

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

华为云官方博客 286

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

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

华为云官方博客 291

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

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

华为云官方博客 578

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

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

华为云官方博客 692

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

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

华为云官方博客 464

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

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

华为云官方博客 381
上一篇: 分享两种Pulsar消息积压topic级别策略老化办法
下一篇: 记一次kubernetes获取internal Ip错误流程
华为云开发者联盟
华为云开发者联盟 企业官方账号 企业官方账号
博客等级 码龄10年 72万+粉丝 5985原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值