SCA技术进阶系列(四):DSDX SBOM供应链安全应用实践

news2024/11/18 9:48:21

一、SBOM的发展趋势

数字时代,软件已经成为维持生产生活正常运行的必备要素之一。随着容器、中间件、微服务、 DevOps等技术理念的演进,软件行业快速发展,但同时带来软件设计开发复杂度不断提升,软件供应链愈发复杂,软件整体透明度下降,软件供应链安全防护难度不断加大。

由于缺少对软件资产的最小要素管理,每当环境中出现新的漏洞时,我们通常需要花费大量时间和精力来检测环境中运行的应用程序和服务的真正影响。如果我们可以枚举我们使用和生产的所有软件组件,并且轻松地分发和使用它,那么就可以极大地提高对软件资产的精细管理,以及对突发漏洞的影响面快速定位分析。

SBOM可以帮助我们解决以上问题。

开源社区十多年前开源社区就注意到创建SBOM的必要性,2010年SPDX开放标准开始作为解决该问题的初步方案。

图一 数字供应链下愈发复杂的应用资产构成

SBOM是为了提升供应链透明度而记录其软件组成等信息的工程文件,对降低供应链维护和保障的工作量及难度意义重大。随着软件供应链安全成为关注焦点,特别是2021年美行政令EO14028要求包括NIST在内的多个机构通过与软件供应链的安全性和完整性相关的各种举措来增强网络安全,SBOM的推广和落地也变得尤为迫切。

理想情况下,产品的供应商应该告诉我们每个组件,并以数字签名文档的形式提供,以防止篡改或修改。但是SBOM在使用推广过程中并不顺利,特别是在国内没有自主协议框架的情况下。多数情况下,上游每个组件生成 SBOM 的最佳方法仍然不统一,这会导致SBOM不完整或不准确;更不用说不同的现有格式(CycloneDX、SPDX、SWID)和缺乏标准化的分发机制,这使得 SBOM 的消费变得相当困难。

除了SBOM协议不统一、数据字段不一致以外,大多厂商只有在生产环节生成SBOM,没有分发和使用,更无法在供应链中形成链接的链条。SBOM未来的方向是分发、验证、集中数据和使用数据。

二、SBOM主流协议的风险

SBOM应该是机器可读的格式,同时也是易于人类可读,国外主流的SBOM格式有三种:

1. Software Package Data Exchange(SPDX)

• Linux基金会主推的格式;许可证:cc-by-3.0

• 已经完成标准化工作,标准号:ISO/IEC 5962。

2. CycloneDX

• OWASP基金会主推的格式;许可证:apache-2.0

• 尚未完成标准化工作。

3. Software Identification(SWID)

• NIST主推的格式;

• 已经完成标准化工作,标准号:ISO/IEC 19770。

图二  linux和owasp基金会部分条款

当下看主流协议的许可证似乎并无断供风险;但是作为Linux、OWASP基金会下的项目,如果违反了基金会的条款,基金会有可能会阻止访问项目。

目前我国在软件供应链安全物料清单管理方面的基础比较薄弱,缺乏统一标准规范,限制了软件物料信息的共享和数据交换。随着国内外软件供应链安全法规和实践标准的逐步落地,自有SBOM的推广应用将有效提升软件供应链透明度,极大地便利软件组件溯源、软件产品依赖关系梳理、已知漏洞的影响范围判断、及时发现恶意软件渗透等,从而有力支撑软件供应链相关监管政策规则的落地实施。

三、DSDX协议的组成要素

DSDX(Digital Supply-chain Data Exchange)SBOM格式由OpenSCA社区主导发起,汇聚开源中国、电信研究院、中兴通讯等权威研究机构、甲方用户、安全厂商多方力量,共同适配中国企业实战化应用实践场景。作为国内首个数字供应链安全SBOM格式,DSDX目标是成为数字供应链安全治理与运营的核心技术抓手,以助力行业及产业从软件供应链安全向数字供应链安全过渡升级,使每个软件公司都可以将SBOM 附加到每个可交付成果,并且每个人都可以完全了解软件中使用的组件,并确切地知道哪些漏洞正在影响该软件。

DSDX规范文档由基本信息、项目信息、对象信息、代码片段信息及依赖信息这几部分构成。

