Whitepaper · 08
Sicherheitsrahmen
Bedrohungsmodell, Invarianten, Zugriffskontrolle, die Vertrauensgrenze der Hooks, Schlüsselverwaltung für die Durchsetzung, Upgrade-Sicherheit und Audit-Lage der Referenzimplementierung von A-REX Core.
Sicherheitslage in einem Absatz
Der Referenz-Token hat einen zentralen Durchgangspunkt (_update), eine feste Auswertungsreihenfolge, eine Reentrancy-Sperre um die gesamte Hook-Sequenz, rollenbasierte Befugnisse, die nie aus Salden abgeleitet werden, ERC-7201-Speicher und eine kleine Angriffsfläche: acht externe zustandsändernde Funktionen jenseits von ERC-1155. Die mächtigsten Fähigkeiten – Einfrieren, erzwungener Transfer, Hook-Administration, Upgrades – sind getrennte Rollen, die für Multisigs und Timelocks vorgesehen sind, und jede Nutzung ist ein Ereignis.
Invarianten
| Invariante | Durchgesetzt durch | Getestet durch |
|---|---|---|
totalSupply(id) entspricht der Summe der Salden für id | OpenZeppelin ERC1155Supply; transform verbrennt und mintet anschließend über _update | Abstammungstests (Teilen, Zusammenführen, Verarbeiten) |
status == 255 ist terminal | setBatchStatus revertiert mit ARexInvalidStatusTransition | Statustests |
| Eine stillgelegte Charge kann nicht gemintet oder transferiert, sondern nur verbrannt werden | _update | Test für stillgelegte Chargen |
amount ≤ balance − frozen für vom Inhaber ausgelöste Bewegungen | _update; forcedTransfer senkt frozen auf balance − amount | Tests für Einfrieren und erzwungene Transfers |
| Kein Hook kann eine saldenändernde Funktion erneut betreten | Speichersperre vor den Prüfungen gesetzt, nach den Benachrichtigungen gelöscht | Test ReentrantHook |
| Hooks werden in der Registrierungsreihenfolge ausgewertet; Entfernen bewahrt die Reihenfolge | Array-Verschiebung in removeHook | Reihenfolgetest |
| Eine abgelehnte Operation ändert keinen Saldo und emittiert keinen Transfer | Prüfungen laufen vor super._update | Ablehnungstest (Anzahl ausgeführter Aufrufe unverändert) |
| Befugnis leitet sich nie aus dem Saldo ab | jede zustandsändernde Funktion ist an eine Rolle oder an eine ERC-1155-Freigabe geknüpft | Tests „Das Halten von Token verleiht nichts“ |
canTransfer == (transferCheck == 0) | canTransfer ist genau so definiert | Konformitätstests |
Bedrohungsmodell
Akteure und Fähigkeiten
| Akteur | Kann | Kann nicht |
|---|---|---|
| Inhaber | nicht eingefrorene Einheiten an berechtigte Empfänger transferieren; verbrennen; Re-Batching desselben Rohstoffs und derselben Einheit bei erhaltener Menge | den Status ändern, minten, zu einem anderen Rohstoff verarbeiten, eingefrorene Einheiten bewegen |
| Zugelassener Operator | wie der Inhaber, für das freigebende Konto | alles, was ein Inhaber nicht kann |
ISSUER_ROLE | Chargen erstellen | Token anderer bewegen |
TRANSFORMER_ROLE | Verarbeitungs-Transformationen von Token, die sie hält oder für die sie freigegeben ist | Token ohne Freigabe transformieren |
STATUS_ROLE | den Status ändern (einschließlich Stilllegung), Metadaten aktualisieren | Token bewegen |
ENFORCER_ROLE | beliebige Beträge einfrieren; beliebige Transfers erzwingen | Hooks umgehen (sie laufen mit OP_FORCED_TRANSFER) |
HOOK_ADMIN_ROLE | Hooks hinzufügen/entfernen | Salden direkt ändern |
PAUSER_ROLE | alles außer erzwungenen Transfers anhalten | — |
UPGRADER_ROLE | Implementierung ersetzen | – (das ist uneingeschränkte Macht; siehe Schlüsselverwaltung) |
| Hook-Contract | Operationen ablehnen; sie beobachten; Berechtigungsanfragen beantworten | erneut eintreten; Salden ändern |
Szenarien
Bösartiger oder fehlerhafter Hook (Denial of Service). Ein Hook, der stets ablehnt, blockiert alle Transfers des Tokens; ein Hook, der in check revertiert, bewirkt dasselbe. Gegenmaßnahme: HOOK_ADMIN_ROLE kann jeden Hook jederzeit entfernen (Reihenfolge bleibt erhalten); PAUSER_ROLE kann während der Untersuchung anhalten; erzwungene Transfers laufen weiterhin, sodass die Durchsetzung nicht verloren geht. Die Registrierung prüft die ERC-165-Unterstützung und Flags ungleich null und weist EOAs zurück. Empfehlung: Hooks vor der Registrierung auditieren; die Anzahl klein halten; den Administrator hinter einen Timelock legen, damit Hook-Änderungen sichtbar sind, bevor sie wirksam werden.
Reentrancy durch einen Hook. onExecuted eines Hooks ruft safeTransferFrom zurück auf. Gegenmaßnahme: die Sperre; der Aufruf revertiert mit ARexReentrantCall. Zu beachten ist, dass der Empfänger-Callback von ERC-1155 (onERC1155Received) wie bei jedem ERC-1155-Token nach der Freigabe der Sperre läuft; der Zustand des Tokens ist dann bereits endgültig.
Kompromittierter Durchsetzungsschlüssel. Wer ENFORCER_ROLE hält, kann beliebige Token bewegen. Gegenmaßnahme: Multisig mit einem dokumentierten Verfahren (Gerichtsbeschluss, Pfandvertrag, Sanktionsmitteilung); jede Aktion emittiert ForcedTransfer/Frozen; Hooks können eine Anordnungsreferenz in den Transferdaten verlangen (OP_FORCED_TRANSFER ist nicht von den Hooks ausgenommen). Für nicht dringliche Durchsetzungsmaßnahmen ist ein Timelock in Erwägung zu ziehen.
Kompromittierter Upgrader. Totale Kompromittierung. Gegenmaßnahme: Multisig plus Timelock; OpenZeppelin-Upgrade-Validierungen in der CI; ERC-7201-Speicher, um Layout-Unfälle zu vermeiden.
Missbrauch des Status. STATUS_ROLE kann eine Charge stilllegen, die von anderen gehalten wird. Das ist beabsichtigt – ein Lager, ein Prüfer oder eine Aufsichtsbehörde erklärt eine Charge für untauglich – und muss den Inhabern offengelegt werden. Gegenmaßnahme: einer rechenschaftspflichtigen Institution zuweisen; jede Änderung ist ein Ereignis mit einem Grund.
Betrug durch den Aussteller. ISSUER_ROLE kann eine Charge erstellen, die physisch nicht existiert. Der Token kann dies nicht verhindern; er macht es zuordenbar (issuer, originRef, metadataHash) und ermöglicht es, über AttestationHook Attestierungen unabhängiger Parteien (Lager, Prüfer, Register) vor dem Transfer vorauszusetzen.
Austausch der Metadaten. setBatchMetadata ändert Hash und URI. Gegenmaßnahme: rollengesteuert; die Ereignisse BatchMetadataUpdated und URI bewahren die Historie; frühere Dokumente bleiben anhand früherer Hashes überprüfbar.
Front-Running von transferCheck. Eine Vorabprüfung kann veralten, bevor die Transaktion ausgeführt wird (der Zustand eines Hooks ändert sich). Die Transaktion wertet erneut aus; im schlimmsten Fall kommt es zu einem Revert mit einem präzisen Code.
Gas-Griefing durch Hooks. Jeder Hook fügt pro betroffener ID und Phase einen externen Aufruf hinzu. Ein Hook mit unbegrenzten Schleifen macht Transfers unbezahlbar. Gegenmaßnahme: Regeln für die Hook-Entwicklung (begrenztes check), Prüfung vor der Registrierung.
Vertrauen in upgradefähige Hooks. Ein hinter einem Proxy ausgerollter Hook kann die Transferrichtlinie ändern, ohne dass sich am Token etwas ändert. Gegenmaßnahme: Administratorschlüssel von Hooks mit derselben Sorgfalt behandeln wie HOOK_ADMIN_ROLE; im Produktivbetrieb unveränderliche Hooks bevorzugen.
Zugriffskontrollmodell
OpenZeppelin AccessControl mit acht Rollen am Token und einer am Attestierungsregister; DEFAULT_ADMIN_ROLE verwaltet sie alle. Empfohlene Aufteilung im Produktivbetrieb:
| Rolle | Inhaber |
|---|---|
DEFAULT_ADMIN_ROLE, UPGRADER_ROLE, HOOK_ADMIN_ROLE | Governance-Multisig hinter einem Timelock |
ENFORCER_ROLE | Durchsetzungs-Multisig (Compliance + Recht) |
PAUSER_ROLE | Schlüssel für die Störfallreaktion (schnell) |
ISSUER_ROLE, STATUS_ROLE, TRANSFORMER_ROLE | operative Dienste mit minimalen Rechten, rotiert |
ATTEST_ADMIN_ROLE | Zertifizierungsstelle oder Plattform |
initialize überträgt aus Bequemlichkeit alles an einen Administrator; die Deployment-Checkliste verlangt vor dem Produktivbetrieb eine Neuverteilung.
Semantik von Durchsetzung und Pause
- Die Pause blockiert Mints, Transfers, Burns und Transformationen; sie blockiert erzwungene Transfers nicht, sodass eine rechtmäßige Anordnung während eines Störfalls ausgeführt werden kann.
- Erzwungene Transfers überspringen
canSend/canReceiveund die Prüfung des eingefrorenen Saldos, senken den eingefrorenen Betrag auf den verbleibenden Rest und führen die Hooks weiterhin mitOP_FORCED_TRANSFERaus. Referenz-Hooks liefern für diese OperationOK; ein Hook, der die Durchsetzung regelt, kann Anordnungsreferenzen indataverlangen. - Das Einfrieren darf den Saldo übersteigen (ERC-7943), sodass ein Pfandrecht auch künftige Zugänge erfassen kann.
Upgrade-Sicherheit
- UUPS;
_authorizeUpgradedurchUPGRADER_ROLEabgesichert. - ERC-7201-Speicher-Struct mit Namensraum; nur Anhängen erlaubt.
- Die Validierungen des OpenZeppelin-Upgrades-Plugins laufen in den Tests und sollten vor jeder Upgrade-Transaktion in der CI laufen.
- Die dateibezogene Einstellung
optimizer.runs = 1hält die Implementierung unter EIP-170; eine Änderung, die sie darüber hebt, schlägt beim Kompilieren mit einer Warnung und beim Deployment mit einem Revert fehl.
Sicherheit von Abhängigkeiten und Build
- OpenZeppelin Contracts und Contracts-Upgradeable auf 5.3.0 fixiert; Lockfile eingecheckt; die CI verwendet
npm ci. - Solidity 0.8.22, viaIR, EVM
paris(keine Abhängigkeit von Transient Storage, auf Chains einsetzbar, die Cancun nicht übernommen haben). - Keine externen Bibliotheken gelinkt; kein delegatecall außerhalb des UUPS-Proxys.
Audit-Lage
- 46 Tests für die Referenzimplementierung, die Hooks und die Erweiterungen decken jede der oben genannten Invarianten ab, einschließlich eines mit festem Seed randomisierten Invariantenlaufs.
- Gas und Größe werden durch Skripte im Repository gemessen.
- Ein Audit von
ARexToken,ARexAttestationsund den Referenz-Hooks durch Dritte ist eine erklärte Voraussetzung für einen Anker im Produktivbetrieb und für die Einreichung des ERC (siehe Zukünftige Entwicklungen). - Die formale Verifikation der Pipeline-Invarianten steht auf der Roadmap; die Invarianten sind klein genug, um als Eigenschaften formuliert zu werden.
Restrisiken, die der Standard nicht beseitigt
- Die physische Existenz und die Qualität einer Charge werden attestiert, nicht bewiesen; der Token macht Aussagen zuordenbar, nicht wahr.
- Die Verfügbarkeit von Off-Chain-Metadaten hängt vom gewählten Speicher ab; der Hash garantiert Integrität, nicht Verfügbarkeit.
- Die Governance von Hooks und Modulen ist nur so gut wie die Schlüssel, die sie kontrollieren.