Boîte à outils de détection, de vérification et de réponse aux incidents pour CVE-2026-85097 : évaluation à distance de Bricksforge, recherche d'IOC dans les journaux, audit des implants sur le système de fichiers, ainsi que des règles Sigma et WAF.
Téléversement arbitraire de fichiers non authentifié → RCE dans le plugin WordPress Bricksforge
Boîte à outils de détection, de vérification et de réponse aux incidents pour CVE-2026-85097, un CVSS 10.0
téléversement arbitraire de fichiers non authentifié dans le plugin Bricksforge
pour WordPress qui est activement exploité dans la nature.
Un seul script, trois modes : évaluer une cible à distance, rechercher dans les journaux historiques des traces d'exploitation, et auditer une racine web à la recherche d'implants déposés.
____ _ _ _ __ ___ _ _
| __ ) _ __(_) | _| | __/ _| ___ _ __ __ _ / _ \ ___| | _| | ___ _ __
| _ \| '__| | |/ / |/ / |_ / _ \| '__/ _` | | | / __| |/ / |/ _ \| '_ \
| |_) | | | | <| <| _| (_) | | | (_| | |_| \__ \ <| | (_) | | | |
|____/|_| |_|_|\_\_|\_\_| \___/|_| \__, |\___/|___/_|\_\_|\___/|_| |_|
|___/
CVE-2026-85097 | Unauthenticated Arbitrary File Upload -> RCE
CVSS 10.0 CRITICAL | Bricksforge <= 3.1.8.9 | Fixed 3.1.8.10
| Champ | Valeur |
|---|---|
| CVE | CVE-2026-85097 |
| Produit | Bricksforge (extension WordPress, addon pour Bricks Builder) |
| Type | Téléversement arbitraire de fichier non authentifié → Exécution de code à distance |
| CWE | CWE-434 : Téléversement sans restriction de fichier de type dangereux |
| CVSS | 10.0 CRITIQUE : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H (vecteur déduit, voir Limitations) |
| Authentification | Aucune |
| Affecté | <= 3.1.8.9 |
| Corrigé | 3.1.8.10 (ligne de version du fournisseur référencée dans la presse : 4.0.1) |
| Exploitation | ACTIVE DANS LA NATURE |
| Première observation | 2026-10-07 21:47:17 UTC |
| Installations | ~6 000 |
| IP sources observées | 63 uniques (top 6 ≈ 46 % des requêtes) |
| Point de terminaison principal | POST /wp-json/bricksforge/v1/form_submit |
| Point de terminaison de repli | POST /wp-admin/admin-ajax.php (action=bricksforge_form_submit) |
| Nommage de l'implant | login_admin_*.php |
[!CAUTION] Usage autorisé uniquement. Cet outil est destiné à l'évaluation de sécurité autorisée, à la validation défensive et à la réponse aux incidents. Exécuter un test actif contre un système que vous ne possédez pas ou pour lequel vous n'avez pas d'autorisation écrite est illégal dans la plupart des juridictions. Voir SAFETY-AND-LEGAL.md.
Bricksforge étend Bricks Builder avec des formulaires avancés,
des animations et des données dynamiques. Sa fonctionnalité Pro Forms accepte le téléversement de fichiers. L'extension
valide correctement le type MIME d'un fichier lors de son premier téléversement, mais lorsque le
formulaire est ensuite soumis, elle fait confiance aux métadonnées du fichier envoyées par le client et ne valide jamais
le champ url à l'intérieur du paramètre temporaryFileUploads.
Cette unique vérification manquante transforme un téléversement d'image anodin en exécution de code à distance
non authentifiée. Un attaquant n'a besoin d'aucun compte, d'aucun jeton CSRF qu'il ne puisse forger
lui-même, et d'aucune interaction utilisateur. Patchstack a observé une exploitation débutant le
2026-10-07 21:47:17 UTC depuis 63 adresses IP sources uniques couvrant les infrastructures de datacenter, cloud, VPN et
résidentielles.
file (le chemin côté serveur qui a été vérifié au niveau MIME) et url (la destination vers laquelle l'extension
va écrire) sont découplés. L'extension relit l'url fournie par le client au moment de la
soumission et y écrit les octets mis en attente.
{
"temporaryFileUploads": [
{
"field": "form-field-file",
"file": {
"file": "/var/www/example.com/wp-content/uploads/bricksforge/tmp/img_example.gif",
"url": "https://example.com/wp-content/uploads/bricksforge/tmp/img_example.php",
"type": "image/gif"
}
}
]
}
La signature, c'est l'incohérence : le chemin côté serveur est un .gif, l'URL de destination est un .php. Dans 95 % des requêtes capturées, le chemin côté serveur se terminait par .gif ou .png.
| Fichier | Rôle |
|---|---|
wp-content/plugins/bricksforge/includes/elements/pro-forms/actions/init.php | Point d'injection : les métadonnées fournies par le client (y compris url) sont fusionnées dans le contexte de l'action de formulaire sans validation. |
wp-content/plugins/bricksforge/includes/elements/pro-forms/actions/base.php | Sink : les métadonnées de confiance pilotent l'écriture finale du fichier, de sorte que l'attaquant contrôle le nom de fichier de destination sur disque et son extension. |
| # | Étape | Observable |
|---|---|---|
| 1 | Obtenir un nonce non authentifié : POST /wp-admin/admin-ajax.php avec action=bricksforge_regenerate_nonce. Aucune authentification requise ; renvoie un nonce valide. | Requête admin-ajax.php avec action=bricksforge_regenerate_nonce |
| 2 | Téléverser un polyglotte GIF/PHP : une image valide qui porte aussi du code PHP. La validation MIME est effectuée ici, donc elle passe et le fichier atterrit dans wp-content/uploads/bricksforge/tmp/. | Téléversement multipart écrivant dans /wp-content/uploads/bricksforge/tmp/ |
| 3 | Soumettre le formulaire avec des métadonnées incohérentes : file pointe vers le .gif validé, url se termine par .php. | Requête form_submit contenant temporaryFileUploads |
| 4 | Le plugin écrit le contenu à l'emplacement PHP → RCE. Requêter cette URL exécute le code embarqué : web shells, modification de contenu, vol de données, persistance. | GET HTTP vers un fichier .php nouvellement créé sous un répertoire uploads |
Les attaquants sondent activement les moyens de contourner le filtrage des extensions. Quatre familles :