Zum Inhalt springen
Zurück zu Tutorials

APIs pruefen und absichern mit dem OWASP API Security Top 10

Fortgeschritten · 1 hour 10 minutes · 14 Min. Lesezeit · Byte Smith ·

Bevor du beginnst

  • Ein API-Inventar oder zumindest Zugriff auf Quellcode-Repositories, API-Gateway-Konfigurationen und Service-Dokumentation
  • Dokumentation des Authentifizierungs- und Autorisierungsmodells fuer die zu pruefenden APIs
  • Eine Test- oder Staging-Umgebung, in der Sie Anfragen sicher wiedergeben koennen
  • Zugriffsprotokolle, Metriken oder Gateway-Telemetrie fuer die zu pruefenden APIs
  • Grundlegender Zugriff auf Quellcode oder OpenAPI-Spezifikationen

Was du lernen wirst

  • Ein echtes API-Inventar erstellen oder verifizieren, das oeffentliche, interne, Partner- und Schatten-APIs umfasst
  • Objekt-Level-, Funktions-Level- und Tenant-Level-Autorisierung effektiver pruefen
  • Eingabevalidierung, Schema-Durchsetzung und Mass-Assignment-artige Risiken ueberpruefen
  • Rate Limits, Missbrauchskontrollen und Kostenverstaerkungspfade pruefen
  • Sensible Datenexposition in Antworten, Logs, Debug-Routen und Drittanbieter-Aufrufen finden
  • Audit-Ergebnisse in einen priorisierten Behebungsplan umwandeln, den Ihr Team tatsaechlich umsetzen kann
1
2
3
4
5
6
7
8
9
Auf dieser Seite

API-Sicherheit ist immer noch einer der schnellsten Wege, kompromittiert zu werden, weil APIs Geschaeftsfunktionen, Objekt-Identifikatoren, privilegierte Aktionen und sensible Daten auf eine Weise exponieren, die leicht im grossen Massstab automatisiert werden kann. Ein kleiner Autorisierungsfehler an einem Endpunkt kann oft ueber Tausende von IDs, Tenants oder Objekten repliziert werden. Deshalb sollte ein API-Review nicht bei “wir verwenden OAuth” oder “das Gateway hat Auth aktiviert” aufhoeren.

Moderne AI- und SaaS-Integrationen verschlimmern das Problem. Viele Teams nutzen mittlerweile Drittanbieter-APIs, als waeren sie vertrauenswuerdige interne Systeme, leiten AI-Prompts und -Ergebnisse durch API-Schichten und fuegen Partner-spezifische oder Beta-Endpunkte schneller hinzu, als das Inventar mithalten kann. Diese Kombination erzeugt genau die Art von Problemen, die OWASP bei unsachgemaessem Inventarmanagement, uneingeschraenktem Ressourcenverbrauch und unsicherer Nutzung von APIs hervorhebt.

Dieses Tutorial gibt Ihnen einen praktischen Audit-Workflow basierend auf den OWASP API Security Top 10. Sie werden ein nutzbares API-Inventar erstellen, Autorisierung und Tenant-Grenzen ueberpruefen, Schema- und Missbrauchskontrollen inspizieren, nach Datenexposition suchen, die betriebliche Sicherheit ueberpruefen und dann die Ergebnisse in einen Behebungsplan umwandeln, der die groessten Risiken zuerst behebt.

Schritt 1: API-Inventar erstellen oder verifizieren

Beginnen Sie nicht mit Schwachstellen-Scanning. Beginnen Sie mit Sichtbarkeit. Wenn Sie nicht wissen, welche APIs existieren, wem sie gehoeren, welche Version live ist und wer sie erreichen kann, befinden Sie sich bereits im API9-Territorium.

Inventarisieren Sie oeffentliche, interne, Partner- und Schatten-APIs

Erstellen Sie eine einzelne Inventardatei, die diese Fragen fuer jede API-Oberflaeche beantwortet:

  • Was ist der Hostname oder Basispfad?
  • Ist sie oeffentlich, intern, nur fuer Partner oder unbekannt?
  • Wer ist der Eigentuemer?
  • Welches Auth-Modell verwendet sie?
  • In welcher Umgebung befindet sie sich?
  • Gibt es einen dokumentierten Deprecation-Plan?

File: api-inventory.csv

