一种检测python代码漏洞的方法及装置的制造方法_2

文档序号:9489381阅读:来源:国知局
任一危险函数确定相应的代码漏洞之前,所述处理单元进一步用于:
[0051]采用用户预设的安全函数或者python自带的安全函数对所述任一危险函数包含的可控参数进行处理,确定经处理后的可控参数仍可控时,最终判定所述任一危险函数为真正的危险函数。
【附图说明】
[0052]图1为本发明实施例中检测python代码漏洞流程图;
[0053]图2为本发明实施例中生成可控参数集合流程图;
[0054]图3为本发明实施例中检测python代码漏洞的装置功能结构示意图。
【具体实施方式】
[0055]为了提高python代码漏洞检测的精准度,本发明实施例中,针对python代码进行分析,生成一个python语法树,然后对该语法树进行分析,跟踪数据流,当发现危险函数之后,再继续跟踪危险函数包含参数是否可控,若为可控参数,则认定检测到危险函数对应的漏洞。
[0056]下面结合附图对本发明优选的实施方式进行详细说明。
[0057]参阅图1所示,本发明实施例中,检测python代码漏洞的详细流程如下:
[0058]步骤110:对待检测的python代码进行语法解析,生成相应的语法树,以及对语法树进行数据流分析,提取出使用的危险函数。
[0059]实际应用中,用于解析python代码的工具很多,可以采用任意一种工具对python代码进行语法解析,生成相应的语法树。在进行语法分析时,包含但不限于对代码中包含的类,函数,import,控制语句等等进行分析。
[0060]进一步地,在对python代码进行语法解析的过程中,需要根据指示删除非必要代码,从而去语法树中不必要的枝干,降低代码分析的难度,降低干扰。
[0061]另一方面,存在漏洞的场景,很大一部分是由注入引起的,常见的注入场景有操作系统(Operating System, OS)命令注入,代码注入,结构化查询语言(Structured QueryLanguage, SQL)注入,任意文件读取,下载等等。在这些注入场景中,所有的漏洞都涉及到使用危险函数,并且该危险函数中包含的参数是可控的。因此,在执行步骤110时,经语法解析,获得python的语法树后,得到其语法树,再跟踪语法树产生的数据流,从而提取出python代码中可能使用到的危险函数。
[0062]筛选危险函数的过程较简单,可选的,可以通过学习累积维护一个危险函数列表,若语法树中发现了函数调用并且该函数名称在上述危险函数列表中,就可以标注出相应的代码行,表示查找到危险函数。
[0063]进一步地,在进行数据流跟踪的过程中,基于输入(import)机制,从数据流以及python代码的环境变量中获取引入的第三方模块或/和第三方函数,并对该第三方模块或/和第三方函数进行解析,包括一些简单的函数处理,具体包含但不限于以下两种处理方式的任意一种或组合:
[0064]1、判断引入的第三方模块或/和第三方函数是否为危险函数,确定为危险函数时,将该第三方模块或/和第三方函数包含的参数归属至可控参数集合中;
[0065]2、根据解析结果判断引入的第三方模块或/和第三方函数包含的参数在整个函数处理过程是否发生改变,将未发生改变的参数归属于可控参数集合中。
[0066]例如,输入参数A后,返回值仍为参数A,则认为参数A可控。
[0067]又例如:将已知的可控参数赋值给参数B,那么则认为参数B可控。
[0068]之所以这样处理,是第三方可能会引入可控参数,那么,这些参数在后续的流程中经过各类危险函数处理后,仍然可以是可控参数,因此,需要加强防范。
[0069]步骤120:对提取出的危险函数的外层函数所包含的参数进行跟踪,将赋值类型满足预设传递规则的参数确定为可控参数,组成可控参数集合。
[0070]具体的,在提取出危险函数后,难点在于跟踪危险函数包含的参数。
[0071]本发明实施例中,较佳的,默认危险函数的外层函数所包含的参数为可控参数,那么,只需要对外层函数包含的参数进行跟踪,分析其传递过程,即可确定最终的取值是否可控,从而可以根据分析结果获得相应的可控参数集合。
[0072]可选的,本发明实施例中,只需要确定外层函数包含的参数的赋值类型符合以下传递规则中的任意一条,即可确定其为可控参数。
[0073]1、参数的赋值类型为:指定的属性取值。
[0074]例如,对一个变量取属性,比如:request的GET属性、POST属性和FILES属性。若参数的赋值类型为上述属性取值,或者,进一步地,为上述属性的属性取值,则认为参数是可控参数。
[0075]此外,若参数的赋值类型是request的其他字段,如META、user、sess1n、url等等,则认为不是可控参数。
[0076]2、参数的赋值类型为:字符串拼接,且被拼接的字符串中包含已认定的可控参数。
[0077]由于被可控参数赋值后的值也被认定是可控的,因此,需要考虑到各种拼接情况,如,采用+,%,format函数等等方式进行拼接。
[0078]3、参数的赋值类型为:分片符取值。
[0079]通常情况下一般认为分片后的值也是可控的。
[0080]4、参数的赋值类型为:列表解析式,且该列表解析式基于至少一个可控因子进行迭代,或者,且该列表解析式为包含有可控因子的列表相加。
[0081]在这种情况下,默认赋值后的列表也是可控的。
[0082]5、参数的赋值类型为:经字符串操作函数处理的返回值,或/和,经未过滤函数处理的返回值。
[0083]例如,若参数经过简单的字符串操作函数(如,str,Unicode,strip,encode等)处理,或/和,参数经简单的未过滤函数处理,那么,则认定函数的返回参数是可控的。
[0084]另一方面,可选的,还可以进一步对上述python语法树进行类分析,在分析过程中将各个类的初始化参数归属于可控参数集合(便于后续匹配流程使用),以及对各个类的变量赋值进行跟踪,若任一危险函数中使用了类的变量,则确定该任一危险函数包含有可控参数。
[0085]步骤130:将获得的危险函数中包含的参数与可控参数集合中的每一个可控参数进行匹配,若匹配成功,则确定危险函数中包含的参数为可控参数。
[0086]实际应用中,在确定任一危险函数中包含的参数为可控参数后,在根据上述任一危险函数确定相应的代码漏洞之前,进一步地,采用用户预设的安全函数或者python自带的安全函数对上述任一危险函数包含的可控参数进行处理,确定经处理后的参数仍为可控参数时,最终判定所述任一危险函数为真正的危险函数。
[0087]这是因为,用户可以根据实际需求自行定义安全函数或者用户可以采用python自带的安全函数,如果任一危险函数(以下称为危险函数X)包含的可控参数,经过安全函数处理之后由可控变成了不可控,那么,危险函数X则被排除,安全函数通常是程序员对输入进行安全检查的另外一种封装,相应的,若采用用户预设的安全函数对危险函数X包含的参数进行处理后,参数仍可控,则最终判定危险函数X为真正的危险函数,即需要检测出危险函数X对应的代码漏洞。
[0088]当然,对危险函数进行分析的前提是危险函数中包含有参数,若有,才会进一步判断参数是否可控,否则,则直接排除相应的危险函数,但需要将该危险函数加入危险函数列表中,以便分析其他函数时使用。
[0089]步骤140:根据包含有可控参数的危险函数确定相应的代码漏洞。
[0090]进一步地,在检测到所有的代码漏洞后,根据代码漏洞的类型,对应记录相应级别的系统日志,在不同的级别下输出的系统日志也是不
当前第2页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1