《CoinWatch: A Clone-Based Approach For Detecting Vulnerabilities in Cryptocurrencies》略读

从比特币fork出的项目以及它们与比特币v0.17.0相比而言的克隆比率,如下所示
《CoinWatch: A Clone-Based Approach For Detecting Vulnerabilities in Cryptocurrencies》略读

作者团队设计了一个概念验证工具包CW,目前为止扫描了1094个加密货币项目,并且将其与比特币进行比较。他们选取了在严重性程度方面排在前四的加密货币中的CVE。总得来说,CW报告了786个在384种加密货币中传播导致的漏洞,精确率达到了89.7%。反过来,得到了额外的4个CVE(https://github.com/JinBean/CVE-Extension/)

例子:
以CVE-2018-17144为例
A.介绍
这个漏洞类型为CWE-617
《CoinWatch: A Clone-Based Approach For Detecting Vulnerabilities in Cryptocurrencies》略读

攻击者利用的是reachable assertion的漏洞进行攻击,通过构造一比双花交易(double spends),可以使网络中的任何节点失效,这会导致所有接收到包含这比交易的mined blockde所有节点出现DoS。漏洞在Sep 18,2018,比特币 0.16.3版本中修复。
《CoinWatch: A Clone-Based Approach For Detecting Vulnerabilities in Cryptocurrencies》略读

而基于比特币克隆的漏洞周期如下所示
《CoinWatch: A Clone-Based Approach For Detecting Vulnerabilities in Cryptocurrencies》略读

B)
使用CW对所有加密货币检测漏洞(包括已经修复)是否存在,并标记存在漏洞代码但是没有修复的。
C.将CW应用至CVE-2018-17144
CW会报告潜在的可疑的具有高相似性的加密货币。
PigeonCoin.在Sept 26,2018,该加密货币被利用CVE-2018-17144攻击,损失了235百万的PGN。这个漏洞的fix在27Sept ,2018才被上传到他们的github repo,这一天距离比特币中修复该漏洞的时间迟了9天。如果CW早点监测到PigeonCoin,这个漏洞就可以被发现并在被利用前进行修复。

COINWATCH的设计
A.overview
《CoinWatch: A Clone-Based Approach For Detecting Vulnerabilities in Cryptocurrencies》略读

在指定了具体的CVE之后,CW会对现有的项目进行代码演化分析(code evolution analysis)来获得bug fixing和Bug introducing commits。这些信息之后会手动注释来最小化那些存在漏洞或是修复的代码。
然后CW会进行克隆检测。在检测前,被检测的名单会基于fork的日期进行过滤去掉无关的和不受影响的项目来减少搜索范围。
之后就是克隆检测器,喂给它过滤后的要被检测的加密货币的代码库,它会识别并报告克隆的并可能会受到漏洞影响的项目。

B.细节
CVE parsing.
在当前项目中的一个新漏洞被报告后,CW就会触发。首先,CW会解析输入的CVE并提取关于CVE的细节:1.公开的日期;2.使用针对小文本的文本挖掘技术从描述中获得关键字;3.指向版本控制系统的资源的外部链接(比如issues,pull request,release notes);4.受影响的加密货币的列表,以及对应的编程语言。然后CW会进行检查该漏洞是否取决于特定于加密货币的代码,因为某些漏洞可能源自使用的底层协议(比如TLS)。最后,使用爬虫技术提取与bug和fix相对应的软件发行版本,并将其用于考虑了项目增量代码历史的代码演变分析。
Code Evolution Analysis
CW使用比特币的代码演变来发现包含fix和bug的commit ID。CW将入口点设置为漏洞的release date,并在按照issue进行迭代时会依照时间进行回退,直到将fixing commit与给定的cve联系起来。为了拿到commit id,CW使用了SZZ算法。SZZ算法被作为一种识别在软件仓库中引入bug的算法提出。通过泄露github的issue-tracking system,我们可以通过使用git-blame命令来找到引入bug的commit,以此来提高准确率。SZZ算法的一种公开实现名为SZZ Unleashed,它帮助我们进一步了解如何将其进一步应用于实际。
在这部分工作中,我们基于SZZ算法,将其根据我们的目的(识别bug-fixing,bug-introducing的commit)进一步扩展。我们搜索了所有已经被fix,resolved,closed或被标记被bug的issue.CW使用诸如CVE,CVE-ID这种关键字,并从CVE细节中提取关键字作为正则表达式要匹配的字符串模式。这将使得CW可以定位bug-fixing commits,将其存储至Gf.为了找到bug-introduing commit Gb,CW使用git-blame功能,该功能使用revision中的信息对代码行注释,revision修改该行为最后一行(即getPrevCommits()),从而对代码行进行注释。
《CoinWatch: A Clone-Based Approach For Detecting Vulnerabilities in Cryptocurrencies》略读

