Skip to main content

DSL .sca-Referenz

Niveau Fortgeschritten
Lesezeit ⏱ 20 Min.
Wörter 1360
Themen custom-rulesdsl

DSL-.sca-Referenz — StaticCodeAudit von CodeFixture

Dieses Dokument beschreibt die vollständige Syntax der .sca-Regeldateien. Jede Datei definiert eine eigenständige Erkennungsregel.

1. Aufbau einer Regel

Eine .sca-Datei enthält genau eine Regel. Mindeststruktur:

rule mon_id_de_regle
  language  python
  severity  HIGH

  match
    pattern  mon_pattern_regex
  end

  risk
    en: English risk description
    fr: Description du risque en français
  end
  solution
    en: English fix
    fr: Correction en français
  end
end
Die rule_id muss in Kleinbuchstaben mit Unterstrichen geschrieben werden: [a-z0-9_]+

↑ Zurück zum Inhaltsverzeichnis

2. Schlüsselwörter der Regel

SchlüsselwortWertePflichtBeschreibung
languagepython, javascript, java, csharp, php, html, yaml, dockerfileerforderlichSprache des analysierten Codes
severityCRITICAL, HIGH, MEDIUM, LOW, INFOerforderlichSchweregrad des Findings
categorysecurity, arch, ui, ux, maintenance, cicdoptionalKategorie (Standard: security)
confidence0 bis 100optionalKonfidenz in % (Standard: 80)

↑ Zurück zum Inhaltsverzeichnis

3. match-Block (Mustererkennung)

Der match-Block definiert die im Code zu erkennenden Muster. Wiederholbar (mehrere Blöcke = ODER).

3.1 Schlüsselwörter des match-Blocks

SchlüsselwortTypBeschreibung
patternRegexZu suchender regulärer Ausdruck
textKlartextText wird automatisch escapt. * = Platzhalter (beliebig)
withRegexDer Kontext muss ebenfalls dieses Muster enthalten
with-textKlartextWie with, aber automatisch escapt
pattern-notRegexDer Kontext darf dieses Muster nicht enthalten
text-notKlartextWie pattern-not, aber escapt
scopeWertSuchbereich (siehe unten)

3.2 Scopes

ScopeVerhalten von patternVerhalten von pattern-not
lineZeile für Zeile geprüftAuf derselben Zeile geprüft
context-NAuf Fenstern von N Zeilen geprüftAuf dem gesamten N-Zeilen-Block geprüft
fileAuf der gesamten Datei geprüftAuf der gesamten Datei geprüft

3.3 text vs pattern

text — für alle Entwickler. Das Werkzeug escapt Sonderzeichen automatisch. Das * bedeutet „beliebig".

