本论文相关内容

  1. 论文下载地址——Web Of Science
  2. 论文中文翻译——Vulnerability Dataset Construction Methods Applied To Vulnerability Detection A Survey
  3. 论文阅读笔记——Vulnerability Dataset Construction Methods Applied To Vulnerability Detection A Survey

文章目录

  • 本论文相关内容
  • 前言
  • 应用于漏洞检测的漏洞数据集构建方法综述
    • 作者信息
    • 摘要
    • 索引术语
    • I. 引言
    • II. 问题及解决方案
      • A. 数据源可靠性问题
      • B. 缺少多源数据
      • C. 特征
      • D. 粒度
      • E. 数据集大小
    • III. 现有最先进的漏洞数据集
      • A. 真实世界程序漏洞数据集
      • B. 人工合成的漏洞数据集
      • C. 混合漏洞数据集
    • IV. 挑战和机遇
      • A. 基准数据集
      • B. 自动化数据集标记框架
      • C. 安全和非安全提交
    • V. 结论
    • 致谢
  • 总结

前言

此博客为Vulnerability Dataset Construction Methods Applied To Vulnerability Detection A Survey论文的中文翻译,本篇作为一篇综述性文章,主要讲述了目前漏洞检测数据集的一些发展和一些看法。文章整体读起来不难,值得一看。下面就是本篇翻译的全部内容。


应用于漏洞检测的漏洞数据集构建方法综述

作者信息

Yuhao Lin, Ying Li, Mianxue Gu, Hongyu Sun, Qiuling Yue,
Jinglu Hu, Chunjie Cao, Yuqing Zhang
School of Cyberspace Security, Hainan University, Haikou, China, zhangyq@nipc.org.cn
College of Cyber Engineering, Xidian University, Xi’an, China
National Computer Network Intrusion Protection Center, University of Academy of Sciences, Beijing, China
Graduate School of Information, Production and Systems, Waseda University, Japan

摘要

日益增多的安全漏洞的数量已成为软件安全领域亟待解决的重要问题,这意味着当前的漏洞挖掘技术仍有巨大的发展潜力。然而,现有的基于AI的漏洞检测方法大多侧重于设计不同的AI模型以提高漏洞检测的准确性,而忽略了基于数据驱动的AI算法的根本问题:首先,缺乏足够的高质量漏洞数据;第二,没有统一的标准化构建方法来满足不同漏洞检测模型的标准化评估。这一切都极大地限制了安全人员对漏洞的深入研究。在本次调查中,我们回顾了当前关于构建高质量漏洞数据集的文献,旨在调查最先进的研究如何利用数据挖掘和数据处理技术生成漏洞数据集,以促进漏洞发现。我们还确定了这一新领域的挑战,并分享了我们对潜在研究方向的看法。

索引术语

安全漏洞、深度学习、数据集

I. 引言

软件安全漏洞(缩写为漏洞)是指软件的操作逻辑或系统安全策略中的缺陷。攻击者可以利用漏洞危害信息系统或访问未经授权的信息(如访问敏感信息、损坏或修改数据、拒绝服务等),这会导致广泛的安全和隐私问题。此外,一旦安全漏洞被披露,将对软件供应商的市场价值产生严重的负面影响。因此,避免这些危害的直接方法是在攻击者利用这些安全漏洞之前尽快找到并修复它们。

机器学习(ML)技术的快速发展为自动漏洞挖掘提供了新的研究方向。ML算法可以自动捕获复杂数据的内在结构,并学习和概括易受攻击代码的许多抽象特征,甚至是人类专家可能从未考虑过的潜在特征。此外,从版本控制系统获得的一些信息(例如,开发者活动和代码提交)也可以被ML用于漏洞检测。因此,研究人员热衷于使用神经模型来学习和识别程序中潜在漏洞的共同特征。然而,基于AI模型的安全漏洞自动检测通常依赖于高质量的安全漏洞数据集。在大模型时代,在不同质量的数据集上训练的同一个AI模型可能会导致完全不同的预测结果。换句话说,具有完整信息、合理注释和足够大数据量的漏洞数据集是影响AI漏洞挖掘性能的直接因素。因此,安全漏洞数据集的建立和维护是人工智能漏洞挖掘的重要研究内容。

