很好SCA规则,爱来自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 语法示例

直接来看一个语法示例

// 检查版本是否在 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]} // 版本号是否在多个范围内

总结一下:version_in 语法

  1. 使用 in 关键字

  2. 版本范围表示:"]" 闭 ")"开

  3. 版本范围之间可以通过 "||" 并集多个不连续的版本范围。

图片

下面是yak内置的fastjson SCA规则的一部分

__dependency__.*alibaba*fastjson.version as $ver;
$ver in (,1.2.68] as $vuln_1_2_68;
alert $vuln_1_2_68 for {
    message: 'SCA: com.alibaba.fastjson <= 1.2.68 RCE Mid to exploit',
    level: high,

}

简单解析一下其中使用,首先通过 __dependency__ 内置变量获取到审计项目的所有依赖信息,然后使用*alibaba*fastjson作为过滤条件获取到所有和fastjson相关的依赖信息。最后通过version 获取到依赖的版本信息,之后就可以通过检查依赖的版本来进行风险提示。

下面是一个简单案例的使用

图片

整个流程十分简单明了,不过SCA规则数量会相对更多,如果都是手写规则,可能比较吃力。而本身SCA规则的格式相对稳定,所以这部分的规则可以尝试通过脚本生成。

图片

比较常见的一个SCA合规信息的获取来源是CVE信息库,yakit本身有CVE信息基础支持,所以可以尝试联动,进行CVE合规的自动生成。cve.QueryEx的返回值结构的部分内容如下所示

type CVE struct {
      CVE               string     CWE               string    ProblemType       []byte    References        []byte    TitleZh           string    Solution          string    DescriptionMain   string    DescriptionMainZh string    Descriptions      []byte    Vendor            string    Product           string    CPEConfigurations []byte    ...}

其中在生成合规规则需要重点关注的信息有两个:

  • CVE :CVE编号

  • CPEConfigurations:CPE配置(这部分存储涉及产品及其版本的相关信息)

还是以fastjson为例。先使用CVE的基础支持查询出对应的CVE信息。

for i in cve.QueryEx(cve.product("fastjson")){ // 搜索产品为 fastjson 的CVE
    println(i.CVE)
    println(string(i.CPEConfigurations))
}

/*
CVE-2017-18349
{
    "CVE_data_version": "4.0",
    "nodes": [
        {
            "operator": "OR",
            "cpe_match": [
                {
                    "vulnerable": true,
                    "cpe23Uri": "cpe:2.3:a:pippo:pippo:1.11.0:*:*:*:*:*:*:*",
                    "versionStartExcluding": "",
                    "versionEndExcluding": "",
                    "versionStartIncluding": "",
                    "versionEndIncluding": ""
                },
                {
                    "vulnerable": true,
                    "cpe23Uri": "cpe:2.3:a:alibaba:fastjson:*:*:*:*:*:*:*:*",
                    "versionStartExcluding": "",
                    "versionEndExcluding": "1.2.25",
                    "versionStartIncluding": "",
                    "versionEndIncluding": ""
                }
            ],
            "children": []
        }
    ]
}


CVE-2022-25845
{
    "CVE_data_version": "4.0",
    "nodes": [
        {
            "operator": "OR",
            "cpe_match": [
                {
                    "vulnerable": true,
                    "cpe23Uri": "cpe:2.3:a:alibaba:fastjson:*:*:*:*:*:*:*:*",
                    "versionStartExcluding": "",
                    "versionEndExcluding": "1.2.83",
                    "versionStartIncluding": "",
                    "versionEndIncluding": ""
                }
            ],
            "children": []
        },
        {
            "operator": "OR",
            "cpe_match": [
                {
                    "vulnerable": true,
                    "cpe23Uri": "cpe:2.3:a:oracle:communications_cloud_native_core_unified_data_repository:22.2.0:*:*:*:*:*:*:*",
                    "versionStartExcluding": "",
                    "versionEndExcluding": "",
                    "versionStartIncluding": "",
                    "versionEndIncluding": ""
                }
            ],
            "children": []
        }
    ]
}
*/

可以看到在CPEConfigurations字段中有若干条配置,每个配置内部有cpe_match用来描述相关的产品以及其受影响的版本。各个字段的意义有明确指示。

这里直接提供一个脚本生成的demo

product =  cli.String("product",cli.setRequired(true),cli.setVerboseName("产品名"))
cli.check()

