如何在codeql for javascript中吸引变量的传递使用

问题描述

这是一个例子:

var express = require('express');
var http = require('http');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json({ type: 'application/json',limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb',extended: true,parameterLimit:50000}));
var server = http.createServer(app);

我想提取从 require('express')app.use 的路径,我该如何设计 codeql 查询,DataFlow::Node.getASuccessor() 函数似乎无法从 {{1} 检索数据流}} 到 express(),以及之后 app 的用法。

这是我的尝试,我只得到了 app 的路径。

app

结果如下:

import javascript

predicate isImportAssign(DataFlow::Node n,DataFlow::ModuleImportNode m){
    exists(Variable a| a.getADefinition().getSource() = m.asExpr() and  n.asExpr() = a.getADefinition().getTarget())
    
    
}

predicate isTarget(DataFlow::ModuleImportNode a,DataFlow::Node b){
    (b.(DataFlow::PropRef).getBase() = a.getASuccessor*()
    or 
    b = a.getASuccessor*())
    and 
    a != b
}


predicate isAssignedByCall(DataFlow::Node m,DataFlow::Node n){
    exists(Assignment a | a.getLhs() = n.asExpr() and a.getRhs() = m.getEnclosingExpr().getParentExpr())
    or
    exists(DeclStmt v |  v.getAChild().getChild(0).(Expr) = n.asExpr() and v.getAChild().getChild(1).(Expr) = m.getEnclosingExpr().getParentExpr())
}

predicate hasDataFlow(DataFlow::Node source,DataFlow::Node sink){
    exists(TaintTracking::Configuration cfg | cfg.hasFlow(DataFlow::valueNode(source.getEnclosingExpr().getParentExpr()),sink))
}


predicate transitive(DataFlow::Node a,DataFlow::Node b){
    isAssignedByCall(a,b) or hasDataFlow(a,b) or exists(DataFlow::Node c | transitive(a,c) and transitive(c,b))
}

from DataFlow::ModuleImportNode a,DataFlow::Node b,DataFlow::Node c,DataFlow::Node d
where isTarget(a,b) 
and transitive(b,c)
select a,b,c

任何人都可以帮助改进此查询以在这种情况下也检索 # a b c 1 require('express') express app

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...