在本文中,我们首先描述了在构建漏洞数据集的过程中可能遇到的一些问题。然后,我们回顾了最近的一些研究,这些研究基于不同的目标构建了不同的漏洞数据集,旨在提高AI漏洞检测模型的性能。最后,我们指出了现有工作的不足和未解决的问题,旨在提出未来可能的研究方向和潜在的解决方案。总之,我们做出了以下贡献:

  • 我们分析了漏洞数据集构建的许多困难,并总结了一些解决方案。

  • 据我们所知,没有任何研究总结了漏洞数据集的构建和质量。本文总结了过去十年在这一领域的所有最新研究,并分析了一些流行的漏洞数据集的优缺点。

  • 为了促进未来的研究,我们讨论了需要在现有数据集中解决的一些问题,并描述了我们对这些问题的一些潜在看法。

II. 问题及解决方案

在过去十年中,许多研究人员在不同的工作中提出了各种漏洞数据集,这些数据集通常基于真实世界的程序并基于特定的目标。因此,其他安全研究人员收集这些数据集来训练或评估他们的技术。这些数据集几乎总是从世界权威的漏洞数据库或软件供应商提供的补丁信息中获得的,包括美国国家漏洞数据库NVD、丹麦漏洞数据库Secunia、SecurityFocus、中国国家信息安全漏洞共享平台CNVD、中国国家安全漏洞数据库CNNVD和NSFocus。当然,还有一些数据集是基于手动注入漏洞或代码重写构建的。尽管这些数据集以各种方式保存了基本信息、特征和安全漏洞解决方案等属性,但在构建数据集方面仍存在许多挑战。

A. 数据源可靠性问题

由于不同的漏洞描述规范和信息不对称,同一个CVE-ID漏洞可能存在数据差异,这可能导致多源漏洞数据集中的数据冗余或错误。Dong等人系统地评估各种漏洞数据库之间的数据差异问题。相关统计结果如图1所示。每个数据库之间的最高匹配率不超过40。他们发现,数据库之间的相同漏洞非常不同,包括同一软件项目的不同名称、受漏洞影响的软件版本范围不一致、不同的漏洞风险级别等。表I比较了NVD和SecurityFocus中受CVE-2018-20242漏洞影响的软件版本。然而,对于同样的CVE-ID漏洞,哪个漏洞库描述信息准确可靠,仍然需要手动检查,这无疑带来了巨大的劳动力消耗。因此,为不同的数据源制定统一的描述和检索规范非常重要。

图1 NVD与其他漏洞数据库的精确匹配率
表I 不同数据库中不同版本的CVE-2018-20242示例

B. 缺少多源数据

当从多个数据源构建数据集时,预计生成的数据集将不可避免地引入空值,这是因为数据源中缺少部分易受攻击的数据,甚至是不同数据源之间的数据维度差异。例如,NVD数据库中的一些CVE记录可能只包含描述性信息、缺失的漏洞类型、项目存储库链接、严重性分数等。在使用机器学习方法研究漏洞时,此类漏洞数据被认为是有缺陷的。Rostami等人提出一种有监督的机器学习方法,以填充大多数漏洞样本中缺失的网络攻击行为分类值(ATT&CK)。该方法根据漏洞数据集中的常见攻击模式枚举和分类(CAPEC)特征,推导出相应的ATT&CK值。这在一定程度上解决了漏洞数据集的不完整性问题。然而,该方法仍有局限性,因为它无法学习数据集中未包含的分类特征,并且由于攻击行为的复杂性和部分通用性,对其建模很困难。

C. 特征

特性是漏洞模型学习的关键(如风险级别、受影响版本、系统环境等)。一个漏洞样本包含的特征越多,对该漏洞的描述就越全面,这将更有利于我们对该漏洞进行深入研究。例如,漏洞的补丁签名专门描述了如何修复漏洞。当检测代码重用漏洞时,AI模型可以准确识别易受攻击代码和固定代码之间的差异,从而减少误报。Xiao等人提出了一种数据集构建方法,该方法将漏洞代码与补丁代码相结合,并以哈希值的形式存储,可以快速准确地识别代码重用漏洞。然而,大多数现有漏洞数据集仅收集漏洞的源代码和正常代码,缺乏对漏洞的全面描述。然而,考虑过多的特性也会显著降低模型的性能。因此,漏洞数据集应该具有什么特征是一个值得思考的问题。

D. 粒度

