Mittel

pacioli: Submit-Consent-Marker autorisierte die Stornierung von durch Aufrufer benannten bestehenden Dokumenten

  • Veröffentlicht: 09.10.2026
  • Aktualisiert: 15.10.2026 18:17

Die Originalmeldung wurde seit der Erstellung dieser Erklärung geändert. Prüfen Sie die aktuellen technischen Daten und die Originalmeldung unten.

Auswirkungen

Das Consent-Gate auf Dokumentenebene von pacioli-guard erfordert einen von Menschen generierten, einmalig verwendbaren, dokumenten- und aktionsgebundenen Marker, bevor Zugangsdaten mit API Key Scope.require_consent ein Dokument übermitteln oder stornieren dürfen. Da ERPNext als Folge einer gesteuerten Aktion weitere Schreibvorgänge auf Dokumente durchführt, dürfen verschachtelte Aktionen die durch die übergeordnete Aktion erteilte Einwilligung "mitnutzen" (ride), anstatt einen eigenen Marker zu benötigen.

Das Ride-Prädikat gab für jede Stornierung true zurück, unabhängig davon, welche Aktion der übergeordnete Marker autorisiert hatte. Das Mitnutzen erreicht niemals consent_verdict, wo die Bindung zwischen Marker und Aktion durchgesetzt wird. Die Folge: Jede Document.cancel(), die innerhalb einer Aktion mit bestehender Einwilligung ausgeführt wurde, erreichte docstatus = 2 ohne Marker, ohne Prüfung der Aktionsbindung, ohne einmaligen Verbrauch und ohne Audit-Eintrag für eine Verweigerung.

Dies ist mit genau den Berechtigungen erreichbar, die ein Administrator dem Broker laut Dokumentation zuweist, und die Identität des stornierten Dokuments wird vom Aufrufer gesteuert:

  • Sales Invoice.on_submit (sales_invoice.py:507) ruft bedingungslos process_asset_depreciation() auf und erreicht depreciate_asset_on_sale (:1508-1516).
  • Dies iteriert über die Positionszeilen der Rechnung und ruft frappe.get_doc("Asset", d.asset) auf. Sales Invoice Item.asset ist ein einfaches beschreibbares Link ohne read_only und ohne fetch_from, sodass der Aufrufer es im Request-Body übergeben kann. Die Validierung, die dies einschränken würde, liegt hinter if d.is_fixed_asset: (:428-429), einem serverseitig gesetzten Feld.
  • Die Kette erreicht depreciation.py:481 und anschließend asset_depreciation_schedule.py:215-217, was current_schedule.cancel() auf einem docstatus == 1, übermittelbaren Asset Depreciation Schedule über den Dokumentenlebenszyklus aufruft (nur should_not_cancel_depreciation_entries ist gesetzt, nicht ignore_validate, sodass before_cancel ausgelöst wird und das Ride-Verhalten den Zugriff gestattet hat).

Somit stornierte ein Marker, der submit Sales Invoice X autorisierte, ein übermitteltes Dokument, das der Benutzer nie gesehen und nie genehmigt hatte. Das Stornieren eines solchen Dokuments macht dessen Hauptbucheintrag rückgängig.

Das gleiche Muster existiert bei weiter gefassten Berechtigungen, beispielsweise Unreconcile Payment.on_submit (unreconcile_payment.py:59-64), welches eine vom Aufrufer gefüllte untergeordnete Tabelle durchläuft und accounts/utils.py:857/:859 gain_loss_je.cancel() auf übermittelten Journalbuchungen erreicht.

Wer betroffen ist

Nur Instanzen, die das Consent-Gating aktiviert haben: Ein Berechtigungsnachweis muss ein API Key Scope mit gesetztem require_consent besitzen. pacioli-guard ist für Prinzipale ohne eine solche Berechtigung inaktiv, und die Mindesteinschränkung der Zugangsdaten (auth_hooks) ist von diesem Problem nicht betroffen.

Das Consent-Gate auf Dokumentenebene wurde erstmals in 0.9.6 veröffentlicht, was die einzige betroffene veröffentlichte Version darstellt.

Verbleibendes Restrisiko