1)SBOM 清单信息:清单名称、ID、创建者、清单版本、创建阶段、创建时间等

2)项目基本信息:项目名称、宿主环境信息、运行时环境信息、EAR 信息

3)组件信息:组件名称、ID、厂商、组件来源、组件类型、置信度、校验码、语言、依赖关系、依赖数量、依赖路径等

4)代码文件信息:名称、ID、校验码、路径、相似文件来源、相似度

5)代码片段信息:ID、来源文件 ID、校验码、代码片段位置、相似代码片段来源、相似度

6)依赖树信息:以 K-V 形式保存的项目完整依赖关系图(在任何情况下,SBOM 都应该捕获多级依赖关系)

7)备注信息:其他备注信息

DSDX兼容SPDX、CycloneDX、SWID国际标准和国内标准,但不止于主流规范,在最小元素集基础上扩展其他元素。DSDX重点引入了运行环境信息、创建阶段和供应链流转信息,加强了清单间的互相引用,并实现最小集/扩展集的灵活应用,深度支持代码片段信息的存储及追踪,为企业用户提供整个数字供应链基础设施视角的落地治理实践。

四、DSDX协议支持的生命周期

悬镜DSDX覆盖数字供应链全场景(CreateStage),涵盖源码、二进制、镜像、预发布、发布等不同阶段的物料清单,对组件、漏洞、许可证风险全面覆盖,提供更加透明化的SBOM管理。

同样重要的是,每次资产发生变化时,例如在产品的每个版本甚至每次构建时,都应该创建一个新的 SBOM以匹配该版本的更改。

如下图所示,在应用不同的构建以及不同的阶段,都应该生成对应的SBOM清单来记录不同的清单信息。同时,在应用上线分发时,需要合并不同阶段的清单信息,包括在采购阶段引入的供应商产品的清单融合开发的情况。

在上线后,应用的运营阶段,如果有识别到新的漏洞风险,则需要出新版本更新或者打补丁,那么应用的清单信息,也需要同步更新补丁的成分信息并同步更新版本信息。

图三  应用生成SBOM的生命周期

老旧的SBOM数据可能产生反作用,做无用功的同时让研发团队产生抱怨,因此SBOM应该是跟随代码、制品动态变化的实时数据。

用户可以通过将SBOM更新的逻辑嵌入到每一次代码的变更,与代码仓库集成在代码提交或合并时重新生成;对于没有代码或者项目中存在二进制依赖的情况,CI/CD环节则更为关键,通过与jenkins等软件的集成可以实现代码发布前的审查。

五、DSDX协议价值

1. SBOM自身安全可信

软件物料清单创建者应通过加密或数字签名的方式对软件物料清单的真实性和完整性进行保证。

即使在构建阶段拥有完美的工具链和完美的SBOM 信息,攻击者也可以篡改SBOM清单的内容以隐藏它包含易受攻击或恶意组件的事实。然后,消费者检索SBOM的被篡改版本并跟丢这些危险组件。

DSDX支持向SBOM工件添加数字签名,以确保消费者可以验证其真实性和完整性。

但更糟糕的是,攻击者可能会破坏构建管道,从而能够修改创建SBOM的过程,这将导致生成了经过数字签名但被篡改的组件列表。

从“扫描”工具的角度来看,软件组件通常是一个黑匣子,可以从供应商的交付制品中分析获得的信息量可能非常有限,因为其中大部分(如 pom.xml或go.mod 文件)是在构建期间可用,但在最终交付件中删除。

悬镜源鉴SCA支持进行SBOM和交付制品的深度检测结果比较,分析成分数据与提供的SBOM数据差异,并且给出对比报告,最大限度的降低引入质量低劣的SBOM清单或管道被攻击的风险SBOM清单的可能性。

2. SBOM深度和有效性

DSDX支持描述组件的全部依赖关系,SBOM将提供这些传递依赖项的可见性。

图四  组件依赖1层和多层对比

例如如果包libfoobar-1.5.3-r3-u8是SBOM的一部分,它还应该包括用于组装libfoobar-1.5.3-r3-u8 的每个包名称、版本、许可证等,以及每个节点的组件,从而形成一个多级树,其中每个节点都分解为其依赖项。