此外,粒度是数据集构建过程中需要考虑的另一个重要问题。它确定每个数据样本中包含的有效信息量。高质量的数据集应该包含多个粒度级别,如文件、类、函数等。由于与漏洞相关的代码在整个项目中所占比例很小,因此为模型学习过多的正常代码将导致经过训练的模型几乎完全无法识别真实程序中的漏洞。函数级粒度有效缓解了前一个问题,因为目前大多数数据集都是以函数作为模型的基本单元来训练的。然而,函数级别的粒度仍然不足以包含产生漏洞的根本原因,因此模型只能找到漏洞函数,但无法精确定位与漏洞直接相关的代码,无法处理跨函数问题。因此,漏洞数据集的粒度应以代码片段为主,即它必须基于易受攻击语句片段的组成,而不仅仅是易受攻击函数。当然,这需要编程语言处理技术的支持。例如,Li等人使用程序间程序切片技术提取漏洞相关语句并构建数据集,这缓解了漏洞挖掘的跨函数问题。另一方面,使用作者改进的程序切片技术处理源代码以生成语句粒度数据集。

E. 数据集大小

一些数据集源自NVD或CNVD的已识别漏洞。尽管它们提供了更完整的多维特征以及高质量的标签,但此类样本的数量非常有限,可能不足以进行模型训练。当然,大的漏洞样本量并不是一件好事。更多的漏洞数据并不意味着数据集包含更多类型的漏洞。由于真实世界程序中的漏洞多样性,几乎不可能在仅涵盖一种或几种漏洞类型的数据集上训练一个真正满足真实世界程序的漏洞检测模型。此外,面对不断扩大的数据集,我们必须考虑漏洞检测模型的灾难性遗忘问题。

由于缺乏真实世界的漏洞数据源,研究人员一直在努力开发人工漏洞合成数据集。安全专家通过向现有程序中注入漏洞或通过人工制作漏洞程序来构建此类合成数据集。Gavitt等人通过修改四个真实世界程序(base64、md5sum、uniq、who)的源代码,一次自动插入多个漏洞,生成了数据集LAVA-M。该数据集已广泛用于漏洞检测工具的性能评估。Wang等人提出了一种改进的过采样技术,该技术在源代码级别修改关键语句以生成一组合成补丁数据,从而与基于NVD的数据集形成混合数据集。他们的实验结果表明,对于有限大小的数据集,合成数据可以在一定程度上提高漏洞检测模型识别漏洞的准确性。

总的来说,构建一个统一和标准化的综合漏洞数据集有助于衡量不同漏洞检测模型之间的性能差异,减少错误,并促进对安全漏洞的深入研究。我们将在下一节介绍现有研究提出的漏洞数据集。

III. 现有最先进的漏洞数据集

许多现有研究基于不同的标准和目标创建了特定的数据集。然而,只有少数人完全公开了他们的数据集。表II总结了一些流行的漏洞数据集,我们从六个方面对它们进行了系统比较,因为这些是大多数漏洞数据集构建时考虑的基本属性。通过比较,我们发现当前主流的漏洞数据集大多来自开源漏洞库或软件项目库。尽管也有一些合成的漏洞数据集甚至混合数据集,但这方面的发展仍处于初步阶段。其次,数据集的很大一部分缺乏必要的补丁特征。在不考虑二进制源文件的情况下,大多数漏洞的标记方式依赖于源代码差异分析。下面我们将详细讨论它们的利弊。

表II 用于AI漏洞挖掘的开源数据集

注:源:数据集的源,粒度:数据集粒度大小,已发布:开源,漏洞类型:漏洞已分类,修补程序:包括修补程序信息,标记方法:如何正确标记每条数据。

A. 真实世界程序漏洞数据集

Zheng等人提出了一种结合提交历史差异分析和静态分析工具的数据集生成方法。与现有的函数级数据集不同,D2A的数据样本来自程序间分析,并保留了更多细节,如错误类型、位置、跟踪和解析器输出。此外,D2A保留了用于编译相关源文件的编译器参数,这对于动态分析漏洞非常有用。

考虑到分析连续提交版本的高开销,作者基于NVD漏洞数据库训练了漏洞识别模型CMA,以查找可能包含漏洞的提交版本及其相关版本。然而,由于缺少修补程序信息,经过训练的CMA模型可能会将修补的版本识别为易受攻击的版本。然后,在执行相邻版本差异分析时,可能会对其进行错误标记,导致生成的数据集不准确。此外,某些函数位置的更改或无效提交可能会导致差异分析错误。因此,该数据集的质量受到模型可靠性的限制。

