欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

代码分析平台CodeQL学习手记(十)

来源:本站整理 作者:佚名 时间:2020-01-22 TAG: 我要投稿

前面的文章中,我们为读者简单介绍了如何利用查询控制台分析Python代码,以及用于分析Python代码的CodeQL库。在本文中,我们将为读者深入介绍如何利用CodeQL提供的标准类来分析Python项目中的函数、语句、表达式和控制流。
函数分析
在前面的文章中,我们简单的介绍了一下标准的CodeQL类Function,下面,我们开始通过示例进行深入的讲解。
查找所有名为“get ...”的函数
在这个例子中,我们要找出程序中的所有“getter”函数。众所周知,对于刚刚从Java语言转换到Python语言的程序员来说,往往会习惯性地编写getter和setter方法,而不是使用属性。有时候,我们可能需要找出这些方法,那该怎么办呢?很简单,利用成员谓词Function.getName(),就能轻松找到数据库中的所有getter函数,具体代码如下所示:
import python
 
from Function f
where f.getName().matches("get%")
select f, "This is a function called get..."
上面的代码并不复杂,其中where f.getName().matches("get%")的含义是,这里要找的函数的名称与字符串"get%"匹配;而"get%"表示以get开头的字符串,因为%在这里是一个通配符,表示其他字符。代码的运行结果如下所示:

如图所示,这里找到了大量的其名称以get开头的函数,不过,其中许多函数都不是我们要找的getter函数。
查找所有名为“get ...”的方法
为了让查询返回我们真正感兴趣的内容,需要对上面的查询稍作修改。由于这里只对“方法”感兴趣,所以,我们可以通过Function.isMethod()谓词来改进我们的查询代码。
import python
 
from Function f
where f.getName().matches("get%") and f.isMethod()
select f, "This is a method called get..."
上述代码的查询结果如下所示:

我们发现,这里返回的方法的名称都是以“get”开头的,但是,仍然有许多不是要找的目标方法。
查找所有名为“get…”的单行方法
我们可以进一步修改查询,使其只返回函数定义中只有一条语句方法。为此,我们可以通过统计每个方法中的代码行数来做到这一点,具体代码如下所示:
import python
 
from Function f
where f.getName().matches("get%") and f.isMethod()
 and count(f.getAStmt()) = 1
select f, "This function is (probably) a getter."
其中,count(f.getAStmt()) = 1表示函数的定义中只包含一条语句,其他代码非常简单,这里就不多说了。上述代码的运行结果如下所示:

如您所见,这次返回的结果明显减少了,但是,其中的许多方法仍然不是我们要找的getter方法。因此,该查询代码还需做进一步的调整,具体将在后文中详细介绍。
查找针对特定函数的调用
下面,我们要通过Call 和Name这两个类来查找对函数eval的调用,因为这个函数经常会带来安全隐患,具体代码如下所示:
import python
 
from Call call, Name name
where call.getFunc() = name and name.getId() = "eval"
select call, "call to 'eval'."
其中,call.getFunc() = name and name.getId() = "eval"表示调用的函数的名称为eval。此外,Call类表示Python程序中的调用,而谓词getfunc()则用于获取被调用的表达式。而谓词getid()则用于获取名称表达式的标识符(字符串)。上述代码的运行结果如下所示:

由于Python的动态特性,该查询将返回具有eval(...) 形式的所有调用,无论它是否是对内置函数eval的调用。在后文中,我们将介绍如何使用类型推断库来查找对内置函数eval的调用。
上面,我们介绍了如何利用查找满足特定条件的函数和调用,接下来,我们开始介绍如何从语句和表达式的角度来分析Python代码。
语句与表达式分析
语句
对于Python程序来说,大部分的代码都是某种语句的形式出现的。因此,对于Python中各种类型的语句,CodeQL都提供了相应的类来加以表示。
下面是这些类的层次结构:
Stmt类 —— 语句
· Assert类 —— assert语句
· Assign类
* AssignStmt类 —— 赋值语句,如x = y
* ClassDef —— 类定义语句
* FunctionDef —— 函数定义语句
· AugAssign —— 增量赋值(augmented assignment)语句,如x += y
· Break类 —— break语句
· Continue类 —— continue语句
· Delete类 —— del语句
· ExceptStmt类 —— try语句的except部分
· Exec类 —— exec语句
· For类 —— for语句
· Global类 —— global语句
· If类 —— if语句
· ImportStar类 —— from xxx import * 语句
· Import类 —— 其他类型的import语句
· Nonlocal类 —— nonlocal语句

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载