diff --git a/.gitignore b/.gitignore index 5de5b46..5f7846c 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,7 @@ fib.err # Piper (lokale Sprachausgabe) — Binaries und Stimmmodell, ~80 MB tools/piper/ + +# Sysinternals-Binaries (signiert, aber Binaries gehoeren nicht ins Repo — +# gleiche Regel wie tools/piper/). Nachladen: siehe tools/autologon_einrichten.ps1 +tools/autologon/ diff --git a/CLAUDE.md b/CLAUDE.md index 51a4409..1cebfb6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -259,6 +259,31 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche: Anteil, WR-Verfall, PF<1, Einzelverlust). **Wöchentlich** laufen lassen (B4/B5). - **Vor „fertig":** immer `python -m py_compile `; JS grob via Klammern- Balance prüfen (kein node im Env). +- **⚠ BOOT-LÜCKE: Auto-Logon vorbereitet, aber NICHT abgeschlossen (2026-08-07).** + `OilTradingServer` und `HyperliquidDashboard` hängen an einem **Logon**-Trigger + — nach einem Update-Reboot läuft nichts bis zur Anmeldung (real 20.07.: + Reboot 01:30, Server bis 07:42 tot, −95,48 €). ⚠ Ein Task „ohne angemeldete + Sitzung" hilft **nicht**: der Bot braucht das laufende **MT5-Terminal**, und das + ist eine GUI-Anwendung — es braucht eine echte Desktop-Sitzung. Auto-Logon ist + hier also tatsächlich das richtige Mittel, nicht nur das bequeme. + **Vorbereitet:** `tools/autologon_einrichten.ps1` + Sysinternals `Autologon` + (Microsoft-signiert, Signatur geprüft; `tools/autologon/` ist **gitignored** wie + `tools/piper/`). + ⚠⚠ **Bewusst NICHT der Registry-Weg.** Der verbreitete Weg legt das Passwort als + `DefaultPassword` im **Klartext** unter `HKLM\…\Winlogon` ab — lesbar für jeden + lokalen Admin und in jedem Backup-Image. Sysinternals `Autologon` speichert es + als **verschlüsseltes LSA-Secret**. Das Skript prüft danach nach, dass + `DefaultPassword` NICHT im Klartext steht. + ⚠⚠ **Das eigentliche Restrisiko ist nicht das Passwort, sondern die offene + Sitzung:** nach dem Reboot steht ein angemeldeter Desktop mit MT5 und + Live-Broker-Verbindung da. Deshalb legt das Skript zusätzlich die Aufgabe + `OilAutoLogonLock` an — 30 s nach der Anmeldung `LockWorkStation`. Die Sitzung + **läuft** (MT5 und beide Server arbeiten), der Bildschirm ist gesperrt. + ⚠ **Muss ELEVATED ausgeführt werden** — `HKLM` ist aus einer normalen Sitzung + nicht schreibbar (getestet: „Requested registry access is not allowed"). Das + Passwort steht **nicht** im Skript und wird nirgends gespeichert; es wird im + Autologon-Dialog eingegeben. **Zurück:** `Autologon /accepteula` → Disable, und + `schtasks /Delete /TN OilAutoLogonLock /F`. - **✅ STUFE 5 DER PIPELINE IST JETZT EIN SKRIPT (`tools/deploy.py`, 2026-08-07).** Ersetzt das von Hand zusammengesetzte „killen, starten, warten, nachsehen" und macht die dokumentierte Schwachstelle prüfbar. diff --git a/tools/autologon_einrichten.ps1 b/tools/autologon_einrichten.ps1 new file mode 100644 index 0000000..67efbd1 --- /dev/null +++ b/tools/autologon_einrichten.ps1 @@ -0,0 +1,81 @@ +# Auto-Logon einrichten — schliesst die letzte Luecke der Boot-Pipeline. +# +# WOZU: `OilTradingServer` und `HyperliquidDashboard` haengen an einem LOGON- +# Trigger. Nach einem Windows-Update-Reboot laeuft nichts, bis sich jemand +# anmeldet — real in der Nacht zum 2026-07-20 passiert (Reboot 01:30, Server bis +# 07:42 tot, nur der broker-seitige SL schuetzte, -95,48 EUR). Ein Task ohne +# angemeldete Sitzung hilft NICHT: der Bot braucht das laufende MT5-TERMINAL, +# und das ist eine GUI-Anwendung — es braucht eine echte Desktop-Sitzung. +# +# ⚠⚠ WARUM DIESES SKRIPT UND NICHT DIE REGISTRY. Der verbreitete Weg schreibt +# das Passwort als `DefaultPassword` im KLARTEXT nach +# HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon — dort kann es +# jeder lokale Administrator und jedes Backup-Image lesen. Sysinternals +# `Autologon` legt es stattdessen als **verschluesseltes LSA-Secret** ab. Gleiche +# Wirkung, deutlich besseres Versteck. Die EXE ist von Microsoft signiert +# (geprueft: Status Valid, CN=Microsoft Corporation). +# +# ⚠ DAS RESTRISIKO BLEIBT und ist NICHT das Passwort: nach dem Reboot steht eine +# ANGEMELDETE Sitzung mit offenem MT5 und Live-Broker-Verbindung da. Wer physisch +# an den Rechner kommt, sitzt davor. Deshalb sperrt Schritt 2 den Bildschirm +# sofort wieder — die Sitzung laeuft (MT5 arbeitet), der Desktop ist zu. +# +# AUFRUF: dieses Fenster muss ALS ADMINISTRATOR laufen. +# powershell -ExecutionPolicy Bypass -File tools\autologon_einrichten.ps1 +# +# ⚠ Das Passwort steht bewusst NICHT in dieser Datei und wird nirgends +# gespeichert — es wird im GUI-Dialog von Autologon eingegeben. + +$ErrorActionPreference = 'Stop' +$id = [Security.Principal.WindowsIdentity]::GetCurrent() +if (-not (New-Object Security.Principal.WindowsPrincipal($id)).IsInRole( + [Security.Principal.WindowsBuiltInRole]::Administrator)) { + Write-Host " ABBRUCH: Dieses Fenster hat keine Administratorrechte." -ForegroundColor Red + Write-Host " PowerShell als Administrator oeffnen und erneut aufrufen." + exit 1 +} + +$hier = Split-Path -Parent $MyInvocation.MyCommand.Path +$exe = Join-Path $hier 'autologon\Autologon64.exe' +if (-not (Test-Path $exe)) { $exe = Join-Path $hier 'autologon\Autologon.exe' } +if (-not (Test-Path $exe)) { + Write-Host " ABBRUCH: Autologon.exe fehlt unter tools\autologon\." -ForegroundColor Red + exit 1 +} + +Write-Host "==================================================================" +Write-Host " SCHRITT 1 — Auto-Logon aktivieren (verschluesseltes LSA-Secret)" +Write-Host "==================================================================" +Write-Host " Benutzer : $env:USERNAME" +Write-Host " Domaene : $env:COMPUTERNAME (lokales Konto)" +Write-Host " Es oeffnet sich der Autologon-Dialog. Passwort dort eintragen" +Write-Host " und auf Enable klicken." +Start-Process -FilePath $exe -ArgumentList '/accepteula' -Wait + +# ── Ergebnis pruefen ──────────────────────────────────────────────────── +$k = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon' +$an = (Get-ItemProperty -Path $k -Name AutoAdminLogon -EA SilentlyContinue).AutoAdminLogon +$klartext = (Get-ItemProperty -Path $k -Name DefaultPassword -EA SilentlyContinue).DefaultPassword +Write-Host "" +Write-Host " AutoAdminLogon : $an" +if ($klartext) { + Write-Host " ⚠ DefaultPassword steht im KLARTEXT in der Registry!" -ForegroundColor Yellow + Write-Host " (Autologon sollte das vermeiden — bitte pruefen.)" +} else { + Write-Host " DefaultPassword : nicht im Klartext ✅ (LSA-Secret)" +} + +# ── Schritt 2: Sitzung sofort sperren ─────────────────────────────────── +Write-Host "" +Write-Host "==================================================================" +Write-Host " SCHRITT 2 — Bildschirm nach dem Auto-Logon sofort sperren" +Write-Host "==================================================================" +$t = 'OilAutoLogonLock' +schtasks /Delete /TN $t /F 2>$null | Out-Null +schtasks /Create /TN $t /SC ONLOGON /RU "$env:USERNAME" /DELAY 0000:30 ` + /TR "rundll32.exe user32.dll,LockWorkStation" /F | Out-Null +Write-Host " Aufgabe '$t' angelegt (30 s nach Anmeldung -> Sperrbildschirm)." +Write-Host " Die Sitzung LAEUFT weiter, MT5 und beide Server arbeiten." +Write-Host "" +Write-Host " Rueckgaengig: $exe /accepteula (Disable) und" +Write-Host " schtasks /Delete /TN $t /F"