软件供应链啥的

The Software Genome Project: Venture to the Genomic Pathways of Open Source Software and Its Applications

与人类基因计划(human genome project)相似的结构来构造“软件基因计划(SGP)”。

目前开源软件的问题:

  1. 开发者的专业性、潜在的引入恶意代码和后门的可能性、在issue里提vuln
  2. 维护和issue管理的实时性、licenses的有效性、文档全面有效性

目标:开源项目管理、更鲁棒、实时和安全的管理

分析生物学中的中心法则:DNA—mRNA---->蛋白质过程中信息定向流动。
类比软件开发,源码—编译器—>可执行文件

HGP:

  • base:DNA/RNA里的ATCG/AUCG
  • codon:DNA/RNA里连续三个碱基序列,指明了一个氨基酸;共64种
  • DNA片段:包括编码区和非编码区
  • 染色体:包含基因和非编码区
  • 人(个体):23对染色体
  • 人类基因:不同个体之间的差异在整个人类基因组中占比较小

SGP的组成:
源码token、源码(函数)片段、源码组件、模块(可复用)、repo、SG

基因库构建过程:

软件基因库构建

  1. 代码收集
    获取足够有效和有代表性的repo,首先知名的项目肯定要加入;先前的研究在收集repo进行测试的时候考虑了这几个方面[stars, forks, issues, commits, and contributors]

  2. 处理代码片段
    结合多个指标(Halstead Volume, Cyclomatic Complexity, LOC)
    得到代表性的snippet,相同snippet可能在多个repo里

  3. 对repo进行评估

软件智能基因库构建

对标人类的遗传病基因收集
围绕安全漏洞、恶意代码、敏感代码片段

  1. 漏洞代码收集评估:目前的漏洞库聚焦不同的方面;目标是评估目前的漏洞库并且进行整理
  • 收集不同来源的漏洞信息
  • 数据依赖分析(?)对信息准确性进行检查
  • 合并所有信息
  1. 漏洞信息增强:漏洞信息的完整性
    用LLM从漏洞代码和commits里直接得到漏洞信息
    程序切片跟踪、符号执行
    模糊匹配识别漏洞影响的版本

  2. 恶意代码:
    平台:VirusShare、VXHeaven、Github

  3. 敏感代码收集:
    对标遗传病基因收集,因为在复用过程中可能把敏感/有害信息复用了

  • 用户敏感信息,例如贡献者commit了token或数据库凭证之类的敏感信息
  • 行为敏感信息:索要更高权限的操作
  • 政治敏感信息

软件基因注解

  1. 软件基因识别:代码贡献分析
    分析结构和软件基因的关键(?)
    建立函数调用图,使用度中心分析、紧密度中心性分析等方法来找到关键点,得到控制软件行为和数据流的关键函数
    已有的研究表明“无用”的函数表现出较低复杂度
    把cg构建、中心性分析、函数代码复杂度结合,评估函数对整个软件生态系统的贡献(单个repo->整个基因?)

  2. 代码功能性分析
    对每个软件进行评估,包括功能、行为、潜在的脆弱性

  • 软件基因分析
    目标是知道代码实现的功能、如何实现、解决了什么问题,来提供能够与代码片段进行映射的可用的文档,作为基因分析的“字典”
    通过收集代码结构、变量、注释等能够标识代码意图的信息;可以的话,也对代码进行一些测试来验证代码得到了预期的效果

  • 漏洞分析
    识别漏洞类型、漏洞影响、攻击向量和攻击方式
    来评估软件漏洞在现实世界的影响

  • 恶意代码
    触发条件、行为、载荷、是否会传播/迁移

  • 敏感代码
    记录敏感数据的流向和访问控制机制的作用(交互的对象和权限)

基因分析

依赖分析

  1. 基于包管理器的依赖分析
    分析包管理文件,包括包名、版本,构造依赖图
    识别依赖项的用途和对软件的贡献部分

  2. 克隆代码的依赖分析
    识别代码复用片段->追踪克隆代码(应该是在elf里?)->评估克隆代码如何影响其他克隆(?)->复用相同片段的软件的行为模式->可视化

