Skip to content

Glossaire

Journalisation des blocs de script (Script Block Logging)

Fonctionnalité de PowerShell 5 qui enregistre le code source de chaque bloc de script compilé par le moteur, après désobfuscation, dans l'événement 4104.

La journalisation des blocs de script est une fonctionnalité ajoutée dans PowerShell 5.0 (Windows 10 / WMF 5.0) qui écrit le texte de chaque bloc de script compilé par le moteur dans l'événement 4104 du journal Microsoft-Windows-PowerShell/Operational. Un bloc de script est toute unité de code que PowerShell compile : un script entier, une fonction, une commande tapée à l'invite ou une chaîne passée à Invoke-Expression. Comme la journalisation intervient après la désobfuscation du code, un -EncodedCommand ou une ligne concaténée est enregistré sous sa forme développée (Microsoft).

Pourquoi c'est important en investigation

C'est le seul journal PowerShell qui montre le code, et pas seulement une ligne de commande, ce qui en fait la meilleure trace des charges utiles en mémoire, des scripts téléchargés et des lignes décodées. Trois éléments conditionnent sa lecture :

  • Désactivée par défaut. La journalisation complète requiert le paramètre de stratégie de groupe « Activer la journalisation de blocs de scripts PowerShell », ou la valeur de registre EnableScriptBlockLogging définie à 1 sous HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging.
  • Des blocs de niveau Avertissement malgré tout. Même lorsque la stratégie est désactivée, PowerShell 5 journalise au niveau Avertissement les blocs contenant des termes qu'il juge suspects : un hôte « sans journalisation » conserve donc souvent une trace partielle.
  • Des blocs fractionnés. Les blocs longs sont répartis sur plusieurs événements 4104 qui partagent un ScriptBlockId et doivent être réassemblés dans l'ordre.

Les attaquants le savent : la désactiver est donc en soi un signal d'altération. Les modifications de la clé de stratégie ScriptBlockLogging, ou la réflexion visant les paramètres de stratégie de groupe mis en cache par PowerShell, méritent d'être signalées partout où elles apparaissent.

Exemple

Une commande qui désactive la fonctionnalité, le genre de ligne à rechercher dans l'historique, les transcriptions ou des événements 4104 antérieurs :

Set-ItemProperty HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging -Name EnableScriptBlockLogging -Value 0

Le parseur lève une détection d'altération de la journalisation de gravité élevée pour cette commande ainsi que pour les références à cachedGroupPolicySettings ou au fournisseur ETW de PowerShell, et marque séparément les blocs 4104 de niveau Avertissement.

Termes associés

Reconstituez et décodez les blocs de script dans PowerShell Parser, et lisez le guide forensique du 4104.