01 — Pour le décideur
Synthèse exécutive
La plateforme répond à un besoin métier réel et dispose de plusieurs fondations techniques positives — mais plusieurs mécanismes critiques de sécurité et de gouvernance doivent être renforcés avant de considérer la plateforme comme durablement adaptée à un usage administratif sensible.
✓ Ce qui fonctionne
Modèle métier cohérent et fidèle à l'organisation budgétaire réelle, technologies à jour (Laravel 11, Backpack 6.7), mots de passe correctement hachés, protection CSRF active, journal d'audit métier déjà en place.
✗ Ce qui expose l'organisation
Le contrôle d'accès n'est pas effectivement appliqué côté serveur : le système ne garantit pas que chaque opération sensible est réalisée par un utilisateur disposant des habilitations correspondantes. Ce constat dépasse la simple ergonomie d'interface.
Ce que ce rapport établit
- Un diagnostic technique complet, chaque constat étant relié à une preuve vérifiable (code source, base de données, ou point à confirmer explicitement en production).
- Une évaluation des risques réels pour l'organisation — pas seulement des anomalies de code — avec leurs impacts potentiels sur la confidentialité, l'intégrité et la disponibilité des données budgétaires.
- Une matrice de priorisation actionnable (section 13) et une liste de mesures à traiter sans attendre une éventuelle modernisation (section 14).
- Une trajectoire de transformation en trois horizons, non une réécriture brutale (section 19).
Recommandation en un regard
Binaire SAS recommande une démarche en deux temps : (1) sécurisation immédiate de l'existant pour traiter les risques critiques identifiés, puis (2) une transformation progressive vers une architecture 3 tiers sécurisée intégrant les principes Zero Trust. Le détail de cette recommandation est développé en conclusion (section 23).
02 — Présentation de la mission
Mission & périmètre
Binaire SAS a été mandatée par la Direction du Contrôle de la Performance (DCP) de la DGCBF pour réaliser un audit indépendant de l'existant de sa plateforme de suivi de la performance budgétaire, développée sous Laravel/PHP. Cette première phase vise exclusivement à comprendre, auditer et documenter la solution en place, avant toute décision de modernisation.
Périmètre analysé : application Laravel 11 (PHP 8.2) du domaine
dcp.dgcbf.online (contrôleurs, modèles, vues, migrations, configuration),
deux sauvegardes de bases de données MySQL/MariaDB (dcp — ancien schéma, et
dcp_new — base active), ainsi que les fichiers de dépendances et de
configuration. Un second domaine présent dans la sauvegarde (page de parking par défaut)
a été exclu, hors périmètre applicatif.
03 — Méthodologie
Méthodologie
Analyse statique ciblée : cartographie du framework et des dépendances, lecture des fichiers à forte valeur d'information (contrôleurs, modèles, middlewares, migrations, configuration), recherches par mots clés pour les risques de sécurité, inspection structurelle de la base de données. Chaque constat de ce rapport est relié à une preuve technique précise.
04 — Ce que ces failles signifient pour l'organisation
Risques majeurs pour l'organisation
Les trois constats suivants ne sont pas de simples anomalies de code : ils déterminent si l'organisation peut aujourd'hui garantir que ses données budgétaires et administratives sont accédées, modifiées et conservées par les seules personnes habilitées.
CheckIfAdmin::checkIfUserIsAdmin()) retourne systématiquement
true, sans aucune vérification réelle. Chaque formulaire de validation
(FormRequest::authorize()) ne vérifie que la connexion de l'utilisateur,
jamais son rôle. Le middleware alternatif qui aurait pu appliquer un contrôle par rôle
(CheckUserRole) n'est monté sur aucune route.app/Http/Middleware/CheckIfAdmin.php:31,
config/backpack/base.php:114, 13 classes
app/Http/Requests/*.php, absence totale de app/Policies./admin/*) : utilisateurs, rôles, entités, plans d'action, crédits,
activités.CheckIfAdmin, ajouter des tests de non-régression
sur le contrôle d'accès..env réel (non l'exemple) est présent dans
la sauvegarde transmise et contient en clair la clé applicative (APP_KEY)
et les identifiants complets de connexion à la base de données de production. La
configuration observée montre également APP_DEBUG=true combiné à une
URL de production..env:4-5,7,25-30 — correctement exclu de Git
(.gitignore), donc constat propre à cette sauvegarde/transmission, pas à
une fuite via le dépôt.APP_DEBUGAPP_KEY et le mot de passe de
base de données ; vérifier et forcer APP_DEBUG=false en production ;
à terme, gestion des secrets via un coffre-fort dédié plutôt qu'un fichier en clair.app/Models/User.php:59-63.05 — Le cadre d'analyse
Les trois dimensions de la sécurité
Tout risque identifié dans ce rapport se rattache à l'une de ces trois dimensions. Pour une plateforme de suivi budgétaire, l'intégrité des données mérite une attention particulière : une donnée budgétaire modifiée sans autorisation ou de façon incohérente peut fausser une décision, même sans qu'aucune donnée n'ait « fuité ».
Confidentialité
Qui peut accéder aux informations ?
Aujourd'hui non pleinement maîtrisée : contrôle d'accès non appliqué (VULN-001) et secrets de production exposés dans la sauvegarde (VULN-002).
Intégrité Priorité
Qui peut modifier les informations ?
C'est la dimension la plus directement affectée : le contrôle d'accès défaillant
(VULN-001) permet potentiellement une modification non autorisée des données
budgétaires, sans qu'aucun test automatisé ne protège contre une régression
(section 11), et sans contrainte d'intégrité sur la table financière
credits (section 09).
Disponibilité
La plateforme peut-elle rester opérationnelle ?
Hébergement mutualisé standard, aucun mécanisme de supervision ni de mise en cache identifié dans le code. À confirmer sur production : politique de sauvegarde et de continuité effective.
06 — État des lieux technique
Architecture existante
Application monolithique Laravel 11, structurée autour du package d'administration Backpack/CRUD 6.7, qui génère l'essentiel de l'interface. Pas de séparation frontend/backend au sens moderne : les vues sont des templates Blade rendus côté serveur. Preuve : code source
Notes par axe
Signe fort d'évolution non maîtrisée : deux modèles de hiérarchie
coexistent dans la base (l'ancien couple Ministère/Direction, et une table
générique entities auto-référencée), doublés de trois tables pivot
distinctes reliant un utilisateur à son périmètre et à son rôle — principale
source de risque d'incohérence fonctionnelle identifiée.
07 — Ce que fait réellement l'application
Analyse fonctionnelle
Domaine métier reconstruit à partir du code, hiérarchie à six niveaux :
| Fonctionnalité | Utilisateurs | Criticité |
|---|---|---|
| Suivi budgétaire (crédits par BOP/UO/trimestre) | DCP, responsables BOP | Critique |
| Gestion des utilisateurs, rôles, affectations | Admin | Critique |
| Tableaux de bord BOP / Programme / Mission | Responsables par niveau | Haute |
| Gestion Ministères / Directions / Missions / Plans d'action | Admin, gestionnaires | Haute |
| Gestion Activités / Sous-activités (édition en ligne, validation trimestrielle) | Directions, contributeurs | Haute |
| Journal d'audit métier | Admin | Moyenne |
| Recherche d'utilisateur (API) | Tous (endpoint public) | Faible |
Anomalies fonctionnelles identifiées
- Trois systèmes de rattachement utilisateur↔périmètre coexistants : selon l'écran, l'application peut afficher des données différentes pour un même utilisateur.
- Code et vues « Old » laissés en production, source de confusion sur ce qui est réellement actif.
- Totaux de crédits stockés sans mécanisme garantissant leur cohérence avec le détail trimestriel.
08 — Détail technique
Audit sécurité
Les trois constats les plus critiques (VULN-001 à VULN-003) sont détaillés en fiche section 04. Le tableau ci-dessous couvre l'ensemble des constats de sécurité, y compris ceux de gravité moindre.
| Réf. | Gravité | Constat | Composant | Preuve |
|---|---|---|---|---|
| VULN-001 | Critique | Contrôle d'accès non appliqué (escalade de privilèges) | Middlewares / FormRequests | code |
| VULN-003 | Haute | Mot de passe par défaut prévisible, codé en dur | Modèle User | code |
| VULN-002 | Haute | Secrets de production en clair dans la sauvegarde transmise | .env | code |
| R-004 | Haute | Mode debug potentiellement actif en production | Configuration applicative | à confirmer |
| R-009 | Moyenne | Endpoint API sans authentification exposant des noms d'utilisateurs | routes/api.php | code |
| R-012 | Faible | Requêtes SQL construites par interpolation (non exploitable en l'état, filtrage en amont) | 3 modèles Eloquent | code |
Points vérifiés sans anomalie détectée
- Mots de passe hachés en bcrypt — conforme aux bonnes pratiques.
- Aucune désactivation de la protection CSRF trouvée.
- Aucun mass assignment ouvert (
$guarded = []) sur les modèles. - Aucune injection SQL exploitable trouvée dans le code applicatif propre.
09 — Structure et intégrité
Audit base de données
Preuve : base SQL La base active
(dcp_new, 29 tables, MariaDB 11.8) est globalement bien construite : clés
primaires, étrangères et index correctement posés sur la majorité des tables métier.
credits — qui
porte l'intégralité des données financières — ne comporte aucune clé étrangère ni
aucun index secondaire, alors que ses colonnes de rattachement sont systématiquement
utilisées dans les requêtes des tableaux de bord. Risque : lignes orphelines possibles et
ralentissement progressif avec la croissance du volume.Bonnes pratiques observées : montants financiers typés en decimal(15,2)
(pas de float), usage cohérent des clés primaires bigint
unsigned. Les deux dumps contiennent des données à caractère personnel réelles —
non reproduites dans ce rapport, à traiter avec la même confidentialité qu'une base de
production.
10 — Points de vigilance, pas des mesures
Audit performance
Aucun environnement d'exécution n'étant disponible, cette section liste des risques identifiés dans le code, jamais des mesures réelles.
- Agrégations financières sur table non indexée — les requêtes de somme sur les crédits s'exécuteront en parcours complet de table à mesure que le volume augmente.
- Logique dupliquée dans 4 contrôleurs — tout correctif de performance doit être répliqué manuellement à 4 endroits.
- Absence de cache applicatif sur les tableaux de bord.
- Traitement 100% synchrone — l'infrastructure de file d'attente est provisionnée en base mais inutilisée dans le code.
Contexte atténuant : le volume de données actuel reste celui d'un environnement pilote — ces risques ne deviendront probablement sensibles qu'avec la croissance des exercices budgétaires.
11 — Coût des évolutions futures
Qualité et dette technique
| Axe | Constat |
|---|---|
| Tests automatisés | Absents (fichiers d'exemple du squelette Laravel, jamais modifiés) |
| Taille des contrôleurs | 4 fichiers dépassent 550 lignes, jusqu'à 926 lignes |
| Duplication | Logique de calcul budgétaire répétée à l'identique dans 4 contrôleurs |
| Code mort | Fichiers et vues « Old », méthode non appelée, middleware jamais monté |
| Documentation | README générique du squelette Laravel, aucune documentation propre au projet |
12 — Hébergement et déploiement
Audit infrastructure
Confirmé par les fichiers
Hébergement mutualisé cPanel/Imunify (Hostinger) ; domaine
dcp.dgcbf.online ; base MariaDB colocalisée avec l'application ;
déploiement manuel (aucun pipeline CI/CD trouvé).
Nécessite une vérification serveur
Version PHP réellement exécutée, configuration TLS/HTTPS effective, valeur réelle du mode debug en production, politique de sauvegarde automatisée, permissions effectives des dossiers applicatifs.
13 — Vue consolidée et actionnable
Matrice des risques
Chaque risque est relié à une action corrective, une priorité (P0 à P3) et un horizon de traitement recommandé.
| ID | Domaine | Risque | Preuve | Probabilité | Impact | Criticité | Action corrective | Priorité |
|---|---|---|---|---|---|---|---|---|
| VULN-001 | Sécurité | Contrôle d'accès non appliqué | code | Haute | Critique | Critique | Policies Laravel par ressource | P0 |
| VULN-002 | Sécurité | Secrets de production exposés | code | Haute (à chaque transmission) | Haute | Haute | Rotation immédiate des secrets | P0 |
| R-004 | Sécurité | Mode debug potentiellement actif en prod. | à confirmer | Non déterminée | Haute | Haute | Vérifier / forcer APP_DEBUG=false | P0 |
| R-006 | Infrastructure | Politique de sauvegarde non vérifiée | à confirmer | Non déterminée | Haute | Haute | Vérifier / mettre en place sauvegardes automatisées | P0 |
| VULN-003 | Sécurité | Mot de passe par défaut prévisible | code | Moyenne | Haute | Haute | Processus d'activation sécurisé | P1 |
| R-005 | Qualité | Absence de tests automatisés | code | Haute | Haute | Haute | Suite de tests sur parcours critiques | P1 |
| R-009 | Sécurité | Endpoint API public non authentifié | code | Haute | Faible | Faible/Moy. | Ajouter authentification + throttle | P1 |
| R-007 | Données / Perf. | Table credits sans clé étrangère ni index | SQL | Moyenne | Moyenne | Moyenne | Ajouter FK + index | P2 |
| R-008 | Architecture | 3 modèles de rattachement concurrents | SQL code | Moyenne | Moyenne | Moyenne | Unifier le modèle de données | P2 |
| R-010 | Qualité | Logique métier dupliquée (4 contrôleurs) | code | Haute | Moyenne | Moyenne | Factoriser en service dédié | P2 |
| R-011 | Gouvernance | Comptes institutionnels sur e-mails personnels | SQL | Haute (déjà en place) | Moyenne | Moyenne | Migrer vers identités institutionnelles | P2 |
| R-014 | Qualité | Absence de documentation projet | code | Haute | Moyenne | Moyenne | Documenter modèle métier et rôles | P2 |
| R-012 | Sécurité | Requêtes SQL par interpolation | code | Faible | Moyenne | Faible | Paramétrer les requêtes | P3 |
| R-013 | Qualité | Code mort / fichiers « Old » | code | Haute | Faible | Faible | Nettoyage du code mort | P3 |
| R-015 | Performance | Absence de cache / traitement synchrone | code | Moyenne | Faible | Faible | Cache applicatif, jobs asynchrones | P3 |
14 — À traiter avant toute autre décision
Urgences de sécurisation
Ces mesures ne doivent pas attendre une éventuelle migration vers une nouvelle architecture — elles s'appliquent sur la plateforme actuelle, en service aujourd'hui.
Mesures immédiates (Horizon 0)
- Correction du contrôle d'accès (Policies Laravel)
- Rotation des secrets exposés
- Suppression des mots de passe par défaut codés en dur
- Vérification du mode debug en production
- Vérification des comptes et privilèges existants
- Vérification des sauvegardes (existence, fréquence, test de restauration)
- Vérification de l'exposition réseau (HTTPS, en-têtes de sécurité)
- Renforcement de la journalisation des actions sensibles
- Revue des comptes à privilèges (super-admin, admin)
15
Forces & faiblesses
Points forts
- Modèle métier cohérent, fidèle à l'organisation réelle
- Technologies récentes et éprouvées (Laravel 11.36, Backpack 6.7.45)
- Mots de passe hachés correctement, CSRF actif
- Journal d'audit métier déjà existant
- Montants financiers typés en
decimal
Points faibles
- Contrôle d'accès non appliqué au niveau serveur
- Aucun test automatisé
- Trois modèles de rattachement concurrents
- Logique métier dupliquée dans 4 contrôleurs volumineux
- Secrets et mot de passe par défaut en clair dans le code/la config
16 — Vision, pas décision automatique
Architecture cible proposée
L'orientation React / Express / MongoDB n'est pas retenue parce qu'elle serait « plus moderne », mais parce qu'elle répond à des objectifs architecturaux précis :
Comparaison des architectures
Architecture actuelle
Architecture cible
Comparaison objective avec l'existant
| Critère | Existant | Cible |
|---|---|---|
| Génération d'interface d'administration | Backpack CRUD : point fort réel, rapide | Aucun générateur équivalent — reconstruction manuelle |
| Intégrité des données financières | Relationnel/ACID, nativement adapté | Documentaire — discipline applicative accrue nécessaire |
| Sécurité par défaut | Faille actuelle, mais corrigible sans réécriture | Conception Zero Trust possible dès le départ, non garantie par le seul choix technique |
| Coût et délai | Correction ciblée, coût mesuré | Réécriture intégrale — effort significatif |
| Hébergement | Compatible mutualisé, faible coût | Infrastructure Node/Mongo dédiée nécessaire |
17 — Une distinction essentielle
VPN vs Zero Trust
Ce qu'apporte un VPN
- Réduction de la surface d'exposition réseau
- Chiffrement du transport entre le poste et le réseau interne
- Restriction géographique/réseau de l'accès
Une fois connecté au VPN, un utilisateur est souvent implicitement fait confiance pour tout ce qui est accessible sur ce réseau — c'est précisément ce que le Zero Trust remet en cause.
Ce qu'exige le Zero Trust
- Vérification explicite de l'identité, à chaque requête
- Principe du moindre privilège
- Contrôle d'accès par ressource et par action (pas par réseau)
- Authentification forte, MFA pour les comptes sensibles
- Segmentation, chiffrement, journalisation, surveillance continue
- Aucune confiance implicite, y compris en interne
Dans la cible proposée (section 16), le VPN/ZTNA reste une couche pertinente pour restreindre l'exposition réseau de l'interface d'administration — mais le contrôle d'accès réel doit être appliqué au niveau de l'API, indépendamment du réseau d'où provient la requête.
18 — Traduction architecturale
Architecture Zero Trust — vue d'ensemble
19 — Pas une réécriture brutale
Trajectoire de modernisation — trois horizons
Sécurisation immédiate
- Traiter les risques Critique et Haute (VULN-001 à 003, R-004, R-006)
- Voir section 14 « Urgences de sécurisation »
Stabilisation
- Tests automatisés
- Refactorisation (dédupliquer la logique métier)
- Contrôle des accès consolidé
- Documentation, CI/CD, supervision
- Sauvegardes, durcissement infrastructure
Transformation
- Architecture 3 tiers — React, API Express, MongoDB
- Segmentation, VPN/ZTNA, Zero Trust
- Migration des données, nouveaux environnements
- Supervision, déploiement sécurisé
20 — Ce que coûte le statu quo
Coût de l'inaction
Sans chiffrage financier inventé, le maintien de l'architecture actuelle sans action corrective a des conséquences prévisibles :
- Maintien des risques de sécurité identifiés (VULN-001 à 003) sur une plateforme en service
- Augmentation continue de la dette technique (section 11)
- Coût croissant de chaque nouvelle évolution fonctionnelle
- Risque de régression accru en l'absence de tests
- Complexité croissante du modèle de données non unifié
- Difficulté durable de contrôle des habilitations
- Dépendance croissante à l'existant, rendant toute reprise plus coûteuse dans le temps
- Difficulté d'intégration avec de futurs systèmes de l'administration
- Difficulté à industrialiser les déploiements (absence de CI/CD observée)
- Difficulté à appliquer une politique de sécurité homogène sur un socle hétérogène
21 — Plus qu'un changement de framework
Étendue potentielle du programme de transformation
La modernisation ne se résume pas à « remplacer Laravel par React/Express/MongoDB ». Un programme de transformation complet couvre potentiellement :
Aucun coût n'est chiffré dans ce rapport en l'absence de données permettant de le justifier — l'étape suivante recommandée est un atelier de cadrage dédié (section 23).
22 — De l'audit à la supervision
Feuille de route visuelle
AUDITER
SÉCURISER
STABILISER
CONCEVOIR
DÉVELOPPER
MIGRER
TESTER
DÉPLOYER
SUPERVISER
23
Conclusion & recommandation
La plateforme DCP répond aujourd'hui à un besoin métier réel et bien modélisé, mais porte une faille de contrôle d'accès critique qui doit être corrigée sans attendre, ainsi qu'une dette technique importante qui limitera sa capacité d'évolution si elle n'est pas traitée.
- Sécurisation immédiate de l'existant afin de traiter les risques critiques identifiés ;
- Lancement d'une démarche de transformation progressive vers une architecture 3 tiers sécurisée, intégrant les principes Zero Trust et un contrôle renforcé des accès.
La modernisation doit être cadrée par une étude fonctionnelle, technique, budgétaire et de migration avant son lancement — ce cadrage fait l'objet d'une mission distincte, non couverte par le présent audit. Binaire SAS se tient à la disposition de la DCP/DGCBF pour accompagner la priorisation et la mise en œuvre de ces recommandations.