支持记录组件包的hash指,相似文件的路径和片段以及文件hash。这些可以可以在悬镜的XSBOM知识库中进行对比关联,确认成分的分析准确有效。

有了依赖树,就可以分析组件的风险传递,一个产品中的组件依赖关系是复杂的,这导致漏洞传递的路径也是复杂的。所以准确的解析组件间依赖关系并进行SBOM传递非常重要,这是供应链上下游分析组件的真实依赖调用,漏洞的可达性分析的基石。

3. SBOM与漏洞关联

漏洞是攻击者可以利用来绕过安全边界、访问系统等的弱点或缺陷,它们是攻击或破坏软件供应链的典型方式。要查找软件(或正在运行的主机、容器镜像等)中的漏洞,需要将已知漏洞与软件中的组件信息相匹配。这就是 SBOM 发挥作用的地方,因为它包含构成软件的软件包和版本的完整列表。

但是软件生产者和消费者都注意到,并不是所有漏洞产生的威胁都是相同的,在一个上下文环境中容易受到攻击的代码在另一个上下文中可能不会受到攻击。如果上游供应商确定来自漏洞的潜在风险不可利用,他们允许将该风险信息传递给下游的其他用户,以帮助他们做出基于风险的决策。

基于此,SBOM的另一个关键元素是VEX,它作为SBOM的机器可读“辅助工件”,允许制造商将在SBOM中列出的某个软件组件中发现的漏洞的当前状态进行交流。

DSDX同样支持对VEX漏洞的兼容,因此可以消除大部分误报,解决由于实现或其他控制措施而漏洞无法利用的实例,传达制造商在缓解漏洞方面的进展情况。

通过漏洞关联和漏洞交流,供应商可以轻松地传达客户因漏洞而面临的风险或不存在风险,减少了供应商和最终用户的工作量。

4. SBOM结合风险策略排查

SBOM数据还应该可以构建完整的资产图谱,并基于谱图进行高级检索。

例如“我是否容易受到 CVE-2022-22965 ( Spring4Shell ) 漏洞的攻击?”利用此漏洞需要在运行可利用Java包的主机或容器中同时发生一组条件:

使用SpringCore版本 5.3.0 到 5.3.17、5.2.0 到 5.2.19 或更早版本,使用JDK 9 或更高版本;

使用 spring-webmvc或spring-webflux 依赖。

大多数这些情况都可以在SBOM的内容中进行检查,轻松地评估环境中的风险。

图五  SBOM消费场景-策略合规

同样的,我们可以结合企业的合规要求和安全策略配置,对SBOM进行专项和定期检查,因为SBOM本身也是动态实时变化的数据,所以我们可以在分析出不满足合规和策略时,能够基于项目、资产等不同维度对总体风险进行梳理,并触发对应的预警或者阻断等操作,使数据的消费更及时更左移。对于企业的内部治理而言,单点的工具是不够的,还需要有全局的风险视图,出现问题时帮助企业及时止损。

六、DSDX行业实践

作为国内领先的数字供应链安全专业厂商,悬镜安全为用户提供完整的基于SBOM清单管理的数字供应链安全管理解决方案,并已在大量标杆用户成功实践落地。SBOM作为数字供应链安全治理的基础性工具之一,悬镜安全是其国内最早的实践者和布道者。

悬镜安全率先在源鉴SCA商业化产品中集成了DSDX、SPDX、CycloneDX、SWID四种SBOM标准格式的自动化生成能力。在商业化的同时,悬镜安全更不忘为开源社区、广大开发者和中小企业赋能,旗下开源数字供应链安全社区OpenSCA是目前国内唯一能够完全自主化、自动化生成DSDX、SPDX格式SBOM清单的开源SCA工具。

1. SBOM清单文件生成

SBOM 的质量取决于构建 SBOM 的过程的质量和自动化程度。

生成根级别很容易,如直接构建的软件的版本和详细信息,以及直接依赖项(包和第三方库)。当在依赖树中更深入地构建时,传递依赖关系解析变得困难,因为许多组件不提供自己的SBOM,并且检测依赖关系可能很复杂,例如带有剥离信息的静态链接二进制文件。

悬镜源鉴SCA最佳实践,软件物料清单生成包括人工生成和自动化生成两种方式:

  • 构建过程完全自动化并且SBOM创建被集成为构建管道的一部分;
  • 人工生成,则可以灵活选择在不同节点不同的维度进行生成。
  • 另外当软件组件以新版本或发布的形式更新,会自动对SBOM进行更新/追加。