Bhandari等人提出了多类数据集CVEfixes。他们放弃了将源代码简单分类为易受攻击或非易受攻击,这在许多漏洞数据集中很常见。CVEfixes根据常见弱点枚举(CWE)类型定义的类别对漏洞进行分类,同时引入CVSS严重性分数作为漏洞的度量。这使得能够对多类漏洞预测问题进行更全面的研究。但其数据来源相对单一,仅从NVD获取漏洞数据。当NVD引用的某些项目存储库不再可用时,这些存储库将无法提供漏洞代码和相应的修复提交。要么集中删除它们,要么需要进行一些额外的检查,以考虑其他方法来获得这些修复提交。这些都给数据集的质量带来了挑战。

Ponta等人手动收集了关于开源软件漏洞及其修复的代码语句级数据,涵盖205个不同的项目,包括NVD尚未索引的漏洞,以及从软件供应商获得的漏洞数据。具体而言,数据集包括29个没有CVE标识符的漏洞,以及46个已分配CVE标识符但尚未在NVD中发布的漏洞。与自动构建的数据集(D2A、CrossVul等)相比,它完全是手动生成的,并且漏洞标签的准确性很高。粒度更精细,直到语句级别,因为它将错误映射到错误修复提交。然而,整个数据集构建过程缺乏自动化,维护和更新工作量很大。而且它的数据量很小,很难满足漏洞检测模型的训练需求。

Guan等人提出了一种基于代码属性图(CPG)构建漏洞数据集的方法,以生成基于CPG的高质量数据集。与基于源代码的漏洞数据集相比,基于CPG的数据集只保留了源代码的代码属性图,在降低数据维度的同时更完整地保留了关键代码的语义信息,并显著降低了噪声。同时,数据集具有图结构,有助于促进图神经网络在漏洞挖掘领域的应用。然而,该数据集的质量依赖于静态程序切片技术,该技术无法跨文件提取语义信息,只能为四种漏洞类型生成代码切片,缺乏通用性。

Nikitopoulos等人提供了易受攻击代码的数据集,以及从开源软件库Git提交中检索到的补丁提交。与D2A类似,他们训练自然语言处理模型来发现与漏洞补丁相关的提交消息,这有效地扩展了漏洞数据集的特征。但它的一个缺点是,它只针对易受攻击的文件进行拆分和标记,而不是在函数中。数据集的粒度过于粗糙,包含漏洞的整个文件被直接标记为易受攻击,很难达到良好的模型训练效果。

B. 人工合成的漏洞数据集

软件保障度量和工具评估(SAMATE)项目创建了Juliet漏洞数据集,作为静态分析工具的评估度量,用于识别源代码中的漏洞。然而,Juliet是从预定义模式生成的合成数据集。尽管它们的数据量很大,但与真实世界的程序相比,它们缺乏多样性。如果不完全理解合成数据集与真实世界漏洞之间的差异和联系,盲目地使用合成数据集来评估漏洞检测模型,那么它们的度量是不可靠的,也缺乏公平性和公正性。例如,Wang等人发现,对于合成数据集LAVA-M,Angora(一种基于AFL的改进模糊测试工具)可以检测几乎所有的漏洞,而AFL只能检测其中的一小部分。但对于一些相同的真实世界漏洞,AFL发现的漏洞比Angora多62%(例如,CVE-2017-9666、CVE2018-11416、CVE 2017-13741)。

C. 混合漏洞数据集

PatchDB是一个包含补丁信息的大规模混合数据集。PatchDB不仅包含NVD索引的经验证的安全补丁,还包含从外部获取的大量补丁信息。此外,对于漏洞数据多样性,PatchDB提供了一个额外的合成数据集,该数据集通过改进的过采样技术从现有样本中自动生成。他们的实验结果表明,合成补丁可以提高模型自动识别有限大小数据集安全补丁的能力。但这是在向量空间中操作的,在源代码领域,合成数据在语法和语义方面仍然无法解释。

