
Outil d'analyse statique de code sensible au framework pour une revue automatisée du code source avec des règles spécifiques à la plateforme, analyse de flux de données (taint), estimation d'effort, et lignes de base de suppression.
Author:
## À propos de Daksh SCRA
L'outil Daksh SCRA (Source Code Review Assist) est conçu pour améliorer l'efficacité du processus de revue de code source, offrant une approche bien structurée et organisée pour les réviseurs de code.
Plutôt que de signaler indiscriminément tout comme un problème potentiel, Daksh SCRA favorise une analyse réfléchie, incitant à enquêter et à confirmer les problèmes potentiels. Cette approche réduit la précipitation à étiqueter chaque préoccupation potentielle comme un bogue, limitant ainsi la confusion et le temps perdu sur les faux positifs.
## Début
Daksh SCRA a été initialement présenté lors d'une session de formation sur la revue de code source à Black Hat USA 2022 (6-9 août), où il a été présenté subtilement à un public spécifique. Ses débuts officiels publics ont eu lieu à Black Hat USA 2023 à Las Vegas.
## Fonctionnalités et Capacités
### Caractéristiques Distinctives
- **Identifie les zones d'intérêt dans le code source :** Encourage une enquête et une confirmation ciblées plutôt que d'étiqueter indistinctement tout comme un bogue.
- **Identifie les zones d'intérêt dans les chemins de fichiers (Première mondiale) :** Reconnaît les motifs dans les chemins de fichiers pour cibler les sections pertinentes à examiner.
- **Reconnaissance au niveau logiciel pour identifier les technologies utilisées :** Identifie les technologies du projet, permettant aux réviseurs de code de mener des analyses précises avec des règles appropriées.
- **Estimation scientifique automatisée de l'effort pour la revue de code (Première mondiale) :** Fournit une approche mesurable pour estimer les efforts nécessaires à un processus de revue de code.
- **Analyse sensible au framework :** Applique automatiquement les règles spécifiques au framework lorsque le framework du projet est détecté.
- **Rapports d'analyse de contamination :** Rapports de flux de contamination HTML par plateforme avec des thèmes mode hacker et mode professionnel.
- **RDL (Rule Description Language) :** Logique de règle externe référencée avec `rdl_ref` et exécutée par le pipeline actuel `core/rdl_engine.py` - prend en charge les portes sensibles aux fichiers, les expressions booléennes, les observations du projet et les métadonnées de logique exportées dans les rapports.
- **État d'analyse / Reprise :** Enregistre les points de contrôle des analyses longues et reprend après interruption.
- **Référence de suppression :** Générer et appliquer une base de référence de faux positifs connus pour les supprimer des rapports futurs.
- **Interface Web :** Lanceur d'analyse basé sur navigateur avec flux console en temps réel et navigateur d'artefacts de tâche.
> Des améliorations actives sont en cours. De nombreuses nouvelles fonctionnalités et améliorations sont prévues pour les prochaines versions.
N'hésitez pas à contribuer à la mise à jour ou à l'ajout de nouvelles règles et au développement futur.
Si vous trouvez des bogues, signalez-les à [[email protected]](mailto:[email protected]).
Documentation détaillée : [https://dakshlabs.com/#docs](https://dakshlabs.com/#docs)
---
## Configuration de l'outil
### Prérequis
- Python 3.8+
- Toutes les bibliothèques listées dans `requirements.txt`
### 1. Télécharger Daksh SCRA```bash
git clone https://github.com/coffeeandsecurity/DakshSCRA.git
Ou téléchargez le dernier zip depuis https://github.com/coffeeandsecurity/DakshSCRA et décompressez-le.
💡 L'environnement virtuel peut être créé dans n'importe quel répertoire - il n'a pas besoin d'être à l'intérieur du dossier DakshSCRA.
python setup_env.py
Ce script crée l'environnement virtuel, installe toutes les dépendances, et installe le navigateur Chromium de Playwright (nécessaire pour l'export PDF).
#### Option B: Configuration manuelle
**Windows:**```bash
python -m venv daksh-env
.\daksh-env\Scripts\activate
macOS / Linux:```bash python3 -m venv daksh-env source daksh-env/bin/activate
Ensuite, installez les dépendances :```bash
cd path/to/DakshSCRA
pip install -r requirements.txt
playwright install chromium
Utilisez python dans un environnement virtuel, ou python3 en dehors.
usage: dakshscra.py [-h] [-r RULES] [-f FILE_TYPES] [-v] [-t TARGET_DIR] [-l {R,RF}] [--recon] [--rs] [--estimate] [-rpt FORMATS] [--pdf-from-json] [--json-input-dir PATH] [--pdf-output PATH] [--pdf-multi-dir PATH] [--pdf-single-only] [--skip-analysis] [--loc] [--baseline-file PATH] [--baseline-generate] [--no-baseline] [--review-config PATH] [--resume-scan] [--state-file PATH] [--no-state] [--state]
| Option | Description |
|---|---|
| `-r RULES` | Règles de la plateforme (ex. `php`, `java`, `php,java`) ou `auto` pour la détection automatique |
| `-f FILE_TYPES` | Remplacer les types de fichiers par défaut pour l'analyse |
| `-v` | Niveau de verbosité (`-v`, `-vv`, `-vvv`) |
| `-t TARGET_DIR` | Répertoire cible du code source |
| `-l {R,RF}` | Lister les règles de la plateforme + frameworks `[R]` ou inclure les types de fichiers `[RF]` |
| `--recon` | Exécuter la reconnaissance (détection de la plateforme / framework / langage) |
| `--rs`, `--recon-strict` | Reconnaissance stricte : détections haute confiance uniquement (à utiliser avec `--recon`) |
| `--estimate` | Estimer l'effort de revue de code en fonction de la taille de la base de code |
| `-rpt`, `--report FORMATS` | Formats de rapport : `html`, `pdf` ou `html,pdf` (par défaut : `html`) |
| `--pdf-from-json` | Générer un ou plusieurs rapports PDF à partir de sorties JSON existantes sans re-scanner |
| `--json-input-dir PATH` | Répertoire des rapports JSON (par défaut : `./reports/data`) |
| `--pdf-output PATH` | Chemin de sortie PDF unique (par défaut : `./reports/scan/pdf/report.pdf`) |
| `--pdf-multi-dir PATH` | Répertoire de sortie PDF multi-fichier (par défaut : `./reports/scan/pdf/multi-file`) |
| `--pdf-single-only` | Générer uniquement le PDF combiné en un seul fichier ; ignorer l'ensemble multi-fichier par plateforme |
| `--skip-analysis` | Désactiver l'étape d'analyse pour cette exécution |
| `--loc` | Compter les lignes de code effectives |
| `--baseline-file PATH` | Fichier de base de suppression (JSON) |
| `--baseline-generate` | Générer une base de suppression à partir des résultats actuels |
| `--no-baseline` | Désactiver la suppression de base pour cette exécution |
| `--review-config PATH` | Fichier de triage des résultats (JSON) ; supprimer les faux positifs déjà examinés des rapports |
| `--resume-scan` | Reprendre une analyse interrompue précédemment à partir du fichier d'état |
| `--state-file PATH` | Chemin personnalisé du fichier d'état/point de contrôle d'analyse |
| `--no-state` | Désactiver la création de points de contrôle d'état pour cette exécution |
| `--state` | Forcer l'activation de la création de points de contrôle d'état pour cette exécution |
### Exemple d'utilisation
> `-f` (types de fichiers) est optionnel. S'il n'est pas spécifié, DakshSCRA utilise les types de fichiers par défaut pour la ou les plateformes sélectionnées.```bash
# Single platform scan
python dakshscra.py -r php -t /path/to/source
# Multiple platforms
python dakshscra.py -r php,java,cpp -t /path/to/source
# Auto-detect platform and apply matching rules
python dakshscra.py -r auto -t /path/to/source
# Override filetypes
python dakshscra.py -r php -f dotnet -t /path/to/source
# Reconnaissance only (no scanning)
python dakshscra.py --recon -t /path/to/source
# Reconnaissance + scanning
python dakshscra.py --recon -r php -t /path/to/source
# Strict recon (high-confidence detections only)
python dakshscra.py --recon --rs -t /path/to/source
# Effort estimation
python dakshscra.py --estimate -t /path/to/source
# Scan with HTML + PDF report output
python dakshscra.py -r auto -t /path/to/source -rpt html,pdf
# Verbosity levels
python dakshscra.py -r php -v -t /path/to/source # default
python dakshscra.py -r php -vvv -t /path/to/source # show all pattern checks
# Generate suppression baseline from current findings
python dakshscra.py -r auto -t /path/to/source --baseline-generate
# Apply suppression baseline (suppress known FPs)
python dakshscra.py -r auto -t /path/to/source --baseline-file config/suppressions.json
# Disable baseline for this run
python dakshscra.py -r auto -t /path/to/source --no-baseline
# Apply findings triage / review config
python dakshscra.py -r auto -t /path/to/source --review-config config/review.json
# Scan with checkpoint state enabled
python dakshscra.py -r auto -t /path/to/source --state
# Resume an interrupted scan
python dakshscra.py -r auto -t /path/to/source --resume-scan
# Resume with a custom state file
python dakshscra.py -r auto -t /path/to/source --resume-scan --state-file runtime/scan_state.json
# Generate PDF from existing JSON outputs (no re-scan)
python dakshscra.py --pdf-from-json
# Generate PDF from a custom JSON directory
python dakshscra.py --pdf-from-json --json-input-dir ./custom/reports/data
# Custom output paths for PDF
python dakshscra.py --pdf-from-json --pdf-output ./reports/scan/pdf/custom.pdf --pdf-multi-dir ./reports/scan/pdf/multi-file
# Single combined PDF only (skip per-platform set)
python dakshscra.py --pdf-from-json --pdf-single-only
python dakshscra.py -l R # List platform rules and framework mappings python dakshscra.py -l RF # List platform rules, framework mappings, and filetypes
Plateforme | Frameworks
|---|---|
| dotnet | aspnetcore, entityframework |
| php | codeigniter, drupal, laravel, symfony, wordpress |
| java | hibernate, spring, springboot |
| javascript | angular, express, nestjs, nextjs, react, vue |
| kotlin | ktor, springkotlin |
| python | django, fastapi, flask |
| go | echo, fiber, gin |
| c | freertos |
| cpp | boost, qt |
| android | cordova-android, flutter-android, ionic-android, jetpack, nativescript-android, reactnative-android, xamarin-android |
| ios | cordova-ios, flutter-ios, ionic-ios, nativescript-ios, reactnative-ios, swiftui, uikit, xamarin-ios |
| reactnative | reactnative |
| flutter | flutter |
| xamarin | xamarin |
| ionic | ionic |
| nativescript | nativescript |
| cordova | cordova |
| ruby | rails, sinatra |
| rust | actix, axum, rocket |
| common | - |
Pour obtenir les dernières plateformes et frameworks pris en charge, exécutez toujours :```bash
python dakshscra.py -l R
config/tool.yamlLes paramètres par défaut de l'exécution de Daksh SCRA sont contrôlés via config/tool.yaml.```yaml
state_management:
enabled: false
resume_mode: manual
persist_after_seconds: 300
persist_interval_seconds: 30
default_state_file: runtime/scan_state.json
cleanup_on_success: false
analysis: run_by_default: true include_frameworks: true report_theme: hacker_mode
**Options de configuration de l'analyseur :**
- `analysis.run_by_default`
- `true` : l'analyseur s'exécute automatiquement lors de l'analyse
- `false` : l'analyseur est désactivé sauf s'il est réactivé dans la configuration ou via l'interface en ligne de commande
- `analysis.include_frameworks`
- `true` : inclure les entrées d'analyseur au niveau du framework lorsque la détection de framework existe
- `false` : uniquement la sortie de l'analyseur au niveau de la plateforme
- `analysis.report_theme`
- `hacker_mode` : thème d'analyseur moderne sombre à fort contraste (par défaut)
- `professional_mode` : thème d'analyseur moderne clair
- `both` : générer les deux variantes de thème côte à côte
### Rédaction de règles RDL
RDL (Rule Description Language) est la couche de logique de règles externalisée de DakshSCRA. Dans l'architecture actuelle :
- Les règles XML restent l'inventaire des règles et portent des métadonnées telles que `name`, `regex`, des descriptions, et un `scan_config` optionnel.
- La logique RDL est exécutée par [`core/rdl_engine.py`](https://github.com/coffeeandsecurity/dakshscra/blob/HEAD/mnt/c/_Source/Developement/DakshSCRA/core/rdl_engine.py).
- Les fichiers de logique de règles se trouvent sous `rules/scanning/logic/...` et sont référencés depuis le XML avec `<rdl_ref>`.
- Les valeurs `rdl_ref` sont résolues par rapport à `rules/scanning/`, par exemple : `logic/php/core/some_rule.rdl` -> `rules/scanning/logic/php/core/some_rule.rdl`
- Les résultats de logique sont exportés dans le rapport JSON en tant que métadonnées telles que `logic_engine`, `logic_source`, `logic_reason`, `logic_trace`, `logic_consulted_files` et `logic_outcome`.
L'ancienne forme inline `<rdl>` n'est plus l'architecture active et ne doit pas être utilisée pour les nouvelles règles.
#### Aperçu de l'architecture RDL```text
XML rule
-> regex / exclude / scan_config / descriptions
-> rdl_ref
-> rules/scanning/logic/<platform>/<scope>/<rule>.rdl
-> core/rdl_engine.py
-> pass / fail
-> reason / fail_reason
-> trace / consulted_files / outcome
Pour une règle source, DakshSCRA évalue la logique dans cet ordre :
rules/scanning/platform/....regex trouve des lignes candidates ou des correspondances de fichier entier lorsqu'il est présent.exclude supprime le bruit évident pour cette règle, s'il est présent..rdl externe depuis rdl_ref est évalué par rapport au texte du fichier courant, au chemin du fichier courant et à la racine du projet.Pour les règles de chemin de fichier dans filepaths.xml, le même modèle rdl_ref s'applique, mais le sujet de correspondance est
le chemin relatif normalisé au lieu du texte du code source. Dans ce mode, RDL reçoit la chaîne du chemin relatif
comme texte du fichier courant et contexte de chemin.
WHEN PRESENT, WHEN MISSING et WHEN CURRENT_FILE_MATCHES s'évaluent par rapport au texte du fichier courant.WHEN FILE_NAME_IS et WHEN FILE_PATH_MATCHES s'évaluent par rapport au contexte du chemin du fichier courant.WHEN EXPR prend en charge la logique booléenne sur les prédicats PRESENT:, MISSING: et EXISTS:.OBSERVE PROJECT_HAS_GLOB ... AS ... ne bloque pas la détection ; il enregistre les fichiers projet associés dans les métadonnées de trace.REPORT AS, REASON, FAIL_REASON et contrôlent les métadonnées exportées du rapport.Les expressions booléennes dans WHEN EXPR prennent en charge :
PRESENT:<regex>MISSING:<regex>EXISTS:<regex>&&, ||, ! et les parenthèsesRègle XML :```xml Possible SQL Injection in Query Execution query)\s*\(]]> <rdl_ref>logic/common/core/insecure_sql_query_unsafe_string_concatenation.rdl</rdl_ref> <rule_desc>...</rule_desc>
RDL externe :```text
VERSION 1
WHEN PRESENT /\b(?:mysql_query|mysqli_query|->query)\s*\(/i
WHEN EXPR PRESENT:\$_(GET|POST|REQUEST|COOKIE) && MISSING:\b(?:prepare|bindParam|bindValue|PDO::prepare)\b
REPORT AS area_of_interest
REASON Query execution appears to rely on direct input without parameterisation.
FAIL_REASON Query API matched, but parameterised query indicators were also found in the file.
Règle XML :```xml Exported Components Without Permission activity|service|receiver|provider)\s[^>]*android:name="(?P[^"]+)"[^>]*android:exported="true"[^>]*(?:/>|>)]]> <rdl_ref>logic/mobile/android/core/exported_components.rdl</rdl_ref> <scan_config>...</scan_config>
RDL externe:```text
VERSION 1
WHEN FILE_NAME_IS AndroidManifest.xml
WHEN CURRENT_FILE_MATCHES /android:exported\s*=\s*"true"/i
WHEN MISSING /android:permission\s*=\s*"/i
REPORT AS area_of_interest
REASON Exported component appears reachable without a permission guard.
Règle XML :```xml Admin Section File Path <rdl_ref>logic/filepaths/core/admin_section.rdl</rdl_ref>
RDL externe :```text
VERSION 1
WHEN CURRENT_FILE_MATCHES /(^|\/)(admin|administrator|root)(\/|$)/i
UNLESS CURRENT_FILE_MATCHES /(^|\/)(tests?|docs?|samples?|examples?)(\/|$)/i
REPORT AS area_of_interest
REASON File path suggests privileged application functionality.
FAIL_REASON Path matched an excluded documentation or sample location.
regex suffisamment large pour attraper les candidats, puis utilisez RDL pour filtrer le contexte.rdl_ref pour toute logique de règle et conservez le fichier .rdl à côté de l'arborescence logique de la plateforme/framework appropriée.<rdl> en ligne.WHEN PRESENT / WHEN MISSING pour les portes simples et WHEN EXPR uniquement lorsque la logique est réellement booléenne.REASON et les explications de suppression dans FAIL_REASON.PRESENT et MISSING comme des vérifications à l'échelle du fichier. Une atténuation n'importe où dans le fichier peut supprimer chaque correspondance de ce fichier.OBSERVE PROJECT_HAS_GLOB pour enrichir les résultats avec le contexte du projet, et non comme une porte de validation/échec.Toutes les sorties sont écrites sous le répertoire reports/ :```
reports/
├── scan/
│ ├── html/
│ │ ├── report.html # Single-file HTML scan report
│ │ └── multi-file/ # Per-platform HTML report set
│ ├── pdf/
│ │ ├── report.pdf # Single-file PDF scan report
│ │ └── multi-file/ # Per-platform PDF report set
│ ├── recon/
│ │ └── reconnaissance.html # Reconnaissance HTML report
│ └── estimate/
│ └── estimation.html # Effort estimation HTML report
├── analysis/
│ └── /
│ ├── analysis.html # Taint analysis report (default theme)
│ ├── analysis_professional.html # Professional theme (if theme=both)
│ ├── analysis_xref.html # Cross-reference report
│ └── analysis.json # Structured analysis data
└── data/
├── areas_of_interest.json # AoI findings
├── filepaths_aoi.json # File path AoI findings
├── summary.json # Scan summary
├── recon.json # Recon summary
└── analysis.json # Analyzer output
Les fichiers d'exécution (état du scan, journaux, inventaire) sont écrits sous `runtime/`.
---
## Interface Web
Daksh SCRA inclut une interface frontale basée sur navigateur pour lancer des scans et suivre la progression en temps réel.```bash
docker compose up --build
Puis ouvrez : http://localhost:8080
Capacités de l'interface Web :
Modèle d'exécution :
runtime/ et reports/)runtime/webui/jobs/<job-id>/artifacts/ afin que les rapports précédents restent accessiblesLa configuration Docker prend en charge l'interface Web et la CLI de manière indépendante en utilisant des services Compose séparés construits à partir de la même image.
Lancer l'interface Web :```bash docker compose up --build
Ensuite, ouvrez : [http://localhost:8080](http://localhost:8080)
**Exécutez la CLI dans Docker :**```bash
docker compose run --rm cli -h
docker compose run --rm cli -r auto -t /scan-targets/path/to/source
Arrêter la pile:```bash docker compose down
**Ce que Docker inclut :**
- FastAPI + interface web
- CLI complète de Daksh SCRA en tant que service séparé
- Playwright Chromium pour la génération de PDF
- Volumes persistants `reports/` et `runtime/`
- Montages de chemins hôtes pour que les analyses puissent atteindre les arborescences source depuis l'intérieur du conteneur
**Points de montage clés :**
| Montage | Chemin dans le conteneur |
|---|---|
| Source du projet | `/app` |
| Racine d'analyse par défaut | `/scan-targets` |
| Alias de lecteurs hôtes | `/host`, `/host/c`, `/host/d` |
| Montages WSL | `/mnt`, `/run/desktop/mnt/host` |
**Variables d'environnement (à configurer dans `.env`) :**
| Variable | Description |
|---|---|
| `DAKSH_PORT` | Port de l'interface web (par défaut : `8080`) |
| `DAKSH_SCAN_ROOT` | Répertoire cible par défaut dans le conteneur |
| `DAKSH_HOST_SOURCE` | Chemin hôte à monter en tant que `/scan-targets` (par défaut : `/tmp`) |
| `DAKSH_HOST_MOUNT` | Racine de montage hôte supplémentaire |
| `DAKSH_HOST_C` | Chemin du lecteur Windows C: (WSL) |
| `DAKSH_HOST_D` | Chemin du lecteur Windows D: (WSL) |
| `DAKSH_DESKTOP_MOUNT` | Chemin de montage du bureau WSL |
| `DAKSH_BROWSE_ROOTS` | Remplacer les racines du navigateur de répertoires (séparées par des virgules) |
Copiez `.env.example` vers `.env` et définissez les chemins pour votre machine avant d'exécuter Docker.
---
## Author
| | |
|---|---|
| Site web | [coffeeandsecurity.com](https://www.coffeeandsecurity.com) |
| Email | [email protected] |
| Twitter / X | [@coffeensecurity](https://x.com/coffeensecurity) |
| Source | [github.com/coffeeandsecurity/DakshSCRA](https://github.com/coffeeandsecurity/DakshSCRA) |
| License | GNU General Public License v3.0 (GPL-3.0) |
Si DakshSCRA a aidé votre équipe à économiser du temps, des efforts ou des coûts importants, à réduire la dépendance à des outils commerciaux coûteux, à améliorer la couverture des revues, ou à rendre la revue de code plus structurée et efficace, n'hésitez pas à nous contacter et à partager votre expérience. Je suis toujours ouvert aux retours réfléchis et aux conversations intéressantes.
Vous avez trouvé un bug ou vous souhaitez contribuer ? Ouvrez un problème ou une pull request sur GitHub.
TRACE/pattern/flags, avec i, m et s pris en charge.| Commande | Comportement | Utilisation typique |
|---|
WHEN PRESENT <regex> | Exiger qu'un motif existe dans le texte du fichier courant | Exiger une API risquée coexistante ou un champ sensible |
WHEN MISSING <regex> | Exiger qu'un motif soit absent du texte du fichier courant | Supprimer lorsqu'une atténuation existe déjà |
WHEN EXPR <expr> | Évalue les expressions booléennes en utilisant PRESENT: / MISSING: / EXISTS: avec &&, ` | |
WHEN CURRENT_FILE_MATCHES <regex> | Correspondre au texte intégral du fichier courant | Re-vérifier des conditions complexes sur tout le fichier |
WHEN FILE_NAME_IS <nom> | Exiger que le nom du fichier courant corresponde exactement | Limiter les règles pour les plist / manifest / config |
WHEN FILE_PATH_MATCHES <glob> | Exiger que le chemin relatif courant corresponde à un glob | Restreindre les règles de chemin de framework / config |
UNLESS CURRENT_FILE_MATCHES <regex> | Échouer lorsque tout le fichier correspond à un motif d'exclusion | Bloquer les cas structurels connus comme sûrs |
OBSERVE PROJECT_HAS_GLOB <glob> AS <étiquette> | Enregistrer les fichiers projet associés dans les métadonnées de trace | Mettre en évidence les fichiers de configuration ou compagnons |
REPORT AS <résultat> | Définir le résultat de la règle, généralement area_of_interest | Rendre explicites les résultats à l'épreuve du temps |
REASON <texte> | Raison affichée lorsque la règle passe | Expliquer pourquoi la détection est restée visible |
FAIL_REASON <texte> | Raison affichée lorsque la règle supprime une correspondance | Expliquer pourquoi le résultat a été filtré |
TRACE <texte> | Ajouter des lignes de trace de débogage/décision | Support pour la migration/débogage |
logic/... stables et limités à la plateforme afin que les règles XML restent légères et que la couche logique reste réutilisable.