Spectre und Meltdown schönes Powershell-Script welches auch den Zugriff und vor allem die Mächtigkeit von NtQuerySystemInformation verdeutlicht


Microsoft hat für die geplagten Administratoren von Windowssystemen ein kleines Powershellscript herausgegeben. Damit werden einige Infos aus dem Prozessor, BIOS/UEFI und von Windows ermittelt und dargestellt. Damit lässt sich zum momentanen Zeitpunkt dann leicht nachvollziehen, ob ein Rechner noch Updates oder Änderungseinstellungen braucht.

Hier zunächst der Link zum Powershell-Script: https://gallery.technet.microsoft.com/scriptcenter/Speculation-Control-e36f0050. Hier noch die offizielle Beschreibung dazu von MS: https://support.microsoft.com/en-us/help/4073119/protect-against-speculative-execution-side-channel-vulnerabilities-in. Gleich noch der Link zur Powershell Gallery: https://www.powershellgallery.com/packages/SpeculationControl/1.0.3.

Wenn man Updates von einem Hardwarehersteller benötigt, ist auch diese Liste noch hilfreich: https://www.heise.de/newsticker/meldung/Meltdown-und-Spectre-Die-Sicherheitshinweise-und-Updates-von-Hardware-und-Software-Herstellern-3936141.html. Hier eine Liste mit Links von MS: https://support.microsoft.com/en-us/help/4073757/protect-your-windows-devices-against-spectre-meltdown.

Aber wo ich eigentlich drauf hinaus wollte, war diese nette PInvoke-Definition im Powershell-Skript:

    $NtQSIDefinition = @‘
    [DllImport("ntdll.dll")]
    public static extern int NtQuerySystemInformation(uint systemInformationClass, IntPtr systemInformation, uint systemInformationLength, IntPtr returnLength);
‚@
   
    $ntdll = Add-Type -MemberDefinition $NtQSIDefinition -Name ’ntdll‘ -Namespace ‚Win32‘ –PassThru

Um NtQuerySystemInformation sinnvoll anwenden zu können, braucht man noch etwas drumherum:

[System.IntPtr]$systemInformationPtr = [System.Runtime.InteropServices.Marshal]::AllocHGlobal(4)
[System.IntPtr]$returnLengthPtr = [System.Runtime.InteropServices.Marshal]::AllocHGlobal(4)
[System.UInt32]$systemInformationClass = 201
[System.UInt32]$systemInformationLength = 4

Nun kann man einen Aufruf wagen:

$retval = $ntdll::NtQuerySystemInformation($systemInformationClass, $systemInformationPtr, $systemInformationLength, $returnLengthPtr)

Ist $retval vom Wert 0 ist alles gut, bei 0xc0000003 oder 0xc0000002 ist $systemInformationClass nicht vorhanden. Alle anderen Werte stellen einen Fehler dar.

Nach dem Aufruf zeigt $systemInformationPtr auf einen Speicherbereich, welche die Daten vom System enthält. Diese Daten kann man z. b. so abfragen:

[System.UInt32]$flags = [System.UInt32][System.Runtime.InteropServices.Marshal]::ReadInt32($systemInformationPtr)

$flags enthält anschließend die ersten 4Bytes.

Hat man die Informationen, die einen interessieren, dann gibt man den Speicher wieder brav frei:

if ($systemInformationPtr -ne [System.IntPtr]::Zero) {
  [System.Runtime.InteropServices.Marshal]::FreeHGlobal($systemInformationPtr)
}
 
if ($returnLengthPtr -ne [System.IntPtr]::Zero) {
  [System.Runtime.InteropServices.Marshal]::FreeHGlobal($returnLengthPtr)
}

Die Freigabe sollte auch im Fehlerfall erfolgen, weshalb man ein try catch drumherum bauen sollte.

Jetzt stellt sich die Frage, wie kommt man an die gültigen SysteminformationClass-Werte und die zurückgegebenen Strukturen? Diese findet man zum Beispiel hier: http://www.exploit-monday.com/2013/06/undocumented-ntquerysysteminformation.html. Weitere Infos gibt es hier: http://www.geoffchappell.com/studies/windows/km/ntoskrnl/api/ex/
sysinfo/query.htm
.

Wer mehr mit der Geschichte spielen möchte, der nimmt Get-NtSystemInformation aus dem PowershellArsenal: https://github.com/mattifestation/PowerShellArsenal.

Ach wenn ich schon am verlinken bin, hier noch wie man damit PerformanceCounter abfragen kann: http://blog.whatsupduck.net/2010/05/querying-peak-commit-bytes-with.html. Oder wie man gelockte Filehandles in Erfahrung bringen kann: https://blogs.technet.microsoft.com/heyscriptingguy/2013/12/01/weekend-scripter-determine-process-that-locks-a-file/. Der Kernel weiß eben über alles Bescheid Smiley.

Wer sich für weitere Möglichkeiten von NtQuerySystemInformation interessiert, der sollte sich noch nach ZWAPI.H umschauen…

Advertisements

