Skip to content

Commit 5944b88

Browse files
committed
C#: Re-factor the SafeConstructor classes to use the new API.
1 parent 0e17fa7 commit 5944b88

File tree

1 file changed

+48
-54
lines changed

1 file changed

+48
-54
lines changed

csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll

Lines changed: 48 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,15 @@ abstract class Sink extends DataFlow::Node { }
2323
*/
2424
abstract private class InstanceMethodSink extends Sink {
2525
InstanceMethodSink() {
26-
not exists(
27-
SafeConstructorTrackingConfig safeConstructorTracking, DataFlow::Node safeTypeUsage,
28-
MethodCall mc
29-
|
30-
safeConstructorTracking.hasFlow(_, safeTypeUsage) and
26+
not exists(DataFlow::Node safeTypeUsage, MethodCall mc |
27+
(
28+
DataContractJsonSafeConstructorTracking::flowTo(safeTypeUsage) or
29+
JavaScriptSerializerSafeConstructorTracking::flowTo(safeTypeUsage) or
30+
XmlObjectSerializerDerivedConstructorTracking::flowTo(safeTypeUsage) or
31+
XmlSerializerSafeConstructorTracking::flowTo(safeTypeUsage) or
32+
DataContractSerializerSafeConstructorTracking::flowTo(safeTypeUsage) or
33+
XmlMessageFormatterSafeConstructorTracking::flowTo(safeTypeUsage)
34+
) and
3135
mc.getQualifier() = safeTypeUsage.asExpr() and
3236
mc.getAnArgument() = this.asExpr()
3337
)
@@ -378,9 +382,11 @@ module WeakTypeCreationToUsageTracking =
378382
TaintTracking::Global<WeakTypeCreationToUsageTrackingConfig>;
379383

380384
/**
385+
* DEPRECATED: Do not extend this class.
386+
*
381387
* Safe deserializer creation to usage tracking config.
382388
*/
383-
abstract class SafeConstructorTrackingConfig extends TaintTracking2::Configuration {
389+
abstract deprecated class SafeConstructorTrackingConfig extends TaintTracking2::Configuration {
384390
bindingset[this]
385391
SafeConstructorTrackingConfig() { any() }
386392
}
@@ -490,13 +496,8 @@ private class DataContractJsonSerializerDeserializeMethodSink extends DataContra
490496
}
491497
}
492498

493-
private class DataContractJsonSafeConstructorTrackingConfiguration extends SafeConstructorTrackingConfig
494-
{
495-
DataContractJsonSafeConstructorTrackingConfiguration() {
496-
this = "DataContractJsonSafeConstructorTrackingConfiguration"
497-
}
498-
499-
override predicate isSource(DataFlow::Node source) {
499+
private module DataContractJsonSafeConstructorTrackingConfig implements DataFlow::ConfigSig {
500+
predicate isSource(DataFlow::Node source) {
500501
exists(ObjectCreation oc |
501502
oc = source.asExpr() and
502503
exists(Constructor c |
@@ -508,14 +509,17 @@ private class DataContractJsonSafeConstructorTrackingConfiguration extends SafeC
508509
)
509510
}
510511

511-
override predicate isSink(DataFlow::Node sink) {
512+
predicate isSink(DataFlow::Node sink) {
512513
exists(MethodCall mc |
513514
isDataContractJsonSerializerCall(mc, _) and
514515
mc.getQualifier() = sink.asExpr()
515516
)
516517
}
517518
}
518519

520+
private module DataContractJsonSafeConstructorTracking =
521+
TaintTracking::Global<DataContractJsonSafeConstructorTrackingConfig>;
522+
519523
/** JavaScriptSerializer */
520524
private predicate isJavaScriptSerializerCall(MethodCall mc, Method m) {
521525
m = mc.getTarget() and
@@ -540,13 +544,8 @@ private class JavaScriptSerializerDeserializeMethodSink extends JavaScriptSerial
540544
}
541545
}
542546

543-
private class JavaScriptSerializerSafeConstructorTrackingConfiguration extends SafeConstructorTrackingConfig
544-
{
545-
JavaScriptSerializerSafeConstructorTrackingConfiguration() {
546-
this = "JavaScriptSerializerSafeConstructorTrackingConfiguration"
547-
}
548-
549-
override predicate isSource(DataFlow::Node source) {
547+
private module JavaScriptSerializerSafeConstructorTrackingConfig implements DataFlow::ConfigSig {
548+
predicate isSource(DataFlow::Node source) {
550549
exists(ObjectCreation oc |
551550
oc = source.asExpr() and
552551
exists(Constructor c |
@@ -557,14 +556,17 @@ private class JavaScriptSerializerSafeConstructorTrackingConfiguration extends S
557556
)
558557
}
559558

560-
override predicate isSink(DataFlow::Node sink) {
559+
predicate isSink(DataFlow::Node sink) {
561560
exists(MethodCall mc |
562561
isJavaScriptSerializerCall(mc, _) and
563562
mc.getQualifier() = sink.asExpr()
564563
)
565564
}
566565
}
567566

567+
private module JavaScriptSerializerSafeConstructorTracking =
568+
TaintTracking::Global<JavaScriptSerializerSafeConstructorTrackingConfig>;
569+
568570
/** XmlObjectSerializer */
569571
private predicate isXmlObjectSerializerCall(MethodCall mc, Method m) {
570572
m = mc.getTarget() and
@@ -584,13 +586,8 @@ private class XmlObjectSerializerDeserializeMethodSink extends XmlObjectSerializ
584586
}
585587
}
586588

587-
private class XmlObjectSerializerDerivedConstructorTrackingConfiguration extends SafeConstructorTrackingConfig
588-
{
589-
XmlObjectSerializerDerivedConstructorTrackingConfiguration() {
590-
this = "XmlObjectSerializerDerivedConstructorTrackingConfiguration"
591-
}
592-
593-
override predicate isSource(DataFlow::Node source) {
589+
private module XmlObjectSerializerDerivedConstructorTrackingConfig implements DataFlow::ConfigSig {
590+
predicate isSource(DataFlow::Node source) {
594591
exists(ObjectCreation oc |
595592
oc = source.asExpr() and
596593
exists(ValueOrRefType declaringType |
@@ -604,14 +601,17 @@ private class XmlObjectSerializerDerivedConstructorTrackingConfiguration extends
604601
)
605602
}
606603

607-
override predicate isSink(DataFlow::Node sink) {
604+
predicate isSink(DataFlow::Node sink) {
608605
exists(MethodCall mc |
609606
isXmlObjectSerializerCall(mc, _) and
610607
mc.getQualifier() = sink.asExpr()
611608
)
612609
}
613610
}
614611

612+
private module XmlObjectSerializerDerivedConstructorTracking =
613+
TaintTracking::Global<XmlObjectSerializerDerivedConstructorTrackingConfig>;
614+
615615
/** XmlSerializer */
616616
private predicate isXmlSerializerCall(MethodCall mc, Method m) {
617617
m = mc.getTarget() and
@@ -630,13 +630,8 @@ private class XmlSerializerDeserializeMethodSink extends XmlSerializerSink {
630630
}
631631
}
632632

633-
private class XmlSerializerSafeConstructorTrackingConfiguration extends SafeConstructorTrackingConfig
634-
{
635-
XmlSerializerSafeConstructorTrackingConfiguration() {
636-
this = "XmlSerializerSafeConstructorTrackingConfiguration"
637-
}
638-
639-
override predicate isSource(DataFlow::Node source) {
633+
private module XmlSerializerSafeConstructorTrackingConfig implements DataFlow::ConfigSig {
634+
predicate isSource(DataFlow::Node source) {
640635
exists(ObjectCreation oc |
641636
oc = source.asExpr() and
642637
exists(Constructor c |
@@ -648,14 +643,17 @@ private class XmlSerializerSafeConstructorTrackingConfiguration extends SafeCons
648643
)
649644
}
650645

651-
override predicate isSink(DataFlow::Node sink) {
646+
predicate isSink(DataFlow::Node sink) {
652647
exists(MethodCall mc |
653648
isXmlSerializerCall(mc, _) and
654649
mc.getQualifier() = sink.asExpr()
655650
)
656651
}
657652
}
658653

654+
private module XmlSerializerSafeConstructorTracking =
655+
TaintTracking::Global<XmlSerializerSafeConstructorTrackingConfig>;
656+
659657
/** DataContractSerializer */
660658
private predicate isDataContractSerializerCall(MethodCall mc, Method m) {
661659
m = mc.getTarget() and
@@ -678,13 +676,8 @@ private class DataContractSerializerDeserializeMethodSink extends DataContractSe
678676
}
679677
}
680678

681-
private class DataContractSerializerSafeConstructorTrackingConfiguration extends SafeConstructorTrackingConfig
682-
{
683-
DataContractSerializerSafeConstructorTrackingConfiguration() {
684-
this = "DataContractSerializerSafeConstructorTrackingConfiguration"
685-
}
686-
687-
override predicate isSource(DataFlow::Node source) {
679+
private module DataContractSerializerSafeConstructorTrackingConfig implements DataFlow::ConfigSig {
680+
predicate isSource(DataFlow::Node source) {
688681
exists(ObjectCreation oc |
689682
oc = source.asExpr() and
690683
exists(Constructor c |
@@ -696,14 +689,17 @@ private class DataContractSerializerSafeConstructorTrackingConfiguration extends
696689
)
697690
}
698691

699-
override predicate isSink(DataFlow::Node sink) {
692+
predicate isSink(DataFlow::Node sink) {
700693
exists(MethodCall mc |
701694
isDataContractSerializerCall(mc, _) and
702695
mc.getQualifier() = sink.asExpr()
703696
)
704697
}
705698
}
706699

700+
private module DataContractSerializerSafeConstructorTracking =
701+
TaintTracking::Global<DataContractSerializerSafeConstructorTrackingConfig>;
702+
707703
/** XmlMessageFormatter */
708704
private predicate isXmlMessageFormatterCall(MethodCall mc, Method m) {
709705
m = mc.getTarget() and
@@ -722,13 +718,8 @@ private class XmlMessageFormatterDeserializeMethodSink extends XmlMessageFormatt
722718
}
723719
}
724720

725-
private class XmlMessageFormatterSafeConstructorTrackingConfiguration extends SafeConstructorTrackingConfig
726-
{
727-
XmlMessageFormatterSafeConstructorTrackingConfiguration() {
728-
this = "XmlMessageFormatterSafeConstructorTrackingConfiguration"
729-
}
730-
731-
override predicate isSource(DataFlow::Node source) {
721+
private module XmlMessageFormatterSafeConstructorTrackingConfig implements DataFlow::ConfigSig {
722+
predicate isSource(DataFlow::Node source) {
732723
exists(ObjectCreation oc |
733724
oc = source.asExpr() and
734725
exists(Constructor c |
@@ -740,14 +731,17 @@ private class XmlMessageFormatterSafeConstructorTrackingConfiguration extends Sa
740731
)
741732
}
742733

743-
override predicate isSink(DataFlow::Node sink) {
734+
predicate isSink(DataFlow::Node sink) {
744735
exists(MethodCall mc |
745736
isXmlMessageFormatterCall(mc, _) and
746737
mc.getQualifier() = sink.asExpr()
747738
)
748739
}
749740
}
750741

742+
private module XmlMessageFormatterSafeConstructorTracking =
743+
TaintTracking::Global<XmlMessageFormatterSafeConstructorTrackingConfig>;
744+
751745
/** LosFormatter */
752746
private predicate isLosFormatterCall(MethodCall mc, Method m) {
753747
m = mc.getTarget() and

0 commit comments

Comments
 (0)