service,base_url,audience,owner,environment,auth,openapi_spec,current_version,status
payments-api,https://api.example.com/payments,public,payments-team,production,oauth2,openapi/payments.yaml,v2,active
admin-api,https://admin-api.internal.example.com,internal,platform-team,production,jwt-rbac,openapi/admin.yaml,v1,active
partner-orders,https://partners.example.com/orders,partner,bizops-team,production,api-key-plus-hmac,openapi/partner-orders.yaml,v1,active
legacy-beta,https://beta-api.example.com,unknown,unknown,production,unknown,missing,v0,investigate

Ziehen Sie Inventar aus Code und Traffic, nicht nur aus Dokumentation

Dokumentation ist ein Ausgangspunkt, nicht die Wahrheit. Um undokumentierte oder veraltete Endpunkte zu finden, kombinieren Sie Quellcode-Suche und Zugriffsprotokolle.

Beispiel Quellcode-Suche:

grep -R "router\.\|app\.\|@RequestMapping\|@GetMapping\|@PostMapping" ./services
grep -R "openapi\|swagger" ./services

Beispiel log-abgeleitetes Inventar aus JSON-Zugriffsprotokollen:

jq -r '.host + "," + .method + "," + .path' access.log \
  | sort -u \
  | tee observed-routes.csv

Wenn Ihr Gateway Route-IDs oder Upstream-Service-Namen protokolliert, extrahieren Sie diese ebenfalls.

Markieren Sie Schatten- und veraltete APIs explizit

Ein echtes Audit braucht einen Bereich fuer Endpunkte, die Sie noch nicht vollstaendig verstehen. Zwingen Sie sie nicht in “intern” oder “sicher”, nur damit die Tabelle sauberer aussieht.

Erstellen Sie ein Review-Arbeitsblatt:

File: shadow-api-review.md

# Shadow API Review

## beta-api.example.com
- Owner: unknown
- Environment: production
- OpenAPI spec: missing
- Auth model: unknown
- Last seen in traffic: 2026-03-08
- Public DNS: yes
- Action: classify or remove within 7 days

Inventarisieren Sie Versionen und Datenfluesse

Inventarisieren Sie nicht nur Hostnamen. Verfolgen Sie auch Versionen und Datenfreigabepfade.

File: api-data-flows.yaml

payments-api:
  inbound_clients:
    - web-app
    - mobile-app
  outbound_dependencies:
    - tax-provider
    - fraud-provider
  sensitive_data:
    - customer-name
    - partial-card-metadata
    - billing-address

partner-orders:
  inbound_clients:
    - reseller-a
    - reseller-b
  outbound_dependencies:
    - warehouse-api
  sensitive_data:
    - customer-email
    - shipping-address
Tipp
Wenn Sie nicht schnell beantworten koennen “welche APIs sind oeffentlich, welche sind nur fuer Partner und welche Versionen sind noch live”, ist Ihre erste Massnahme Inventar, nicht Penetrationstests.

Sie sollten nun ein funktionierendes API-Inventar mit echten Routen, Zielgruppen, Versionen, Eigentuemern und Datenfluessen haben.

Schritt 2: Auth und Autorisierung pruefen

Dies ist der ertragreichste Teil des Audits. Die groessten API-Verletungen kommen normalerweise von fehlenden oder inkonsistenten Autorisierungspruefungen, nicht von exotischen Payloads.

Pruefen Sie Objekt-Level-Autorisierung

Objekt-Level-Autorisierung fragt: Kann dieser Aufrufer auf dieses spezifische Objekt zugreifen?

Wenn Ihre API einen Datensatz aus einer vom Benutzer angegebenen ID, UUID, Slug oder Fremdschluessel laedt, benoetigen Sie eine Eigentums- oder Policy-Pruefung nach dem Laden und vor der Rueckgabe oder Mutation des Objekts.

File: src/middleware/ownership.ts

import { Request, Response, NextFunction } from "express";

export function requireAccountOwnership(
  fetchAccount: (accountId: string) => Promise<{ id: string; tenantId: string } | null>
) {
  return async (req: Request, res: Response, next: NextFunction) => {
    const accountId = req.params.accountId;
    const account = await fetchAccount(accountId);

    if (!account) {
      return res.status(404).json({ error: "Not found" });
    }

    if (account.tenantId !== req.auth?.tenantId) {
      return res.status(403).json({ error: "Forbidden" });
    }

    res.locals.account = account;
    next();
  };
}

