mirror of
https://github.com/github/codeql.git
synced 2026-04-30 03:05:15 +02:00
Python: Add modeling of jmespath
This commit is contained in:
2
python/change-notes/2021-06-09-add-jmespath-modeling.md
Normal file
2
python/change-notes/2021-06-09-add-jmespath-modeling.md
Normal file
@@ -0,0 +1,2 @@
|
||||
lgtm,codescanning
|
||||
* Added modeling of the PyPI package `jmespath`.
|
||||
@@ -12,6 +12,7 @@ private import semmle.python.frameworks.Fabric
|
||||
private import semmle.python.frameworks.Flask
|
||||
private import semmle.python.frameworks.Idna
|
||||
private import semmle.python.frameworks.Invoke
|
||||
private import semmle.python.frameworks.Jmespath
|
||||
private import semmle.python.frameworks.MysqlConnectorPython
|
||||
private import semmle.python.frameworks.MySQLdb
|
||||
private import semmle.python.frameworks.Psycopg2
|
||||
|
||||
35
python/ql/src/semmle/python/frameworks/Jmespath.qll
Normal file
35
python/ql/src/semmle/python/frameworks/Jmespath.qll
Normal file
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* Provides classes modeling security-relevant aspects of the `jmespath` PyPI package.
|
||||
* See https://pypi.org/project/jmespath/.
|
||||
*/
|
||||
|
||||
private import python
|
||||
private import semmle.python.dataflow.new.DataFlow
|
||||
private import semmle.python.dataflow.new.TaintTracking
|
||||
private import semmle.python.Concepts
|
||||
private import semmle.python.ApiGraphs
|
||||
|
||||
/**
|
||||
* Provides models for the `jmespath` PyPI package.
|
||||
* See https://pypi.org/project/jmespath/.
|
||||
*/
|
||||
private module Jmespath {
|
||||
class JmespathAdditionalTaintSteps extends TaintTracking::AdditionalTaintStep {
|
||||
override predicate step(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) {
|
||||
exists(DataFlow::CallCfgNode call |
|
||||
call = API::moduleImport("jmespath").getMember("search").getACall() and
|
||||
nodeFrom in [call.getArg(1), call.getArgByName("data")] and
|
||||
nodeTo = call
|
||||
or
|
||||
call =
|
||||
API::moduleImport("jmespath")
|
||||
.getMember("compile")
|
||||
.getReturn()
|
||||
.getMember("search")
|
||||
.getACall() and
|
||||
nodeFrom in [call.getArg(0), call.getArgByName("value")] and
|
||||
nodeTo = call
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,11 +6,11 @@ def test_idna():
|
||||
expression = jmespath.compile("foo.bar")
|
||||
|
||||
ensure_tainted(
|
||||
jmespath.search("foo.bar", data), # $ MISSING: tainted
|
||||
jmespath.search("foo.bar", data=data), # $ MISSING: tainted
|
||||
jmespath.search("foo.bar", data), # $ tainted
|
||||
jmespath.search("foo.bar", data=data), # $ tainted
|
||||
|
||||
expression.search(data), # $ MISSING: tainted
|
||||
expression.search(value=data) # $ MISSING: tainted
|
||||
expression.search(data), # $ tainted
|
||||
expression.search(value=data) # $ tainted
|
||||
)
|
||||
|
||||
# since ```jmespath.search("{wat: `foo`}", {})``` works (and outputs a dictionary),
|
||||
|
||||
Reference in New Issue
Block a user