@@ -15,7 +15,46 @@ import csharp
1515import semmle.code.csharp.security.dataflow.UnsafeDeserializationQuery
1616import DataFlow:: PathGraph
1717
18- from TaintTrackingConfig config , DataFlow:: PathNode source , DataFlow:: PathNode sink
19- where config .hasFlowPath ( source , sink )
20- select sink .getNode ( ) , source , sink , "$@ flows to unsafe deserializer." , source .getNode ( ) ,
21- "User-provided data"
18+ from DataFlow:: PathNode userInput , DataFlow:: PathNode deserializeCallArg
19+ where
20+ exists ( TaintToObjectMethodTrackingConfig taintTracking |
21+ // all flows from user input to deserialization with weak and strong type serializers
22+ taintTracking .hasFlowPath ( userInput , deserializeCallArg )
23+ ) and
24+ // intersect with strong types, but user controlled or weak types deserialization usages
25+ (
26+ exists (
27+ DataFlow:: Node weakTypeCreation , DataFlow:: Node weakTypeUsage ,
28+ WeakTypeCreationToUsageTrackingConfig weakTypeDeserializerTracking , MethodCall mc
29+ |
30+ weakTypeDeserializerTracking .hasFlow ( weakTypeCreation , weakTypeUsage ) and
31+ mc .getQualifier ( ) = weakTypeUsage .asExpr ( ) and
32+ mc .getAnArgument ( ) = deserializeCallArg .getNode ( ) .asExpr ( )
33+ )
34+ or
35+ exists (
36+ TaintToObjectTypeTrackingConfig userControlledTypeTracking , DataFlow:: Node taintedTypeUsage ,
37+ DataFlow:: Node userInput2 , MethodCall mc
38+ |
39+ userControlledTypeTracking .hasFlow ( userInput2 , taintedTypeUsage ) and
40+ mc .getQualifier ( ) = taintedTypeUsage .asExpr ( ) and
41+ mc .getAnArgument ( ) = deserializeCallArg .getNode ( ) .asExpr ( )
42+ )
43+ )
44+ or
45+ // no type check needed - straightforward taint -> sink
46+ exists ( TaintToConstructorOrStaticMethodTrackingConfig taintTracking2 |
47+ taintTracking2 .hasFlowPath ( userInput , deserializeCallArg )
48+ )
49+ or
50+ // JsonConvert static method call, but with additional unsafe typename tracking
51+ exists (
52+ JsonConvertTrackingConfig taintTrackingJsonConvert , TypeNameTrackingConfig typenameTracking ,
53+ DataFlow:: Node settingsCallArg
54+ |
55+ taintTrackingJsonConvert .hasFlowPath ( userInput , deserializeCallArg ) and
56+ typenameTracking .hasFlow ( _, settingsCallArg ) and
57+ deserializeCallArg .getNode ( ) .asExpr ( ) .getParent ( ) = settingsCallArg .asExpr ( ) .getParent ( )
58+ )
59+ select deserializeCallArg , userInput , deserializeCallArg , "$@ flows to unsafe deserializer." ,
60+ userInput , "User-provided data"
0 commit comments