Wenn Ihr Codepfad wie “ID aus Pfad lesen, Objekt laden, Objekt zurueckgeben” aussieht, aber nie Tenant oder Eigentum prueft, ist das ein Warnsignal.

Pruefen Sie Funktions-Level-Autorisierung

Funktions-Level-Autorisierung fragt: Kann dieser Aufrufer auf diese Funktion oder Aktion zugreifen?

Das schliesst Admin-Routen, Exporte, Bulk-Aktionen, Genehmigungsablaeufe und sensible Geschaeftsoperationen ein.

File: src/middleware/requireScope.ts

import { Request, Response, NextFunction } from "express";

export function requireScope(requiredScope: string) {
  return (req: Request, res: Response, next: NextFunction) => {
    const scopes = req.auth?.scopes ?? [];

    if (!scopes.includes(requiredScope)) {
      return res.status(403).json({ error: "Missing required scope" });
    }

    next();
  };
}

Und verwenden Sie es dann konsistent:

app.post(
  "/admin/users/:userId/suspend",
  requireScope("admin:user:suspend"),
  suspendUserHandler
);

Pruefen Sie Tenant-Trennung

Multi-Tenant-APIs sollten sich nicht nur auf eine vom Client uebermittelte Tenant-ID verlassen. Der Tenant-Kontext sollte aus verifizierten Auth-Claims oder serverseitigem Lookup kommen, nicht aus einem beliebigen Header, den der Client aendern kann.

Schlechtes Muster:

const tenantId = req.headers["x-tenant-id"];

Besseres Muster:

const tenantId = req.auth?.tenantId;

Verifizieren Sie dann, dass jeder Datenzugriffspfad durch diesen Tenant eingeschraenkt ist.

Pruefen Sie Token-Scope, Audience und Ablauf

Beantworten Sie fuer jeden Auth-Mechanismus:

  • Hat der Token eine Audience-Pruefung?
  • Sind Scopes oder Rollen eng genug?
  • Ist der Ablauf vernuenftig?
  • Werden Refresh-Tokens separat behandelt?
  • Kann ein Token sowohl auf oeffentliche als auch auf Admin-APIs zugreifen?

Erstellen Sie eine einfache Auth-Matrix:

File: auth-matrix.yaml

payments-api:
  auth_type: oauth2-jwt
  audience: payments-api
  scopes:
    - payments:read
    - payments:write
  admin_scopes:
    - payments:refund
  max_access_token_lifetime_minutes: 15

admin-api:
  auth_type: internal-jwt
  audience: admin-api
  scopes:
    - admin:users:read
    - admin:users:suspend
  max_access_token_lifetime_minutes: 10
Warnung
“Authentifiziert” ist nicht dasselbe wie “autorisiert.” Fuer API-Audits gehen Sie davon aus, dass jeder Pfadparameter, jede Objekt-ID und jeder Aktionsendpunkt seine eigene Autorisierungsentscheidung benoetigt.

Sie sollten nun wissen, ob Ihre APIs Eigentum, aktionsbasierte Berechtigungen, Tenant-Grenzen und vernuenftige Token-Scope-Regeln durchsetzen.

Schritt 3: Eingabeverarbeitung und Schema-Kontrollen pruefen

In diesem Schritt finden Sie Mass-Assignment-artige Bugs, schwache Query-Validierung, unsicheres Parsing und Schema-Drift zwischen Dokumentation und tatsaechlichem Verhalten.

Validieren Sie Request-Bodies gegen ein Schema

Verlassen Sie sich nicht auf handgeschriebene if-Anweisungen, die ueber Controller verteilt sind. Verwenden Sie explizite Request-Schemas fuer Body, Pfadparameter und Query-Parameter.

File: src/validation/updateProfile.ts

import { z } from "zod";

export const updateProfileSchema = z.object({
  displayName: z.string().min(1).max(80),
  marketingOptIn: z.boolean().optional(),
});

File: src/middleware/validateBody.ts

import { AnyZodObject } from "zod";
import { Request, Response, NextFunction } from "express";

export function validateBody(schema: AnyZodObject) {
  return (req: Request, res: Response, next: NextFunction) => {
    const result = schema.safeParse(req.body);

    if (!result.success) {
      return res.status(400).json({
        error: "Invalid request body",
        details: result.error.flatten(),
      });
    }

    req.body = result.data;
    next();
  };
}

Verhindern Sie Objekt-Property-Uebergriffe

