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
rule_id muss in Kleinbuchstaben mit Unterstrichen geschrieben werden: [a-z0-9_]+↑ Zurück zum Inhaltsverzeichnis
2. Schlüsselwörter der Regel
| Schlüsselwort | Werte | Pflicht | Beschreibung |
|---|---|---|---|
language | python, javascript, java, csharp, php, html, yaml, dockerfile | erforderlich | Sprache des analysierten Codes |
severity | CRITICAL, HIGH, MEDIUM, LOW, INFO | erforderlich | Schweregrad des Findings |
category | security, arch, ui, ux, maintenance, cicd | optional | Kategorie (Standard: security) |
confidence | 0 bis 100 | optional | Konfidenz 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üsselwort | Typ | Beschreibung |
|---|---|---|
pattern | Regex | Zu suchender regulärer Ausdruck |
text | Klartext | Text wird automatisch escapt. * = Platzhalter (beliebig) |
with | Regex | Der Kontext muss ebenfalls dieses Muster enthalten |
with-text | Klartext | Wie with, aber automatisch escapt |
pattern-not | Regex | Der Kontext darf dieses Muster nicht enthalten |
text-not | Klartext | Wie pattern-not, aber escapt |
scope | Wert | Suchbereich (siehe unten) |
3.2 Scopes
| Scope | Verhalten von pattern | Verhalten von pattern-not |
|---|---|---|
line | Zeile für Zeile geprüft | Auf derselben Zeile geprüft |
context-N | Auf Fenstern von N Zeilen geprüft | Auf dem gesamten N-Zeilen-Block geprüft |
file | Auf der gesamten Datei geprüft | Auf 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üsselwort | Logik | Beschreibung | Beispiel |
|---|---|---|---|
has | ALLE müssen passen | Der Dateiinhalt muss dieses Muster enthalten | has @app\.route |
not_has | KEINES darf passen | Der Dateiinhalt darf dieses Muster NICHT enthalten | not_has logging |
min_lines | ≥ N | Die Datei muss mindestens N Zeilen haben | min_lines 500 |
path_contains | MINDESTENS EINES muss passen | Der Dateipfad muss dieses Segment enthalten | path_contains vendor/ |
not_path_has_file | KEINES darf existieren | Das Verzeichnis der Datei darf diese Datei NICHT enthalten | not_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üsselwort | Syntax | Beschreibung |
|---|---|---|
source | source <regex> kind=<type> | Ursprung der nicht vertrauenswürdigen Daten |
sink | sink <regex> | Gefährliche Funktion, die die Daten empfängt |
sanitizer | sanitizer <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
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üssel | Format | Beschreibung |
|---|---|---|
cwe | CWE-NNN (mehrere) | Common Weakness Enumeration. Mehrere Werte über wiederholte Zeilen oder leerzeichengetrennte Tokens. |
cve | CVE-YYYY-NNNN (mehrere) | Spezifische CVE, für die die Regel erstellt wurde. Wird als anklickbarer NVD-Link gerendert. |
owasp | ANN:YYYY | OWASP Top 10 |
iso27001 | A.N.NN (mehrere) | ISO/IEC 27001:2022 Anhang A |
asvs | N.N.N (mehrere) | OWASP ASVS |
wcag | N.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öcke | Abgeleiteter Modus |
|---|---|
match (pattern/text) | regex |
requires allein (has/not_has/min_lines) | file_contains |
match + requires | regex mit Datei-Vorfilter |
source + sink | taint |
source + sink + match | regex+taint |
hook | python_hook (erweiterte Custom-Regeln) |
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
| Begriff | Definition |
|---|---|
| DSL | Domain-Specific Language — eine Sprache zur Definition von Audit-Regeln |
| Finding | Von einer Regel erkanntes Problem (Schwachstelle, Architekturfehler usw.) |
| Pattern | Regulärer Ausdruck oder Klartext, der im Code gesucht wird |
| Scope | Suchbereich: Zeile, Block aus N Zeilen oder ganze Datei |
| Source | Eingabe nicht vertrauenswürdiger Daten (HTTP-Anfrage, Tastatureingabe usw.) |
| Sink | Gefährliche Funktion, in die nicht vertrauenswürdige Daten ohne Validierung nicht gelangen dürfen |
| Sanitizer | Funktion, die gefährliche Daten neutralisiert (Escaping, Validierung, Konvertierung) |
| Taint | Markierung von Daten als „kontaminiert", um ihre Ausbreitung im Code zu verfolgen |
| CWE | Common Weakness Enumeration — Katalog von Software-Schwächen |
| OWASP | Open Web Application Security Project — Top 10 der Risiken bei der Web-Sicherheit |
| ASVS | Application Security Verification Standard — Verifikationsstufen der Sicherheit |
| ISO 27001 | Internationale Norm für das Management der Informationssicherheit |
| SAST | Static Application Security Testing — Sicherheitsanalyse ohne Ausführung des Codes |
↑ Zurück zum Inhaltsverzeichnis
StaticCodeAudit — CodeFixture | DSL-Dokumentation v1.0