Skip to main content

使用规则管理新功能,进行新年的第一场代码审计!

原创 Yak Yak Project 2025-01-02 17:30

大家好,这里是上二休一的超级开心牛

先祝大家2025新年快乐!

新年新气象,YAK的新功能大家都用过了吗?

来,试试看⬇️

以下为该功能的大致一览。

该模块可以分为两个部分,组别为规则的组管理,右边为规则的详细信息。


除了方便管理规则外,主要作用是在代码扫描中会按组选取规则进行扫描

目前有内置一些基础的组,也可根据自己需求新建规则组。

右侧规则详细信息
中,包含着许多
需要我们在创建规则的时候填写的信息。

可能有些师傅已经熟悉如何使用Yak在命令行下创建规则了,而使用Yakit创建规则会有一些区别。接下来将为大家介绍规则的创建、调试以及相关的管理。

创建规则功能的按钮在右上角,如图:

一个完整的规则一般包含三个部分:规则描述、规则内容和规则输出。

如图:

规则描述#

规则描述对于一个规则是必要的,它能够表示一个规则的目的、漏洞等级、已经审计出的漏洞类型或者是CVE编号等信息。它由Desc语句中的键值对表示,一些有效的内置键值对如下:

描述字段简介示例
title规则的标题。title: "Check Direct Path Travel Vulnerability For Java"
title_zh规则的中文标题。title_zh: "检测Java直接路径穿越漏洞",
type | purpose规则的目的,包括:漏洞、审计、配置、安全热点。type: vuln,
description | desc | note规则的介绍,主要简要介绍该规则的作用。dscription一般使用heredoc语言,以便具备足够强的文本表述能力。desc: <<<TEXT跨站脚本攻击(XSS)是一种常见的......TEXT,
level | severity | sev风险等级,用来描述该规则审计到的漏洞的风险。包括:关键、高危、中危、低危、信息。level:high,
cveCVE编号,如果该规则用于审计CVE漏洞,那么可以填写该内容。cve:"CVE-2024-22234",
risk | risk_type风险类型。用来描述规则审计漏洞的风险类型,比如:SQL注入、XSS、命令执行等。risk:"rce",
lib | allow_include | as_library | as_lib | library_name作为被导入的规则的名称。写了这个字段后,那么该规则就允许被其它规则调用。lib: "java-command-exec-sink",

值得一提的是,使用Yakit创建规则,则无须指定title和descritor。规则默认使用规则名称作为title,使用左边的描述输入的内容作为descriptor。因而我们创建规则的时候,要着重去填
type、level与risk

  • type type描述了规则的类型,更确切的讲,是规则的目的,也就是这个规则是用来干什么的。我们将规则分为四种类型,包括:漏洞、审计、配置、安全。如果规则没有指定type,那么默认为审计规则。

    规则类型介绍示例
    漏洞规则漏洞规则目的专注于寻找代码中的安全漏洞。这可能包括但不限于SQL注入、跨站脚本攻击(XSS)、缓冲区溢出等。漏洞检查的目的是确保代码在部署前没有已知的安全缺陷,从而减少被攻击的风险。type:vuln,type:v,type:vulnerability,type:weak,
    审计规则审计规则是指对代码进行安全检查和评估,目的是发现潜在的安全问题或不良的编程实践。相较于漏洞规则而言,审计规则并不一定意味着发现了实际的漏洞,但它可以指出可能需要进一步调查或改进的区域。type:audit,type:a,type:audition,
    配置规则配置规则目的关注于代码的配置部分,包括但不限于配置文件、环境变量、数据库设置等。配置检查的目的是确保配置项设置得当,不会导致安全漏洞或系统不稳定。type:config,type:c,type:configuration
    安全规则安全规则,更精确的讲,应该叫安全热点规则。这个规则相较于漏洞规则更为广泛,它不仅包括寻找代码中的安全漏洞,还包括检查代码的整体安全架构、访问控制、加密措施、身份验证机制等。type:security,type:s,type:secure,
  • level

level描述了漏洞的风险等级。风险等级包括:超危,高危,中危,低危和信息。不过这只是从宏观上进行分类,在实践中,你可以使用多种关键字用来表述level。

风险等级示例
关键level:critical,level:fatal,
高危level:high,level:error,
中危level:warning,level:middle,
低位level:low,
信息level:info,