Lassen Sie nur bekannte Properties durch. Binden Sie nicht beliebiges JSON direkt an ORM-Modelle oder Update-Objekte.

Schlechtes Muster:

await userRepository.update(req.params.userId, req.body);

Besseres Muster:

const allowed = {
  displayName: req.body.displayName,
  marketingOptIn: req.body.marketingOptIn,
};

await userRepository.update(req.params.userId, allowed);

Validieren Sie Query-Parameter und Paginierung

Query-Parameter sind auch Teil der Angriffsflaeche. Erzwingen Sie Bereiche und Defaults.

File: src/validation/listOrdersQuery.ts

import { z } from "zod";

export const listOrdersQuerySchema = z.object({
  limit: z.coerce.number().int().min(1).max(100).default(25),
  offset: z.coerce.number().int().min(0).default(0),
  status: z.enum(["pending", "paid", "failed"]).optional(),
});

Pruefen Sie Deserialisierungs- und Parser-Verhalten

Markieren Sie jeden Endpunkt, der:

  • rohe serialisierte Objekte ohne Schemavalidierung akzeptiert
  • dynamisch Operatoren oder Feldnamen aus JSON interpretiert
  • GraphQL-Queries mit schwachen Komplexitaetskontrollen akzeptiert
  • unsichere Dateiformate oder Dokumenttransformationen akzeptiert

Gleichen Sie OpenAPI mit dem Live-Verhalten ab

Wenn Ihre OpenAPI-Spec sagt, dass nur displayName beschreibbar ist, der Endpunkt aber tatsaechlich isAdmin, tenantId oder accountBalance akzeptiert, haben Sie eine Spec-zu-Runtime-Luecke.

Ein sicherer Request-Schema-Ausschnitt sieht so aus:

File: openapi/profile.yaml

paths:
  /v1/me/profile:
    patch:
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              properties:
                displayName:
                  type: string
                  maxLength: 80
                marketingOptIn:
                  type: boolean
Hinweis
additionalProperties: false ist eine der einfachsten Moeglichkeiten, versehentliche Property-Level-Exposition zu reduzieren, wenn Ihr Tooling und Ihre Runtime es unterstuetzen.

Sie sollten nun wissen, ob Ihre API Request-Schemas durchsetzt, beschreibbare Properties einschraenkt, Query-Parameter begrenzt und das Runtime-Verhalten mit dem dokumentierten Vertrag uebereinstimmt.

Schritt 4: Rate-Limiting und Missbrauchskontrollen pruefen

Hier ueberpruefen Sie sowohl klassischen API-Missbrauch als auch moderne Kostenverstaerkungspfade. Nicht jeder Missbrauchsfall ist Brute Force. Einige sind Paginierungsmissbrauch, Bulk-Export-Missbrauch, OTP-Flooding, AI-Token-Spend-Missbrauch oder Partner-Workflow-Automatisierung.

Erstellen Sie routenbasierte Rate-Profile

Wenden Sie nicht ein globales Limit auf alles an. Verschiedene Endpunkte brauchen verschiedene Kontrollen.

File: rate-limit-profile.yaml

routes:
  /v1/auth/login:
    limit_per_minute: 5
    burst: 2
    key: ip_plus_username
  /v1/password/reset:
    limit_per_hour: 3
    key: account_identifier
  /v1/orders/search:
    limit_per_minute: 30
    burst: 10
    key: token_subject
  /v1/ai/generate:
    limit_per_minute: 10
    burst: 2
    key: tenant_id

Fuegen Sie implementierungsbasierte Limits hinzu

File: src/middleware/rateLimit.ts

import rateLimit from "express-rate-limit";

export const loginRateLimit = rateLimit({
  windowMs: 60 * 1000,
  max: 5,
  standardHeaders: true,
  legacyHeaders: false,
  keyGenerator: (req) => `${req.ip}:${req.body.username ?? "unknown"}`,
});

Pruefen Sie Enumerationsschutz

Pruefen Sie, ob Angreifer kostenguenstig enumerieren koennen:

  • Benutzer-IDs
  • Konto-IDs
  • Rechnungs-IDs
  • E-Mail-Existenz
  • Passwort-Reset-Flows
  • Einladungs-Token
  • Partner-Datensaetze

Suchen Sie nach inkonsistenten 404- vs. 403-Antworten, Timing-Unterschieden und verschiedenen Fehlerkoerpern fuer “existiert” versus “existiert nicht.”

