Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-65321-pyathena — SQL-Injection in PyAthena über DefaultParameterFormatter (CVE-2026-65321) | Kitploit
Tools/GitHubGitHub/rahulreddykarne/cve-2026-65321-pyathena
SchwachstellenanalyseExploitationCloud-SicherheitLernen & BildungDatenbanksicherheit
GitHubrahulreddykarne/cve-2026-65321-pyathena

CVE-2026-65321-pyathena

SQL-Injection in PyAthena über DefaultParameterFormatter (CVE-2026-65321)

Repository anzeigen
2vor 1 MonatNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-65321: SQL-Injection in PyAthena durch Backslash-Escaping von Anführungszeichen bei Nicht-SELECT-Anweisungen

Schweregrad: Kritisch, CVSS v4.0 9.3 / CVSS v3.1 9.8 (vergeben von VulnCheck, der CNA)

Vektor (v4.0): CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

Vektor (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Betroffen: PyAthena <= 3.35.3 (alle Versionen bis einschließlich 3.35.3)

Behoben in: 3.35.4

CWE: CWE-89 (Unsachgemäße Neutralisierung spezieller Elemente in einem SQL-Befehl, 'SQL-Injection')

Gemeldet von: Rahul Karne

CNA: VulnCheck

Veröffentlicht: 3. August 2026


Zusammenfassung

PyAthena hat nicht vertrauenswürdige Eingaben in SELECT-Abfragen korrekt und in DELETE-Abfragen inkorrekt escaped.

PyAthena, der weit verbreitete Python-DB-API-Client für Amazon Athena, wählt seine String-Escaping-Routine anhand des führenden Schlüsselworts der Anweisung aus. Anweisungen, die mit SELECT, WITH, INSERT, UPDATE oder MERGE beginnen, erhalten Trino-korrektes Escaping, bei dem ein einfaches Anführungszeichen durch Verdopplung ('') neutralisiert wird. Jede andere Anweisung – meist ein DELETE oder ein CREATE TABLE … AS SELECT (CTAS) – fällt auf Hive-artiges Backslash-Escaping (\') zurück. Die Engine von Athena ist Trino, das einen Backslash innerhalb einer in einfache Anführungszeichen gesetzten Zeichenkette als gewöhnliches Zeichen behandelt; Backslash-Escaping neutralisiert folglich nichts. Ein Angreifer, der einen String-Parameter in einer solchen Anweisung beeinflussen kann, kann das Literal beenden und beliebiges SQL injizieren – ohne Authentifizierung und ohne Benutzerinteraktion.

Der Fehler fehlt daher im Lesepfad und ist genau in den destruktiven Anweisungstypen vorhanden, wo er den größten Schaden anrichtet. Das Paket wird 22,3 Millionen Mal pro Monat heruntergeladen.

PyAthena ist eine Community-Client-Bibliothek von Drittanbietern für Amazon Athena. Es ist kein AWS-Produkt, und dies ist keine Schwachstelle in AWS oder in Athena selbst.

Auswirkungen

Ein Angreifer, der einen String-Parameter kontrolliert, der an eine anfällige Anweisung übergeben wird, kann aus dem beabsichtigten String-Literal ausbrechen und die Logik der Anweisung verändern. Die direkteste und am zuverlässigsten demonstrierbare Auswirkung ist unbefugtes Löschen von Daten: Ein Payload wie missing' OR 1=1 -- in einer DELETE … WHERE token = %(token)s-Abfrage neutralisiert das WHERE-Prädikat und löscht jede Zeile, die die IAM-Rolle des Athena-Workgroups löschen darf (z. B. alle Zeilen einer Iceberg-Tabelle). Je nach Anweisungstyp und den Berechtigungen der Rolle kann ein Angreifer darüber hinaus über CTAS-Injection vom Angreifer definierte Tabellen erstellen und – sofern er die resultierende Tabelle anschließend lesen kann – Daten aus anderen Tabellen exfiltrieren, auf die die Rolle zugreifen kann.

Alle Auswirkungen sind durch die Berechtigungen des Athena-Workgroups / der IAM-Rolle begrenzt, die der Client verwendet. Es handelt sich um eine Data-Plane-Injection in die SQL-Engine von Athena; sie führt nicht zu Codeausführung auf dem Host, auf dem PyAthena läuft, und auch nicht zur Kompromittierung von AWS selbst.

Wer betroffen ist: Anwendungen, die PyAthena < 3.35.4 mit dem standardmäßigen DefaultParameterFormatter (clientseitige pyformat- / named-Parametersubstitution) verwenden und (1) eine Anweisung erstellen, die nicht mit SELECT/WITH/INSERT/UPDATE/MERGE beginnt – in der Praxis DELETE, CTAS, CREATE VIEW, DROP oder ALTER – und (2) vom Angreifer beeinflusste Daten als String-Parameter an diese Anweisung übergeben.

Wer nicht betroffen ist:

  • Jeder, der PyAthena 3.35.4 oder neuer verwendet.
  • Anwendungen, deren parametrisierte Anweisungen ausschließlich mit SELECT/WITH/INSERT/UPDATE/MERGE beginnen; diese werden zum sicheren Escaper mit Anführungszeichen-Verdopplung geleitet.
  • Anwendungen, die nicht vertrauenswürdige Werte ausschließlich über Athenas native serverseitige Abfrageparameter übergeben und nicht über die clientseitige Interpolation von PyAthena.
  • Anwendungen, die niemals nicht vertrauenswürdige oder vom Angreifer beeinflusste Daten als Parameter übergeben (alle Parameter sind vertrauenswürdige Konstanten).

Reichweite

MetrikWertQuelle
Downloads, insgesamt740,6 Mio.pepy.tech/projects/pyathena
Downloads, letzte 30 Tage22,3 Mio.pepy.tech
Downloads, letzte 24 Stunden221,0Kpepy.tech
Anhaltende Installationsrate8,95/Sekundepepy.tech
Nennenswerte Downstream-Projektedbt-athena importiert _escape_hive und _escape_presto direkt aus pyathena.formatterconnections_legacy.py#L23-L27

Technische Details

Ursache

DefaultParameterFormatter.format() wählt die String-Escaping-Funktion ausschließlich anhand des führenden Schlüsselworts der Anweisung aus. Nur eine Allowlist von Präfixen erhält den Trino-korrekten Escaper; jede andere Anweisung fällt auf Hive-artiges Backslash-Escaping zurück.

root@kitploit:~
# src/pyathena/formatter.py, DefaultParameterFormatter.format(), lines ~271-275 (v3.35.2)
operation_upper = operation.upper()
if operation_upper.startswith(("SELECT", "WITH", "INSERT", "UPDATE", "MERGE")):
    escaper = _escape_presto      # safe: doubles single quotes
else:
    escaper = _escape_hive        # UNSAFE for Trino: backslash-escapes quotes
root@kitploit:~
# src/pyathena/formatter.py, lines ~157-165 (v3.35.2)
def _escape_hive(val: str) -> str:
    escaped = (
        val.replace("\\", "\\\\")
        .replace("'", "\\'")          # produces \' (not a quote escape in Trino)
        .replace("\r", "\\r")
        .replace("\n", "\\n")
        .replace("\t", "\\t")
    )
    return f"'{escaped}'"

Die SQL-Engine von Amazon Athena ist Trino (in früheren Engine-Versionen Presto). In Trino ist der einzige Escape für ein einfaches Anführungszeichen innerhalb eines in einfache Anführungszeichen gesetzten String-Literals die Verdopplung (''); ein Backslash ist ein literales Zeichen. _escape_hive neutralisiert daher für Athena überhaupt kein Anführungszeichen – es erzeugt ... = 'missing\' OR 1=1 -- ', was Trino als das String-Literal 'missing\' gefolgt von OR 1=1 -- ' parst, also als vom Angreifer kontrolliertes SQL.

Das Design fällt im Fehlerfall gefährlich aus (fail-dangerous): Es führt den sicheren Pfad auf einer Allowlist und setzt für alles andere standardmäßig den unsicheren Escaper ein. Der Upstream-Fix kehrt dies in fail-safe um (standardmäßig den Trino-Escaper verwenden; Hive-Escaping nur für echte Hive-DDL wie CREATE DATABASE/DROP TABLE/MSCK REPAIR, während CTAS und CREATE VIEW als Trino behandelt werden) und entfernt zusätzlich führende SQL-Kommentare, damit ein /* … */ DELETE …-Präfix die Erkennung des Anweisungstyps nicht aushebeln kann.

Warum dies die automatisierte Analyse überstanden hat

_escape_hive vermisst keine Sanitisierung – es ist Sanitisierung. Es ist eine korrekte, wohlgeformte Escaping-Routine für die String-Literal-Grammatik von Hive, angewendet auf eine Engine, die Trinos Grammatik verwendet. Taint-Tracking-Werkzeuge modellieren SQL-Injection als nicht vertrauenswürdige Daten, die eine Senke erreichen, ohne durch einen Escaper zu laufen; hier durchlaufen die Daten auf jedem Pfad einen Escaper, und der Escaper sieht exakt wie Remediation-Code aus, weil er Remediation-Code ist – nur für den falschen Dialekt.

Dialektkorrektheit ist keine Taint-Eigenschaft, daher bewertet sie keine Taint-Regel. Der Defekt ist für CodeQL, Semgrep, Snyk und Socket strukturell unsichtbar und nicht nur übersehen – weshalb er in einem Paket überleben konnte, das etwa neunmal pro Sekunde installiert wird.

Voraussetzungen für die Ausnutzung

Ein Angreifer benötigt:

  1. Eine Zielanwendung, die PyAthena < 3.35.4 mit dem standardmäßigen clientseitigen Parameter-Formatter verwendet (pyformat- / named-Paramstyle).
  2. Einen Codepfad, der eine Anweisung erstellt, die nicht mit SELECT/WITH/INSERT/UPDATE/MERGE beginnt – in der Praxis DELETE oder CTAS.
  3. Die Möglichkeit, einen String-Parameter zu beeinflussen, der an diese Anweisung übergeben wird.
  4. Ein Athena-Workgroup / eine IAM-Rolle, dessen/deren Berechtigungen das injizierte SQL wirkungsvoll machen (z. B. Löschrechte auf der Zieltabelle oder Leserechte auf anderen Tabellen für den Exfiltrationspfad).

Numerische Parameter sowie jede Anweisung, die an den sicheren Escaper geleitet wird, sind über diesen Fehler nicht ausnutzbar.

Proof of Concept

Der PoC ruft den echten, unveränderten PyAthena-Formatter auf (importiert aus der veröffentlichten PyPI-Version, keine Rekonstruktion) und führt dessen Ausgabe gegen eine lokale In-Memory-DuckDB-Datenbank aus. Kein AWS-Konto, keine Anmeldedaten, kein Netzwerkzugriff. Die vollständige Reproduktion besteht aus zwei Befehlen:

root@kitploit:~
pip install pyathena==3.35.2 duckdb
python poc_pyathena_cna_demo.py --no-pause

Quelle: poc_pyathena_cna_demo.py Aufgezeichnete Demo: Demo ansehen

Die eigene Behauptung der Bibliothek

Der Docstring von DefaultParameterFormatter besagt, dass er Parameter escaped, um SQL-Injection zu verhindern. Der PoC gibt diesen Docstring aus und druckt anschließend _escape_presto, _escape_hive und den Präfix-Auswahlzweig direkt aus dem installierten Paket per inspect.getsource – der Leser sieht den Widerspruch also im Quellcode der Bibliothek selbst, statt dem Advisory aufs Wort zu glauben.

Auswirkung A/I: DELETE-Prädikat-Durchbruch

Vom Angreifer kontrollierter Parameter: missing' OR 1=1 --

root@kitploit:~
DELETE FROM sessions WHERE token = 'missing\' OR 1=1 -- '

Trinos Lexer kennt genau einen Escape für ein einfaches Anführungszeichen innerhalb eines in einfache Anführungszeichen gesetzten String-Literals: die Verdopplung (''). Ein Backslash hat keine Escaping-Bedeutung. Das Literal endet daher an dem Anführungszeichen nach missing\, und OR 1=1 -- wird als SQL geparst. DuckDB teilt diese Eigenschaft, und gegen eine mit zwei Zeilen befüllte sessions-Tabelle ist das Ergebnis:

root@kitploit:~
Rows before executing generated SQL: 2
Rows after executing generated SQL:  0

Das WHERE-Prädikat ist neutralisiert und jede Zeile wird gelöscht.

Auswirkung C: CTAS-Exfiltrations-Durchbruch

Vom Angreifer kontrollierter Parameter: nobody' UNION SELECT secret FROM admin_credentials --

root@kitploit:~
CREATE TABLE leaked AS SELECT name FROM users WHERE name = 'nobody\' UNION SELECT secret FROM admin_credentials -- '

Das injizierte UNION kopiert eine Zeile aus einer Tabelle, auf die sich die ursprüngliche Anweisung nie bezogen hat. In der Demo landet DEMO_SECRET_VALUE aus admin_credentials in der für den Angreifer sichtbaren leaked-Tabelle. Bei Athena ist dies durch das begrenzt, was die IAM-Rolle des Workgroups lesen kann.

Kontrollen: Der sichere Pfad verhält sich korrekt

Dieselben Payloads, die über SELECT und UPDATE geleitet werden, erreichen _escape_presto und werden durch Anführungszeichen-Verdopplung korrekt neutralisiert:

root@kitploit:~
SELECT name FROM users WHERE name = 'nobody'' UNION SELECT secret FROM admin_credentials -- '
UPDATE update_control SET token = 'x'' OR 1=1 -- ' WHERE id = 999

Beide Payloads bleiben innerhalb des String-Literals. SELECT liefert null Zeilen und UPDATE ändert null Zeilen – kein Durchbruch. Diese Kontrollen belegen, dass die Testumgebung solide ist und dass der Defekt spezifisch für die Escaper-Auswahl ist und nicht für das Test-Setup.

Gepatchte Version 3.35.4

Dieselben drei Payloads gegen 3.35.4 erzeugen alle Ausgaben mit verdoppelten Anführungszeichen:

root@kitploit:~
DELETE FROM sessions WHERE token = 'missing'' OR 1=1 -- '
CREATE TABLE leaked AS SELECT name FROM users WHERE name = 'nobody'' UNION SELECT secret FROM admin_credentials -- '

Der Fix übersteht auch ein Präfix mit führendem Kommentar, das andernfalls die Erkennung des Anweisungstyps aushebeln würde:

root@kitploit:~
/* hi */ DELETE FROM sessions WHERE token = 'missing'' OR 1=1 -- '

In jedem Fall bleibt der Payload als Daten enthalten und es findet keine Injection statt.

Behebung

Führen Sie ein Upgrade auf PyAthena 3.35.4 oder neuer durch:

root@kitploit:~
pip install --upgrade "pyathena>=3.35.4"

Wenn Sie nicht sofort aktualisieren können: Übergeben Sie keine nicht vertrauenswürdigen Daten als Parameter an Anweisungen, die nicht mit SELECT/WITH/INSERT/UPDATE/MERGE beginnen. Validieren bzw. allowlisten Sie bei destruktiven Anweisungen die Eingabe serverseitig oder führen Sie die Operation über einen Pfad aus, der nicht auf den clientseitigen Formatter angewiesen ist. Es gibt kein Konfigurations-Flag, das die Escaper-Auswahl in betroffenen Versionen ändert; ein Upgrade ist die zuverlässige Lösung.

Hinweis für Projekte, die die Escaper direkt importieren. Der Fix in 3.35.4 ändert die Escaper-Auswahl innerhalb von DefaultParameterFormatter.format(). Er ändert _escape_hive selbst nicht, das weiterhin per Design korrekt-für-Hive und falsch-für-Trino bleibt. Jedes Downstream-Projekt, das _escape_hive oder _escape_presto aus pyathena.formatter importiert und ein eigenes Statement-Typ-Dispatch durchführt, ist durch ein PyAthena-Upgrade daher nicht behoben und sollte seine eigene Dispatch-Logik anhand derselben Dialektfrage prüfen.

So prüfen Sie, ob Sie betroffen sind:

root@kitploit:~
pip show pyathena          # check the installed version
pip-audit                  # flags CVE-2026-65321 once it propagates to the advisory feeds

Zum CVSS-Score

VulnCheck (die CNA) hat zwei Scores veröffentlicht, beide Kritisch: CVSS v4.0 = 9.3 (CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N) und CVSS v3.1 = 9.8 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H).

Der Angriff ist remote und ohne Authentifizierung, ohne Benutzerinteraktion (AV:N/PR:N/UI:N) und erfordert keine besonderen angrifferseitigen Voraussetzungen (AC:L/AT:N). Die Auswirkung auf das verwundbare System ist in Bezug auf Vertraulichkeit, Integrität und Verfügbarkeit hoch (VC:H/VI:H/VA:H in v4.0; C:H/I:H/A:H in v3.1): Ein injiziertes DELETE kann Daten zerstören, und ein injiziertes CTAS/UNION SELECT kann Daten lesen und kopieren, auf die die Rolle des Workgroups zugreifen kann. Im v4.0-Vektor sind die Metriken für nachgelagerte Systeme alle None (SC:N/SI:N/SA:N) – der Fehler ist auf Athenas SQL- und Autorisierungsgrenze beschränkt und führt nicht zu Codeausführung auf dem Host oder einem Pivot in AWS selbst. Genau dieses SC/SI/SA:N-Triple ist der Grund, warum v4.0 bei 9.3 statt bei einem ausgereizten 10.0 landet, und es ist die ehrliche Antwort auf die Frage „bedeutet das eine vollständige Systemkompromittierung?“ – nein, das tut es nicht. Der v3.1-Score erreicht 9.8, weil sein binäres Scope-Flag (S:U/S:C) in einem einzigen Bit zusammenfasst, was v4.0 auf drei separate nachgelagerte Systemmetriken verteilt; die beiden Scores sind konsistent, nicht widersprüchlich.

Eine Einschränkung, die proaktiv erwähnt werden sollte: Die reale Ausnutzbarkeit erfordert, dass die konsumierende Anwendung nicht vertrauenswürdige Eingaben in eine parametrisierte Nicht-SELECT-Anweisung (DELETE/CTAS/DROP/ALTER) leitet, und der konkrete Blast Radius ist durch die IAM-Berechtigungen des Athena-Workgroups begrenzt. Der Base Score modelliert den angemessenen Worst Case; ein Deployment nach dem Least-Privilege-Prinzip ist weniger stark betroffen.

Offenlegungs-Timeline

DatumEreignis
19. Juli 2026Schwachstelle identifiziert
20. Juli 2026Dem Maintainer gemeldet
20. Juli 2026Maintainer bestätigt
31. Juli 2026Fix committet
31. Juli 2026Gepatchte Version 3.35.4 veröffentlicht
2. August 2026CVE-2026-65321 von VulnCheck vergeben
3. August 2026Öffentliche Offenlegung

Danksagung

Entdeckt und gemeldet von Rahul Karne, Sicherheitsforscher und IEEE Senior Member. Seine Forschung konzentriert sich auf Injection- und Eingabeverarbeitungsfehler in stark genutzten Open-Source-Paketen; frühere Offenlegungen umfassen CVEs in confluent-kafka (1,12 Mrd. Downloads), datamodel-code-generator (185 Mio.) und dem WordPress-Plugin ElementsKit Elementor Addons (über 1 Mio. aktive Installationen).

Kontakt: [email protected] · GitHub: rahulreddykarne

Referenzen

  • CVE-2026-65321, NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-65321
  • CVE Record: https://www.cve.org/CVERecord?id=CVE-2026-65321
  • VulnCheck Advisory: https://www.vulncheck.com/advisories/pyathena-sql-injection-via-defaultparameterformatter-delete-ctas
  • GitHub Security Advisory: GHSA-xwj5-g6cv-4r5c, https://github.com/pyathena-dev/PyAthena/security/advisories/GHSA-xwj5-g6cv-4r5c
  • Patch-Commit: https://github.com/pyathena-dev/PyAthena/commit/27901d12245ea722b3b4e211c60e2ade4e7c8efd
  • PyAthena-Repository: https://github.com/pyathena-dev/PyAthena
  • Download-Statistiken: https://pepy.tech/projects/pyathena

Presse

Presseanfragen: [email protected]. Demoaufzeichnung in hoher Auflösung, PoC und zusätzliche technische Details auf Anfrage verfügbar.

Tool herunterladen