支持生成SBOM阶段:应用包检测,源码仓库检测,同源溯源分析,二进制制品检测,镜像检测。

软件清单生成内容包括:

  • 组件信息:组件名称、ID、厂商、组件来源、组件类型、置信度、校验码、语言、依赖关系、依赖数量、依赖路径等。
  • 代码文件信息:名称、ID、校验码、路径、相似文件来源、相似度。
  • 代码片段信息:来源文件ID、校验码、代码片段位置、相似代码片段来源、相似度。

软件物料清单生成深度包括:记录从根节点到叶子节点全部深度的清单,以 K-V 形式保存的项目完整依赖关系图。

软件物料清单进行软件漏洞管理:从安全漏洞出发,溯源哪些组件被影响,从应用维度出发,查看应用的SBOM的安全漏洞信息。

图六  SBOM生成和更新周期

支持导出的维度:项目维度导出,应用维度导出

支持导出的格式:每种标准格式,优先json文件格式支持

DSDX:支持格式text、json、xml

SPDX:支持格式tag:value、rdf、json、xml、yaml

SWID:支持格式cbor、json、xml

CycloneDX:支持格式json、xml

图七  源鉴SCA-SBOM生成

2. SBOM清单文件检测

扫描SBOM是必要的,因为来自供应商的SBOM可能是错误的。供应商的构建过程可能会受到影响,因此供应商SBOM可能会故意省略某些组件。

源鉴SCA支持导入SBOM文件进行机器解析,解析后进行检测,发现清单中的风险问题,并可自动或人工对全局的SBOM进行更新。 并可支持SBOM的清单对比,通过上传的SBOM清单文件解析和供应商产品的检测生成的SBOM进行对比,分析SBOM清单的准确度和风险要素。

图八 源鉴SCA-SBOM检测

3. 基于SBOM清单文件的资产管理

构建和维护SBOM信息数据要素,在满足当前解决已知风险的同时,也是在建立后续排查和梳理的软件资产清单。

源鉴SCA在资产视角上支持树结构和图谱结构,查看全局的资产信息,并进行过滤检测,查看资产之间的依赖关系,帮助企业构建软件物料清单中组件成分体系、组件的依赖关系体系,建立完整的软件与组件链路关系树,实现链路的上下游可达分析架构模型,可以准确判断风险问题引入点和影响面。

图九 源鉴SCA-SBOM资产视角

4. 基于SBOM清单资产的风险分析

要想用于风险的治理,只有基线数据字段的SBOM难以发挥它的价值,SBOM要和知识库进行联动,当SBOM发生变化或者知识库中的数据发生变化时,都应该触发风险识别逻辑。例如,当SBOM中引入了一个新的组件,需要通过知识库评估这个组件是否存在开源许可证约束、是否适合商业使用;当出现一个新漏洞,知识库收录后应该联动SBOM判断有哪些项目受到影响。

企业需要根据风险发生的可能性和严重程度来对风险进行优先级排序。如果不了解漏洞是否被利用,就不可能精确地预估其发生的可能性。

悬镜SCA基于SBOM清单结合组件库,漏洞库数据识别组件安全性和漏洞信息,包括但不限于漏洞名称、编号、描述、风险等级、可利用性、修复方案等。同时项目将VEX和SBOM结合,分析供应商关于其产品中存在的漏洞的可利用性的上下文见解和说明,企业可基于其风险容忍度来识别、分析、评估和解决网络安全威胁。

帮助企业对清单中组件的最小元素进行提取,并且通过信息整合,提供包括但不限于软件清单的组件基准信息、漏洞信息、许可证信息等。

图十 源鉴SCA-SBOM风险信息

5. 基于SBOM清单资产的事件响应

DSDX中包含了详尽的软件组成成分,安全团队可以通过DSDX分析软件风险,并进行持续监控;在有供应链安全事件发生时,安全团队也能根据DSDX快速定位第三方组件中已知漏洞的影响范围,并针对性地对修复措施进行优先级排序,加速供应链攻击事件应急响应速度。追踪漏洞修复的状态,统计时间维度漏洞的产生、修复趋势变化等。