可能你会有疑惑,作为一个规则,只能填写一个固定的level吗?答案显然是否定的,因为level不同于type,决定最后level等级的一定是最后审计出来的结果。举个例子,有一个规则是用来审计命令执行漏洞的,如果确实存在这个漏洞,那么这个漏洞等级确实是高危。但是如果到命令执行的数据流中存在过滤函数,那么其风险等级可能就降到了低危。

所以,作为开头描述信息的level只是起到了一个“兜底”的作用,当审计出的结果没有level的时候,就默认使用这个level。关于审计结果如何修改level,将会在下面的alert语法进行介绍。

  • Risk

risk为风险类型,它同level一样,最后的risk也是依赖于alert语法。

一些risk如下:

risk关键字含义
url-redirectURL重定向
sqli,SQL注入
xssXSS
rce, rce-command命令执行/注入
rce-code代码执行/注入
lfi, file-read, file-download文件包含/读取/下载
file-write, file-upload文件写入/上传
xxeXML外部实体攻击
unserialize, deserialization反序列化
path-traversal路径遍历
......

规则内容#

规则的内容由一堆审计语句组成,不同类型的规则内容的写法都有一定的范式。现在可以通过规则管理功能查看现在拥有的内置规则是如何写的。关于这块内容,我们后续也会写一篇文章,分享不同类型内置规则的常见写法。

规则输出#

使用check语法根据审计语句的结果来断言和输出相应的信息,或者通过 alert 来告诉报告生成器需要重点关注的或者有漏洞的变量信息。

其中alert语法会修正规则描述的level和risk。

以下面这个路径穿越漏洞规则为例:

desc(    title: "Check Path Travel Vulnerability For Java",    title_zh: "检测Java路径穿越漏洞",    type: vuln,    level: mid,    risk: "path-traversal",    desc: <<<TEXT路径穿越漏洞(也称为目录遍历漏洞)允许攻击者通过操纵输入参数,访问或执行服务器上的任意文件。在Java应用中,这种漏洞通常出现在未对用户输入进行适当验证或清理的情况下,导致攻击者可以读取敏感文件或执行任意代码。为了防范这种漏洞,应严格验证和清理所有用户输入,确保它们仅指向预期的文件或目录。TEXT)
<include('java-spring-param')> as $source;<include('java-servlet-param')> as $source;<include('java-write-filename-sink')> as  $sink;<include('java-read-filename-sink')> as  $sink;<include('java-filename_filter')> as  $filter;
check $source;check $sink;check $filter;
$sink #{    until:`<self> & $source`,    exclude:`<self>?{opcode:call}?{!<self> & $source}?{!<self> & $sink}`}->as $high;
alert $high for {    message: "检测到直接路径穿越漏洞。",    level: high,};
$sink #{    until:`<self> & $source`,    exclude:`<self>?{opcode: call && <self><getCaller> & $filter}`}->as $low;
alert $low for {    message: "检测到路径穿越漏洞,但是数据流上有过滤函数。",    level: low,};

规则描述的默认level为mid,但是当规则检测到路径穿越漏洞的数据流从source到sink中间没有任何过滤的时候,alert语法将level修正为high;当检测到数据流有filter的时候,将level修正为low。因此规则具体的level只有在具体运行时才能知道。

现在,在创建完规则后,可以直接选择项目进行规则调试。如下图:

但是,调试功能还可以有更好的效果。目前只能够调试规则,在未来,也将会支持规则和项目能够在同一个页面修改的调试,就避免了对项目进行重新编译。

现在支持对规则进行分组,更加方便的管理规则。值得一提的是,对于每个规则,在创建的时候会进行默认分组。默认的分组为语言、规则类型与默认漏洞等级。如图:

新的代码审计规则管理功能已经上线,现在编写一条SyntaxFlow规则更为方便!同时,编写规则的时候务需准确填写规则的描述信息,因为引擎会根据描述信息自动生成规则的默认分组。也欢迎各位社区的伙伴去编写SyntaxFlow规则,并反馈你遇到的问题!

END

 YAK官方资源

Yak 语言官方教程:
https://yaklang.com/docs/intro/Yakit 视频教程:
https://space.bilibili.com/437503777Github下载地址:
https://github.com/yaklang/yakitYakit官网下载地址:
https://yaklang.com/Yakit安装文档:
https://yaklang.com/products/download_and_installYakit使用文档:
https://yaklang.com/products/intro/常见问题速查:
https://yaklang.com/products/FAQ