此外,我们还统计了与常见CWE漏洞类型和编程语言相关的现有漏洞数据集的分布,如图2所示。我们发现,大多数漏洞数据集主要包括C/C++的漏洞数据,其次是Java和PHP,但后者的总和也远不及前者的一半。这表明,现有的漏洞数据集几乎不能满足跨语言通用漏洞检测模型的训练要求。我们推测这可能与编程语言的广泛使用有关。更重要的是,即使是数据量最大的C/C++的漏洞数据,也没有完全覆盖五种最常见的漏洞类型,这就考验了漏洞挖掘模型在评估测试中的适用性。

图2 五种最常见的漏洞类型和流行编程语言的分布。

总之,尽管现有的开源漏洞数据集在某种程度上可以满足特定AI模型的训练需求,但它们仍然具有明显的局限性,无法提供真实世界多变量漏洞状况的全面概述。据我们所知,没有一个数据集符合真正基准数据集的标准。

IV. 挑战和机遇

A. 基准数据集

通过回顾现有的漏洞数据集研究,我们发现大多数漏洞数据集是专门为特定的漏洞检测模型生成的,缺乏可扩展性,无法横向评估模型之间的不同性能。不仅数据源单一,而且大多数数据源只包含C/C++开源项目,不够全面。随着漏洞检测模型性能的提高,任何漏洞数据集的价值都会随着时间的推移而降低。此外,一些漏洞检测模型在合成数据集上表现良好,但在检测真实漏洞方面可能表现不佳。然而,现实世界程序中的漏洞数量巨大且非常多样,因此从众多漏洞数据中构建合理的数据集是一项重大挑战。具有多种数据源、足够大的数据量、全面的漏洞特征、均匀分布的漏洞类型和频繁更新的数据集对于衡量漏洞检测模型的性能至关重要。因此,迫切需要一个标准化和规范化的基准数据集作为评估和比较模型有效性的统一标准。我们认为,标准基准数据集应根据多层次检测粒度进行精心定制,并应包含少量合成和大量真实代码样本,用于定性和定量评估和比较。

B. 自动化数据集标记框架

此外,大多数可用的漏洞数据集通常规模较小,其中很大一部分数据集缺乏标记信息,甚至被错误标记。如果未正确标记,该数据可能会成为影响检测模型性能的噪声点。目前,大多数自动化漏洞数据收集框架要么依赖安全专家的事先知识来确定样本的正确标记,要么假设所有收集的样本都正确标记,这显然是不合理的。手动注释似乎解决了部分问题,但手动验证每个样本数据是一种非常低效的方法。因此,基于AI模型的自动漏洞数据标记与人类审查相结合,对于提高漏洞数据集的质量可能更为实用。我们认为这是未来漏洞数据集研究的一个有趣方向。

C. 安全和非安全提交

另一个重要问题是,被称为漏洞修复的提交可能仍然存在其他尚未修复的漏洞,甚至补丁也可能无法工作。这意味着未来可能会有类似的提交,或者提交可能包含与漏洞修复无关的代码更改,例如文档改进和新函数添加。为了进一步提高数据集的质量,连续提交的方差分析至关重要。但是,如何从大量的项目提交中准确地找到有关漏洞修复和补丁的提交,将有助于减少分析基本开销。准确区分修补程序和非易受攻击的修改代码信息,甚至是失败的修补程序,将是一项有趣的任务。

V. 结论

人工智能在漏洞检测中的应用是一个很有前途的研究方向,但仍有许多尚未解决的问题。在本文中,我们讨论了漏洞数据集构建中面临的问题,回顾了应用于AI漏洞检测的数据集的相关研究,展示了基于真实世界程序的漏洞数据集和合成漏洞数据集的趋势,并分析了它们的优缺点,旨在促进安全领域的学者尽快达成统一的漏洞数据集构建标准和规范。这将激励和吸引更多的研究人员为这一有前途的领域做出贡献。

致谢

这项工作得到了海南省重点研发科技(ZDYF202012,GHYF2022010)和中国国家自然科学基金(U1836210)的支持。


总结

以上就是本篇论文翻译的全部内容了,整篇论文从数据集的角度分析目前的漏洞检测研究现状,值得深思,具体的论文精读笔记可见本系列博文:论文阅读笔记——Vulnerability Dataset Construction Methods Applied To Vulnerability Detection A Survey。下篇论文翻译见!