Pruefen Sie Bot- und Geschaeftsprozess-Missbrauch

Identifizieren Sie Flows mit hohem Geschaeftswert:

  • Gutscheinerstellung
  • Testkontoerstellung
  • Geschenkkarten-Einloesung
  • Massen-Downloads
  • Seat-Zuweisung
  • AI-Generierungsendpunkte
  • OTP- oder E-Mail-Sendeendpunkte

Fuegen Sie Kontrollen wie diese hinzu:

  • routenspezifische Quoten
  • Idempotenz-Keys
  • CAPTCHA oder Challenge bei oeffentlichen Flows
  • Workflow-Anomalie-Alerts
  • Queuing fuer teure asynchrone Jobs

Pruefen Sie Kostenverstaerkungspfade

Moderne APIs leiten oft externe Kosten weiter:

  • SMS
  • E-Mail
  • Dokumenten-Rendering
  • AI-Inferenz
  • Geocoding
  • Betrugsermittlung

Wenn eine Route pro Anfrage Geld verbrennen kann, braucht sie strengere Kontrollen als ein normaler Nur-Lese-Endpunkt.

Warnung
Missbrauchskontrollen betreffen nicht nur Verfuegbarkeit. Sie schuetzen auch Geld, Partner-Quoten und teure Downstream-Systeme.

Sie sollten nun wissen, welche Endpunkte staerkere Burst-Kontrollen, Enumerationsschutz und kostenbewusste Quoten benoetigen.

Schritt 5: Sensible Datenexposition pruefen

Dieser Schritt faengt APIs ab, die technisch Auth erfordern, aber trotzdem zu viele Daten an den falschen Aufrufer, die falsche Log-Senke oder den falschen Downstream-Service exponieren.

Pruefen Sie Response-Feld-Exposition

Definieren Sie fuer jede sensible Ressource eine Response-Allowlist nach Rolle oder Zielgruppe.

File: src/serializers/customerSerializer.ts

type Customer = {
  id: string;
  email: string;
  fullName: string;
  internalRiskScore: number;
  billingAddress: string;
};

export function serializeCustomerForSelf(customer: Customer) {
  return {
    id: customer.id,
    email: customer.email,
    fullName: customer.fullName,
    billingAddress: customer.billingAddress,
  };
}

export function serializeCustomerForSupport(customer: Customer) {
  return {
    id: customer.id,
    email: customer.email,
    fullName: customer.fullName,
  };
}

Geben Sie nicht direkt volle ORM-Entities zurueck.

Redaktieren Sie Logs

Zugriffsprotokolle und App-Logs lecken oft Token, E-Mails, Kontonummern oder vollstaendige Request-Bodies. Redaktieren Sie vor dem Schreiben.

File: src/logging/redact.ts

export function redact(value: string): string {
  return value
    .replace(/Bearer\s+[A-Za-z0-9._-]+/g, "Bearer [REDACTED]")
    .replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi, "[REDACTED_EMAIL]");
}

Und loggen Sie standardmaessig nie sensible Bodies bei Auth-, Zahlungs- oder AI-Prompt-Routen.

Entfernen oder sichern Sie Debug-Endpunkte

Ueberpruefen Sie alle Routen wie:

  • /debug
  • /internal
  • /health/details
  • /graphql-playground
  • /swagger
  • /metrics
  • /__admin

Diese werden oft exponiert gelassen, weil sie “fuer Ops” sind, aber Produktionsexposition muss absichtlich und geschuetzt sein.

Pruefen Sie Drittanbieter-Weiterleitung

Wenn Ihre API Prompts, Payloads, Kundendaten oder Identifikatoren an externe SaaS-Anbieter weiterleitet, dokumentieren und validieren Sie diesen Flow explizit.

File: third-party-forwarding-review.yaml

dependency: external-ai-provider
forwarded_fields:
  - prompt
  - account_tier
  - locale
disallowed_fields:
  - raw_access_token
  - full_payment_card
  - national_id
response_validation: required
timeout_seconds: 15
Tipp
Sensible Datenexposition ist oft ein Serialisierungsproblem, nicht nur ein Verschluesselungsproblem. Ueberpruefen Sie, was jeder Endpunkt nach Rolle zurueckgibt, nicht nur ob der Endpunkt authentifiziert ist.

Sie sollten nun wissen, ob Ihre APIs zu viele Daten zurueckgeben, Informationen an Logs lecken, Debug-Oberflaechen exponieren oder mehr Daten als noetig an Drittanbieter weiterleiten.

