mirror of
https://github.com/github/codeql.git
synced 2026-05-01 03:35:13 +02:00
refactor miscellaneous expression uses to dataflow nodes
This commit is contained in:
committed by
erik-krogh
parent
6697dd1396
commit
5b61db9fd3
@@ -562,6 +562,14 @@ class ObjectLiteralNode extends DataFlow::ValueNode, DataFlow::SourceNode {
|
||||
DataFlow::FunctionNode getPropertySetter(string name) {
|
||||
result = astNode.getPropertyByName(name).(PropertySetter).getInit().flow()
|
||||
}
|
||||
|
||||
/** Gets the value of a computed property name of this object literal, such as `x` in `{[x]: 1}` */
|
||||
DataFlow::Node getAComputedPropertyName() {
|
||||
exists(Property prop | prop = astNode.getAProperty() |
|
||||
prop.isComputed() and
|
||||
result = prop.getNameExpr().flow()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -482,17 +482,13 @@ module TaintTracking {
|
||||
*/
|
||||
private class HeapTaintStep extends SharedTaintStep {
|
||||
override predicate heapStep(DataFlow::Node pred, DataFlow::Node succ) {
|
||||
exists(Expr e, Expr f | e = succ.asExpr() and f = pred.asExpr() |
|
||||
exists(Property prop | e.(ObjectExpr).getAProperty() = prop |
|
||||
prop.isComputed() and f = prop.getNameExpr()
|
||||
)
|
||||
or
|
||||
// spreading a tainted object into an object literal gives a tainted object
|
||||
e.(ObjectExpr).getAProperty().(SpreadProperty).getInit().(SpreadElement).getOperand() = f
|
||||
or
|
||||
// spreading a tainted value into an array literal gives a tainted array
|
||||
e.(ArrayExpr).getAnElement().(SpreadElement).getOperand() = f
|
||||
)
|
||||
succ.(DataFlow::ObjectLiteralNode).getAComputedPropertyName() = pred
|
||||
or
|
||||
// spreading a tainted object into an object literal gives a tainted object
|
||||
succ.(DataFlow::ObjectLiteralNode).getASpreadProperty() = pred
|
||||
or
|
||||
// spreading a tainted value into an array literal gives a tainted array
|
||||
succ.(DataFlow::ArrayCreationNode).getASpreadArgument() = pred
|
||||
or
|
||||
// arrays with tainted elements and objects with tainted property names are tainted
|
||||
succ.(DataFlow::ArrayCreationNode).getAnElement() = pred and
|
||||
|
||||
@@ -68,7 +68,7 @@ private class TrackStringsInAngularCode extends DataFlow::SourceNode::Range, Dat
|
||||
*/
|
||||
private DataFlow::CallNode angularModuleCall(string name) {
|
||||
result = angular().getAMemberCall("module") and
|
||||
result.getArgument(0).asExpr().mayHaveStringValue(name)
|
||||
result.getArgument(0).mayHaveStringValue(name)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -280,7 +280,7 @@ abstract class CustomDirective extends DirectiveInstance {
|
||||
InjectableFunction getController() { result = this.getMember("controller") }
|
||||
|
||||
/** Gets the template URL of this directive, if any. */
|
||||
string getTemplateUrl() { this.getMember("templateUrl").asExpr().mayHaveStringValue(result) }
|
||||
string getTemplateUrl() { this.getMember("templateUrl").mayHaveStringValue(result) }
|
||||
|
||||
/**
|
||||
* Gets a template file for this directive, if any.
|
||||
@@ -298,9 +298,7 @@ abstract class CustomDirective extends DirectiveInstance {
|
||||
else result = DirectiveInstance.super.getAScope()
|
||||
}
|
||||
|
||||
private string getRestrictionString() {
|
||||
this.getMember("restrict").asExpr().mayHaveStringValue(result)
|
||||
}
|
||||
private string getRestrictionString() { this.getMember("restrict").mayHaveStringValue(result) }
|
||||
|
||||
private predicate hasTargetType(DirectiveTargetType type) {
|
||||
not exists(this.getRestrictionString()) or
|
||||
@@ -383,10 +381,12 @@ class GeneralDirective extends CustomDirective, MkCustomDirective {
|
||||
override DataFlow::FunctionNode getALinkFunction() { result = this.getLinkFunction(_) }
|
||||
|
||||
override predicate bindsToController() {
|
||||
this.getMemberInit("bindToController").asExpr().mayHaveBooleanValue(true)
|
||||
this.getMemberInit("bindToController").mayHaveBooleanValue(true)
|
||||
}
|
||||
|
||||
override predicate hasIsolateScope() { this.getMember("scope").asExpr() instanceof ObjectExpr }
|
||||
override predicate hasIsolateScope() {
|
||||
this.getMember("scope") instanceof DataFlow::ObjectLiteralNode
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -930,9 +930,7 @@ class RouteSetup extends DataFlow::CallNode, DependencyInjection {
|
||||
|
|
||||
result = controllerProperty
|
||||
or
|
||||
exists(ControllerDefinition def |
|
||||
controllerProperty.asExpr().mayHaveStringValue(def.getName())
|
||||
|
|
||||
exists(ControllerDefinition def | controllerProperty.mayHaveStringValue(def.getName()) |
|
||||
result = def.getAService()
|
||||
)
|
||||
)
|
||||
@@ -1012,7 +1010,7 @@ private class RouteInstantiatedController extends Controller {
|
||||
|
||||
override predicate boundTo(DOM::ElementDefinition elem) {
|
||||
exists(string url, HTML::HtmlFile template |
|
||||
setup.getRouteParam("templateUrl").asExpr().mayHaveStringValue(url) and
|
||||
setup.getRouteParam("templateUrl").mayHaveStringValue(url) and
|
||||
template.getAbsolutePath().regexpMatch(".*\\Q" + url + "\\E") and
|
||||
elem.getFile() = template
|
||||
)
|
||||
@@ -1020,7 +1018,7 @@ private class RouteInstantiatedController extends Controller {
|
||||
|
||||
override predicate boundToAs(DOM::ElementDefinition elem, string name) {
|
||||
this.boundTo(elem) and
|
||||
setup.getRouteParam("controllerAs").asExpr().mayHaveStringValue(name)
|
||||
setup.getRouteParam("controllerAs").mayHaveStringValue(name)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -244,7 +244,7 @@ abstract class RecipeDefinition extends DataFlow::CallNode, CustomServiceDefinit
|
||||
this = moduleRef(_).getAMethodCall(methodName) or
|
||||
this = builtinServiceRef("$provide").getAMethodCall(methodName)
|
||||
) and
|
||||
getArgument(0).asExpr().mayHaveStringValue(name)
|
||||
getArgument(0).mayHaveStringValue(name)
|
||||
}
|
||||
|
||||
override string getName() { result = name }
|
||||
@@ -281,7 +281,7 @@ private predicate isCustomServiceDefinitionOnModule(
|
||||
DataFlow::Node factoryFunction
|
||||
) {
|
||||
mce = moduleRef(_).getAMethodCall(moduleMethodName) and
|
||||
mce.getArgument(0).asExpr().mayHaveStringValue(serviceName) and
|
||||
mce.getArgument(0).mayHaveStringValue(serviceName) and
|
||||
factoryFunction = mce.getArgument(1)
|
||||
}
|
||||
|
||||
@@ -296,7 +296,7 @@ private predicate isCustomServiceDefinitionOnProvider(
|
||||
factoryArgument = mce.getOptionArgument(0, serviceName)
|
||||
or
|
||||
mce.getNumArgument() = 2 and
|
||||
mce.getArgument(0).asExpr().mayHaveStringValue(serviceName) and
|
||||
mce.getArgument(0).mayHaveStringValue(serviceName) and
|
||||
factoryArgument = mce.getArgument(1)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -959,7 +959,7 @@ module Express {
|
||||
* Example: `fun` for `router1.use(fun)` or `router.use("/route", fun)`
|
||||
*/
|
||||
HTTP::RouteHandler getARouteHandler() {
|
||||
result.(DataFlow::SourceNode).flowsToExpr(this.getARouteSetup().getAnArgument().asExpr())
|
||||
result.(DataFlow::SourceNode).flowsTo(this.getARouteSetup().getAnArgument())
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -35,11 +35,10 @@ module NextJS {
|
||||
*/
|
||||
Module getAModuleWithFallbackPaths() {
|
||||
result = getAPagesModule() and
|
||||
exists(DataFlow::FunctionNode staticPaths, Expr fallback |
|
||||
exists(DataFlow::FunctionNode staticPaths, DataFlow::Node fallback |
|
||||
staticPaths = result.getAnExportedValue("getStaticPaths").getAFunctionValue() and
|
||||
fallback =
|
||||
staticPaths.getAReturn().getALocalSource().getAPropertyWrite("fallback").getRhs().asExpr() and
|
||||
not fallback.(BooleanLiteral).getValue() = "false"
|
||||
fallback = staticPaths.getAReturn().getALocalSource().getAPropertyWrite("fallback").getRhs() and
|
||||
not fallback.mayHaveBooleanValue(false)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -165,7 +165,7 @@ module ExternalApiUsedWithUntrustedData {
|
||||
not param = base.getReceiver()
|
||||
|
|
||||
result = param and
|
||||
name = param.asSource().asExpr().(Parameter).getName()
|
||||
name = param.asSource().(DataFlow::ParameterNode).getName()
|
||||
or
|
||||
param.asSource().asExpr() instanceof DestructuringPattern and
|
||||
result = param.getMember(name)
|
||||
|
||||
Reference in New Issue
Block a user