Unter einer gesteuerten Stornierung greift das Mitnutzen für eine kaskadierte Stornierung eines bereits bestehenden Dokuments weiterhin. Dies ist essenziell für Rückgängigmachungen (eine gewöhnliche Rechnungsstornierung veranlasst ERPNext dazu, erzeugte Gutschriften/Lastschriften und Journale über accounts_controller.py:2001-2005 zu stornieren) und kann nicht eingeschränkt werden, ohne dass ein Signal vorliegt, dass die kaskadierte Stornierung eine direkte Folge des übergeordneten Dokuments ist. Diese Begründung deckt jedoch nicht alles ab, was das Restrisiko zulässt: Mindestens ein Fall kann auf dieselbe Weise vom Aufrufer gesteuert werden wie die hier behobene Schwachstelle: Asset Repair.on_cancel (asset_repair.py:215-222), was ein Serial and Batch Bundle storniert, das über einen vom Aufrufer in einer untergeordneten Tabelle ausgefüllten Link referenziert wird. pacioli-guard erfasst zudem keine Schreibvorgänge, die flags.ignore_validate setzen oder den Dokumentenlebenszyklus vollständig umgehen (rohes SQL, Feld-Schreibvorgänge via db_update/db_set); diese Restrisiken sind in der Projektdokumentation beschrieben und bleiben unverändert.

Danksagung

Entdeckt durch ein internes Audit am 2026-07-28, bei dem das Prädikat gegen den Quellcode von Frappe 16.28.0 und ERPNext v16 anstelle der Projektdokumentation geprüft wurde. Ein früherer Code-Kommentar ging davon aus, dass kein solcher Angriffspunkt existiert; diese Annahme basierte nicht auf einer Quellcode-Überprüfung.

Was zu tun ist

Patches

Behoben in 0.10.0. Das Ride-Verhalten unterscheidet nun anhand der übergeordneten Aktion: Ein Rückgängigmachen darf in weitere Rückgängigmachungen kaskadieren, aber ein Übermitteln (Submit) darf nicht in die Stornierung eines Dokuments kaskadieren, das bereits einen Namen hat, da dies eine Aktion darstellt, für die eine menschliche Freigabe hätte eingeholt werden können. Der Verwahrungsstempel enthält nun die Aktion, für die er erstellt wurde, anstelle eines einfachen booleschen Werts.

Ein Upgrade ändert das Verhalten. Jeder ERPNext-Ablauf, bei dem ein Submit in eine Lifecycle-Stornierung kaskadiert, erfordert nun einen Consent-Marker für diese Stornierung zusätzlich zum Marker für die eigentliche Aktion. In ERPNext v16 betrifft dies den Verkauf von Anlagevermögen, Teilverkäufe von Anlagevermögen, Gutschriften gegen Anlagenverkäufe, Aktivierung von Anlagenreparaturen, Schichtzuteilungen von Anlagen, Wertanpassungen von Anlagen sowie Unreconcile Payment. Um dies zu ermöglichen, akzeptiert der Header X-Pacioli-Consent nun mehrere Marker, getrennt durch Leerzeichen oder Kommas; jeder bleibt an ein Dokument und eine Aktion gebunden, erfordert einen separaten Aussteller und wird genau einmal verbraucht.

Problemumgehungen

Unter 0.9.6 entfernen Sie require_consent aus den betroffenen Berechtigungen und verlassen sich ausschließlich auf die Mindesteinschränkungen, oder beschränken Sie gesteuerte Zugangsdaten so, dass sie keine Dokumente übermitteln können, deren Controller andere Dokumente stornieren (für ERPNext Slice-One ist Sales Invoice mit ausgefüllter Positionszeile asset der bekannte Pfad). Keine der Maßnahmen ersetzt ein Upgrade.

Betroffene Software

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

PlattformPaketAnfällige VersionenBehoben in
Python (PyPI) pacioli-guard >= 0.9.6, < 0.10.0 0.10.0

Verweise

CVSS-Wert 5.7/10
CVSS-Vektor
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:N/I:H/A:N
Schwäche (CWE)
CWE-863
Plattform
Python (PyPI)
Paket
pacioli-guard
Veröffentlicht
09.10.2026
Aktualisiert
15.10.2026 18:17

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

OSV / GitHub Advisory Database - PYSEC-2026-4246 - PyPA Advisory Database; CC BY 4.0

OSV / GitHub Advisory Database - GHSA-3hj7-6vmj-h8v4 - CC BY 4.0

Schwachstellenhistorie: pacioli-guard

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.