Office Makros automatisiert kontrollieren - Security Thematik
Hallo Werte Administrator LeserInnen,
was ist das Problem:
Viele Kunden/Lieferanten schicken uns Excel Listen, wo teils Makro Code das Excel aufhübschen,
ein paar Zeilen ausfüllen, Berechnungen durchführen, etc.
Auf die Anfrage zum Kunden/Lieferanten ob es möglich ist,
es gemeinsam so zu ändern umzustellen, das man keinen Makro Code mehr benötige,
wird meist abgelehnt.
Office Dokumente mit Makros kann ich nicht einfach blind weiterleiten,
heißt ich muss jedes Makro anschauen Zeile für Zeile und jedes mal,
auch wenn es gleich aussieht.
theoretischer Ansatz:
Mein Ansatz wäre ein System, Script, Programm das automatisch
das Makro vom Excel exportiert, und diesen exportierten Code
mit Vorlagen vergleicht, Zeichen für Zeichen.
Also man bekommt einen Makro Code vom Kunden, der sich nicht ändert.
Man ließt sich diesen Code sorgfältig 1x durch.
Speichert diesen Code als Vorlage.
Jedes Excel mit Makros wird mit den Vorlagen verglichen,
wenn keines übereinstimmt, kommt es in die Quarantäne.
Frage:
Hat jemand gleiche Probleme und schon eine Lösung ?
Habt Ihr andere Ansätze für mich ?
Danke fürs lesen.
was ist das Problem:
Viele Kunden/Lieferanten schicken uns Excel Listen, wo teils Makro Code das Excel aufhübschen,
ein paar Zeilen ausfüllen, Berechnungen durchführen, etc.
Auf die Anfrage zum Kunden/Lieferanten ob es möglich ist,
es gemeinsam so zu ändern umzustellen, das man keinen Makro Code mehr benötige,
wird meist abgelehnt.
Office Dokumente mit Makros kann ich nicht einfach blind weiterleiten,
heißt ich muss jedes Makro anschauen Zeile für Zeile und jedes mal,
auch wenn es gleich aussieht.
theoretischer Ansatz:
Mein Ansatz wäre ein System, Script, Programm das automatisch
das Makro vom Excel exportiert, und diesen exportierten Code
mit Vorlagen vergleicht, Zeichen für Zeichen.
Also man bekommt einen Makro Code vom Kunden, der sich nicht ändert.
Man ließt sich diesen Code sorgfältig 1x durch.
Speichert diesen Code als Vorlage.
Jedes Excel mit Makros wird mit den Vorlagen verglichen,
wenn keines übereinstimmt, kommt es in die Quarantäne.
Frage:
Hat jemand gleiche Probleme und schon eine Lösung ?
Habt Ihr andere Ansätze für mich ?
Danke fürs lesen.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 299261
Url: https://administrator.de/forum/office-makros-automatisiert-kontrollieren-security-thematik-299261.html
Ausgedruckt am: 09.04.2025 um 00:04 Uhr
16 Kommentare
Neuester Kommentar

Cherio.
Sag deinen Kunden / Lieferanten das sie Ihre Makros doch bitte mit einer gültigen Signatur versehen möchten, ansonsten würden diese abgelehnt. Dann packst du diese Zertifikate per GPO in die Whitelist von Office, fertig. Unsignierte Makros werden dann in Zukunft nicht mehr erlaubt.
Gruß fk
Sag deinen Kunden / Lieferanten das sie Ihre Makros doch bitte mit einer gültigen Signatur versehen möchten, ansonsten würden diese abgelehnt. Dann packst du diese Zertifikate per GPO in die Whitelist von Office, fertig. Unsignierte Makros werden dann in Zukunft nicht mehr erlaubt.
Gruß fk

Zitat von @K-ist-K:
Auch wenn das Makro mit einer Digitalen Signatur versehen wird, heißt das doch nicht, das das Makro zu 100% sicher ist oder ?
Absolut sicher kann man nie sein das in den Firmen euch nicht doch jemand schaden möchte. Ansonsten hilft nur die Files auf die typischen Signaturen von Malware hin zu checken. Also Download von Content, ausführen von Befehlen wie Shell etc.Auch wenn das Makro mit einer Digitalen Signatur versehen wird, heißt das doch nicht, das das Makro zu 100% sicher ist oder ?
Das beweißt nur das das Makro wirklich von dieser Firma kommt, und es kein "man in the middle" etc. manipuliert hat.
Eine Änderung am Makroprojekt durch dritte macht die Signatur ungültig. Das ist der Zweck dieser.
Zitat von @K-ist-K:
Ob das machbar ist.
Bei der Urpsrungsidee von mir, ließt man sich den Code der Firmen 1x durch.
Kann sich selbst überzeugen und man muss es dennoch nur 1x checken.
Ob das machbar ist.
Bei der Urpsrungsidee von mir, ließt man sich den Code der Firmen 1x durch.
Kann sich selbst überzeugen und man muss es dennoch nur 1x checken.
Also man bekommt einen Makro Code vom Kunden, der sich nicht ändert.
Ist man sich sicher ob der Code sich nicht ändert ?? Da muss man dann jedes mal ran wenn sich was ändert, und wer sagt einem das schon jedes mal.Es bleibt also trotzdem noch manuelle Selektion. Wie man es dreht oder wendet nur 2 Augen geben dir die Sicherheit die du wünschst.
Sehe ich positiv, schafft wenigstens Arbeitsplätze, in der heutigen Zeit eine Seltenheit
Du könntest natürlich auch mit Makros und Regex den Code der Mappen durchpflügen z.B. ala
'(?i)\.Run|Shell|powershell|executionpolicy|\.exec|kill|cmd\.exe'
Und so eine Vorauslese von verdächtigen Dokumenten generieren die man manuell durchsieht.