结语:

SBOM是保护软件供应链的关键部分,也是漏洞匹配和管理的基础。

对于企业而言,SBOM是软件供应链治理中很重要的基础数据,能够帮助企业实现依赖治理、漏洞管理和开源许可证合规。SBOM背后靠的是SCA和知识库数据的支撑,想要充分发挥SBOM的作用,应该将生成工具和尽可能多的研发流程打通,做到实时更新SBOM清单,并和全面的知识库订阅数据进行实时动态关联。

随着软件消费者会使用到各类供应商提供的软件产品,这些产品通常以二进制的形式交付,相比源码识别的效果覆盖率会更低,存在的风险更难识别。此时SBOM会作为供应商准入的要求,在采购环节要求提供SBOM,并对SBOM进行审查和统一管理,SBOM变得越来越重要。

我们需要保护供应链,统一标准,并使SBOM成为构建过程的重要组成部分。以DSDX为代表的SBOM格式必将在整个供应链引入、生产、交付等关键环节的开源治理实践中发挥重要作用,悬镜安全全栈产品覆盖DSDX,针对性适配中国企业实战化应用实践场景,为供应链上下游企业用户提供安全新方案与整体建设新思路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1276359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

28.线段树与树状数组基础

一、线段树 1.区间问题 线段树是一种在算法竞赛中常用来维护区间的数据结构。它思想非常简单,就是借助二叉树的结构进行分治,但它的功能却非常强大,因此在很多类型的题目中都有它的变种,很多题目都需要以线段树为基础进行发展。…

Windows server 2016 FTP服务器的搭建

FTP(File Transfer Protocol)是一个用来在两台计算机之间传输文件的通信协议。这两台计算机中,一台是FTP服务器,另一台是FTP 客户端。 1.安装FTP服务与建立FTP站点 1.1 打开服务器管理器——单击仪表盘的添加角色和功能 1.2 持续…

Gavin Wood:财库保守主义偏离了初心,应探索 Fellowship 等更有效的资金部署机制

波卡创始人 Gavin Wood 博士最近接受了 The Kusamarian 的采访,分享了他的过往经历、对治理的看法,还聊到了 AI、以太坊、女巫攻击、财库等话题。本文整理自 PolkaWorld 对专访编译的部分内容,主要包含了 Gavin 对治理、财库提案、生态资金分…

听GPT 讲Rust源代码--src/tools(4)

题图由AI生成 File: rust/src/tools/rust-analyzer/crates/hir-ty/src/interner.rs 在Rust源代码中,rust/src/tools/rust-analyzer/crates/hir-ty/src/interner.rs这个文件是rust-analyzer工具的一部分,它定义了用于将类型系统中的实体进行唯一标识和共享…

15.oracle的 listagg() WITHIN GROUP () 行转列函数使用

1.使用条件查询 查询部门为20的员工列表 -- 查询部门为20的员工列表 SELECT t.DEPTNO,t.ENAME FROM SCOTT.EMP t where t.DEPTNO 20 ; 效果: 2.使用 listagg() WITHIN GROUP () 将多行合并成一行(比较常用) SELECT T .DEPTNO, listagg (T .ENAME, ,) WIT…

uniapp小程序分包页面引入wxcomponents(vue.config.js、copy-webpack-plugin)

实例:小程序添加一个源生小程序插件,按照uniapp官方的说明,要放在wxcomponents。后来发现小程序超2m上传不了。 正常的编译情况 会被编译到主包下 思路:把wxcomponents给编译到分包sub_package下 用uniapp的vue.config.js自定义…

【报名】2023产业区块链生态日暨 FISCO BCOS 开源六周年生态大会

作为2023深圳国际金融科技节系列活动之一,由深圳市地方金融监督管理局指导,微众银行、金链盟主办的“2023产业区块链生态日暨FISCO BCOS开源六周年生态大会”将于12月15日下午14:00在深圳举办。 今年的盛会将进一步升级,以“FISCO BCOS和TA的…

C/C++,图算法——求强联通的Tarjan算法之源程序

1 文本格式 #include <bits/stdc.h> using namespace std; const int maxn 1e4 5; const int maxk 5005; int n, k; int id[maxn][5]; char s[maxn][5][5], ans[maxk]; bool vis[maxn]; struct Edge { int v, nxt; } e[maxn * 100]; int head[maxn], tot 1; vo…

