SCA: 依赖版本信息检测
SyntaxFlow 能够解析依赖包的版本信息,同时也允许用户编写规则来分析这些版本信息。通过对依赖版本的检测,可以有效识别项目中存在已知漏洞的依赖包,从而提升代码的安全性和稳定性。本节将详细介绍如何在 SyntaxFlow 中获取和筛选依赖版本信息,并通过实例演示如何检测具有漏洞的依赖包版本。
简介
在现代软件开发中,依赖管理是一个关键环节。项目通常依赖多个第三方库和框架,而这些依赖包的版本直接影响项目的安全性和稳定性。SyntaxFlow 提供了强大的功能来解析和分析依赖包的版本信息,使开发者能够轻松检测出存在已知漏洞的依赖版本,从而及时采取措施进行更新或替换。
获取依赖信息
SyntaxFlow 通过内置变量 __dependency__
存储解析后的依赖信息。用户可以通过筛选依赖名称的方式获取特定依赖的版本信息或文件信息。以下是获取依赖信息的示例:
// 获取依赖名以 fastjson 结尾的依赖版本
__dependency__.*fastjson.version as $ver;
// 获取依赖名以 fastjson 结尾所在的依赖文件
__dependency__.*fastjson.filename as $file;
__dependency__.*fastjson.version as $ver;
:筛选依赖名称以fastjson
结尾的依赖版本,并将结果存储在变量$ver
中。__dependency__.*fastjson.filename as $file;
:筛选依赖名称以fastjson
结尾的依赖文件,并将结果存储在变量$file
中。
筛选依赖版本
获取到依赖的版本信息后,下一步通常是筛选出存在已知漏洞的版本。SyntaxFlow 提供了 version_in
语法来定义版本区间,以便检测依赖版本是否落在特定的漏洞版本范围内。
version_in 语法定义
SyntaxFlow 中 version_in
的语法定义如下:
filterItem
...
| In versionInExpression # VersionInFilter
;
versionInExpression: versionInterval ('||' versionInterval)*;
versionInterval: ( '[' | '(') vstart? ',' vend? ( ']'| ')' ) ;
vstart: versionString;
vend: versionString;
// unless ',' ']' ')'
versionBlockElement: Number versionSuffix* ;
versionSuffix: '-' | Identifier;
versionBlock: versionBlockElement ('.' versionBlockElement )*;
versionString
: stringLiteral
| versionBlock
;
In: 'in';
conditionExpression
...
| VersionIn ':' versionInExpression # VersionInCondition
;
VersionIn: 'version_in';
version_in
:关键字,用于表示版本区间筛选。versionInterval
:定义一个版本区间,使用圆括号()
表示不包括边界,方括号[]
表示包括边界。多个区间可以用||
连接,表示并集。versionString
:版本字符串,可以是简单的字符串字面量或由数字和后缀组成的版本块。
version_in 语法示例
以下是 version_in
语法的使用示例:
// 检查版 本是否在 1 < version <= 2 范围内
$version in (1,2]
// 检查版本是否在 1.0.0 < version <= 2.0.0 范围内
$version in (1.0.0,2.0.0]
// 检查版本是否在 1.2.3-beta < version <= 2.2.1-beta 范围内
$version in (1.2.3-beta,2.2.1-beta]
// 检查版本是否在 [1.1,1.3] 或 [2.2,2.3] 或 [3.2,3.3] 范围内
$version in [1.1,1.3] || [2.2,2.3] || [3.2,3.3]
此外,也可以使用分析值 筛选过滤的语法进行版本筛选:
$version ?{version_in:(1,2]} // 版本号是否在 1 < version <= 2 范围内
$version ?{version_in:(1.0.0,2.0.0]} // 版本号是否在 1.0.0 < version <= 2.0.0 范围内
$version ?{version_in:(1.2.3-beta,2.2.1-beta]} // 版本号是否在 1.2.3-beta < version <= 2.2.1-beta 范围内
$version ?{version_in:[1.1,1.3] || [2.2,2.3] || [3.2,3.3]} // 版本号是否在多个范围内