Skip to content

Commit ceb3b21

Browse files
bdrodestausbn
andauthored
Update python/ql/lib/semmle/python/security/dataflow/ServerSideRequestForgeryCustomizations.qll
Co-authored-by: Taus <tausbn@github.com>
1 parent 4d4e7a1 commit ceb3b21

File tree

1 file changed

+17
-29
lines changed

1 file changed

+17
-29
lines changed

python/ql/lib/semmle/python/security/dataflow/ServerSideRequestForgeryCustomizations.qll

Lines changed: 17 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -186,37 +186,25 @@ module ServerSideRequestForgery {
186186

187187
private predicate uri_validator(DataFlow::GuardNode g, ControlFlowNode node, boolean branch) {
188188
exists(DataFlow::CallCfgNode call, string funcs |
189-
funcs in ["in_domain", "in_azure_keyvault_domain", "in_azure_storage_domain"]
190-
|
189+
funcs in ["in_domain", "in_azure_keyvault_domain", "in_azure_storage_domain"] and
191190
call = API::moduleImport("AntiSSRF").getMember("URIValidator").getMember(funcs).getACall() and
192-
call.getArg(0).asCfgNode() = node and
193-
(
194-
// validator used in a comparison
195-
exists(CompareNode cn, Cmpop op, Node n | cn = g and n.getALocalSource() = call |
196-
(
197-
// validator == true or validator == false or validator is True or validator is False
198-
(op instanceof Eq or op instanceof Is) and
199-
exists(ControlFlowNode l, boolean bool |
200-
l.getNode().(BooleanLiteral).booleanValue() = bool and
201-
bool in [true, false] and
202-
branch = bool and
203-
cn.operands(n.asCfgNode(), op, l)
204-
)
205-
or
206-
// validator != false or validator != true or validator is not True or validator is not False
207-
(op instanceof NotEq or op instanceof IsNot) and
208-
exists(ControlFlowNode l, boolean bool |
209-
l.getNode().(BooleanLiteral).booleanValue() = bool and
210-
bool in [true, false] and
211-
branch = bool.booleanNot() and
212-
cn.operands(n.asCfgNode(), op, l)
213-
)
214-
)
215-
)
191+
call.getArg(0).asCfgNode() = node
192+
|
193+
// validator call directly (e.g., if URIValidator.in_domain(...) )
194+
g = call.asCfgNode() and
195+
branch = true
196+
or
197+
// validator used in a comparison
198+
exists(Cmpop op, Node n, ControlFlowNode l |
199+
n.getALocalSource() = call and g.(CompareNode).operands(n.asCfgNode(), op, l)
200+
|
201+
// validator == true or validator == false or validator is True or validator is False
202+
(op instanceof Eq or op instanceof Is) and
203+
branch = l.getNode().(BooleanLiteral).booleanValue()
216204
or
217-
// validator call directly (e.g., if URIValidator.in_domain(...) )
218-
g = call.asCfgNode() and
219-
branch = true
205+
// validator != false or validator != true or validator is not True or validator is not False
206+
(op instanceof NotEq or op instanceof IsNot) and
207+
branch = l.getNode().(BooleanLiteral).booleanValue().booleanNot()
220208
)
221209
)
222210
}

0 commit comments

Comments
 (0)