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

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

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

在前文中,我们为读者详细介绍了如何在命令行环境下构建CodeQL数据库、更新数据库,以及如何通过自定义查询来分析数据库。从本文开始,我们为读者介绍如何利用CodeQL的标准库来分析JavaScript和TypeScript代码中潜在的安全漏洞。
首先,让我们了解一下如何通过LGTM查询控制台来编写和运行用于分析JavaScript和TypeScript代码的查询。
利用查询控制台编写并运行JavaScript查询代码
在JavaScript语言中,所有的表达式都是使用表达式语句来表示的。这样做的好处是用起来非常方便,但是也可能会带来一些问题。例如,假设程序员想通过赋值语句x = 42给变量x赋一个新值。 但是,由于粗心,键入了两个等号,这时,它就变成了一个比较语句x == 42。 由于这个语句在语法上是正确的,所以,编译和执行时并不会报错:它只是将x与42进行比较,然后,将比较的结果丢弃。好了,我们现在的任务,就是编写一个查询,专门寻找此类语句。
在编写查询之前,让我们先来看看如何在查询控制台中运行查询。
运行查询代码
首先,打开查询控制台,地址为https://lgtm.com/query。然后,从Language下拉列表中选择JavaScript,并从Project下拉列表中选择要查询的一个或多个项目。接着,将以下查询代码复制到查询控制台的文本框中:
import javascript
 
from Expr e
where e.isPure() and
  e.getParent() instanceof ExprStmt
select e, "This expression has no effect."
这时,LGTM会自动编译查询代码,并检查是否存在语法错误;如果一切正常的话,“Run”按钮将变成绿色的,表示查询代码已经通过了编译,可以运行了,具体如下图所示:

单击“Run”按钮,查询就会开始运行,运行结束后,原来的按钮会变成一个紫色的“View results”按钮。点击这个按钮,我们就可以看到查询代码返回的结果了:

如您所见,结果通常展示在项目名称下面。这里的查询结果分为两列,分别对应于查询的select子句中的两个表达式。第一列对应于表达式e,并链接到项目源代码中e所在的位置。第二列是警报消息。结果底部的省略号(…)表示有更多的结果可用,单击它就会显示更多的结果。
如果返回的结果数量不为0,单击e列中的相关链接,就会在代码查看器中看到符合要求的表达式。

解读查询代码
现在,我们来解释一下这个查询中的各个语句。首先,开头部分是一个import语句,其作用是导入相应的标准库。在此之后,这个查询还包含三个语句,它们的作用与 SQL查询中的FROM、WHERE和SELECT子句的作用基本相同。
下面,我们进行逐行解读:
import javascript
这一行代码的作用是,导入用于分析javascript代码的标准查询库。实际上,每个查询的开头部分都会有一个或多个import语句。
from Expr e
这个from子句的作用是定义了一个变量,该变量的名称为e,其类型为 Expr,表示javascript语言中的表达式。下面给出定义变量的一般形式为:
现在,我们来看下一个语句:
where e.isPure() and e.getParent() instanceof ExprStmt
该语句定义了变量e需要满足的条件。其中,e.isPure()表示这是一个“纯粹的”表达式,纯粹到啥用也没有。而e.getParent() instanceof ExprStmt则表示该表达式的父类为表达式语句。那么,中间位置的and是什么作用呢?其实,and是一个逻辑连接词,表示前后的判断必须同时成立,则整个判断才能成立。
select e, "This expression has no effect."
这里的select子句的作用是,指出要显示哪些内容。就本例来说,就是显示符合要求的表达式,并给出一个解释性的文本,也就是上面的字符串。一般来说,用于查找不良编码实践实例的查询的select语句总是采用以下形式:
select
改进查询代码
通常来说,查询代码的编写过程就是一个迭代的过程。例如,刚开始的时候,我们编写了一个简单的查询,通过运行,可能会发现以前没有考虑过的情况,或需要改进的地方,然后,着手进行修改,再次运行,如果有必要,继续进行修改,依此类推。
消除假阳性结果
如果仔细浏览上面查询返回的结果,就会发现我们的代码还有待改进,因为返回的结果中,有一些是类似use strict这样的指令——对于如今的浏览器来说,这些指令是有其特定的含义的,换句话说,认为这些表达式没有任何作用是错误的。
为了从返回结果中去掉这些指令,我们需要:
· 扩展where子句,加入额外的限制条件,具体如下所示:
and not e.getParent() instanceof Directive
这样的话,我们的where子句就变成了下面的样子:
where e.isPure() and
  e.getParent() instanceof ExprStmt and
  not e.getParent() instanceof Directive
· 之后,再次点击“Run”按钮。由于use strict指令被排除掉了,所以,返回结果的数量会有所减少。

上面我们简单介绍了如何利用查询控制台分析JavaScript项目,下面我们开始介绍用于分析JavaScript代码的CodeQL标准库。
用于分析JavaScript代码的CodeQL标准库
为了帮助人们分析JavaScript代码,CodeQL平台专门提供了一个功能丰富的标准库,来帮助我们分析从JavaScript项目中提取的CodeQL数据库。这个库中的类,不仅能够以面向对象的形式表示数据库中的数据,同时,该库还提供了许多抽象类和谓词,来帮助我们完成各种常见的任务。这个库是通过一组QL模块(即扩展名为.qll的文件)的形式来实现的。其中,模块javascript.qll的作用是导入这个库的其他模块。因此,在编写查询代码时,我们可以在其开头部分加入如下所示的语句来导入完整的库:

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

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