Skip to content

Commit fb49bab

Browse files
authored
Merge pull request github#10778 from sylwia-budzynska/python-db-models
Python: Add cx_Oracle, phoenixdb, pyodbc models
2 parents cbc0dac + 0eb4896 commit fb49bab

File tree

19 files changed

+169
-0
lines changed

19 files changed

+169
-0
lines changed

docs/codeql/support/reusables/frameworks.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,15 @@ and the CodeQL library pack ``codeql/python-all`` (`changelog <https://github.co
221221
aiopg, Database
222222
asyncpg, Database
223223
clickhouse-driver, Database
224+
cx_Oracle, Database
224225
mysql-connector-python, Database
225226
mysql-connector, Database
226227
MySQL-python, Database
227228
mysqlclient, Database
229+
oracledb, Database
230+
phoenixdb, Database
228231
psycopg2, Database
232+
pyodbc, Database
229233
pymssql, Database
230234
PyMySQL, Database
231235
sqlite3, Database

python/ql/lib/semmle/python/Frameworks.qll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ private import semmle.python.frameworks.Asyncpg
1212
private import semmle.python.frameworks.ClickhouseDriver
1313
private import semmle.python.frameworks.Cryptodome
1414
private import semmle.python.frameworks.Cryptography
15+
private import semmle.python.frameworks.Cx_Oracle
1516
private import semmle.python.frameworks.data.ModelsAsData
1617
private import semmle.python.frameworks.Dill
1718
private import semmle.python.frameworks.Django
@@ -33,12 +34,15 @@ private import semmle.python.frameworks.MarkupSafe
3334
private import semmle.python.frameworks.Multidict
3435
private import semmle.python.frameworks.Mysql
3536
private import semmle.python.frameworks.MySQLdb
37+
private import semmle.python.frameworks.Oracledb
3638
private import semmle.python.frameworks.Peewee
39+
private import semmle.python.frameworks.Phoenixdb
3740
private import semmle.python.frameworks.Psycopg2
3841
private import semmle.python.frameworks.Pycurl
3942
private import semmle.python.frameworks.Pydantic
4043
private import semmle.python.frameworks.Pymssql
4144
private import semmle.python.frameworks.PyMySQL
45+
private import semmle.python.frameworks.Pyodbc
4246
private import semmle.python.frameworks.Requests
4347
private import semmle.python.frameworks.RestFramework
4448
private import semmle.python.frameworks.Rsa
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* Provides classes modeling security-relevant aspects of the `cx_Oracle` PyPI package.
3+
*
4+
* See
5+
* - https://github.com/oracle/python-cx_Oracle
6+
* - https://pypi.org/project/cx-Oracle/
7+
*/
8+
9+
private import python
10+
private import semmle.python.dataflow.new.DataFlow
11+
private import semmle.python.dataflow.new.RemoteFlowSources
12+
private import semmle.python.Concepts
13+
private import semmle.python.ApiGraphs
14+
private import semmle.python.frameworks.PEP249
15+
16+
/**
17+
* Provides models for the `cx_Oracle` PyPI package.
18+
*
19+
* See
20+
* - https://github.com/oracle/python-cx_Oracle
21+
* - https://pypi.org/project/cx-Oracle/
22+
*/
23+
private module Cx_Oracle {
24+
/**
25+
* A model for Cx_Oracle as a module that implements PEP 249, providing ways to execute SQL statements
26+
* against a database.
27+
*/
28+
class Cx_Oracle extends PEP249::PEP249ModuleApiNode {
29+
Cx_Oracle() { this = API::moduleImport("cx_Oracle") }
30+
}
31+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* Provides classes modeling security-relevant aspects of the `oracledb` PyPI package.
3+
*
4+
* See
5+
* - https://python-oracledb.readthedocs.io/en/latest/index.html
6+
* - https://pypi.org/project/oracledb/
7+
*/
8+
9+
private import python
10+
private import semmle.python.dataflow.new.DataFlow
11+
private import semmle.python.dataflow.new.RemoteFlowSources
12+
private import semmle.python.Concepts
13+
private import semmle.python.ApiGraphs
14+
private import semmle.python.frameworks.PEP249
15+
16+
/**
17+
* Provides models for the `oracledb` PyPI package.
18+
*
19+
* See
20+
* - https://python-oracledb.readthedocs.io/en/latest/index.html
21+
* - https://pypi.org/project/oracledb/
22+
*/
23+
private module Oracledb {
24+
/**
25+
* A model for oracledb as a module that implements PEP 249, providing ways to execute SQL statements
26+
* against a database.
27+
*/
28+
class Oracledb extends PEP249::PEP249ModuleApiNode {
29+
Oracledb() { this = API::moduleImport("oracledb") }
30+
}
31+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* Provides classes modeling security-relevant aspects of the `phoenixdb` PyPI package.
3+
*
4+
* See
5+
* - https://github.com/apache/phoenix-queryserver/tree/master/python-phoenixdb
6+
* - https://pypi.org/project/phoenixdb/
7+
*/
8+
9+
private import python
10+
private import semmle.python.dataflow.new.DataFlow
11+
private import semmle.python.dataflow.new.RemoteFlowSources
12+
private import semmle.python.Concepts
13+
private import semmle.python.ApiGraphs
14+
private import semmle.python.frameworks.PEP249
15+
16+
/**
17+
* Provides models for the `phoenixdb` PyPI package.
18+
*
19+
* See
20+
* - https://github.com/apache/phoenix-queryserver/tree/master/python-phoenixdb
21+
* - https://pypi.org/project/phoenixdb/
22+
*/
23+
private module Phoenixdb {
24+
/**
25+
* A model for Phoenixdb as a module that implements PEP 249, providing ways to execute SQL statements
26+
* against a database.
27+
*/
28+
class Phoenixdb extends PEP249::PEP249ModuleApiNode {
29+
Phoenixdb() { this = API::moduleImport("phoenixdb") }
30+
}
31+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* Provides classes modeling security-relevant aspects of the `pyodbc` PyPI package.
3+
*
4+
* See
5+
* - https://github.com/mkleehammer/pyodbc/wiki
6+
* - https://pypi.org/project/pyodbc/
7+
*/
8+
9+
private import python
10+
private import semmle.python.dataflow.new.DataFlow
11+
private import semmle.python.dataflow.new.RemoteFlowSources
12+
private import semmle.python.Concepts
13+
private import semmle.python.ApiGraphs
14+
private import semmle.python.frameworks.PEP249
15+
16+
/**
17+
* Provides models for the `pyodbc` PyPI package.
18+
*
19+
* See
20+
* - https://github.com/mkleehammer/pyodbc/wiki
21+
* - https://pypi.org/project/pyodbc/
22+
*/
23+
private module Pyodbc {
24+
/**
25+
* A model for Pyodbc as a module that implements PEP 249, providing ways to execute SQL statements
26+
* against a database.
27+
*/
28+
class Pyodbc extends PEP249::PEP249ModuleApiNode {
29+
Pyodbc() { this = API::moduleImport("pyodbc") }
30+
}
31+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Added model of `cx_Oracle`, `oracledb`, `phonenixdb` and `pyodbc` PyPI packages as a SQL interface following PEP249, resulting in additional sinks for `py/sql-injection`.

python/ql/test/library-tests/frameworks/cx_Oracle/ConceptsTest.expected

Whitespace-only changes.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import python
2+
import experimental.meta.ConceptsTest
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import cx_Oracle
2+
connection = cx_Oracle.connect(user="hr", password="pwd",
3+
dsn="dbhost.example.com/orclpdb1")
4+
5+
cursor = connection.cursor()
6+
cursor.execute("some sql") # $ getSql="some sql"

0 commit comments

Comments
 (0)