我们需要强调,CW采用了保守的方法找出bug-introducing最老的日期和Bug-fixing最新的日期。这种方法使我们能够跟踪引入错误和修复错误的提交,从而可以估计任何代码库中存在错误的时间范围。 我们将此时间范围用作代表其在项目中传播的窗口,该项目是通过fork目标项目而创建的。
Identification of Vulnerable Code.
在得到bug fixing和bug introducing commit之后,CW要求手动注释这些commit里的代码(比如引发漏洞的代码和修复漏洞的代码)。这要求我们能够理解漏洞起因,然后,这种手动的工作做一次就可以了,之后所有被监控的项目都会自动进行。之后,CW将注释后的代码转为适合克隆检测器进行检测。
Filtering of Monitored Projects
我们提供了一种简单的方法来为监控的加密货币进行初始化的过滤。算法基于从父项目派生这些项目的时间戳。 设Vc为受监视的加密货币项目的集合,如果在Gb.date之后和Gf .date之前创建了p∈Vc,则我们考虑对Vc进行进一步分析。 否则,如果p的存储库是在引入bug之前或在bug修复之后创建的,则我们将忽略这种情况,因为在fork项目时不存在bug。 候选项目列表构成了我们对潜在脆弱项目的第一批选择。 算法2使用算法1的输出来标识创建和显示漏洞的日期,直到检查与特定commit ID相关的时间戳为止。
《CoinWatch: A Clone-Based Approach For Detecting Vulnerabilities in Cryptocurrencies》略读

Detection Process
最后,CW使用生成的检测测试,使用克隆检测器在受监视的加密货币列表中找到父项目的克隆,然后使用Gf和Gb对其进行分析以表明此类克隆项目可能存在漏洞。

Implementation
Experiment Setup
我们执行的所有实验均在配备2.70GHz四核i7-7500U CPU并配备16 GB内存的计算机上运行。我们进行了一个模拟实验,在CW上,对早于漏洞披露版本的项目版本进行了CW。仿真实验评估了如果采用我们的方法,是否可以更早地修复某些加密货币。为了实例化克隆检测器,我们选择了Simian ,这是一种相似性分析器,用于识别C ++代码中的重复项,以及使用基于文本的字符串比较来识别I型克隆的其他工具。类型I克隆表示当特定代码库中的代码片段完全相同时,省略注释和缩进的情况。请注意,II型克隆在语法上是相似的代码片段,通常是通过重命名变量名称或修改数据类型,可以从类型I克隆创建。最后,由于类型I或类型II克隆中代码片段的添加,删除或修改,创建了类型III克隆。
Testing Simian
在进行任何克隆检测实验之前,我们首先进行测试以验证Simian能够准确检测完整代码结构内的克隆代码。 因此,我们进行了正面测试,并将克隆的Bitcoin-0.17存储库与部分自己的代码进行了比较。 这标识了整个代码段的正确文件和行号。 然后,我们使用Bitcoin-0.17中不存在的代码进行了否定测试。 我们发现,为了最大程度地减少误报,我们必须将代码行阈值设置为易受攻击代码的每个代码段的确切长度。 这样可以确保仅检测到包含导致漏洞的完整代码的加密货币。 但是,这样做会增加假阴性的可能性; 由于加密货币的时间敏感性和广泛的攻击面,我们采用此设置,因为检测真正的易受攻击的项目比错过潜在的易受攻击的项目更为重要。
Identifying vulnerable code
使用特定于比特币的CVE数据库,我们对比特币的CVE进行了评估,以选择其代码库版在(2016、2018)范围内的漏洞,该时间范围内存在许多其他加密货币创建。 一旦选择了CVE进行分析,CW就会搜索错误修复和错误提交提交。 然后,我们手动注释这些提交的代码段,这些代码段与漏洞和修补程序有关,CW以此为基础为Simian生成了检测测试。 接下来,CW从引入该漏洞的比特币版本及其最终修复的版本中解析了信息。
Clone Detection in Monitored Project
我们编写了Python脚本,这些脚本抓取了coingecko.com来收集所有现有加密货币名称,它们的GitHub存储库链接以及该加密货币所使用的语言的数据集。
在我们拥有的1970种加密货币中,有43种被列出无效的GitHub链接,或者仅仅是指向网站的链接。然后,我们使用Git克隆所有有效的存储库。由于我们想从比特币克隆中识别漏洞,因此我们删除了所有未使用C ++的加密货币。然后我们剩下了1094种加密货币。用于分析的文件夹结构由一个主文件夹组成,我们将其称为比较文件夹。在比较文件夹中还有另外两个文件夹。第一个包含易受攻击的代码,第二个包含我们要比较的加密货币的代码。使用Python脚本自动将代码从数据库移入比较文件夹,运行Simian克隆检测,然后移回代码。对于数据库中的每种加密货币,此操作都是迭代完成的。 Simian每次迭代后都会生成一个XML文件,其中包含克隆检测的结果。 XML文件包含每个检测到的克隆的文件路径,检测到的行数以及所花费的处理时间,如图4所示。然后运行另一个脚本来解析每个Simian输出,从而为我们提供了可疑漏洞列表。加密货币。为了支持我们方法论的有效性,我们还是用了Zcash(及其CVE)作为当前项目的一部分进行试验(CVE-2019-7167)
《CoinWatch: A Clone-Based Approach For Detecting Vulnerabilities in Cryptocurrencies》略读

Evaluation
回答了三个问题:

《CoinWatch: A Clone-Based Approach For Detecting Vulnerabilities in Cryptocurrencies》略读