matchToVersionRange = func(match, wantproduct) {
    /*
    如果cpe_match的CPEuri有指定的版本,那么则代表其对应的版本是一个特定的指定版本。
    若未指定版本则依据其他的versionStartExcluding等数据划定一个版本范围。
    */
    cpeArray = str.Split(match["cpe23Uri"], ":")
    if len(cpeArray) < 6 {
        return
    }

    if cpeArray[4] != wantproduct {
        return
    }

    version = cpeArray[5]
    if version != "*"{
        return f"[${version},${version}]"
    }

    versionStart = ""
    startBoundary = "("
    versionEnd = ""
    endBounday = ")"
    if match["versionStartExcluding"] != "" {
        versionStart = match["versionStartExcluding"]
    }else if match["versionStartIncluding"] != "" {
        versionStart = match["versionStartIncluding"]
        startBoundary = '['
    }

    if match["versionEndExcluding"] != "" {
        versionEnd = match["versionEndExcluding"]
    }else if match["versionEndIncluding"] != "" {
        versionEnd = match["versionEndIncluding"]
        endBounday = "]"
    }
        
    return f"${startBoundary}${versionStart},${versionEnd}${endBounday}"

}

cveInfoToAlert = func (cveInfo) {
    serverity = str.ToLower(cveInfo.Severity)
    return f`{
    title: 'CVE Compliance Check ${cveInfo.CVE}',
    cve: "${cveInfo.CVE}"
    level: ${serverity},
}
`
}

rule = f"__dependency__.*${product}.version as \$ver;"

for i in cve.QueryEx(cve.product(product)){

    alertMessage = cveInfoToAlert(i)
    versionRangeList = []
    
    cpeMap =json.loads(i.CPEConfigurations)
    for node in cpeMap["nodes"] {
        for match in node["cpe_match"] {
            versionRange = matchToVersionRange(match, product)
            if versionRange != "" {
                versionRangeList = append(versionRangeList, versionRange)
            }
        }
    }

    if len(versionRangeList) < 1  {
        continue
    }
    versionCollect = str.Join(versionRangeList, " || ")

    alertVerName := "$"+str.Replace(i.CVE, "-", "_", -1)
    rule +=f`\$ver in ${versionCollect} as ${alertVerName} 
alert ${alertVerName} for ${alertMessage}
`
}

yakit.Text(rule)

生成一个fastjson的CVE合规规则

图片

__dependency__.*fastjson.version as $ver;
$ver in (,1.2.25) as $CVE_2017_18349 
alert $CVE_2017_18349 for {
    title: 'CVE Compliance Check CVE-2017-18349',
    cve: "CVE-2017-18349"
    level: high,
}

$ver in (,1.2.83) as $CVE_2022_25845 
alert $CVE_2022_25845 for {
    title: 'CVE Compliance Check CVE-2022-25845',
    cve: "CVE-2022-25845"
    level: medium,
}