Schritt 6: Betriebliche Sicherheit pruefen

Gute Code-Level-Kontrollen versagen trotzdem, wenn der API-Rand schlecht konfiguriert ist oder Sie Missbrauch nicht rechtzeitig erkennen koennen.

Pruefen Sie Gateway- und Reverse-Proxy-Kontrollen

Pruefen Sie fuer jeden API-Rand:

  • TLS ueberall, wo es sein sollte
  • nur erforderliche HTTP-Methoden exponiert
  • Body-Size-Limits
  • Request-Timeout- und Upstream-Timeout-Policy
  • Request-ID-Propagierung
  • Schemavalidierung, wo unterstuetzt
  • IP-Allowlists fuer Partner- oder Admin-APIs

Pruefen Sie Monitoring und Alerting

Verfolgen Sie mindestens:

  • 401- und 403-Spikes
  • 429-Spikes
  • Routenbasierte Latenz
  • Routenbasierte 5xx
  • Auth-Fehler nach Endpunkt
  • Hochvolumige Objekt-ID-Sweeps
  • Traffic zu veralteten Versionen
  • Ungewoehnliche Partner-Nutzung

Erstellen Sie eine kleine Metriken-Checkliste:

File: api-monitoring-checklist.md

# API Monitoring Checklist

- 401/403 dashboard per route
- 429 dashboard per route
- Token subject or tenant-based rate anomaly alerts
- Object enumeration detection on high-value routes
- Deprecated version traffic alerts
- Third-party dependency timeout alerts

Pruefen Sie Versionierung und Deprecation

Jede Version sollte haben:

  • einen Eigentuemer
  • eine Zielgruppe
  • ein End-of-Life-Datum
  • einen Deprecation-Kommunikationsplan
  • eine Traffic-Retirement-Pruefung

Sie koennen auch Deprecation- und Sunset-Header exponieren.

File: src/middleware/deprecation.ts

import { Request, Response, NextFunction } from "express";

export function markDeprecated(res: Response) {
  res.setHeader("Deprecation", "true");
  res.setHeader("Sunset", "Wed, 30 Sep 2026 23:59:59 GMT");
  res.setHeader("Link", '</docs/migrate-v2>; rel="deprecation"');
}

Pruefen Sie auch Partner- und interne APIs

Viele Organisationen machen einen anstaendigen Job bei oeffentlichen APIs und einen schwachen bei “nur internen” APIs. Interne, Partner- und Admin-Routen sollten trotzdem inventarisiert, versioniert, ueberwacht und geprueft werden.

Info
Eine versteckte API mit schwachem Monitoring ist oft gefaehrlicher als eine oeffentliche API mit starken Kontrollen, weil niemand darauf achtet.

Sie sollten nun wissen, ob der API-Rand gehaertet ist, ob Sie Missbrauch erkennen koennen und ob alte Versionen und versteckte Routen bewusst verwaltet werden.

Schritt 7: Ergebnisse in einen Behebungsplan umwandeln

Ein API-Audit ist nur dann relevant, wenn es zu Aenderungen fuehrt. Die besten Behebungsplaene trennen schnelle Risikoreduktion von Designarbeit, die mehr Zeit braucht.

Erfassen Sie Ergebnisse in einem strukturierten Format

File: api-audit-findings.yaml

findings:
  - id: API-001
    category: API1-BOLA
    service: payments-api
    endpoint: GET /v1/accounts/{accountId}
    severity: critical
    issue: Account lookup does not verify tenant ownership
    quick_fix: Add tenant-scoped query and authorization middleware
    owner: payments-team
    due_in_days: 7

  - id: API-002
    category: API3-BOPLA
    service: partner-orders
    endpoint: PATCH /v1/orders/{id}
    severity: high
    issue: Writable object accepts undocumented internal fields
    quick_fix: Add request schema with explicit allowlist
    owner: bizops-team
    due_in_days: 14

  - id: API-003
    category: API9-Inventory
    service: legacy-beta
    endpoint: unknown
    severity: high
    issue: Public beta host has no owner, no spec, and no retirement plan
    quick_fix: Remove public exposure or assign owner immediately
    owner: platform-team
    due_in_days: 3

Trennen Sie Quick Fixes von architektonischen Fixes

