
Sicherheits-Hardening-Toolkit für COBOL-Legacy-Systeme — Erkennung unsichtbarer Unicode-Zeichen, Analyse von Formatgrenzen, Integrität der Quelltexttransformation
Security-Auditing-Toolkit für COBOL-Legacy-Systeme
Teil der VTR Research Methodology | DOI: 10.5281/zenodo.22063208 Status: Reproduzierbar | Lizenz: MIT | Track: Kritische Infrastruktur
Erkennt Abweichungen im Kompilierungskontext, unsichtbare Unicode-Angriffe und unsichere COBOL-Muster in GnuCOBOL-Quellen. Dieselbe Quelldatei, kompiliert mit -fixed vs. -free, erzeugt unterschiedliche Programme — dieses Tool macht diese Divergenz beobachtbar und reproduzierbar.
git clone https://github.com/LuisCastellanos-dev/cobol-shield
cd cobol-shield
bash tools/poc_compiler_flag.sh
Dieses Tool beansprucht oder demonstriert keine Remote-Code-Ausführung, Privilegieneskalation oder Netzwerkausnutzung. Befunde werden gemäß VTR-Methodik als CONFIRMADO, PROBABLE oder OBSERVADO klassifiziert — die Klassifizierung spiegelt die Beweiskraft wider, nicht die Schwere der Auswirkung.
Security-Auditing-Toolkit für COBOL-Legacy-Systeme
Erkennt unsichtbare Unicode-Angriffe, unsichere COBOL-Muster und Integritätsprobleme bei Formattransformationen in GnuCOBOL-Quellen. Validiert mit GnuCOBOL 3.1.2. Verhalten bei IBM Enterprise COBOL oder Micro Focus nicht verifiziert — compiler-spezifische Flag-Semantik kann abweichen.
PIC X akzeptiert alles. Ihr Batch sollte das nicht.
cobol-shield deckt zwei unterschiedliche Angriffsflächen ab:
1. Unsichtbare Unicode-Zeichen — CVE-2021-42574 und Vektoren der Glassworm-Klasse, die die visuelle Code-Review umgehen und PIC X-Felder stillschweigend korrumpieren.
2. COBOL-Statische Analyse — unsichere Muster in Legacy-Quellen: nicht initialisierter Working-Storage, ungeprüfter STRING/UNSTRING-Überlauf, REDEFINES-Größenabweichungen und positionsabhängige Bedingungen im Fixed-Format, die ihre Bedeutung unter Transformation ändern.
| Datei | Zweck |
|---|---|
tools/check-invisibles.py | CI-Checker — beendet mit 1 bei Erkennung unsichtbarer Unicode-Zeichen |
tools/clean-invisibles.py | Sanitizer mit forensischem Audit-Log |
src/AUDITOR-INVISIBLE.cob | Byte-Validator in COBOL unter Verwendung von HEX-OF |
tools/cobol_rules.py | Statische Analyseregeln R-01 bis R-04 |
tools/transform_renumber.py | Fixed-Format-Renumber-Shift-Simulator (Phase 2) |
tools/poc_compiler_flag.sh | Definitiver PoC — dieselbe Datei, -fixed vs. -free, Compiler-Flag-Divergenz |
tools/poc_differential.sh | Differentieller PoC Phase 2 — SOURCE A vs. SOURCE B (manuelle Migration) |
Jede Regel erzeugt eine Ausgabe im VTR Finding Schema v1, kompatibel mit cryptofault und vtr-forensic-img über context_loader.
| Regel | Name | Schweregrad | Klassifizierung |
|---|---|---|---|
| R-01 | UNINITIALIZED_WS | Hoch | HECHO |
| R-02 | UNSTRING_NO_OVERFLOW | Hoch | HECHO |
| R-03 | REDEFINES_SIZE_MISMATCH | Hoch | HECHO |
| R-04 | FORMAT_BOUNDARY_ANALYSIS | Info | PROYECCION |
R-01 — UNINITIALIZED_WS Erkennt Working-Storage-Variablen, die ohne VALUE-Klausel und ohne INITIALIZE oder MOVE in der PROCEDURE DIVISION deklariert sind. Risiko stillen undefinierten Verhaltens in Batch- und CICS-Umgebungen.
R-02 — UNSTRING_NO_OVERFLOW Erkennt STRING/UNSTRING-Anweisungen ohne ON OVERFLOW-Behandlung. Stille Abschneidung, wenn die Eingabe die Zielfeldlänge überschreitet.
R-03 — REDEFINES_SIZE_MISMATCH Erkennt REDEFINES, bei denen das redefinierte Feld mehr Bytes deklariert als seine Basis. Risiko einer Speichergrenzverletzung — compilerabhängiges Verhalten.
R-04 — FORMAT_BOUNDARY_ANALYSIS (Phase 1 — nur Beobachtungen) Erkennt positionsabhängige Bedingungen in Fixed-Format-COBOL-Quellen:
COL73_NONEMPTY — Nicht-Leerzeichen-Inhalt im Identifikationsbereich (Spalten 73–80)COL7_VERB — ausführbares COBOL-Verb in einer kommentierten Zeile (Spalte 7 = * / / / D)SOURCE_BOUNDARY — Inhalt jenseits von Spalte 80R-04 erzeugt severity=info, classification=PROYECCION. Es dokumentiert Formatbedingungen — keine Schwachstellen. Auswirkungen erfordern eine differentielle Transformationsanalyse (Phase 2).
Die zentrale These: Eine COBOL-Datei im Fixed-Format hat unterschiedliche Semantik, je nachdem, mit welchem Compiler-Flag sie gebaut wird — und dieses Flag liegt außerhalb der Quelldatei.
Demonstriert mit GnuCOBOL 3.1.2, einzelnes Artefakt, keine Modifikation:
bash tools/poc_compiler_flag.sh
cobc -x -fixed poc-same-file.cbl → kompiliert → Ausgabe: 0000001000
cobc -x -free poc-same-file.cbl → 10 Kompilierungsfehler
Unter -fixed: Zeile 6, Spalte 7 = * ist der Kommentarindikator — MOVE 999999 ist inaktiv, das Programm läuft und zeigt 1000 an.
Unter -free: Sequenznummern 000100...001000 werden als numerische Literale geparst — der PROGRAM-ID-Header wird als fehlend gemeldet, jede Zeile erzeugt einen Fehler. Dieselbe Datei ist syntaktisch ungültig.
Das Compiler-Flag befindet sich nicht in der Quelldatei. Es lebt im Makefile, in der CI-Konfiguration oder im Operator-Aufruf. Eine Änderung — beabsichtigt oder versehentlich — ändert, ob das Programm gültig ist und was es tut.
Nachweis: corpus/fixed-format/poc-evidence.md
SHA-256 und vollständiges Fehlerprotokoll dokumentiert.
Ein früherer PoC demonstriert dieselbe These über manuelle Migration:
SOURCE A (Fixed-Format, Spalte 7='*' inaktiv): Ausgabe → 0000001000
SOURCE B (Free-Format, Code aktiv): Ausgabe → 0000999999
SHA-256 A: b70a948a0df5e8f685e82f5bffc9c4710f2c0a7a23b6294e7ca20092c2d25d37
SHA-256 B: f5fd80f79ed3e5be97628f89790256d6fba80605dce2b7985b729b5fef6f26d5
Einschränkung: SOURCE B ist eine manuelle Darstellung einer fehlerhaften Migration, nicht die Ausgabe von IBM Z Open Editor oder IBM SCU unter realer Renummerierung. Der obige Compiler-Flag-PoC hat diese Einschränkung nicht.
Erkannte Bereiche:
| Codepoint | Name | Risiko |
|---|---|---|
| U+0001–U+001F | C0-Steuerzeichen | Batch-Abbrüche |
| U+200B–U+200F | Zero-Width | Datenkorruption, VSAM-Abschneidung |
| U+202A–U+202E | Bidi-Override | Trojan Source — CVE-2021-42574 |
| U+2066–U+2069 | Bidi-Isolate | Richtungs-Spoofing |
| U+FE00–U+FE0F | Variation Selectors | Steganographie der Glassworm-Klasse |
| U+E000–U+F8FF | Private Use Area | Payload-Versteck |
| U+FEFF | BOM | Stilles vorangestelltes Byte |
# Byte-level inspection
hexdump -C source.cob | grep -E "e2 80 (8b|ae)"
# Unicode CI check — exits 1 on detection
python3 tools/check-invisibles.py .
# Sanitize with forensic audit log
python3 tools/clean-invisibles.py . --report audit-$(date +%Y%m%d).log
# Run static analysis rules
python3 -c "
from tools.cobol_rules import scan_path_r01, scan_path_r02, scan_path_r03, scan_path_r04
import json
for f in scan_path_r02('your-source.cbl'):
print(f.to_json())
"
# Transformation differential PoC
bash tools/poc_differential.sh
- name: Check for invisible Unicode
run: python3 tools/check-invisibles.py .
PIC X(n) ist ein roher Byte-Puffer. Er akzeptiert jede Byte-Sequenz ohne Validierung. Wenn eine Zowe-API-Schicht JSON über MOVE an ein COBOL-Copybook übergibt, gelangt unsichtbares Unicode stillschweigend in den Datensatz.
Fixed-Format-COBOL fügt eine zweite Angriffsfläche hinzu: positionsabhängige Spaltensemantik (Spalte 7 als Indikatorbereich, Spalten 73–80 als Identifikationsbereich) ist formatabhängig. Ein Migrationstool, das diese Semantik nicht bewahrt, kann inaktiven Code aktivieren oder die Programmstruktur stillschweigend korrumpieren.