我们这里使用一个lab的源码作为审计目标:JavaSecLab(https://github.com/whgojp/JavaSecLab)

其中有一些有问题的依赖库,先来使用生成的fastjson的规则测试。

来到代码审计页面编译好项目,运行上述脚本获取到的规则。可以看到检查出了 CVE-2022-25845 ,此CVE命中条件版本低于 1.2.83,而Lab的版本为 1.2.37,符合预期。

图片

当然我们可以修改一下目标产品生成一些其他的合规规则比如 xstream,此靶场依赖里的xstream版本为 1.4.14,此版本有多个CVE。

修改上面提供的生成脚本的目标产品,再次生成审计规则。

__dependency__.*xstream.version as $ver;$ver in (,1.4.6] || [1.4.10,1.4.10] as $CVE_2013_7285 
alert $CVE_2013_7285 for {
    title: 'CVE Compliance Check CVE-2013-7285',
    cve: "CVE-2013-7285"
    level: high,
}

....

$ver in (,1.4.19] as $CVE_2022_40152 
alert $CVE_2022_40152 for {
    title: 'CVE Compliance Check CVE-2022-40152',
    cve: "CVE-2022-40152"
    level: high,
}

...

再在代码审计中使用生成的规则,可以看到产出了多个CVE检查的提示

图片

上述的demo脚本还有许多可以优化的地方,比如对供应商的筛选,以及一些产品的别名的修正等,感兴趣的师傅可以继续尝试可改进。

END
YAK官方资源

Yak 语言官方教程:
Yak:致力于安全能力融合的语言 | Yak Program Language  

Yakit 视频教程:
YakProject的个人空间-YakProject个人主页-哔哩哔哩视频

Github下载地址:
GitHub - yaklang/yakit: Cyber Security ALL-IN-ONE Platform

GitHub - yaklang/yaklang: A programming language exclusively designed for cybersecurity

Yakit官网下载地址:
https://yaklang.com/

Yakit安装文档:
下载安装与更新配置 | Yak Program Language

Yakit使用文档:
Yakit: 集成化单兵安全能力平台 | Yak Program Language

常见问题速查:
FAQ | Yak Program Language

内容概要:本文系统研究了Picard迭代法在非线性常微分方程参数估计中的应用,深入阐述了该方法的数学原理及其在参数辨识中的收敛性与稳定性优势。通过构建最小化误差的目标函数,并结合数值积分技术,采用迭代方式逐步逼近系统的真实参数值,有效解决了非线性动态系统中因缺乏解析解而难以进行精确建模的问题。文中提供了完整的Matlab代码实现,涵盖模型定义、迭代求解、参数更新与结果可视化等关键环节,增强了方法的可操作性与工程实用性。研究通过典型非线性系统案例验证了算法的有效性,展示了其在科学计算与工程建模中的良好适应性与推广潜力。; 适合人群:具备常微分方程理论、数值分析基础及Matlab编程能力,从事系统建模、参数辨识、动力学仿真等相关方向的研究生、科研人员和工程技术开发者。; 使用场景及目标:①解决实际工程中非线性微分方程模型的未知参数估计问题;②深入理解Picard迭代法在科学计算中的实现机制与数值特性;③为学术论文复现、科研项目开发或课程设计提供可运行、易调试的技术方案与代码参考。; 阅读建议:建议读者结合文中的数学推导与Matlab代码逐行分析,重点关注迭代流程、目标函数构造与数值积分的耦合实现,通过修改模型结构或噪声条件进行扩展实验,以深化对算法鲁棒性与适用边界的理解。配套资源可通过指定公众号和网盘链接获取,推荐同步学习以加速科研进程。
内容概要:本文详细介绍了一种基于多尺度集成极限学习机(Extreme Learning Machine, ELM)的回归方法,并提供了完整的Matlab代码实现。该方法通过构建多尺度特征表示与集成学习机制,有效提升了ELM在处理非线性、高维复杂数据时的预测精度与模型鲁棒性,特别适用于时间序列回归任务。文档不仅阐述了算法的核心原理与技术流程,还系统展示了其在风电功率预测等工程场景中的应用潜力。同时,文中附带了丰富的科研仿真案例集合,涵盖智能优化算法、深度学习、信号处理、电力系统调度等多个前沿方向,体现了多学科交叉融合的技术优势与实践价值。; 适合人群:具备一定Matlab编程能力,从事科学研究或工程应用的研究生、科研人员及工程技术开发者,尤其适合专注于机器学习、智能算法优化、新能源预测与电力系统建模等相关领域的专业人员。; 使用场景及目标:①用于风电、光伏、负荷等时间序列数据的高精度回归预测任务;②为科研工作者提供可复现的多尺度集成ELM模型代码框架,支持快速算法验证与二次开发;③满足实际工程项目中对高效建模、实时预测与智能决策的技术需求。; 阅读建议:建议读者结合所提供的Matlab代码进行动手实践,深入理解多尺度特征构造与集成策略的设计思想,同时可参考文档中其他相关算法案例进行横向比较与综合应用,以提升整体科研创新能力。
内容概要:本文详细介绍了一种基于Simulink的Ćuk转换器仿真方法,该转换器能够将输入的直流电压高效地转换为极性相反的输出直流电压,具备优异的升降压能力与系统稳定性。文章深入剖析了Ćuk转换器的核心工作原理、电路拓扑结构(包含开关管、电感、电容、二极管等关键元件)及其在能量存储与传递过程中的动态行为。通过构建精确的Simulink仿真模型,验证了系统在不同输入条件下的稳态与暂态响应特性,充分展示了其输出电压反相、纹波小、效率高的优势,适用于对负压电源有严苛要求的应用场景。此外,文档还整合了大量基于Matlab/Simulink和Python的科研仿真资源,涵盖风电预测、微电网优化、GAN场景生成、电力电子系统建模等多个前沿方向,凸显了其在现代电力电子与系统仿真研究中的重要价值。; 适合人群:电气工程、自动化、电力电子及相关专业的本科生、研究生、科研人员及具备电路理论基础和Simulink仿真经验的工程技术人员。; 使用场景及目标:①深入理解Ćuk转换器的工作机理及其在直流-直流变换中的独特优势;②利用Simulink平台开展电力电子电路的建模、仿真与性能分析;③为需要稳定负压输出的电源系统设计提供理论依据和技术验证方案。; 阅读建议:建议结合Simulink软件动手实践,重点掌握电路拓扑搭建、关键参数配置及仿真结果解读技巧,同时可延伸学习文中提供的其他科研案例,以拓宽技术视野并提升综合仿真能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值