Gute Quick Fixes:

  • Eigentumspruefungen hinzufuegen
  • fehlende Scope-Pruefungen hinzufuegen
  • Response-Felder einschraenken
  • Schemavalidierung hinzufuegen
  • Routen-Limits senken
  • Debug-Endpunkte deaktivieren
  • veraltete oeffentliche DNS oder Routing entfernen

Mittelfristige architektonische Fixes:

  • Authz in eine zentralisierte Policy-Schicht verschieben
  • Admin- und oeffentliche APIs trennen
  • Tenant-Isolation neu entwerfen
  • automatisierte Inventar-Erkennung erstellen
  • Admission- oder Gateway-Policy-Kontrollen hinzufuegen
  • Response-Serializer und Schema-Generierung standardisieren

Weisen Sie Eigentuemer und Faelligkeitsdaten zu

Jedes Ergebnis braucht:

  • ein verantwortliches Team
  • eine Schwere
  • einen Behebungsansatz
  • ein Zieldatum
  • eine Validierungsmethode

Testen Sie den Fix erneut

Ein Fix ist nicht abgeschlossen, bis Sie beweisen koennen, dass der Missbrauchspfad weg ist. Speichern Sie fuer jedes Ergebnis einen positiven und einen negativen Test.

File: tests/account-ownership.http

### Allowed: own tenant account
GET https://api.example.com/v1/accounts/acc_123
Authorization: Bearer {{tenant_a_token}}

### Blocked: another tenant account
GET https://api.example.com/v1/accounts/acc_999
Authorization: Bearer {{tenant_a_token}}

Haeufige Einrichtungsprobleme

Nur oeffentliche APIs auditieren

Teams pruefen oft das oeffentliche Gateway und ignorieren interne, Admin-, Partner-, Beta- und veraltete Oberflaechen. Das laesst einige der riskantesten Routen ausserhalb des Audits.

Annahme, dass Authentifizierung gleich Autorisierung ist

Ein gueltiger Token ist kein Beweis, dass der Aufrufer auf ein bestimmtes Objekt, Feld oder eine Funktion zugreifen sollte. Pruefen Sie Authz separat auf Objekt-, Feld-, Funktions- und Tenant-Ebene.

Schatten-APIs finden, aber nicht entfernen

Inventararbeit reduziert Risiken nur, wenn veraltete oder unbekannte APIs Eigentum, Schutz oder Loeschung erhalten. Eine Tabelle allein schliesst keine Exposition.

OpenAPI-Specs generieren, aber nicht durchsetzen

Eine Spec, die nicht an Validierung, Tests oder Review gebunden ist, kann driften, bis sie zur Dekoration wird. Bevorzugen Sie Schemavalidierung und Contract-Tests gegenueber dokumentationsbasierten Specs.

Einen Endpunkt reparieren statt das Muster

Wenn Sie ein kaputtes Objekt-Level-Autorisierungsproblem finden, suchen Sie nach demselben Zugriffsmuster in der gesamten Codebasis. API-Fehler wiederholen sich oft nach Framework, Serializer oder Repository-Muster.

Zusammenfassung

Ein starkes API-Audit beginnt mit Inventar und endet mit priorisierter Behebung. Der ertragreichste Review-Pfad ist normalerweise: alle API-Oberflaechen verifizieren, Objekt- und Funktionsautorisierung pruefen, Schemas und beschreibbare Properties einschraenken, Missbrauchskontrollen absichern, sensible Datenexposition reduzieren und dann betriebliche Luecken wie versteckte Versionen und schwaches Monitoring bereinigen.

Wiederholen Sie dieses Audit nach einem Zeitplan, nicht nur nach Vorfaellen. Ein praktischer Rhythmus ist vierteljaehrlich fuer risikoreiche APIs, nach groesseren Auth- oder Gateway-Aenderungen und wann immer Sie neue Partner-, SaaS- oder AI-abhaengige Integrationen hinzufuegen. Um das Inventar aktuell zu halten, binden Sie Route-Discovery an Code-Review, Gateway-Konfigurations-Aenderungen und Traffic-Telemetrie, statt sich nur auf Dokumentationsaktualisierungen zu verlassen.

Das Hauptziel ist nicht, “OWASP zu bestehen.” Es ist sicherzustellen, dass Ihre APIs schwer zu enumerieren, schwer zu missbrauchen, schwer zu uebernutzen und einfach zu verstehen und zu entfernen sind, wenn sie nicht mehr existieren sollten.