@@ -105,4 +105,67 @@ module StringBreak {
105105
106106 override Quote getQuote ( ) { result = quote }
107107 }
108+
109+ class StringsNewReplacerCall extends DataFlow:: CallNode {
110+ StringsNewReplacerCall ( ) { this .getTarget ( ) .hasQualifiedName ( "strings" , "NewReplacer" ) }
111+
112+ DataFlow:: Node getAReplacedArgument ( ) {
113+ exists ( int m , int n | m = 2 * n and n = m / 2 and result = getArgument ( m ) )
114+ }
115+ }
116+
117+ class StringsNewReplacerConfiguration extends DataFlow2:: Configuration {
118+ StringsNewReplacerConfiguration ( ) { this = "StringsNewReplacerConfiguration" }
119+
120+ override predicate isSource ( DataFlow:: Node source ) { source instanceof StringsNewReplacerCall }
121+
122+ override predicate isSink ( DataFlow:: Node sink ) {
123+ exists ( DataFlow:: MethodCallNode call |
124+ sink = call .getReceiver ( ) and
125+ call .getTarget ( ) .hasQualifiedName ( "strings" , "Replacer" , [ "Replace" , "WriteString" ] )
126+ )
127+ }
128+ }
129+
130+ /**
131+ * A call to `strings.Replacer.Replace`, considered as a sanitizer for unsafe
132+ * quoting.
133+ */
134+ class ReplacerReplaceSanitizer extends DataFlow:: MethodCallNode , Sanitizer {
135+ Quote quote ;
136+
137+ ReplacerReplaceSanitizer ( ) {
138+ exists ( StringsNewReplacerConfiguration config , DataFlow:: Node source , DataFlow:: Node sink |
139+ config .hasFlow ( source , sink ) and
140+ this .getTarget ( ) .hasQualifiedName ( "strings" , "Replacer" , "Replace" ) and
141+ sink = this .getReceiver ( ) and
142+ quote = source .( StringsNewReplacerCall ) .getAReplacedArgument ( ) .getStringValue ( )
143+ )
144+ }
145+
146+ override Quote getQuote ( ) { result = quote }
147+ }
148+
149+ /**
150+ * A call to `strings.Replacer.WriteString`, considered as a sanitizer for
151+ * unsafe quoting.
152+ */
153+ class ReplacerWriteStringSanitizer extends Sanitizer {
154+ Quote quote ;
155+
156+ ReplacerWriteStringSanitizer ( ) {
157+ exists (
158+ StringsNewReplacerConfiguration config , DataFlow:: Node source , DataFlow:: Node sink ,
159+ DataFlow:: MethodCallNode call
160+ |
161+ config .hasFlow ( source , sink ) and
162+ call .getTarget ( ) .hasQualifiedName ( "strings" , "Replacer" , "WriteString" ) and
163+ sink = call .getReceiver ( ) and
164+ this = call .getArgument ( 1 ) and
165+ quote = source .( StringsNewReplacerCall ) .getAReplacedArgument ( ) .getStringValue ( )
166+ )
167+ }
168+
169+ override Quote getQuote ( ) { result = quote }
170+ }
108171}
0 commit comments