Skip to content

Commit bbe93f4

Browse files
committed
Python: Only comparison with constant will clear taint
tainted = SOURCE if tainted == tainted: SINK(tainted) # unsafe before, in the body of the if statement, `tainted` was not tainted
1 parent 1498145 commit bbe93f4

File tree

4 files changed

+17
-1
lines changed

4 files changed

+17
-1
lines changed

python/ql/src/semmle/python/dataflow/Implementation.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,10 @@ private predicate testEvaluatesMaybe(ControlFlowNode test, ControlFlowNode use)
806806
any(PyEdgeRefinement ref).getTest().getAChild*() = test and
807807
test.getAChild*() = use and
808808
not test.(UnaryExprNode).getNode().getOp() instanceof Not and
809-
not Filters::equality_test(test, use, _, _) and
809+
not exists(ControlFlowNode const |
810+
Filters::equality_test(test, use, _, const) and
811+
const.getNode() instanceof ImmutableLiteral
812+
) and
810813
not Filters::isinstance(test, _, use) and
811814
not test = use
812815
or

python/ql/test/library-tests/taint/general/TestSink.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,5 @@
3939
| simple.test | test.py:195 | 199 | t | simple.test |
4040
| simple.test | test.py:208 | 214 | x | simple.test |
4141
| simple.test | test.py:217 | 220 | tainted | simple.test |
42+
| simple.test | test.py:229 | 231 | tainted | simple.test |
43+
| simple.test | test.py:229 | 233 | tainted | simple.test |

python/ql/test/library-tests/taint/general/TestStep.expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,3 +203,6 @@
203203
| simple.test | test.py:217 | SOURCE | | --> | simple.test | test.py:220 | tainted | |
204204
| simple.test | test.py:223 | SOURCE | | --> | simple.test | test.py:224 | tainted | |
205205
| simple.test | test.py:229 | SOURCE | | --> | simple.test | test.py:230 | tainted | |
206+
| simple.test | test.py:229 | SOURCE | | --> | simple.test | test.py:231 | tainted | |
207+
| simple.test | test.py:229 | SOURCE | | --> | simple.test | test.py:232 | tainted | |
208+
| simple.test | test.py:229 | SOURCE | | --> | simple.test | test.py:233 | tainted | |

python/ql/test/library-tests/taint/general/TestVar.expected

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,4 +199,12 @@
199199
| test.py:220 | tainted_5 | test.py:220 | Taint simple.test |
200200
| test.py:223 | tainted_0 | test.py:223 | Taint simple.test |
201201
| test.py:225 | tainted_1 | test.py:225 | Taint simple.test |
202+
| test.py:228 | tainted_7 | test.py:228 | Taint simple.test |
203+
| test.py:228 | tainted_8 | test.py:228 | Taint simple.test |
202204
| test.py:229 | tainted_0 | test.py:229 | Taint simple.test |
205+
| test.py:231 | tainted_1 | test.py:231 | Taint simple.test |
206+
| test.py:231 | tainted_2 | test.py:231 | Taint simple.test |
207+
| test.py:232 | tainted_3 | test.py:232 | Taint simple.test |
208+
| test.py:232 | tainted_4 | test.py:232 | Taint simple.test |
209+
| test.py:233 | tainted_5 | test.py:233 | Taint simple.test |
210+
| test.py:233 | tainted_6 | test.py:233 | Taint simple.test |

0 commit comments

Comments
 (0)