match
  text  .execute(
  with-text  f"*"
  scope  context-4
end

pattern — für Regex-Experten. Das Muster wird unverändert verwendet.

match
  pattern  \.execute\s*\(.*f["']
  scope  context-4
end

Beide Beispiele oben erkennen denselben Code.

↑ Zurück zum Inhaltsverzeichnis

4. requires-Block (Dateibedingungen)

Der requires-Block definiert Bedingungen für die Datei. Wird er allein verwendet (ohne match), liegt das Finding auf Dateiebene (Zeile 1). Wird er mit match kombiniert, dient er als Vorfilter.

SchlüsselwortLogikBeschreibungBeispiel
hasALLE müssen passenDer Dateiinhalt muss dieses Muster enthaltenhas @app\.route
not_hasKEINES darf passenDer Dateiinhalt darf dieses Muster NICHT enthaltennot_has logging
min_lines≥ NDie Datei muss mindestens N Zeilen habenmin_lines 500
path_containsMINDESTENS EINES muss passenDer Dateipfad muss dieses Segment enthaltenpath_contains vendor/
not_path_has_fileKEINES darf existierenDas Verzeichnis der Datei darf diese Datei NICHT enthaltennot_path_has_file LICENSE
has, not_has, path_contains und not_path_has_file sind wiederholbar (mehrere Zeilen = mehrere Bedingungen).

Beispiele

# Flask-Datei ohne Logging
requires
  has      @app\.route
  not_has  import\s+logging
end

# Datei zu lang
requires
  min_lines  500
end

# Vendor-Code ohne LICENSE
requires
  path_contains  vendor/
  not_path_has_file  LICENSE
  not_path_has_file  LICENSE.md
end

↑ Zurück zum Inhaltsverzeichnis

5. Taint-Analyse (source → sink)

Die Taint-Analyse verfolgt den Datenfluss von Sources (Benutzereingaben) zu Sinks (gefährlichen Funktionen), sofern kein Sanitizer dazwischengeschaltet ist.

SchlüsselwortSyntaxBeschreibung
sourcesource <regex> kind=<type>Ursprung der nicht vertrauenswürdigen Daten
sinksink <regex>Gefährliche Funktion, die die Daten empfängt
sanitizersanitizer <regex>Funktion, die die Daten neutralisiert

Source-Typen (kind=): http, stdin, cli, env, file, network

rule taint_sqli
  language  python
  severity  HIGH

  source  request\.args\.get\(   kind=http
  source  request\.form\[        kind=http
  source  input\s*\(             kind=stdin

  sink    \.execute\s*\(
  sink    \.executemany\s*\(

  sanitizer  \bint\s*\(
  sanitizer  psycopg2\.sql\.SQL
end

↑ Zurück zum Inhaltsverzeichnis

6. i18n-Blöcke (risk, solution, message)

Die Blöcke risk, solution, benefit und message unterstützen die Übersetzung in 4 Sprachen:

risk
  en: User input in SQL query allows injection.
  fr: Entrée utilisateur dans la requête SQL permet l'injection.
  es: Entrada de usuario en consulta SQL permite inyección.
  de: Benutzereingabe in SQL-Abfrage ermöglicht Injection.
end
Unterstützte Sprachcodes: en, fr, es, de. Der Bericht verwendet die in --lang konfigurierte Sprache.

↑ Zurück zum Inhaltsverzeichnis

7. metadata-Block (CWE, CVE, OWASP, ISO, WCAG)

metadata
  cwe       CWE-89
  cwe       CWE-90
  cve       CVE-2021-44228
  owasp     A03:2021
  iso27001  A.8.28 A.8.25
  asvs      5.3.4
  wcag      1.1.1
end
SchlüsselFormatBeschreibung
cweCWE-NNN (mehrere)Common Weakness Enumeration. Mehrere Werte über wiederholte Zeilen oder leerzeichengetrennte Tokens.
cveCVE-YYYY-NNNN (mehrere)Spezifische CVE, für die die Regel erstellt wurde. Wird als anklickbarer NVD-Link gerendert.
owaspANN:YYYYOWASP Top 10
iso27001A.N.NN (mehrere)ISO/IEC 27001:2022 Anhang A
asvsN.N.N (mehrere)OWASP ASVS
wcagN.N.N (mehrere)W3C-WCAG-2.1-Erfolgskriterium (von Barrierefreiheits-Regeln statt CWE verwendet).

Alle Schlüssel mit mehreren Werten (cwe, cve, iso27001, asvs, wcag) akzeptieren mehrere Tokens auf einer Zeile (cwe  CWE-89 CWE-90) oder wiederholte Zeilen — die Werte werden akkumuliert.

Die Metadaten-Klassifikation wird an alle Exporte weitergegeben: HTML (anklickbare Links), JSON (Objekt finding.compliance) und SARIF (rule.properties.tags).

↑ Zurück zum Inhaltsverzeichnis

8. Ausführungsmodi

Der Modus wird automatisch abgeleitet aus den vorhandenen Blöcken:

Vorhandene BlöckeAbgeleiteter Modus
match (pattern/text)regex
requires allein (has/not_has/min_lines)file_contains
match + requiresregex mit Datei-Vorfilter
source + sinktaint
source + sink + matchregex+taint
hookpython_hook (erweiterte Custom-Regeln)
Es ist nicht erforderlich, mode explizit anzugeben — die automatische Ableitung wird empfohlen.

↑ Zurück zum Inhaltsverzeichnis

9. Vollständige Beispiele

9.1 Einfache Erkennung (Klartext)

rule console_log_residual
  language  javascript
  severity  LOW
  category  ux

  match
    text  console.log(
  end

  risk
    en: console.log() calls left in production code.
    fr: Appels console.log() laissés en production.
  end
  solution
    en: Remove console.log() or use a logging system.
    fr: Supprimer les console.log() ou utiliser un système de logging.
  end
end

9.2 Pattern mit Ausschluss (context)

rule insecure_cookie
  language  python
  severity  MEDIUM

  match
    pattern  \.set_cookie\s*\(
    pattern-not  (?:httponly\s*=\s*True|secure\s*=\s*True)
    scope    context-4
  end

  risk
    en: Cookie without HttpOnly/Secure flags.
    fr: Cookie sans flags HttpOnly/Secure.
  end
  solution
    en: Add httponly=True, secure=True, samesite="Lax".
    fr: Ajouter httponly=True, secure=True, samesite="Lax".
  end
end

9.3 Nur Dateibedingung

rule file_too_long
  language  python
  severity  LOW
  category  arch

  requires
    min_lines  500
  end

  risk
    en: Very long files are difficult to maintain.
    fr: Les fichiers très longs sont difficiles à maintenir.
  end
  solution
    en: Split into smaller, focused modules.
    fr: Découper en modules plus petits et focalisés.
  end
end

9.4 Kombination match + requires

rule missing_auth_decorator
  language  python
  severity  MEDIUM

  match
    pattern  @app\.route\s*\(\s*[\"'](?:/admin|/api/delete)
    pattern-not  @login_required
    scope    context-4
  end

  risk
    en: Admin route without authentication decorator.
    fr: Route admin sans décorateur d'authentification.
  end
  solution
    en: Add @login_required on all sensitive routes.
    fr: Ajouter @login_required sur toutes les routes sensibles.
  end
end

9.5 Taint-Analyse (SQL-Injection)

rule taint_sqli
  language  python
  severity  HIGH
  confidence  90

  source  request\.args\.get\(  kind=http
  source  request\.form\[      kind=http
  sink    \.execute\s*\(
  sink    \.executemany\s*\(
  sanitizer  psycopg2\.sql\.SQL
  sanitizer  \bint\s*\(

  risk
    en: Tainted data flows into SQL query without parameterization.
    fr: Données non fiables atteignent une requête SQL sans paramétrage.
  end
  solution
    en: Use parameterized queries with placeholders (%s, ?).
    fr: Utilisez des requêtes paramétrées avec placeholders (%s, ?).
  end

  metadata
    cwe    CWE-89
    owasp  A03:2021
  end
end

9.6 Vendor-Governance-Prüfung

rule unreviewed_vendor_code
  language  python
  severity  LOW
  category  maintenance

  requires
    path_contains       vendor/
    path_contains       third-party/
    not_path_has_file   LICENSE
    not_path_has_file   NOTICE
  end

  risk
    en: Vendor code without LICENSE file.
    fr: Code tiers sans fichier LICENSE.
  end
  solution
    en: Add LICENSE file to vendor directories.
    fr: Ajouter un fichier LICENSE aux répertoires vendor.
  end
end

↑ Zurück zum Inhaltsverzeichnis

10. Glossar

BegriffDefinition
DSLDomain-Specific Language — eine Sprache zur Definition von Audit-Regeln
FindingVon einer Regel erkanntes Problem (Schwachstelle, Architekturfehler usw.)
PatternRegulärer Ausdruck oder Klartext, der im Code gesucht wird
ScopeSuchbereich: Zeile, Block aus N Zeilen oder ganze Datei
SourceEingabe nicht vertrauenswürdiger Daten (HTTP-Anfrage, Tastatureingabe usw.)
SinkGefährliche Funktion, in die nicht vertrauenswürdige Daten ohne Validierung nicht gelangen dürfen
SanitizerFunktion, die gefährliche Daten neutralisiert (Escaping, Validierung, Konvertierung)
TaintMarkierung von Daten als „kontaminiert", um ihre Ausbreitung im Code zu verfolgen
CWECommon Weakness Enumeration — Katalog von Software-Schwächen
OWASPOpen Web Application Security Project — Top 10 der Risiken bei der Web-Sicherheit
ASVSApplication Security Verification Standard — Verifikationsstufen der Sicherheit
ISO 27001Internationale Norm für das Management der Informationssicherheit
SASTStatic Application Security Testing — Sicherheitsanalyse ohne Ausführung des Codes

↑ Zurück zum Inhaltsverzeichnis


StaticCodeAudit — CodeFixture | DSL-Dokumentation v1.0