@@ -8,6 +8,10 @@ private import codeql.ruby.DataFlow
8
8
private import codeql.ruby.dataflow.RemoteFlowSources
9
9
private import codeql.ruby.ApiGraphs
10
10
11
+ /**
12
+ * Provides default sources, sinks and sanitizers for reasoning about
13
+ * format injections, as well as extension points for adding your own.
14
+ */
11
15
module TaintedFormatString {
12
16
/**
13
17
* A data flow source for format injections.
@@ -47,11 +51,20 @@ module TaintedFormatString {
47
51
*/
48
52
abstract class PrintfCall extends DataFlow:: CallNode {
49
53
// We assume that most printf-like calls have the signature f(format_string, args...)
54
+ /**
55
+ * Gets the format string of this call.
56
+ */
50
57
DataFlow:: Node getFormatString ( ) { result = this .getArgument ( 0 ) }
51
58
52
- DataFlow:: Node getFormatArgument ( int n ) { n > 0 and result = this .getArgument ( n ) }
59
+ /**
60
+ * Gets then `n`th formatted argument of this call.
61
+ */
62
+ DataFlow:: Node getFormatArgument ( int n ) { result = this .getArgument ( n + 1 ) }
53
63
}
54
64
65
+ /**
66
+ * A call to `Kernel.printf`.
67
+ */
55
68
class KernelPrintfCall extends PrintfCall {
56
69
KernelPrintfCall ( ) {
57
70
this = API:: getTopLevelMember ( "Kernel" ) .getAMethodCall ( "printf" )
@@ -66,6 +79,9 @@ module TaintedFormatString {
66
79
override DataFlow:: Node getFormatString ( ) { result = this .getArgument ( [ 0 , 1 ] ) }
67
80
}
68
81
82
+ /**
83
+ * A call to `Kernel.sprintf`.
84
+ */
69
85
class KernelSprintfCall extends PrintfCall {
70
86
KernelSprintfCall ( ) {
71
87
this = API:: getTopLevelMember ( "Kernel" ) .getAMethodCall ( "sprintf" )
@@ -75,6 +91,9 @@ module TaintedFormatString {
75
91
}
76
92
}
77
93
94
+ /**
95
+ * A call to `IO#printf`.
96
+ */
78
97
class IOPrintfCall extends PrintfCall {
79
98
IOPrintfCall ( ) { this = API:: getTopLevelMember ( "IO" ) .getInstance ( ) .getAMethodCall ( "printf" ) }
80
99
}
0 commit comments