Skip to content

Commit 1459d91

Browse files
committed
JS: Adjust alert message for template sinks
1 parent 8412a6b commit 1459d91

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

javascript/ql/src/Security/CWE-094/CodeInjection.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@ import DataFlow::PathGraph
1818

1919
from Configuration cfg, DataFlow::PathNode source, DataFlow::PathNode sink
2020
where cfg.hasFlowPath(source, sink)
21-
select sink.getNode(), source, sink, "$@ flows to here and is interpreted as code.",
21+
select sink.getNode(), source, sink, "$@ flows to " + sink.getNode().(Sink).getMessageSuffix() + ".",
2222
source.getNode(), "User-provided value"

javascript/ql/src/semmle/javascript/security/dataflow/CodeInjectionCustomizations.qll

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@ module CodeInjection {
1515
/**
1616
* A data flow sink for code injection vulnerabilities.
1717
*/
18-
abstract class Sink extends DataFlow::Node { }
18+
abstract class Sink extends DataFlow::Node {
19+
/**
20+
* Gets the substitute for `X` in the message `User-provided value flows to X`.
21+
*/
22+
string getMessageSuffix() { result = "here and is interpreted as code" }
23+
}
1924

2025
/**
2126
* A sanitizer for code injection vulnerabilities.
@@ -139,10 +144,15 @@ module CodeInjection {
139144
}
140145
}
141146

147+
/** A sink for code injection via template injection. */
148+
private abstract class TemplateSink extends Sink {
149+
override string getMessageSuffix() { result = "here and is interpreted as a template, which may contain code" }
150+
}
151+
142152
/**
143153
* A value interpreted as as template by the `pug` library.
144154
*/
145-
class PugTemplateSink extends Sink {
155+
class PugTemplateSink extends TemplateSink {
146156
PugTemplateSink() {
147157
this = DataFlow::moduleImport(["pug", "jade"]).getAMemberCall(["compile", "render"]).getArgument(0)
148158
}
@@ -151,7 +161,7 @@ module CodeInjection {
151161
/**
152162
* A value interpreted as a tempalte by the `dot` library.
153163
*/
154-
class DotTemplateSink extends Sink {
164+
class DotTemplateSink extends TemplateSink {
155165
DotTemplateSink() {
156166
this = DataFlow::moduleImport("dot").getAMemberCall("template").getArgument(0)
157167
}
@@ -160,15 +170,15 @@ module CodeInjection {
160170
/**
161171
* A value interpreted as a template by the `ejs` library.
162172
*/
163-
class EjsTemplateSink extends Sink {
173+
class EjsTemplateSink extends TemplateSink {
164174
EjsTemplateSink() { this = DataFlow::moduleImport("ejs").getAMemberCall("render").getArgument(0) }
165175
}
166176

167177

168178
/**
169179
* A value interpreted as a template by the `nunjucks` library.
170180
*/
171-
class NunjucksTemplateSink extends Sink {
181+
class NunjucksTemplateSink extends TemplateSink {
172182
NunjucksTemplateSink() {
173183
this = DataFlow::moduleImport("nunjucks").getAMemberCall("renderString").getArgument(0)
174184
}
@@ -177,7 +187,7 @@ module CodeInjection {
177187
/**
178188
* A value interpreted as a template by `lodash` or `underscore`.
179189
*/
180-
class LodashUnderscoreTemplateSink extends Sink {
190+
class LodashUnderscoreTemplateSink extends TemplateSink {
181191
LodashUnderscoreTemplateSink() { this = LodashUnderscore::member("template").getACall().getArgument(0) }
182192
}
183193
}

0 commit comments

Comments
 (0)