软件聚类

探索潜在的组合和利用(感觉是一个减少重复造轮子的事情)

  1. 软件基因聚类
    共存:代码基因在多个repo中共同出现的情况——较高的共存概率,而基因通常在相似领域软件中才会出现
    依赖:主要关注TPL,分析第三方库之间的依赖关系,用这种关系作为距离度量,从而按领域对软件基因进行分类

  2. 软件基因语义
    LLM,大规模理解软件基因片段的用法和语义
    按场景对基因进行分类,提高软件开发效率

软件画像

除了每个软件本身的缺陷之外,更普遍的软件缺陷潜伏在广泛使用的第三方软件工件中

  1. 软件评估分类
    描述软件缺陷的维度:软件质量、安全性、开源组件、可维护性、商业风险

  2. 缺陷描述
    衡量软件缺陷的所有维度并赋不同权重

软件演化分析

追踪开源生态系统中软件基因的动态变化

基于基因的应用

对基因检测和基因工程进行建模,以开发预测模型,以增强SCA和软件维护
包括成分分析、克隆检测、依赖检测、智能分析以及补丁和重构
都是与基因库里的基因进行查找和比较

软件组成分析

  1. SCA成分分析
    语义分析,了解代码的功能与基因库里的功能的相似性
    新项目中的代码段是否对应于已知软件基因的特定版本。确保版本后,使用一些概率匹配算法来计算新项目中的代码段与已知基因匹配的可能性。(有助于最大限度地减少误报并提高识别的精度)

  2. SCA克隆检测
    与基因库的代码相似度比较,识别代码克隆的位置、各自的来源(源文件或repo)、作者或团队、相似性程度的信息

  3. SCA依赖检测
    创建了全面的谱系图,描述软件项目中的依赖关系如何继承,并理解组件之间的父子关系

  4. SCA智能分析
    对已识别的软件组件做详细的智能检查
    漏洞分析
    将检测到的组件与智能基因组中收集的漏洞进行交叉比对,找到已知漏洞
    恶意代码分析
    将组件与智能基因组中的恶意代码进行比较,以检测潜在的恶意软件、病毒或可能表明恶意意图的可疑模式
    敏感代码分析
    侧重于识别处理敏感数据的代码
    帮助社区在软件安全、风险管理方面做出明智决策

软件维护

  1. 软件修复
    补丁、更换组件版本、替换组件
    同时对于漏洞要进行区分,不同的触发条件和威胁程度;进行修复之后可能会引入其他问题,例如新的漏洞和较低维护性等
  2. 重构
    目标是不改变现有代码外部行为的情况下提高现有代码的质量、可读性和可维护性
    从代码气味入手,解决代码的重复性、复杂性和整体设计的问题
    通过单元测试来确保代码的正确性和健壮性

开源治理

开源治理的不同方面的标准(如语义版本控制、软件物料清单和开源许可合规性(ISO/IEC 5230))一直在不断提高

OSS许可治理

  1. 许可证合规性
    对许可工件(尤其是软件基因组中的)进行彻底的检查和管理
  • 细粒度的许可元模型
    将不同的解释合并到不同的标签系统下、以不同的方式进行标准化
  • 许可冲突建模
    主要是代码复用造成的冲突
  • 自定义许可标识
  1. 语义版本控制
    这个说法很怪,有点像版本号命名的问题

开源治理指导

  1. 实时预警
    持续监测repo和代码变化,向开发者、用户进行漏洞告警
    一个方法是基于POM和代码克隆的方式,但是在分析二进制文件的时候非常耗时
    使用字符串作为轻量特征,评估复用代码的相关性
    识别开源包的安全威胁,检测开源威胁情报,利用llm对漏洞进行评估和检测
  2. 安全包管理:安全的registry(包括用户使用的公开的registry、patch registry、监控复用工件的registry)、记录开源工件缺陷的数据库、包管理器客户端、后端引擎(监测第三方工件的重用,解决依赖关系和缺陷)、审核和分析第三方工件、新的的语言

OSSFP: Precise and Scalable C/C++ Third-Party Library Detection using Fingerprinting Functions