Skip to content

Commit fa6abea

Browse files
committed
Python: Add modeling of jmespath
1 parent 5cdd60d commit fa6abea

File tree

5 files changed

+43
-4
lines changed

5 files changed

+43
-4
lines changed

docs/codeql/support/reusables/frameworks.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ Python built-in support
162162
fabric, Utility library
163163
invoke, Utility library
164164
idna, Utility library
165+
jmespath, Utility library
165166
mysql-connector-python, Database
166167
MySQLdb, Database
167168
psycopg2, Database
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
lgtm,codescanning
2+
* Added modeling of the PyPI package `jmespath`.

python/ql/src/semmle/python/Frameworks.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ private import semmle.python.frameworks.Fabric
1212
private import semmle.python.frameworks.Flask
1313
private import semmle.python.frameworks.Idna
1414
private import semmle.python.frameworks.Invoke
15+
private import semmle.python.frameworks.Jmespath
1516
private import semmle.python.frameworks.MysqlConnectorPython
1617
private import semmle.python.frameworks.MySQLdb
1718
private import semmle.python.frameworks.Psycopg2
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/**
2+
* Provides classes modeling security-relevant aspects of the `jmespath` PyPI package.
3+
* See https://pypi.org/project/jmespath/.
4+
*/
5+
6+
private import python
7+
private import semmle.python.dataflow.new.DataFlow
8+
private import semmle.python.dataflow.new.TaintTracking
9+
private import semmle.python.Concepts
10+
private import semmle.python.ApiGraphs
11+
12+
/**
13+
* Provides models for the `jmespath` PyPI package.
14+
* See https://pypi.org/project/jmespath/.
15+
*/
16+
private module Jmespath {
17+
class JmespathAdditionalTaintSteps extends TaintTracking::AdditionalTaintStep {
18+
override predicate step(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) {
19+
exists(DataFlow::CallCfgNode call |
20+
call = API::moduleImport("jmespath").getMember("search").getACall() and
21+
nodeFrom in [call.getArg(1), call.getArgByName("data")] and
22+
nodeTo = call
23+
or
24+
call =
25+
API::moduleImport("jmespath")
26+
.getMember("compile")
27+
.getReturn()
28+
.getMember("search")
29+
.getACall() and
30+
nodeFrom in [call.getArg(0), call.getArgByName("value")] and
31+
nodeTo = call
32+
)
33+
}
34+
}
35+
}

python/ql/test/library-tests/frameworks/jmespath/taint_test.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ def test_idna():
66
expression = jmespath.compile("foo.bar")
77

88
ensure_tainted(
9-
jmespath.search("foo.bar", data), # $ MISSING: tainted
10-
jmespath.search("foo.bar", data=data), # $ MISSING: tainted
9+
jmespath.search("foo.bar", data), # $ tainted
10+
jmespath.search("foo.bar", data=data), # $ tainted
1111

12-
expression.search(data), # $ MISSING: tainted
13-
expression.search(value=data) # $ MISSING: tainted
12+
expression.search(data), # $ tainted
13+
expression.search(value=data) # $ tainted
1414
)
1515

1616
# since ```jmespath.search("{wat: `foo`}", {})``` works (and outputs a dictionary),

0 commit comments

Comments
 (0)