Willkommen, liebe Entwicklerkollegen! In diesem Blogbeitrag werden wir tief in die Welt der Anwendungssicherheit eintauchen und uns dabei insbesondere auf eine Schwachstelle konzentrieren, die die Sicherheit von FastAPI beeinträchtigen kann: Denial of Service (DoS), verursacht durch unsichere reguläre Ausdrücke (Regex). Wir werden untersuchen, wie ein schlecht konstruierter regulärer Ausdruck zu einem sogenannten „Regular Expression Denial of Service“ (ReDoS) führen kann, einer Form des DoS-Angriffs, und wie diese Schwachstellen mithilfe eines leistungsstarken Entwickler-Sicherheitstools – Snyk.
Verständnis der Auswirkungen von ReDoS auf die FastAPI-Sicherheit in Python Python, eine der beliebtesten Programmiersprachen, verfügt über ein riesiges Ökosystem an Paketen und Bibliotheken. Während diese Pakete uns das Leben als Entwickler erleichtern, stellen sie auch ein potenzielles Risiko dar, wenn sie nicht ordnungsgemäß gesichert werden. Aufgrund der rasanten Geschwindigkeit der Softwareentwicklung werden Pakete häufig aktualisiert und neue Versionen veröffentlicht, was manchmal unwissentlich Sicherheitsrisiken mit sich bringt. Ein solches Risiko ist die Möglichkeit eines ReDoS-Angriffs, einer Form des DoS-Angriffs, bei dem ein Angreifer böswillige Eingaben in einen regulären Ausdruck eingibt, dessen Auswertung sehr lange dauert. Dies führt dazu, dass die Anwendung nicht mehr reagiert oder erheblich langsamer wird, was schwerwiegende Folgen haben kann, von einer beeinträchtigten Benutzererfahrung bis hin zum vollständigen Ausfall der Anwendung.import re pattern = re.compile("^(a+)+$") def check(input): return bool(pattern.match(input)) check("a" * 3000 + "!")
# After installing Snyk and setting up the Snyk CLI # you can scan your project: $ snyk test
from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"}
$ snyk test
snyk test Testing /Users/lirantal/projects/repos/fastapi-vulnerable-redos-app... Tested 13 dependencies for known issues, found 1 issue, 1 vulnerable path. Issues to fix by upgrading dependencies: Upgrade fastapi@0.109.0 to fastapi@0.109.1 to fix ✗ Regular Expression Denial of Service (ReDoS) (new) [High Severity][https://security.snyk.io/vuln/SNYK-PYTHON-FASTAPI-6228055] in fastapi@0.109.0 introduced by fastapi@0.109.0 Organization: liran.tal Package manager: pip Target file: requirements.txt Project name: fastapi-vulnerable-redos-app
Our first step is to set up a new Python project. We'll need to install FastAPI, along with a server to host it on. Uvicorn is a good choice for a server because it is lightweight and works well with FastAPI.
Start by installing FastAPI, python-multipart, and Uvicorn with pip:
pip install fastapi==0.109.0 uvicorn python-multipart==0.0.6
Next, create a new directory for your project, and inside that directory, create a new file for your FastAPI application. You can call it main.py.
Now we're ready to write our FastAPI application code. Open main.py and add the following Python code:
from typing import Annotated from fastapi.responses import HTMLResponse from fastapi import FastAPI,Form from pydantic import BaseModel class Item(BaseModel): username: str app = FastAPI() @app.get("/", response_class=HTMLResponse) async def index(): return HTMLResponse("Test", status_code=200) @app.post("/submit/") async def submit(username: Annotated[str, Form()]): return {"username": username} @app.post("/submit_json/") async def submit_json(item: Item): return {"username": item.username}
This simple FastAPI application has several routes (/), including /submit, which uses a multipart form. When a POST request is received, the submit route returns the username that was submitted.
With our FastAPI application code written, we can now start the Uvicorn server and run our application.
Use the following command to start the server:
uvicorn main:app --reload
You should see an output indicating that the server is running. You can test your application by navigating to http://localhost:8000 in your web browser. The message "Test" should be displayed on the page.
Now that our FastAPI application is running, we can test it for vulnerabilities. We'll use a ReDoS attack payload in the HTTP request to exploit the vulnerability in the python-multipart package that parses the content-type header value.
If you have the curl program installed, run the following command in your terminal:
curl -v -X 'POST' -H $'Content-Type: application/x-www-form-urlencoded; !=\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' --data-binary 'input=1' 'http://localhost:8000/submit/'
As you saw by now, open source dependencies play a key role in building Python applications. However, these third-party dependencies can sometimes be a breeding ground for vulnerabilities, thus posing significant security threats. In this context, Snyk Open Source emerges as a robust tool that helps developers identify and fix security issues effectively.
Imagine you could quickly find FastAPI security vulnerabilities already in the IDE panel when you write Python code instead of waiting until security scanners pick this up at a later stage.
The Snyk IDE extension is free, and if you’re using PyCharm, you can search for Snyk in the Plugins view and download it directly from there. If you’re using VS Code you can similarly find it in the Extensions marketplace right from the IDE.
Snyk Open Source is a powerful tool used for uncovering and addressing vulnerabilities in open source dependencies and container images. It is designed to integrate easily with the existing codebase and CI/CD systems, making it a handy tool for developers. It provides a comprehensive database of known vulnerabilities, enabling developers to proactively address potential breaches in security.
To scan Python dependencies for vulnerabilities with Snyk, you first need to install the Snyk CLI. You can do this using one of the methods in the guide, or if you have a Node.js environment, you can quickly install Snyk with npm install -g snyk and then run snyk auth to authenticate.
Once installed, you can use the snyk test command to check your Python project for vulnerabilities:
snyk test --all-projects
Snyk will then scan all your dependencies and compare them against its vulnerability database. If any issues are found, Snyk will provide a detailed report with information about the vulnerability, its severity, and possible fixes.
Monitoring your projects with Snyk is crucial to maintain the security of your application. With Snyk, not only can you detect vulnerabilities, but you can also apply automated fixes, which can save you time and resources.
In addition, Snyk offers vulnerability alerts that notify you about new vulnerabilities that may affect your projects. This allows you to stay one step ahead and fix security issues before they can be exploited.
With the snyk monitor command, you can take a snapshot of your current project dependencies and monitor them for vulnerabilities:
snyk monitor
Integrating Snyk with your Git repositories allows you to automatically scan every commit for vulnerabilities. This can be done by adding Snyk as a webhook in your repository settings.
Sobald dies erledigt ist, löst jeder Push in Ihr Repository einen Snyk-Scan aus, der Ihnen hilft, Schwachstellen so früh wie möglich zu erkennen und zu beheben.
Zusammenfassend lässt sich sagen, dass Snyk Open Source ein wertvolles Tool zur Aufrechterhaltung der Sicherheit Ihrer Python-Projekte ist. Durch die Suche nach Schwachstellen, die Überwachung Ihrer Projekte und die Integration in Ihre Git-Repositorys ermöglicht Ihnen Snyk die Aufrechterhaltung einer robusten, sicheren Codebasis. Wenn Sie es noch nicht getan haben, registrieren Sie sich für ein kostenloses Snyk-Konto und beginnen Sie noch heute mit der Sicherung Ihrer Bewerbungen.
Das obige ist der detaillierte Inhalt vonEin Denial-of-Service-Regex unterbricht die FastAPI-Sicherheit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!