@yinnner
2018-12-08T05:27:00.000000Z
字数 2975
阅读 1744
论文地址:Towards security defect prediction with AI
代码仓库地址:sa-bAbI
核心文件:
sa_babi/
.
├── generate.py # 主要生成代码的文件
├── sa_tag.py # 每行代码性质标签
└── templates.py # 生成不同模块(控制流、函数体等)的模版
如果要添加漏洞种类,则则需要往sa_tag.py
中添加新的行标签,往templates.py
中添加新的模块模版。
generate.py
重要函数逻辑如下:
main()
函数逻辑generators
(含有各种例子生成器的数组) linear_only
表示代码顺序执行,不包含控制流,生成器只有一种。有以下几种生成器,对应相应的函数:
buffe write 格式:"$buf_var[$idx_var] = '$char';"
fv含义:free variable
函数名/生成器 | 作用 |
---|---|
gen_cond_example | idx_var经过while循环模块得到 |
gen_for_example | $idx_var经过for循环模块得到 |
gen_fv_cond_example | 有一个自由变量,经过if条件判断模块 |
gen_fv_while_example | 有一个自由变量,经过while循环模块 |
gen_fv_for_example | 有一个自由变量,for循环模块 |
gen_tautonly_linear_example | 不经过控制流直接进行不安全的buffer write |
以上生成器逻辑几乎相同,只是需要的变量和判断safe的条件不一样。逻辑如下:
_get_anon_vars()
生成得到。dummy_vars
,只用来传递数值,实际不起什么作用。_get_char()
生成得到。substitutions
字典将其封装好。templates.xxx_MAIN_LINES
。safe
用来指示。templates.xxx_DEC_INIT_PAIRS
。_assemble_general_example
组装模块生成代码。gen_tautonly_linear_example
函数由于不经过控制流,直接进行buffer write,因此所有变量都是dummy_vars
,substitutions
、main_lines
、dec_init_pairs
均为空。
如果要添加漏洞种类,我觉得可以按照以上函数的模式写gen_xxx_{Vulnerability Name}_example
7个对应函数,具体是否要写那么多个要看漏洞的性质,main函数可能只需要少量改动。
_assemble_general_example()
组装模块函数逻辑:
main_lines
加一句templates.BUFWRITE_LINES
。_get_lines
得到所有代码行。(这个函数及相应调用函数需要修改。)_get_tags
得到所有代码行标签。_get_instance_str
得到最终c语言代码文本。_get_lines()
获得所有代码行,包含声明初始化、主体内容、dummy变量
(只用来传递数值,实际不起什么作用)的使用。函数逻辑:
_get_setup_lines
获得声明初始化代码行。include_cond_bufwrite == True
),则为最后一个代码行(即为buffer write代码)打上Tag.BUFWRITE_COND_SAFE
或 Tag.BUFWRITE_COND_UNSAFE
(通过safe
判断)。_insert_dummies
为现有代码行添加dummy变量相关的代码行。_insert_dummies()
插入所有dummy变量的声明和赋值语句。函数逻辑如下:
num_dummies
次,调用_insert_referential_dummy
依次插入每一个dummy变量的相关代码行。_insert_referential_dummy()
插入指定dummy变量的声明、初始化和buffer write语句。这里面出现的buffer write不经过控制流,因此标签为BUFWRITE_TAUT_SAFE 或 BUFWRITE_TAUT_UNSAFE。
函数逻辑如下:
dum_len
和buffer write需要用到的下标dum_idx
。dum_buf_var
;指示buffer write位置的下标——dum_int_var
。lines
中。dum_idx
、 dum_len
的大小关系判断buffer write是否安全。body_tags
中。_test()
测试每个生成器生成代码。
这个函数大部分不需要修改,只需要改从745-757
行测试标签种类的代码。
函数名 | 作用 |
---|---|
_get_char() | 获得一个字符 |
_get_anon_vars() | 获得MAX_NUM_VARS 个变量并打乱 |
_get_tags() | 获得完整的标签,即加上函数主体外的其他标签(#include... int main() {return 0;} ) |
_get_instance_str() | 替换模版中的文本并获得最终c语言代码文本。 |
_get_setup_lines() | 获得打乱顺序的声明初始化变量代码行 |
_get_args() | 设置命令行参数格式并获得命令行参数(可能会修改) |
_get_full_template() | 似乎这个文件里面没有使用到 |