2022/3/1 10:49:26 阅读:268 发布者:chichi77
笔记作者:Norns@SecQuan
笔记小编:ourren@SecQuan
原文标题:Disco: Discovering Insecure Code Snippets from Stack Overflow Posts by Leveraging User Discussion
原文作者:Hyunji Hong, Seunghoon Woo and Heejo Lee, Korea University
发表会议:ACSAC '22
原文连接:https://dl.acm.org/doi/pdf/10.1145/3485832.3488026
0x01 Introduction
在线技术问答平台,如Stack Overflow,能够为开发者提供代码片段,提高开发效率。开放化的平台也为这些代码带来了风险。在这些平台上,提供代码的人自身不对代码的质量,尤其是安全性负责,如果不加审查地直接使用这些代码,甚至是将其应用在核心系统中,这将对信息系统安全性带来极大的安全挑战。幸运的是,像Stack Overflow这样的技术问答平台提供了讨论功能及修改功能,代码作者能够根据其它用户的评论或者自我审查发现代码中存在的问题并对其进行修改。在这篇论文中,作者通过对比平台上代码的历史变化,检测代码的安全性迭代,通过判断代码是否打了补丁的方式判断代码是否是安全的。
0x02 Example
以Stack Overflow平台为例,在Stack Overflow上,一个完整的问答包括3个部分:用户提问,用户回答以及针对用户回答的评论,用户的回答可以进一步划分为描述和代码片段两部分,如下图所示:
以Stack Overflow上一个代码片段为例,初始代码如下:
1 char *trimwhitespace(char *str) {
2 char *end;
3 // Trim leading space
4 while(isspace(*str)) str++;
5
6 // Trim trailing space
7 end = str + strlen(str) - 1;
8 while(end > str && isspace(*end)) end--;
9
10 // Write new null terminator character
11 *(end+1) = 0;
12 return str;
13 }
回答的作者在收到如下评论后:
将其答案修改为:
1 char *trimwhitespace(char *str) {
2 char *end;
3 // Trim leading space
4 - while(isspace(*str)) str++;
5 + while(isspace((unsigned char)*str)) str++;
6
7 + if(*str == 0) // All spaces?
8 + return str;
9
10 // Trim trailing space
11 end = str + strlen(str) - 1;
12 - while(end > str && isspace(*end)) end--;
13 + while(end > str && isspace((unsigned char)*end)) end--;
14
15 // Write new null terminator character
16 - *(end+1) = 0;
17 + end[1] = ’0’;
18 return str;
19 }
由此可见,可以通过回答者会通过评论对其答案进行修改。
0x03 Feature Selection
通过对比历史代码,可以识别出历史代码发生了变更。接下来的问题是,如何确定这个代码的变化与安全是相关的。通过对已提出检测代码安全性更新的特征进行比对,作者最终选定3个特征作为判断一次代码变更是否与安全相关,分别是:安全相关API变化,安全相关关键词变化以及代码控制流变化。
0x04 Overview of Dicos
根据以上描述,作者将恶意代码片段的检测流程抽象成一个检测框架:Dicos(Discovering Insecure Code Snippets),如下图:
完整的工作流程分为以下三步:
从帖子中抽取历史变化
通过提取的特征判断代码是否存在安全性更新
若代码存在安全性更新,则将历史代码判断为不安全代码
论文中进一步讨论了Dicos的实现细节,有兴趣的朋友可以前去了解。
0X05 Evaluation
作者在收集的668520个帖子中验证Dicos的有效性,验证Dicos的精确率、召回率以及准确率,得到了较为理想的结果:
对比同类型方法,Dicos在评价指标上也大大领先: