Skip to content

Commit ad8647f

Browse files
authored
Merge pull request github#3547 from pwntester/issue_3139
add support for java.io.StringWriter
2 parents 7c0b8f5 + be86228 commit ad8647f

File tree

1 file changed

+24
-4
lines changed

1 file changed

+24
-4
lines changed

java/ql/src/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,11 @@ private predicate taintPreservingQualifierToMethod(Method m) {
322322
)
323323
or
324324
m.getDeclaringType().getQualifiedName().matches("%StringWriter") and
325-
m.getName() = "toString"
325+
(
326+
m.getName() = "getBuffer"
327+
or
328+
m.getName() = "toString"
329+
)
326330
or
327331
m.getDeclaringType().hasQualifiedName("java.util", "StringTokenizer") and
328332
m.getName().matches("next%")
@@ -335,7 +339,8 @@ private predicate taintPreservingQualifierToMethod(Method m) {
335339
or
336340
(
337341
m.getDeclaringType().hasQualifiedName("java.lang", "StringBuilder") or
338-
m.getDeclaringType().hasQualifiedName("java.lang", "StringBuffer")
342+
m.getDeclaringType().hasQualifiedName("java.lang", "StringBuffer") or
343+
m.getDeclaringType().hasQualifiedName("java.io", "StringWriter")
339344
) and
340345
(m.getName() = "toString" or m.getName() = "append")
341346
or
@@ -506,6 +511,10 @@ private predicate taintPreservingArgumentToMethod(Method method, int arg) {
506511
method instanceof JacksonWriteValueMethod and
507512
method.getNumberOfParameters() = 1 and
508513
arg = 0
514+
or
515+
method.getDeclaringType().hasQualifiedName("java.io", "StringWriter") and
516+
method.hasName("append") and
517+
arg = 0
509518
}
510519

511520
/**
@@ -580,9 +589,20 @@ private predicate argToQualifierStep(Expr tracked, Expr sink) {
580589
private predicate taintPreservingArgumentToQualifier(Method method, int arg) {
581590
exists(Method write |
582591
method.overrides*(write) and
583-
write.getDeclaringType().hasQualifiedName("java.io", "OutputStream") and
584592
write.hasName("write") and
585-
arg = 0
593+
arg = 0 and
594+
(
595+
write.getDeclaringType().hasQualifiedName("java.io", "OutputStream")
596+
or
597+
write.getDeclaringType().hasQualifiedName("java.io", "StringWriter")
598+
)
599+
)
600+
or
601+
exists(Method append |
602+
method.overrides*(append) and
603+
append.hasName("append") and
604+
arg = 0 and
605+
append.getDeclaringType().hasQualifiedName("java.io", "StringWriter")
586606
)
587607
}
588608

0 commit comments

Comments
 (0)