1+ /**
2+ * Provides classes and predicates used by the XSS queries.
3+ */
4+
15private import ruby
26private import codeql.ruby.DataFlow
37private import codeql.ruby.CFG
@@ -7,40 +11,34 @@ private import codeql.ruby.frameworks.ActionController
711private import codeql.ruby.frameworks.ActionView
812private import codeql.ruby.dataflow.RemoteFlowSources
913private import codeql.ruby.dataflow.BarrierGuards
10- import codeql.ruby.dataflow.internal.DataFlowDispatch
11- private import codeql.ruby.typetracking.TypeTracker
14+ private import codeql.ruby.dataflow.internal.DataFlowDispatch
1215
1316/**
1417 * Provides default sources, sinks and sanitizers for detecting
15- * "reflected server-side cross-site scripting"
16- * vulnerabilities, as well as extension points for adding your own.
18+ * "server-side cross-site scripting" vulnerabilities, as well as
19+ * extension points for adding your own.
1720 */
18- module ReflectedXSS {
21+ private module Shared {
1922 /**
20- * A data flow source for "reflected server-side cross-site scripting" vulnerabilities.
23+ * A data flow source for "server-side cross-site scripting" vulnerabilities.
2124 */
2225 abstract class Source extends DataFlow:: Node { }
2326
2427 /**
25- * A data flow sink for "reflected server-side cross-site scripting" vulnerabilities.
28+ * A data flow sink for "server-side cross-site scripting" vulnerabilities.
2629 */
2730 abstract class Sink extends DataFlow:: Node { }
2831
2932 /**
30- * A sanitizer for "reflected server-side cross-site scripting" vulnerabilities.
33+ * A sanitizer for "server-side cross-site scripting" vulnerabilities.
3134 */
3235 abstract class Sanitizer extends DataFlow:: Node { }
3336
3437 /**
35- * A sanitizer guard for "reflected server-side cross-site scripting" vulnerabilities.
38+ * A sanitizer guard for "server-side cross-site scripting" vulnerabilities.
3639 */
3740 abstract class SanitizerGuard extends DataFlow:: BarrierGuard { }
3841
39- /**
40- * A source of remote user input, considered as a flow source.
41- */
42- class RemoteFlowSourceAsSource extends Source , RemoteFlowSource { }
43-
4442 private class ErbOutputMethodCallArgumentNode extends DataFlow:: Node {
4543 private MethodCall call ;
4644
@@ -198,3 +196,83 @@ module ReflectedXSS {
198196 )
199197 }
200198}
199+
200+ /**
201+ * Provides default sources, sinks and sanitizers for detecting
202+ * "reflected cross-site scripting" vulnerabilities, as well as
203+ * extension points for adding your own.
204+ */
205+ module ReflectedXSS {
206+ /** A data flow source for stored XSS vulnerabilities. */
207+ abstract class Source extends Shared:: Source { }
208+
209+ /** A data flow sink for stored XSS vulnerabilities. */
210+ abstract class Sink extends Shared:: Sink { }
211+
212+ /** A sanitizer for stored XSS vulnerabilities. */
213+ abstract class Sanitizer extends Shared:: Sanitizer { }
214+
215+ /** A sanitizer guard for stored XSS vulnerabilities. */
216+ abstract class SanitizerGuard extends Shared:: SanitizerGuard { }
217+
218+ // Consider all arbitrary XSS sinks to be reflected XSS sinks
219+ private class AnySink extends Sink instanceof Shared:: Sink { }
220+
221+ // Consider all arbitrary XSS sanitizers to be reflected XSS sanitizers
222+ private class AnySanitizer extends Sanitizer instanceof Shared:: Sanitizer { }
223+
224+ // Consider all arbitrary XSS sanitizer guards to be reflected XSS sanitizer guards
225+ private class AnySanitizerGuard extends SanitizerGuard instanceof Shared:: SanitizerGuard {
226+ override predicate checks ( CfgNode expr , boolean branch ) {
227+ Shared:: SanitizerGuard .super .checks ( expr , branch )
228+ }
229+ }
230+
231+ // Consider all arbitrary XSS taint steps to be reflected XSS taint steps
232+ predicate isAdditionalXSSTaintStep = Shared:: isAdditionalXSSTaintStep / 2 ;
233+
234+ /**
235+ * A source of remote user input, considered as a flow source.
236+ */
237+ class RemoteFlowSourceAsSource extends Source , RemoteFlowSource { }
238+ }
239+
240+ /**
241+ * Provides default sources, sinks and sanitizers for detecting
242+ * "stored server-side cross-site scripting" vulnerabilities, as well as
243+ * extension points for adding your own.
244+ */
245+ module StoredXSS {
246+ /** A data flow source for stored XSS vulnerabilities. */
247+ abstract class Source extends Shared:: Source { }
248+
249+ /** A data flow sink for stored XSS vulnerabilities. */
250+ abstract class Sink extends Shared:: Sink { }
251+
252+ /** A sanitizer for stored XSS vulnerabilities. */
253+ abstract class Sanitizer extends Shared:: Sanitizer { }
254+
255+ /** A sanitizer guard for stored XSS vulnerabilities. */
256+ abstract class SanitizerGuard extends Shared:: SanitizerGuard { }
257+
258+ // Consider all arbitrary XSS sinks to be stored XSS sinks
259+ private class AnySink extends Sink instanceof Shared:: Sink { }
260+
261+ // Consider all arbitrary XSS sanitizers to be stored XSS sanitizers
262+ private class AnySanitizer extends Sanitizer instanceof Shared:: Sanitizer { }
263+
264+ // Consider all arbitrary XSS sanitizer guards to be stored XSS sanitizer guards
265+ private class AnySanitizerGuard extends SanitizerGuard instanceof Shared:: SanitizerGuard {
266+ override predicate checks ( CfgNode expr , boolean branch ) {
267+ Shared:: SanitizerGuard .super .checks ( expr , branch )
268+ }
269+ }
270+
271+ // Consider all arbitrary XSS taint steps to be stored XSS taint steps
272+ predicate isAdditionalXSSTaintStep = Shared:: isAdditionalXSSTaintStep / 2 ;
273+
274+ /** A file read, considered as a flow source for stored XSS. */
275+ class FileSystemReadAccessAsSource extends Source instanceof FileSystemReadAccess { }
276+ // TODO: Consider `FileNameSource` flowing to script tag `src` attributes and similar
277+ // TODO: ORM database reads as sources
278+ }
0 commit comments