Nacos多数据源插件

Nacos从2.2.0版本开始,可通过SPI机制注入多数据源实现插件,并在引入对应数据源实现后,便可在Nacos启动时通过读取application.properties配置文件中spring.datasource.platform配置项选择加载对应多数据源插件.本文档详细介绍一个多数据源插件如何实现以及如何使其生效。 注意:…

动态规划 | 139. 单词拆分、多重背包

139、单词拆分 dp[i]&#xff1a;长度为 i 的字符串可以有字典中出现的单词拼接出来。 if s[j: i] in wordDict and dp[j] true 则 dp[i] true dp[0] true, 因为后续均由dp[0]推出。 从前向后遍历 public static boolean wordBreak(String s, List<String> wordDi…

简单取证-MISC-bugku-解题步骤

——CTF解题专栏—— 题目信息&#xff1a; 题目&#xff1a;简单取证 作者&#xff1a;Tokeii 提示&#xff1a;flag格式为flag{用户名_对应的密码} 例如flag{administrator_bugku} 解题附件&#xff1a; 解题思路&#xff1a; 取证自己属实不太擅长&#xff0c;所以找个题…

JMX的使用

1. 定义和意义 JMX是Java Management Extention的缩写&#xff0c;出发点是让外部通过属性/方法来读取或设置程序状态。对于提供对外服务的程序来说&#xff0c;天生就有这样的能力&#xff0c;Web程序通过HTTP接口对外暴露&#xff0c;RPC应用通过RPC接口暴露。不过带来的问…

如何快速选出一支好股票?

俗话说得好&#xff1a;股票选得好&#xff0c;收益少不了&#xff01;不用多说&#xff0c;相信大伙儿都知道选一支好股票究竟有多重要。 但是选股可不像咱们去菜市场买菜一样&#xff0c;看着顺眼就成。选股&#xff0c;其实是一个专业性特别强的技术活儿。 目前最常用的选股…

微信开发者工具真机调试连接状态在正常和未连接之间反复横跳

开启局域网模式能解决这个问题&#xff0c;目前只找到这一个方法

详解Linux常用命令

目录 1. ps 命令 2. top 命令 3. grep 命令 4. df 命令 5. tail 命令 6. head 命令 7. cat 命令 8. --help 和 man 命令 9. cd 命令 10. mkdir 命令 11. rm 命令 12. mv 和 cp 命令 13. touch 命令 14. vi 或 vim 命令 15. chmod 修改权限 16. 打包和压缩文件 …

电子学会C/C++编程等级考试2021年12月(四级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:移动路线 桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。 小明是个调皮的孩子,一天他捉来一只蚂蚁,不小心把…

Windows的常用cmd命令总结

文章目录 一.盘符切换二: cd命令(打开文件/文件夹)三:查看目录四.创建和删除文件夹五.查看本机ip地址六.清除当前屏幕七.复制文件到另一个地方八.移动文件到另一个地方九.删除文件&#xff08;不能删除文件夹&#xff09;十.测试网络连接十一.停止任务进程Windows快捷键总结大全…

python简单进阶之web框架:fastapi使用教程

原文&#xff1a;python简单进阶之web框架&#xff1a;fastapi使用教程 - 知乎 这是简单进阶教程系列第四篇&#xff0c;本系列文章主要介绍那些可以很快上手的进阶库。 我其实学过一段时间Django框架&#xff0c;但是半途而废了&#xff0c;我觉得可能还是简单一点的框架比较适…

瑜伽学习零基础入门,各种瑜伽教学方法全集

一、教程描述 练习瑜伽的好处多多&#xff0c;能够保证平衡健康的身体基础&#xff0c;提升气质、塑造形体、陶冶情操&#xff0c;等等。本套教程是瑜伽的组合教程&#xff0c;共由33套视频教程组合而成&#xff0c;包含了塑身纤体&#xff0c;速效瘦身&#xff0c;四季养生&a…

csp 现值计算 C语言

号&#xff1a; 202212-1 试题名称&#xff1a; 现值计算 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 问题描述 评估一个长期项目的投资收益&#xff0c;资金的时间价值是一个必须要考虑到的因素。简单来说&#xff0c;假设…