Mittel

Graphify Fortran-Extractor: Unvollständige Härtung von cpp #include ermöglicht Lesen beliebiger Host-Dateien bei Indizierung

  • Veröffentlicht: 19.10.2026
  • Aktualisiert: 20.10.2026 09:53

Zusammenfassung

Der C-Präprozessorschritt des Fortran-Extractors (graphify/extractors/fortran.py, _cpp_preprocess) wendet eine unvollständige Härtung (#include) an. Die -nostdinc -I /dev/null-Flags, auf die er sich stützt (Kommentar „Security (F-007)“), verhindern nicht, dass eine Fortran-Quelldatei mit Großbuchstaben-F absolute Pfade (#include "/etc/passwd") einbindet oder über Path-Traversal den Analysebereich verlässt (#include "../../../../home/victim/.ssh/id_rsa"). cpp durchsucht für Inklusionen in Anführungszeichen stets das Verzeichnis der gerade verarbeiteten Datei und beachtet absolute Includepfade immer, unabhängig von -nostdinc/-I. Infolgedessen führt die Indizierung eines nicht vertrauenswürdigen Repositories, das eine .F/.F90/.F95/.F03/.F08-Datei enthält, dazu, dass beliebige lokale Dateien vom Host gelesen und deren Inhalte in den Wissensgraphen eingefügt werden. Dieser wird anschließend an das LLM/den Agenten übergeben und in die persistenten Ausgaben auf der Festplatte geschrieben (graph.json, GRAPH_REPORT.md, das Obsidian-Wiki, HTML/SVG-Exporte).

Dies ist genau der Angriffsvektor zur Exfiltration von Dateien, gegen den die F-007-Absicherung schützen soll; die Sicherheitsmaßnahme lässt sich jedoch umgehen.

Schweregrad

Hoch. Lesen beliebiger lokaler Dateien auf dem Host, ausgelöst durch die Kernfunktion von Graphify (Indizierung eines nicht vertrauenswürdigen Ordners). Dabei wird eine dokumentierte Sicherheitskontrolle umgangen. Die Ausführung erfolgt über den standardmäßigen, netzwerkunabhängigen AST-Pfad ohne API-Schlüssel (graphify update . / graphify extract) – es sind keine Zugangsdaten, kein Netzwerk und keine LLM-Aufrufe erforderlich. CWE-73 (externe Kontrolle von Dateinamen/-pfaden) / CWE-22 (Path Traversal) / CWE-200 (Offenlegung von Informationen).

Betroffene Stelle

graphify/extractors/fortran.py, _cpp_preprocess():

result = subprocess.run(
    ["cpp", "-w", "-P", "-nostdinc", "-I", "/dev/null", str(path.resolve())],
    capture_output=True, timeout=30,
)

Erreicht von extract_fortran() (gleiche Datei) für alle Dateiendungen in _FORTRAN_CPP_EXTS = {".F", ".F90", ".F95", ".F03", ".F08"}, die standardmäßig erfasst (detect.CODE_EXTENSIONS) und von extract._DISPATCH verarbeitet werden.

Ursache für das Fehlschlagen der Sicherheitsmaßnahme

-nostdinc entfernt lediglich die standardmäßigen System-Include-Verzeichnisse, und -I /dev/null setzt lediglich den zusätzlichen Suchpfad. Beides hat keinen Einfluss auf:

  1. Absolute Includes – #include "/etc/passwd" wird direkt von cpp geöffnet.
  2. Relative Quoted-Includes zur aktuellen Datei – cpp durchsucht für #include "..." immer das Verzeichnis der Datei, sodass #include "../../../../etc/shadow" den Analysebereich verlässt.

Machbarkeitsnachweis (verifiziert)

Reproduziert mit dem ausgelieferten Code unter Verwendung des genauen Befehls, den _cpp_preprocess generiert (cpp -w -P -nostdinc -I /dev/null <file>), sowie direkt über extract_fortran().

Geheimnis auf der Festplatte (/tmp/secret.txt): TOP_SECRET_...

(a) Absoluter Include – evil_abs.F90:

program evil
#include "/absolute/path/to/secret.txt"
end program evil

(b) Relatives Traversal – evil_rel.F90:

program evil
#include "../secret.txt"
end program evil

Beide erzeugen eine präprozessierte Ausgabe, die den vollständigen Inhalt der Datei enthält ("SECRET IN OUTPUT: True" für beide).

Sichtbarkeit im Graphen – leak.F90 platziert das Include über eine Fortsetzungszeile an der Position eines Bezeichners, sodass der offengelegte Wert zu einem Knoten/einer Kante wird:

module m
contains
subroutine s
use &
#include "/path/to/token.secret"
end subroutine s
end module m

extract_fortran() auf dieser Datei erzeugt einen Knoten, dessen Beschriftung dem gesamten einzeiligen Inhalt von token.secret entspricht, und eine imports-Kante dorthin. Dieser Knoten wird nach graph.json / GRAPH_REPORT.md / in das Wiki geschrieben und von den MCP-Tools query_graph / get_node / get_neighbors zurückgegeben – sprich in den Kontext des Agenten und in persistierte Artefakte übertragen.

Hinweis zur Genauigkeit: Fortran unterscheidet nicht zwischen Groß- und Kleinschreibung, sodass erfasste Bezeichner in Kleinbuchstaben umgewandelt werden. Groß-/Kleinschreibungsunabhängige Geheimnisse (Dateipfade, Hostnamen, Benutzernamen, Hex-Tokens, Fragmente von Verbindungszeichenfolgen sowie das bloße Vorhandensein/Teilinhalte einer lesbaren Datei) lecken unverändert; Secrets mit hoher Entropie und Groß-/Kleinschreibung (Base64/JWT) werden durch die Kleinschreibung teilweise beschädigt, bestätigen aber weiterhin Lesbarkeit und Struktur. Einzeilige Secret-Dateien (API-Schlüssel, Anmeldedaten/Tokens) werden vollständig (in Kleinbuchstaben) offengelegt. Voraussetzung ist cpp/gcc im PATH (auf den Entwicklungs- und CI-Hosts, auf die Graphify abzielt, weit verbreitet); andernfalls fällt das System fehlerfrei auf Rohdatenbytes zurück.

Lösungsvorschlag

Nutzung des Containment-Ansatzes, der bereits an anderer Stelle im Code verwendet wird (_project_xml_is_safe, security.validate_graph_path): Vor dem Aufruf von cpp den Quellcode nach #include-Direktiven durchsuchen und jeden Include verweigern oder neutralisieren, dessen Ziel absolut ist oder außerhalb der Corpus-/Repo-Wurzel aufgelöst wird. Konkret in _cpp_preprocess:

  • #include "..." / #include <...>-Direktiven parsen.
  • Jedes Ziel gegen das Verzeichnis der Datei auflösen; falls es absolut ist oder .resolve() die Scan-Wurzel verlässt, diese Zeile entfernen (oder auf path.read_bytes() ohne Präprozessierung zurückfallen).
  • Nur Includes zulassen, die zu einem Pfad innerhalb der Corpus-Wurzel auflösen.

Eine einfachere, aber sichere Alternative besteht darin, vor der Vorverarbeitung alle #include-Zeilen zu entfernen (Makros werden weiterhin expandiert; dateiübergreifende Includes verlieren an Genauigkeit, es können jedoch keine Host-Dateien gelesen werden). Das Ausführen von cpp innerhalb einer Dateisystem-Sandbox (bwrap/unshare, bei dem nur der Korpus eingehängt ist) würde die Schwachstelle ebenfalls schließen, ist jedoch aufwendiger.

Entdeckt durch

Aeon-Schwachstellenscanner. Semgrep markierte den Fortran-Subprozesspfad; eine manuelle Überprüfung der Schutzmaßnahme F-007 zusammen mit einer empirischen Reproduktion über cpp bestätigte die Umgehung.

Was zu tun ist

Aktualisieren Sie auf Version 0.9.70 oder höher.

Betroffene Software

Klicken Sie auf eine Technologie, um alle zugehörigen Schwachstellen anzuzeigen.

PlattformPaketAnfällige VersionenBehoben in
Python (PyPI) graphifyy >= 0.7.2, < 0.9.70 0.9.70

Verweise

CVSS-Wert -
CVSS-Vektor
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N
Schwäche (CWE)
CWE-22, CWE-73
Plattform
Python (PyPI)
Paket
graphifyy
Veröffentlicht
19.10.2026
Aktualisiert
20.10.2026 09:53

Quellen und Lizenzen · Von DockRay bearbeitet oder übersetzt; Rechte und Lizenzen der Quellen bleiben erhalten.

OSV / GitHub Advisory Database - GHSA-pcc4-rvhr-2pr8 - CC BY 4.0

Schwachstellenhistorie: graphifyy

Alle veröffentlichten Schwachstellen dieses Pakets (Python (PyPI)), neueste zuerst. Zeigt, ob es ein einmaliger Ausrutscher ist oder ein Paket, das man im Auge behalten muss.

Dies ist die einzige bekannte Schwachstelle dieses Pakets.

Erkennen Sie Schwachstellen in Ihrer Anwendung

Mit der DockRay-Integration und aktivierter Softwareinventarisierung prüft DockRay gemeldete Komponentenversionen auf bekannte Schwachstellen und benachrichtigt Sie über bestätigte Treffer. Die Abdeckung hängt von der unterstützten Technologie und den verfügbaren Meldungen ab.

Anwendung verbinden
DockRay Newsletter

Anwendungssicherheit in Ihrem Postfach

Wichtige Schwachstellen, konkrete Empfehlungen und praktische Tipps für Ihre Anwendungen. Wählen Sie Ihre Technologien und verfolgen Sie, was für Ihr Projekt relevant ist.

  • Eine tägliche Zusammenfassung neuer Schwachstellen, auch kritischer.
  • Benachrichtigungen über wichtige Updates.
  • Praktische Tipps zur Sicherheit und Überwachung von Anwendungen.

Leer lassen, um Meldungen zu allen Technologien zu erhalten.

Kostenlos anmelden. In jeder E-Mail mit einem Klick abmelden.