11 Antworten to “Spectre und Meltdown schönes Powershell-Script welches auch den Zugriff und vor allem die Mächtigkeit von NtQuerySystemInformation verdeutlicht”

  1. Quirel Says:

    Hier noch eine C Version auf Github zum Thema vom aktuellen Kernel-Meister:

    https://github.com/ionescu007/SpecuCheck

  2. Quirel Says:

    So sieht es aus, wenn alles korrekt gepatcht ist:

    PS > Get-SpeculationControlSettings
    Speculation control settings for CVE-2017-5715 [branch target injection]

    Hardware support for branch target injection mitigation is present: True
    Windows OS support for branch target injection mitigation is present: True
    Windows OS support for branch target injection mitigation is enabled: True

    Speculation control settings for CVE-2017-5754 [rogue data cache load]

    Hardware requires kernel VA shadowing: True
    Windows OS support for kernel VA shadow is present: True
    Windows OS support for kernel VA shadow is enabled: True
    Windows OS support for PCID performance optimization is enabled: True [not required for security]

    BTIHardwarePresent : True
    BTIWindowsSupportPresent : True
    BTIWindowsSupportEnabled : True
    BTIDisabledBySystemPolicy : False
    BTIDisabledByNoHardwareSupport : False
    KVAShadowRequired : True
    KVAShadowWindowsSupportPresent : True
    KVAShadowWindowsSupportEnabled : True
    KVAShadowPcidEnabled : True

  3. Quirel Says:

    So sieht es auf einem gepatchten Host mit ungepatchtem Gast in Hyper-V aus:

    PS C:\Users\admin> Get-SpeculationControlSettings
    Speculation control settings for CVE-2017-5715 [branch target injection]

    Hardware support for branch target injection mitigation is present: False
    Windows OS support for branch target injection mitigation is present: False
    Windows OS support for branch target injection mitigation is enabled: False

    Speculation control settings for CVE-2017-5754 [rogue data cache load]

    Hardware requires kernel VA shadowing: True
    Windows OS support for kernel VA shadow is present: False
    Windows OS support for kernel VA shadow is enabled: False

    Suggested actions

    * Install BIOS/firmware update provided by your device OEM that enables hardware support for the branch target injection mitigation.
    * Install the latest available updates for Windows with support for speculation control mitigations.
    * Follow the guidance for enabling Windows Client support for speculation control mitigations described in https://support.microsoft.com/help/4073119

    BTIHardwarePresent : False
    BTIWindowsSupportPresent : False
    BTIWindowsSupportEnabled : False
    BTIDisabledBySystemPolicy : False
    BTIDisabledByNoHardwareSupport : False
    KVAShadowRequired : True
    KVAShadowWindowsSupportPresent : False
    KVAShadowWindowsSupportEnabled : False
    KVAShadowPcidEnabled : False

  4. Quirel Says:

    Eine schöne Beschreibung und Erklärung der verwendeten Begriffe im Powershellscript gibt es hier: https://support.microsoft.com/en-us/help/4074629/understanding-the-output-of-get-speculationcontrolsettings-powershell

    Auch gibt es mittlerweile einfache Scripts für Linux: https://github.com/speed47/spectre-meltdown-checker

  5. Quirel Says:

    So sieht die Ausgabe auf einem AMD Opteron-System mit _ungepatchtem_ Windows aus, das angeblich nicht betroffen ist:

    Speculation control settings for CVE-2017-5715 [branch target injection]

    Hardware support for branch target injection mitigation is present: False
    Windows OS support for branch target injection mitigation is present: False
    Windows OS support for branch target injection mitigation is enabled: False

    Speculation control settings for CVE-2017-5754 [rogue data cache load]

    Hardware requires kernel VA shadowing: False

    Suggested actions

    * Install BIOS/firmware update provided by your device OEM that enables hardware support for the branch target injectio
    n mitigation.
    * Install the latest available updates for Windows with support for speculation control mitigations.

    BTIHardwarePresent : False
    BTIWindowsSupportPresent : False
    BTIWindowsSupportEnabled : False
    BTIDisabledBySystemPolicy : False
    BTIDisabledByNoHardwareSupport : False
    KVAShadowRequired : False
    KVAShadowWindowsSupportPresent : False
    KVAShadowWindowsSupportEnabled : False
    KVAShadowPcidEnabled : False

  6. Quirel Says:

    und gleich noch ein paar Zeilen, um die Hardware drumherum besser einschätzen zu können:

    Get-CimInstance Win32_Processor|select name, Caption, SocketDesignation, Revision, ProcessorId, Family
    Get-CimInstance Win32_bios
    Get-CimInstance Win32_BaseBoard
    Get-CimInstance Win32_PnPEntity -Filter „Caption like ‚%chip%'“|select @{N=“Chipset“;E={$_.Caption}} -First 1|fl *

  7. Quirel Says:

    Um die Übersicht zu haben, wenn es Updates für das Powershellscript gegeben hat und was sich geändert hat, kann man hier nachschauen: https://github.com/p0w3rsh3ll/MSRC-SpeculationControl/commits/master

    Der Dienst wird von https://p0w3rsh3ll.wordpress.com/2018/01/07/about-cpu-bug-aka-meltdown-spectre/ zur Verfügung gestellt. Der Blogeintrag enthält auch noch ein paar zusätzliche Infos und Links zur Vorgehensweise.

  8. Quirel Says:

    Die Lage unter Linux näher beleuchtet: https://www.heise.de/ct/artikel/Die-Neuerungen-von-Linux-4-15-3900646.html

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s


%d Bloggern gefällt das: