@@ -87,22 +87,26 @@ module TaintTracking {
8787 */
8888 predicate isSanitizerGuard ( SanitizerGuardNode guard ) { none ( ) }
8989
90- final override predicate isBarrier ( DataFlow:: Node node ) {
91- super .isBarrier ( node ) or
92- isSanitizer ( node ) or
93- node instanceof DataFlow :: VarAccessBarrier
90+ override predicate isLabeledBarrier ( DataFlow:: Node node , DataFlow :: FlowLabel lbl ) {
91+ super .isLabeledBarrier ( node , lbl )
92+ or
93+ isSanitizer ( node ) and lbl . isTaint ( )
9494 }
9595
96- final override predicate isBarrierEdge ( DataFlow:: Node source , DataFlow:: Node sink ) {
97- super .isBarrierEdge ( source , sink ) or
98- isSanitizerEdge ( source , sink )
96+ override predicate isBarrier ( DataFlow:: Node node ) {
97+ super .isBarrier ( node ) or
98+
99+ // For variable accesses we block both the data and taint label, as a falsy value
100+ // can't be an object, and thus can't have any tainted properties.
101+ node instanceof DataFlow:: VarAccessBarrier
99102 }
100103
101104 final override predicate isBarrierEdge (
102105 DataFlow:: Node source , DataFlow:: Node sink , DataFlow:: FlowLabel lbl
103106 ) {
104107 super .isBarrierEdge ( source , sink , lbl ) or
105- isSanitizerEdge ( source , sink , lbl )
108+ isSanitizerEdge ( source , sink , lbl ) or
109+ isSanitizerEdge ( source , sink ) and lbl .isTaint ( )
106110 }
107111
108112 final override predicate isBarrierGuard ( DataFlow:: BarrierGuardNode guard ) {
@@ -157,7 +161,7 @@ module TaintTracking {
157161 * them.
158162 */
159163 abstract class SanitizerGuardNode extends DataFlow:: BarrierGuardNode {
160- override predicate blocks ( boolean outcome , Expr e ) { sanitizes ( outcome , e ) }
164+ override predicate blocks ( boolean outcome , Expr e ) { none ( ) }
161165
162166 /**
163167 * Holds if this node sanitizes expression `e`, provided it evaluates
@@ -166,6 +170,8 @@ module TaintTracking {
166170 abstract predicate sanitizes ( boolean outcome , Expr e ) ;
167171
168172 override predicate blocks ( boolean outcome , Expr e , DataFlow:: FlowLabel label ) {
173+ sanitizes ( outcome , e ) and label .isTaint ( )
174+ or
169175 sanitizes ( outcome , e , label )
170176 }
171177
0 commit comments