Python: `FlaskApp` instances do not reliably track subclasses
- Langage dominant
- CodeQL
- Étoiles
- 10.1k
- Forks
- 2.1k
- Merge moyen
- 2 j 18 h
- PR mergées (30 j)
- 152
Description
I was running a set of queries on the [CTFd](https://github.com/CTFd/CTFd) repository, and got suspiciously few results for endpoints. After some experimenting I found out that [they subclass `Flask`](https://github.com/CTFd/CTFd/blob/master/CTFd/__init__.py#L51C1-L91C1), which the current query for `FlaskApp::instance()` does not seem to track.
# Minimal example:
Query:
```plaintext
import python
import semmle.python.frameworks.Flask
import semmle.python.ApiGraphs
from API::Node node
where Flask::FlaskApp::instance() = node
select node
```
Python:
```py
from flask import Flask
class Sub(Flask):
def __init__(self, *args, **kwargs):
Flask.__init__(self, *args, **kwargs)
app = Sub(__name__)
@app.route("/")
def hello():
return "world"
```
CodeQL is not able to identify `Sub` as a Flask app, which means the route setup for `hello` cannot be detected as well.
Adding `.getASubclass*()` to [FlaskApp::instance()](https://github.com/github/codeql/blob/main/python/ql/lib/semmle/python/frameworks/Flask.qll#L76C1-L76C64) would probably fix this. If this can be overridden without changes to the library I am open to suggestions, my knowledge of the QL modules is not that great as of now.
Guide de contribution
Ouvrir le guide de contribution
Piste de recherche
Commencez dans python/ql/lib/semmle/python/frameworks/Flask.qll, au niveau de FlaskApp::instance(), puis reproduisez la requête minimale et l’exemple de sous-classe Python de l’issue. Vérifiez qu’une sous-classe de Flask est reconnue comme une app et que la route pour hello est détectée ; ajoutez ou mettez à jour le test de couverture de bibliothèque correspondant s’il y en a un à proximité.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- security
- Type d'issue
- Bug
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- Calme
- Clarté
- Plutôt claire
- Accessibilité débutants
- 55/100