codeql下MethodCall详解

admin 2026-06-30 06:33:54 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文系统梳理了CodeQL中核心类methodcall的使用方法。它是表示方法调用行为的核心类,广泛应用于代码分析。文章详细介绍了其常用方法,如获取目标方法、参数、调用者、判断静态上下文等,并通过检测命令执行漏洞的实战案例展示了其具体应用,旨在帮助读者高效编写查询。 综合评分: 85 文章分类: 代码审计,web安全,技术标准,解决方案,安全工具


cover_image

codeql下MethodCall详解

原创

信安路漫漫 信安路漫漫

信安路漫漫

2026年6月11日 07:00 上海

在小说阅读器读本章

去阅读

在进行代码分析时,CodeQL 中最常用的类之一就是 MethodCall。本笔记将系统梳理 MethodCall 的核心概念、常用方法及实战案例,帮助你高效编写查询。

一、核心概念

l  MethodCall(及旧版的 MethodAccess)是表示方法调用行为的核心类,广泛应用于代码抽象语法树(AST)与调用图(Call Graph)分析。

l  MethodCall 代表代码中实际发生的某次“调用动作”(如 obj.doSomething(arg)),而 Method 表示方法的定义/实现。

示例:

// 方法定义public void someMethod() {    // 语句    ResultSet results = statement.executeQuery(query);}

l  statement.executeQuery(query); 就是一次具体的 MethodCall。

二、继承体系

l  MethodCall 是更通用的 Call 类的子类。

l  Call:包含所有类型的调用表达式。

l  MethodCall:专门针对普通方法调用,适合大多数 Java 代码分析场景。

三、常用方法与应用场景

1. 获取目标方法

l  getMethod() / getCallee()

n  作用:获取被调用的方法定义(Method 对象)。

n  区别

u  getMethod():返回 Method 类型,常用于后续调用如 hasName()、getDeclaringType()。

u  getCallee():返回 Callable 类型,语义为“被调用者”,通常等价于 getMethod()。

常见用法:判断是否调用了危险函数(如 Runtime.exec)

from MethodCall callwhere call.getMethod().hasName("exec")select call, "Found exec call"

2. 获取参数

l  getArgument(int n)

n  作用:获取第 n 个参数(从 0 开始),返回 Expr。

n  场景:污点分析、参数追踪。

示例:查找 executeQuery 的第一个参数

from MethodCall callwhere call.getMethod().hasName("executeQuery")select call.getArgument(0)

3. 获取调用者

l  getQualifier()

n  作用:获取调用该方法的对象表达式(点号 . 前的部分)。

n  场景:区分静态调用和实例调用,或定位特定对象的调用。

示例:查找变量调用形式

from MethodCall callwhere call.getQualifier() instanceof VariableAccessselect call

4. 定位调用语句

l  getEnclosingStmt()

n  作用:获取包含该调用的语句(Statement)。

n  场景:回溯调用所在的 if、循环、赋值等语句。

示例:查找日志方法调用语句

from MethodCall callwhere call.getMethod().hasName("log")select call.getEnclosingStmt()

5. 环境判断

l  isStaticContext() / isEnclosingMethodCall()

n  isStaticContext():判断是否在静态上下文(如静态方法或初始化块)中。

n  isEnclosingMethodCall():判断当前节点是否为方法调用(递归遍历 AST 时常用)。

示例代码:

String guid = (String) allParams.get("guid");

6. 参数内部分析

l  getAChildExpr()

n  作用:获取任意子表达式,便于分析参数内部是否包含敏感操作。

n  场景:分析嵌套调用,如 process(getSecretData())。

示例:查找嵌套敏感调用

from MethodCall outerCall, Expr childwhere    outerCall.getMethod().hasName("process") and    child = outerCall.getAChildExpr() and    child instanceof MethodCall and    child.(MethodCall).getMethod().hasName("getSecretData")select outerCall, "Found nested sensitive call"

7. 常量判断

l  isCompileTimeConstant()

n  作用:判断参数是否为编译期常量。

n  场景:污点分析时排除硬编码字符串,减少误报。

示例:排除硬编码 SQL 查询

from MethodCall callwhere    call.getMethod().hasName("executeQuery") and    not call.getArgument(0).isCompileTimeConstant()select call, "Potential SQL Injection with dynamic input"

四、综合实战案例

场景:检测命令执行漏洞模式 Runtime.getRuntime().exec(cmd)

查询示例:

import javafrom MethodCall execCallwhere    // 1. 方法名过滤    execCall.getMethod().hasName("exec") and    // 2. 确认调用者类型为 Runtime    execCall.getReceiverType().hasName("Runtime") and    // 3. 至少有一个参数    execCall.getNumArgument() >= 1select    execCall,    // 4. 输出调试信息    "Found potential command injection: " + execCall.toString(),    // 5. 提取第一个参数作为污点源    execCall.getArgument(0) as source

五、其它常用方法速查表

| | | | | | — | — | — | — | | 方法名 | 类别 | 说明 | 返回类型/说明 | | getMethod() | 核心 | 获取被调用方法定义 | Method  对象 | | getCallee() | 核心 | 获取被调用实体 | Callable  对象 | | getArgument(n) | 核心 | 获取第 n 个参数 | Expr  对象 | | getNumArgument() | 核心 | 获取参数总数 | int  整数 | | getQualifier() | 核心 | 获取调用者表达式 | Expr  对象 | | getReceiverType() | 类型分析 | 获取调用者声明类型 | Type  对象 | | getType() | 类型分析 | 获取返回值类型 | Type  对象 | | getEnclosingStmt() | 上下文 | 获取包含该调用的语句 | Stmt  对象 | | isInStaticContext() | 上下文 | 判断是否为静态上下文 | boolean | | isCompileTimeConstant() | 常量分析 | 判断是否为编译期常量 | boolean | | getAChildExpr() | AST 遍历 | 获取任意子表达式 | Expr  对象 | | getParent() | AST 遍历 | 获取父节点 | AstNode  对象 | | getLocation() | 定位 | 获取代码位置信息 | Location  对象 | | getFile() | 定位 | 获取所属文件 | File  对象 | | getCompilationUnit() | 结构 | 获取编译单元 | CompilationUnit  对象 | | toString() | 调试 | 转为字符串描述 | string | | hasLocationInfo() | 校验 | 检查是否有位置信息 | boolean | | getAPrimaryQlClass() | 高级 | 获取主类定义 | RefType |

欢迎补充交流,如有疑问欢迎留言讨论!


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:信安路漫漫 信安路漫漫 信安路漫漫《codeql下MethodCall详解》

codeql下MethodCall详解 网络安全文章

codeql下MethodCall详解

文章总结: 本文系统梳理了CodeQL中核心类methodcall的使用方法。它是表示方法调用行为的核心类,广泛应用于代码分析。文章详细介绍了其常用方法,如获取
评论:0   参与:  0