Spezifikation
Der Aksu Index
Version 1.0 · genehmigt am 31. Juli 2026 · diese Seite veröffentlicht am 20. August 2026
Definition
The Aksu Index of an (agent, running user) pair is the number of distinct fields the code behind the agent has been proven able to reach beyond what that user is allowed to see — always reported together with what could not be resolved.Der Index wird als vier disjunkte Zahlen angegeben. Abschnitt 04 dieses Dokuments enthält die Regel, die es verbietet, weniger als vier davon zu zitieren.
Kanonische Form
Aksu Index: P proven (C GDPR) · B unproven boundaries · U unresolved
Die Form der Zeile, mit Platzhaltern. Sie ist keine Messung; zwei gemessene Zeilen stehen in Abschnitt 05.
Hinweis zum Einfrieren
Version: 1.0 — approved by the maintainer on 31 July 2026 (the four load-bearing choices: pair-scoped, fields-only, four-bucket reporting, GDPR callout). Freezes permanently at first public reference, and is never silently redefined after that (§8).Eine Lücke ohne Zahl ist eine Meinung.
- Kein Zertifikat. Der Index ist Nachweismaterial für eine Sicherheitsprüfung oder eine Datenschutz-Folgenabschätzung. Er wird statisch erzeugt und ist genau so viel wert wie die Messung, die hinter ihm steht — nicht mehr.
- Kein Org-Score. Ein Index beschreibt genau einen Agenten und einen ausführenden Benutzer, zu einem Zeitpunkt, unter einer Werkzeugversion. Alles Weitergehende ist eine abgeleitete Zusammenfassung und muss als solche gekennzeichnet werden.
- Keine Produktseite. Dieses Dokument definiert einen Begriff und die Disziplin, ihn zu zitieren. Es gibt hier nichts zu kaufen, nichts zu abonnieren und nichts anzufragen. Eine Referenzimplementierung existiert und wird genau einmal genannt, in Abschnitt 10.
Die hier gemessene Lücke wurde nicht hier entdeckt. Anbieter aus dem Identitäts- und SaaS-Sicherheitsumfeld haben sie zuerst benannt und beschreiben sie präzise, und ein Standardisierungsgremium führt sie als Risikokategorie. Ihre Worte folgen, mit Datum und Link, denn ein Beitrag wird erst lesbar, wenn seine Vorarbeiten es sind.
- Obsidian Security30 July 2026Securing Salesforce Agentforce
Obsidian Editorial Team (Security Research)
Zitat“Configuration is not reality, and that gap is the whole game. The Salesforce profile view shows theoretical configuration: object permissions, field-level security, sharing settings on paper. What it does not show is effective access, the actual rows and objects the agent can reach once every permission set, sharing rule, role hierarchy, group membership, and Apex context resolves at runtime.”
EinordnungThe same page states: “The blast radius equals the effective access of the agent's running user.” It names Apex context as part of effective access. It does not produce a number.
- Nudge Security22 April 2026AI Agent Governance: Complete Guide For Security Teams
Rachel Ritchie
Zitat“The security implication: an agent's effective access can be significantly larger than its stated permissions.”
EinordnungStated of MCP-server chaining, not of Salesforce execution semantics. The claim generalises; the mechanism behind it does not.
- Okta4 February 2026AI Agent Security: The Authorization Gap
Kundan Kolhe
Zitat“AI agents retrieve data using the permissions of whoever they authenticate as (checked), but output to shared workspaces where recipients have mixed permissions (not checked).”
EinordnungOkta's “authorization gap” is the output-side audience problem: retrieval is checked, the destination is not. That is adjacent to, and not the same as, the difference between stated and effective permissions. Cited for what it says.
- OWASP Gen AI Security Project2026Top 10 for Agentic Applications 2026 — ASI03: Identity & Privilege Abuse
OWASP Gen AI Security Project
EinordnungCited as a category name only. The risk class exists and is described as the agentic evolution of Excessive Agency (LLM06:2025). It is a taxonomy, not a metric. No sentence is quoted here because the primary document was not fetched.
Aufgeführt sind nur Quellen, die gegen die abgerufene Seite geprüft wurden. Die Seiten wurden am 20. August 2026 abgerufen und die zitierten Sätze zeichengenau abgeglichen. Wo eine Quelle geprüft wurde und nicht das sagte, was ihr häufig zugeschrieben wird, steht das in der Einordnung, statt geglättet zu werden.
Eine bezifferte Kennzahl für überhöhte Rechte ist bereits veröffentlicht, und es ist nicht diese:
OPUR — Over-Privilege Use Rate — When Lower Privileges Suffice: Investigating Over-Privileged Tool Selection in LLM Agents, arXiv 2606.20023, 18 June 2026.
OPUR scores model behaviour — how often a language model selects a higher-privilege tool when a lower-privilege one would do — across a synthetic benchmark. It measures a different object: not a specific agent in a specific org against a specific running user's effective permissions. The two are not competing definitions.
Was dieses Dokument hinzufügt
Die Lücke hat einen Namen. Dies gibt ihr eine Zahl.
Eng formuliert, damit man es prüfen kann: Die Lücke wird von Anbietern aus dem Identitäts- und SaaS-Sicherheitsumfeld benannt und von OWASP als Kategorie geführt. Was bisher fehlte, ist eine veröffentlichte Spezifikation für eine Zahl, die zitiert und anschließend von jemandem geprüft werden kann, der sie nicht erzeugt hat.
Spezifikation §1, §2, §3
The Aksu Index of an (agent, running user) pair is the number of distinct fields the code behind the agent has been proven able to reach beyond what that user is allowed to see — always reported together with what could not be resolved.Die drei Größen
Für das Paar (Agent, ausführender Benutzer) sei:
- outer
- the set of qualified fields (Object.Field; relationship paths kept verbatim) reachable by the agent's resolved code chain. “Resolved” means execution semantics are computed per operation under the precedence law: explicit mode clause ▸ apiVersion default (≥ v67 → user mode) ▸ sharing declaration (record axis, system mode only).
- inner
- the subset of outer the running user could read anyway under their effective permissions.
- gap
- outer \ inner, restricted to operations proven to execute not bounded by the running user (the FLS axis resolved False).
Invariant, enforced by the tool: outer = inner + gap (the concentric circles).
Die vier Größen des Index
Der Index gibt anschließend vier disjunkte Größen an. Sie sind konstruktionsbedingt disjunkt: über die Aktionen eines Agenten hinweg gewinnt das schwerwiegendste Urteil, sodass ein Feld nicht in zwei Größen landen kann.
| Größe | Bedeutung | Beweisgrad |
|---|---|---|
| P — proven | fields in gap whose escalation is proven (ERROR findings, PS502/PS506)P — nachgewiesen: Felder in der Lücke, deren Rechteausweitung nachgewiesen ist (ERROR-Befunde, PS502/PS506). Beweisgrad: nachgewiesen. | proven |
| C — classified | subset of P carrying the org's own compliance labels (GDPR/PII — PS506)C — klassifiziert: die Teilmenge von P, die die org-eigenen Compliance-Kennzeichnungen trägt (DSGVO/PII — PS506). Beweisgrad: nachgewiesen. | proven |
| B — unproven boundaries | same rules at WARN: a real boundary the analysis could not prove crossed (e.g., a sanitizer present but the path unprovable)B — nicht nachgewiesene Grenzen: dieselben Regeln auf WARN-Stufe, also eine reale Grenze, deren Überschreitung die Analyse nicht nachweisen konnte. Beweisgrad: eingegrenzt, nicht nachgewiesen. | bounded, unproven |
| U — unresolved | reach that could not be determined at all: dynamic SOQL, SOSL without RETURNING, undetermined sharing context (PS504)U — ungeklärt: Reichweite, die überhaupt nicht bestimmt werden konnte (dynamisches SOQL, SOSL ohne RETURNING, unbestimmter Sharing-Kontext — PS504). Beweisgrad: ehrliches Unbekanntes. | honest unknown |
P is the headline number. C is why it matters. B and U are why the headline can be trusted — they are printed, never absorbed into P and never dropped.Geltungsbereich
One Index describes exactly one agent × one running user, at one moment, under one tool version. It is not an org score.A hypothetical holder of a single permission set may be substituted, but the report must label it as a hypothesis, not a person.
Spezifikation §1 · ADR-013
Dies ist die Disziplin, um derentwillen die Spezifikation existiert. Es ist die Klausel, die am ehesten bricht, wenn jemand die Zahl in Eile zitiert.
Spezifikation §1
Quoting the proven number alone while unresolved > 0 is a violation of this specification. An unknown never reads as clean.ADR-013, angenommen am 19. August 2026
The headline is P — the count of fields proven reachable beyond the running user — rendered large, first, and always with C, B and U beside it. No ratio is computed, stored or displayed.Zwei Folgen für die Darstellung
- 01
The band renders four numbers as one visual object. C is rendered inside P, never as a peer tile that could read as P + C.
- 02
When P = 0 and U > 0, the not-clean statement renders inside the band, adjacent to the zero, and may not be styled as a pass. This is the design's primary test case, not an edge case.
Warum kein Verhältniswert
Ein Verhältniswert mit einer Nachkommastelle wurde vorgeschlagen und verworfen. Es lohnt sich festzuhalten, warum — denn er ist das Naheliegende und versagt genau in dem Fall, auf den es ankommt:
In dieser Spezifikation wird nirgends ein Verhältniswert, Prozentsatz, Notenwert, Schwellenwert oder Buchstabenrating berechnet, gespeichert oder angezeigt.
Gemessen am 31. Juli 2026 · Salesforce Summer '26
Beide Agenten laufen in den eigenen Demonstrations-Orgs des Autors. Es gibt keine Kunden, und es wird keine fremde Org beschrieben. Beide Läufe stammen vom 31. Juli 2026 gegen Salesforce Summer '26.
TechnoStore Revenue Assistant
Zwei Aktionen, beide unterhalb der API-Version 67 und damit standardmäßig im Systemmodus. Für sechs Felder ist nachgewiesen, dass sie über den ausführenden Benutzer hinaus erreichbar sind; eines davon trägt die org-eigene Compliance-Kennzeichnung. Eine Operation konnte überhaupt nicht aufgelöst werden — deshalb ist die vierte Zahl nicht null.
Aksu Index: 6 nachgewiesen, davon 1 mit den org-eigenen Compliance-Kennzeichnungen; 0 nicht nachgewiesene Grenzen; 1 ungeklärt.
Aksu Index: 6 proven (1 GDPR) · 0 unproven boundaries · 1 unresolved
- actions
- 2
- legacy
- 2 / 2 pre-v67
- fields
- 8 reachable
- fingerprint
- 09789b487c84
HW Energy Agent
Neun Aktionen, keine unterhalb der API-Version 67. Für kein Feld ist nachgewiesen, dass es über den ausführenden Benutzer hinaus erreichbar wäre. Zwei Operationen verwenden dynamisches SOQL, ihre Reichweite konnte daher überhaupt nicht bestimmt werden.
Aksu Index: 0 nachgewiesen, davon 0 mit den org-eigenen Compliance-Kennzeichnungen; 0 nicht nachgewiesene Grenzen; 2 ungeklärt.
Aksu Index: 0 proven (0 GDPR) · 0 unproven boundaries · 2 unresolved
- actions
- 9
- legacy
- 0 / 9 pre-v67
- fields
- 4 reachable
- fingerprint
- 464add656d38
HerkunftAnalyzer-Fingerabdruck d3a0cb4d683c · Parser 5.1.0. Der Fingerabdruck je Bericht benennt, welches Werkzeug welche Zahl erzeugt hat; siehe Abschnitt 07.
Spezifikation §4, wortgetreu
Sechs Aussagen, die der Index nicht trifft. Sie sind unverändert aus §4 der Spezifikation übernommen.
- 01
It counts fields, never records. Record-level visibility is sharing-dependent; the honest answer is “run as the user to measure”, so the record axis is disclosed in prose (PS501) and never as a number in the Index.
Er zählt Felder, nie Datensätze. Datensatzsichtbarkeit hängt vom Sharing ab; die ehrliche Antwort lautet, als dieser Benutzer zu messen.
- 02
Org row counts are context, not the Index. A COUNT() is an upper bound — “could reach up to N rows”, never “reaches N”.
Zeilenzahlen der Org sind Kontext, nicht der Index. Ein COUNT() ist eine obere Schranke — „kann bis zu N Zeilen erreichen“, nie „erreicht N“.
- 03
Index = 0 with U > 0 is not clean. It is “0 proven, U unresolved”, and must be said that way.
Index = 0 bei U > 0 ist nicht unbedenklich. Es heißt „0 nachgewiesen, U ungeklärt“ und muss so gesagt werden.
- 04
It measures authority, not behaviour. The Index says what the code chain can reach as built — not what the agent has done in any conversation.
Er misst Berechtigungsreichweite, nicht Verhalten. Er sagt, was die Codekette erreichen kann — nicht, was der Agent in irgendeinem Gespräch getan hat.
- 05
It is not a certificate. It is evidence for a security review / DPIA, produced statically, with zero agent invocations and zero Flex Credits.
Er ist kein Zertifikat. Er ist Nachweismaterial für eine Sicherheitsprüfung oder eine Datenschutz-Folgenabschätzung, statisch erzeugt, ohne einen einzigen Agentenaufruf.
- 06
It is version-bound. A number is comparable only under the same tool version; the report's fingerprint (a sha256 over the rule/extractor source, parser version, analysis coverage, backend, and each class's own apiVersion) says exactly which tool produced it.
Er ist versionsgebunden. Eine Zahl ist nur unter derselben Werkzeugversion vergleichbar; der Fingerabdruck des Berichts nennt genau, welches Werkzeug sie erzeugt hat.
Spezifikation §7
Die Messung wird veröffentlicht, damit eine Zahl von Menschen geprüft werden kann, die sie nicht erzeugt haben. Das Verfahren ist kurz.
Same org state + same running user + same tool version ⇒ byte-identical reports (proven live: two runs, equal sha256). To verify a Index someone quotes: run the tool twice on the same inputs, hash both outputs, compare fingerprints. The live COUNT() context lines are outside the deterministic fingerprint and say so.Verfahren
- 01
Die drei Eingaben festhalten, von denen die Zahl abhängt: Org-Zustand, ausführender Benutzer und Werkzeugversion.
- 02
Die Analyse zweimal auf genau diesen Eingaben ausführen.
- 03
Beide Ausgaben hashen. Bytegleiche Berichte ergeben gleiche Hashes; alles andere bedeutet, dass sich eine der drei Eingaben bewegt hat.
- 04
Den Fingerabdruck im Bericht mit dem Fingerabdruck vergleichen, der zur Zahl zitiert wurde. Eine Zahl ist nur unter der Werkzeugversion vergleichbar, die ihr Fingerabdruck nennt.
- 05
Die live erhobenen Zeilenzahl-Kontextzeilen gesondert lesen. Sie liegen außerhalb des deterministischen Fingerabdrucks und sagen das auch, denn ein COUNT() ist eine obere Schranke, und eine obere Schranke ist keine Messung.
Methode
Spezifikation §5
Verdichtet aus §5 der Spezifikation — genug, dass eine Implementierung ihr folgen kann, und genug, dass eine Leserin erkennt, was zutreffen müsste, damit eine Zahl falsch wäre.
- 01
Resolve execution semantics — per operation — the precedence law above, on both axes separately: enforces_fls (object CRUD + field security) and enforces_sharing (record visibility). Each is True / False / None = undetermined, and None is reported, never assumed safe.
- 02
Extract reach — SOQL (subqueries are reads of their own), SOSL, DML, async hand-offs (Queueable/Batch/@future, EventBus.publish as a write), trigger cascades, Flow runInMode, prompt-template merges — via two backends (AST and regex) feeding the same precedence core.
- 03
Resolve the user — effective permissions from a snapshot: profile + permission sets + PSG aggregates (muting measured to apply).
- 04
Intersect with the org's own compliance labels — (FieldDefinition.ComplianceGroup), including single-target relationship fields; polymorphic lookups are honestly skipped.
- 05
Subtract and classify — into P / C / B / U per §3.
Spezifikation §9 · Messungen in der Org
Das Vorrangprinzip, auf dem die Methode beruht, ist in einer echten Org gemessen und nicht aus Dokumentation abgeleitet. Wo Dokumentation und laufende Org sich widersprachen, wurde der Org geglaubt.
Aus §9 der Spezifikation
- The escalation is real: the same read, system mode vs user mode — 5 records vs 0, at both the CRUD and the sharing layer (E1).
- The version cliff is real: identical without sharing source — v58 reads 5, v67 reads 0, and at v67 the FLS read is BLOCKED, not silently stripped (E2, E2b).
- The headline case is real: a GDPR-labelled field, invisible to the running user, reaching the model (PS506) — found by intersection with the org's own compliance labels, not by our opinion of what is sensitive.
Die Messungen in der Org
Sechzehn Experimente sind verzeichnet. Fünfzehn lieferten ein Ergebnis; eines (E12, Eingaben von Formelfeldern) ließ sich nicht ausbringen und wird als offen ausgewiesen, nicht als Befund.
| Kennung | was gemessen wurde | Ergebnis |
|---|---|---|
| E1 | System-mode read versus user-mode read, on both axes. | 5 records vs 0 |
| E2 | The same without sharing source at two API versions. Also: no declaration is not the same as without sharing. | v58 = 5, v67 = 0 |
| E2b | The two-axis proof at v67: the record axis enforced, and the FLS read blocked rather than silently stripped. | 0 rows; read BLOCKED |
| E3 | WITH USER_MODE on a without sharing class. The operation clause beats the declaration. | 0 |
| E4 | FieldDefinition.ComplianceGroup is readable without cost, but the query must be bounded per EntityDefinition, and FieldDefinition is itself FLS-gated. | — |
| E5 | Flow runInMode is declarative and static, so Flow actions are analysable without parsing Apex. | — |
| E6 | A trigger's DML runs in the mode of the trigger's own apiVersion. The v58 half of a matched pair with E13. | v58 child write lands |
| E7 | Agent Script apex:// syntax is vendor-validated. | sf agent validate → success |
| E8 | Permission Set Groups: the platform-computed aggregate's ObjectPermissions equalled the union of its components. | exact match |
| E9 | Muting is applied by the aggregate, and the runtime agrees: WITH USER_MODE is blocked while a pre-v67 class still reads the muted value. | aggregate has no row |
| E10 | Three pre-v67 invocables differing only in the sharing declaration, same caller, same admin-owned rows on a Private object. | without sharing = 5, no declaration = 0, with sharing = 0 |
| E11 | Platform-event publish by a user holding no ObjectPermissions row at all. | v58 publish lands, v67 publish blocked |
| E12 | Formula-field inputs. The fixture that would settle whether a formula carries a value past the running user's FLS could not be deployed. Reported as open, not as a result. | BLOCKED — not measured |
| E13 | A v67 trigger's own DML is bounded by the running user. Re-measured with controls on 2026-08-04; the org named the child entity and the trigger's own line in the exception. | v58 writes / v67 blocks |
| E14 | WITH SECURITY_ENFORCED does not compile at v67, with the v66 control. Same source, only the apiVersion differs. | v66 deploys / v67 fails |
| E15 | The record axis inside a trigger body, read two ways: a plain read (which reads the operation's mode) and WITH SYSTEM_MODE (which exposes the ambient context). | v58: PLAIN=5 SYS=5 · v67: PLAIN=0 SYS=5 |
| E16 | A trigger body does not inherit its caller's sharing declaration, in the form an Apex caller can express. Three call shapes at two versions. | all six readings identical |
Eine Referenzimplementierung existiert — Agent Blast Radius — und sie hat die beiden durchgerechneten Beispiele in Abschnitt 05 erzeugt. Sie wird gegen einen gesondert veröffentlichten Korpus bewertet, den Agent Authority Benchmark v1.1 vom 19. August 2026: 28 Apex-Fälle, davon 21 durch eine echte Org entschieden und 7 als nicht entscheidbar gekennzeichnet. Die Spezifikation wird unabhängig davon veröffentlicht, damit eine von ihr erzeugte Zahl gegen die Definition geprüft werden kann und nicht gegen das Werkzeug.
Spezifikation §8, wortgetreu
Dieses Dokument friert mit seiner ersten öffentlichen Referenz ein. Diese Referenz ist diese Seite.
- This specification freezes at its first public reference. After that, any change to §3 (the formula) or §4 (the non-claims) is a new major version, published side by side — an existing number is never silently redefined.
- The tool fingerprint identifies which specification version produced a number.
- Extensions that only add reporting (new sub-buckets, new labels) are minor versions and must not change P/C/B/U for an unchanged input.
Der Quelltext der Version 1.0 enthält Kennzahlen und eine Formulierung, die diese Seite nicht wiedergibt. Sie werden aufgeführt statt stillschweigend berichtigt: Eine Spezifikation, die sich selbst heimlich ändert, begeht genau den Fehler, den zu verhindern sie da ist — eine Ebene höher. Die Klauseln, die die Messung definieren — §1, §3, §4, §7 und §8 — sind nicht betroffen.
- Fundstelle · §9, third bullet
The source text describes one measured org as “all-v67 and reports clean”. Both halves are wrong and this page does not reproduce the sentence. The org in question measures 182 of 219 Apex files pre-v67 — only its agent's nine actions are v67 — and “clean” contradicts §4.3 of this same specification, which states that 0 proven with unresolved reach is not clean. The tool's own report prints that qualifier. Corrected in the source specification on 20 August 2026, before this page was published, so the two agree.
- Fundstelle · §6
The source text says “a 23-case labelled benchmark” and “in-org experiments (E1–E13)”. Both counts have moved: the corpus is 28 cases, and the experiment series runs to E16 with E2b as a sub-identifier and E12 blocked and unmeasured. The precision, recall and mutation figures it quotes still hold.
- Fundstelle · §9, third bullet (second figure)
The source text says “100 % pre-v67 across 106 classes”. The committed report says 113 of 113.
- Fundstelle · §7
The source sentence reads “To verify a Index someone quotes”. Reproduced here unaltered, because a normative sentence is not silently edited. The intended article is “an”.
- Fundstelle · closing line
The source file signs off as “Specification draft” while its own header states version 1.0, approved, and frozen at first public reference. The header governs.
Mustafa Aksu, Aksu Software.
Die Spezifikation des Aksu Index wird veröffentlicht, damit jede Zahl, die seinen Namen trägt, gegen eine Definition geprüft werden kann, über die ihr Autor im Augenblick des Zitierens keine Verfügungsgewalt hat.
Lizenz
Das Repository der Referenzimplementierung steht unter der MIT-Lizenz (Copyright © 2026 Mustafa Aksu), deren Rechteeinräumung die Software und die zugehörigen Dokumentationsdateien umfasst. Ob diese Spezifikation in der hier veröffentlichten Form unter jener Lizenz oder unter einer gesonderten Dokumentationslizenz steht, ist im Quellmaterial nicht angegeben. Die Lizenzlage ist daher noch zu klären und wird hier nicht behauptet.