@@ -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