Zitat von @K-ist-K:
Ich denke der erste Schritt ist, wie kann man den Makro Code automatisch exportieren.
Es kann auch sein, das meine Idee gar nicht umsetzbar ist, deswegen wollte ich mich hier ja informieren.
Das ist kein Problem, Office-Dateien sind intern gesehen ZIP-Dateien, wenn du an diese die Endung *.zip anhängst (z.B. docx.zip) findest du im Zip-File eine Datei namens vbaProject.bin darin ist der VBA-Code enthalten.Ich denke der erste Schritt ist, wie kann man den Makro Code automatisch exportieren.
Es kann auch sein, das meine Idee gar nicht umsetzbar ist, deswegen wollte ich mich hier ja informieren.
Das kannst du nach belieben umsetzen ob nun mit Batch via 7zip oder auch mit Powershell, das kann ab PS 3.0 auch nativ ZIP-Files entpacken.

Hallo K-ist-K!
Eine Möglichkeit wäre vielleicht, wie von Flachkoepper vorgeschlagen, die Makro-Datei zu entpacken (geht per 7zip direkt) und den Hash-Value (MD5, SHA1, SHAxxx...) der Datei vbaProject.bin mit einer von Dir bereits erstellten Hash-Freigabeliste zu vergleichen?
Gruß Dieter
Eine Möglichkeit wäre vielleicht, wie von Flachkoepper vorgeschlagen, die Makro-Datei zu entpacken (geht per 7zip direkt) und den Hash-Value (MD5, SHA1, SHAxxx...) der Datei vbaProject.bin mit einer von Dir bereits erstellten Hash-Freigabeliste zu vergleichen?
Gruß Dieter

Hallo!
Für's extrahieren ist es unerheblich, ob die Word-/Exceldateien Makros (vbaProject) enthalten oder nicht
Mit 7zip lassen sich z.B. folgende Dateien (ohne vorheriges umbenennen) direkt extrahieren:
*.doc
*.docx
*.docm
*.xls
*.xlsx
*.xlsm
Mit Bordmitteln davon nur:
*.docx.zip
*.docm.zip
*.xlsx.zip
*.xlsm.zip
Gruß Dieter
Für's extrahieren ist es unerheblich, ob die Word-/Exceldateien Makros (vbaProject) enthalten oder nicht
Mit 7zip lassen sich z.B. folgende Dateien (ohne vorheriges umbenennen) direkt extrahieren:
*.doc
*.docx
*.docm
*.xls
*.xlsx
*.xlsm
Mit Bordmitteln davon nur:
*.docx.zip
*.docm.zip
*.xlsx.zip
*.xlsm.zip
Gruß Dieter