论文中文翻译——Vulnerability Dataset Construction Methods Applied To Vulnerability Detection A Survey相关推荐

  1. 论文阅读笔记——Vulnerability Dataset Construction Methods Applied To Vulnerability Detection A Survey

    本论文相关内容 论文下载地址--Web Of Science 论文中文翻译--Vulnerability Dataset Construction Methods Applied To Vulnera ...

  2. 论文中文翻译——VulDeePecker: A Deep Learning-Based System for Vulnerability Detection

    本论文相关内容 论文下载地址--Engineering Village 论文中文翻译--VulDeePecker: A Deep Learning-Based System for Vulnerabi ...

  3. 论文中文翻译——Automated Vulnerability Detection in Source Code Using Deep Representation Learning

    本论文相关内容 论文下载地址--Web Of Science 论文中文翻译--Automated Vulnerability Detection in Source Code Using Deep R ...

  4. 论文中文翻译——Double-Fetch情况如何演变为Double-Fetch漏洞:Linux内核中的双重获取研究

    本论文相关内容 论文下载地址--Web Of Science 论文中文翻译--How Double-Fetch Situations turn into Double-Fetch Vulnerabil ...

  5. 论文中文翻译——A deep tree-based model for software defect prediction

    本论文相关内容 论文下载地址--Web Of Science 论文中文翻译--A deep tree-based model for software defect prediction 论文阅读笔记 ...

  6. 论文中文翻译——kAFL Hardware-Assisted Feedback Fuzzing for OS Kernels

    本论文相关内容 论文下载地址--26th USENIX Security Symposium 论文中文翻译--kAFL Hardware-Assisted Feedback Fuzzing for O ...

  7. 论文中文翻译——SketchyCOCO Image Generation from Freehand Scene Sketches

    本论文相关内容 论文下载地址--SketchyCOCO Image Generation from Freehand Scene Sketches 论文中文翻译--SketchyCOCO Image ...

  8. 论文中文翻译——SySeVR A Framework for Using Deep Learning to Detect Software Vulnerabilities

    本论文相关内容 论文下载地址--Web Of Science 论文中文翻译--SySeVR A Framework for Using Deep Learning to Detect Software ...

  9. FastSpeech2论文中文翻译

    FastSpeech2 论文的翻译,翻译的挺差的,大概是那意思 只翻译了摘要.模型部分和实验部分 摘要: 高级的TTS模型像fastspeech 能够显著更快地合成语音相较于之前的自回归模型,而且质量 ...

最新文章

  1. X86中的RDTSC指令
  2. Servlet -- 重定向
  3. Python基础之:数字字符串和列表
  4. Per-FedAvg:联邦个性化元学习
  5. php中glob怎么用,如何在php中利用glob函数对文件进行遍历
  6. linux定时备份Mysql
  7. 拓端tecdat|R语言里的非线性模型:多项式回归、局部样条、平滑样条、 广义相加模型GAM分析
  8. android compare方法,如何的CompareTo或在Android Studio中
  9. 工具开发——端口开放扫描
  10. 软件开发中如何评估工作量
  11. 【STM32】时钟相关函数和类型
  12. jqwidgets简单技术
  13. 看,那人好像一个产品狗,对,这就是产品狗
  14. SpringBoot Actuator
  15. html 自动悬浮,HTML 悬浮float介绍
  16. PT静态时序分析 第一课 第二课
  17. 人行征信上贷款余额指的是什么?(图文)
  18. 9.添加好友 和删除
  19. 运用计算机来动画制作的视频,如何制作一个时钟转动动画视频?电脑制作动画的软件制作时钟转动的小视频的方法...
  20. 华为视频编辑服务全新能力上线,帮助打造更智能剪辑应用

热门文章

  1. PCI-Express转4串/8串/28串口CH384的硬件配置及设计
  2. Google Earth上划定矢量范围并导出为KMZ文件
  3. ICC2 user guide(三)Clock Tree Synthesis
  4. 【Word】Word更改默认模板样式——使用自定义模板【以Windows10+Word2019为例】
  5. 论文翻译-A Comprehensive Survey on Graph Neural Networks《图神经网络GNN综述》
  6. 基于单片机的智能教室控制系统的设计
  7. Ubuntu系统Vscode安装以及配置C++环境(一条龙服务)
  8. 20180423-B · Australian Salaries by Gender · ggplot2 ggalt geom_dumbbell 棒棒糖图 哑铃图 · R 语言数据可视化 案例 源码
  9. Surface pro系统重装
  10. python象棋编程_Python开发象棋小游戏(绘制棋盘)