Hallo K-ist-K!
, zumal es sich um ein aktuelles Thema handelt für das Dir momentan die Zeit fehlt...
Einen Wissensartikel dazu zu schreiben, ist sicherlich keine schlechte Idee und wenn es soweit ist, solltest Du hier den Link dazu posten und den Beitrag auf gelöst setzen...
Gruß Dieter
Soll ich diese Frage einfach so lassen wie es ist oder wenn es mal eine Lösung gibt, eines Wissensartikel schreiben ?
Gute FrageEinen Wissensartikel dazu zu schreiben, ist sicherlich keine schlechte Idee und wenn es soweit ist, solltest Du hier den Link dazu posten und den Beitrag auf gelöst setzen...
Gruß Dieter
Hallo zusammen,
habe das hier gerade zufällig gesehen und mal was in Powershell gezimmert was das beschriebene für aktuelle Office-Dateien im OpenXML-Format erledigt:
Das Skript speichert man als *.ps1 und übergibt diesem auf der Kommandozeile dann zwei Parameter, einmal einen Ordnerpfad in dem die Office-Dateien liegen und der zweite ist der Pfad zu einer Referenzdatei vbaProject.bin.
Vom Skript wird dann jeweils die vbaProject.bin extrahiert, deren Hash geprüft und gegen den Referenz-Hash gecheckt. Je nachdem ob der Hash stimmt oder nicht werden die Dateien dann in entsprechende Unterordner des Prüfordners verschoben.
Zum Schluss erfolgt eine LOG-Ausgabe. Diese kann man sich nach Bedarf dann noch in eine Datei wegschreiben.
Die Ordnernamen etc. lassen sich in den Variablen anpassen.
Vielleicht hilft das dem ein oder anderen.
Grüße Uwe
habe das hier gerade zufällig gesehen und mal was in Powershell gezimmert was das beschriebene für aktuelle Office-Dateien im OpenXML-Format erledigt:
Das Skript speichert man als *.ps1 und übergibt diesem auf der Kommandozeile dann zwei Parameter, einmal einen Ordnerpfad in dem die Office-Dateien liegen und der zweite ist der Pfad zu einer Referenzdatei vbaProject.bin.
powershell -Executionpolicy Bypass -File "C:\script.ps1" "[ORDNER-PFAD DER OFFICE-DATEIEN]" "[PFAD ZUR REFERENZ VBAPROJECT.BIN]"
Zum Schluss erfolgt eine LOG-Ausgabe. Diese kann man sich nach Bedarf dann noch in eine Datei wegschreiben.
Die Ordnernamen etc. lassen sich in den Variablen anpassen.
param(
[parameter(Mandatory=$true)][ValidateScript({Test-Path $_})][string]$folder,
[parameter(Mandatory=$true)][ValidateScript({Test-Path $_})][string]$vbaref
)
# Benötigt wird mindestens NET-Framework 4.5 und Powershell 3.0
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}
# =================== Variablen ============================================
# Ordner in den die Dateien je nach Status verschoben werden
$quarantine_folder = "$folder\quarantäne"
$clean_folder = "$folder\clean"
# zu überprüfende Dateierweiterungen
$extensions = @('.xlsm','.xltm','.docm','.dotm','.pptm','.ppsm','.potm')
# ==========================================================================
# benötigte Assemblies laden
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.IO.Compression.Filesystem
# Ausgabe Ordner erstellen
if (!(Test-Path $quarantine_folder)){md $quarantine_folder -Force}
if (!(Test-Path $clean_folder)){md $clean_folder -Force}
# Hash-Funktion
function md5([System.IO.FileInfo]$fileobj){
$md5 = [System.Security.Cryptography.MD5]::Create()
Try{
$stream = $fileobj.OpenRead()
$hash = [System.BitConverter]::ToString($md5.ComputeHash($stream))
$stream.Close();$stream.Dispose();$md5.Dispose()
return $hash
}catch{
write-host "Error: $($_.Exception.Message)"
return $false
}
}
# Temporäre Extrahierungs-Pfade für die Datei die geändert wird
$vbaprojectfile = "$env:TEMP\vbaProject.bin"
# Hash der Referenzdatei berechnen
$hash_ref = md5 $vbaref
# Dateien ausfiltern
$files = gci $folder | ?{$_.Extension -in $extensions}
$log = @()
foreach ($file in $files){
# Dokument als ZIP-Datei im Read-Modus öffnen
$zipfile = [System.IO.Compression.ZipFile]::Open($file.Fullname,[System.IO.Compression.ZipArchiveMode]::Read)
# Falls die temoporäre Datei existiert lösche sie
remove-item $vbaprojectfile -Force -EA Ignore
# Einträge der benötigte Dateien aus dem Dokument holen
$entry = $zipfile.Entries | ?{$_.Name -eq 'vbaProject.bin'} | select -First 1
if ($entry){
# vbaproject.bin extrahieren
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry,$vbaprojectfile)
# Zipfile-Resourcen freigeben
$zipfile.Dispose()
# Hash berechnen
$hash_file = md5 $vbaprojectfile
# Checken ob Hash mit Hash des Referenz-File übereinstimmt ...
if ($hash_ref -eq $hash_file){
$file | move-item -Destination $clean_folder -Force
$log += [pscustomobject] @{"Filename"=$file.Fullname;'Result'='HASH OK';'Hash'=$hash_file}
}else{
$file | move-item -Destination $quarantine_folder -Force
$log += [pscustomobject] @{"Filename"=$file.Fullname;'Result'='HASH MISMATCH';'Hash'=$hash_file}
}
}else{
$zipfile.Dispose()
$file | move-item -Destination $clean_folder -Force
$log += [pscustomobject] @{"Filename"=$file.Fullname;'Result'='NO VBA PROJECT';'Hash'=''}
}
}
# Log anzeigen
$log | sort Result | ft -GroupBy Result -AutoSize
Grüße Uwe

Hallo Uwe!
Ich bin begeistert, Du bist mein Held
Gruß Dieter
Ich bin begeistert, Du bist mein Held
Gruß Dieter