Statische Analyse zur Erkennung von Sicherheitslücken bei CICS-Transaktionen

Statische Analyse zur Erkennung von Sicherheitslücken bei CICS-Transaktionen

CICS-Systeme unterstützen einige der sensibelsten und volumenintensivsten Transaktionsverarbeitungsumgebungen weltweit. Vom Bank- und Versicherungswesen bis hin zu Logistik und Verteidigung verarbeiten diese Plattformen Arbeitslasten, die sich keine Sicherheitslücken leisten können. Während die Betriebszeit oft im Mittelpunkt steht, führt die Struktur von CICS-Anwendungen zu versteckte Risiken die bei Routineprüfungen leicht übersehen werden können.

Viele dieser Risiken entstehen durch Legacy-Code. Verschachtelte COBOL-Module, Transaktions-Programm-Bindungen, dynamische Programmaufrufe und wiederverwendete Kommunikationsbereiche können Schwachstellen die von außen nicht sichtbar sind. Typische Beispiele sind nicht validierter Terminalzugriff, Missbrauch von XCTL- oder LINK-Anweisungen und erhöhte Berechtigungen durch falsches Transaktionsrouting. Diese Fehler können jahrelang in der Produktion bestehen, ohne dass es zu Warnungen kommt.

Statische Analyse bietet eine strukturierte Möglichkeit, diese Probleme zu identifizieren, bevor sie ausgenutzt werden. Im Gegensatz zu Web- oder API-Anwendungen erfordert das Scannen von CICS-Workloads jedoch eine viel gründlichere Untersuchung. Analysten müssen den Kontrollfluss über mehrere Programmebenen hinweg verfolgen, den Datenfluss durch den gemeinsam genutzten Speicher verstehen und Muster erkennen, die spezifisch für das Transaktionsverhalten von Mainframes sind.

Dieser Artikel befasst sich mit der Anwendung statischer Analysen in CICS-Umgebungen, um Sicherheitslücken aufzudecken und zu minimieren. Er beschreibt die zu beachtenden Hochrisikostrukturen, zeigt die Interpretation der Transaktionslogik in COBOL-Code und bietet Ingenieuren Anleitungen für die genaue und gründliche Überprüfung großer Legacy-Systeme. Ziel ist es, Teams dabei zu unterstützen, ihre Transaktionsebenen ohne Rätselraten oder Unterbrechungen zu sichern.

Inhaltsverzeichnis

Grundlegendes zu Angriffsflächen für CICS-Transaktionen

CICS-Transaktionen sind nicht nur programmatische Arbeitseinheiten. Sie sind tief in die Zugriffskontrolle, Benutzeridentität, Ressourcenautorisierung und Sitzungsintegrität eingebettet. Viele Mainframe-Systeme basieren auf jahrzehntealten Designmustern, bei denen die Sicherheitsdurchsetzung implizit statt explizit erfolgt. Dies birgt Risiken, die bei Tests oder sogar Compliance-Audits oft übersehen werden.

Die statische Analyse auf dieser Ebene beginnt mit der Abbildung, wo die Kontrolle übergeben wird, wie Eingaben verarbeitet werden und welche Pfade in bestimmten Ausführungskontexten erreichbar sind. Selbst Systeme, die Penetrationstests bestanden haben, können immer noch Schwachstellen im Zusammenhang mit fehlgeleiteten oder übermäßig privilegierten Transaktionsflüssen aufweisen.

Versteckte Schwachstellen in EXEC CICS-Aufrufen

Eine häufige Schwäche betrifft die dynamische Nutzung von EXEC CICS LINK, XCTLden RETURN ohne den Ursprung oder Kontext des Aufrufs zu überprüfen. Wenn Programme lose verkettet sind und Programmnamen extern bereitgestellt oder dynamisch erstellt werden, kann böswillige Eingabe die Ausführung auf Module mit erhöhten Berechtigungen lenken.

In der Praxis könnte dies folgendermaßen aussehen:

EXEC CICS LINK PROGRAM(PROG-NAME) COMMAREA(COMM-AREA) LENGTH(COMM-LEN) END-EXEC

If PROG-NAME aus einem vom Benutzer bereitgestellten Wert erstellt oder aus einer Tabelle ohne strenge Validierung zugeordnet wird, können nicht autorisierte Benutzer vertrauliche Programme aufrufen, die nicht offengelegt werden sollten.

Die statische Analyse muss solche Pfade erkennen, insbesondere wenn:

  • Programmnamen werden aus verketteten oder maskierten Werten gebildet
  • Für zulässige oder erwartete Ziele ist keine Fallback-Prüfung implementiert
  • Die Empfangsprogramme arbeiten ohne weitere Überprüfung der Berechtigung

SVC- und Storage Control-Eskalationsmuster

Bestimmte SVC-basierte Aufrufe oder interne Serviceroutinen, auf die über Anweisungen auf Makroebene zugegriffen wird, können eine Eskalation durch Speichermanipulation ermöglichen. Unsachgemäße Verwendung von ADDRESS, ASSIGNoder der direkte Zugriff auf Terminaldatenblöcke kann Sicherheitsvorkehrungen umgehen, wenn der Sicherheitskontext auf Taskebene nicht richtig durchgesetzt wird.

Ein typisches Warnsignalmuster umfasst:

  • Zuweisen einer Terminal-ID oder Aufgabennummer aus Roheingaben
  • Die Verwendung von EXEC CICS ADDRESS TCTUA oder gleichwertige Aufrufe, gefolgt von direkten Schreibvorgängen
  • Switching-Steuerung basierend auf dem Sitzungsstatus ohne Rollenüberprüfung

Angreifer, die mit Terminalstrukturen und CICS-Interna vertraut sind, können diese Zugriffspunkte ausnutzen, um Berechtigungen zu erhöhen oder unbeabsichtigte Befehle einzuschleusen.

Um diese Schwachstellen zu identifizieren, müssen Sie nicht nur nach den CICS-Befehlen suchen, sondern auch die Datenherkunft über Speicherzuweisungen hinweg auflösen, den Ursprung der Steuerparameter prüfen und die Verwendung unsicherer oder nicht authentifizierter Kontextwerte kennzeichnen.

Umfang der statischen Analyse in einer CICS-Umgebung

Die statische Analyse in CICS-Umgebungen muss über die grundlegende Syntax- oder Schlüsselworterkennung hinausgehen. Analysten müssen nicht nur die Struktur des Codes, sondern auch das Transaktionsmodell, Programmverknüpfungen, Datenflüsse und Berechtigungsgrenzen verstehen. Eine umfassende Bewertung sollte die Interaktion von Benutzern, Terminals und Anwendungen über gemeinsam genutzten Speicher und verkettete Ausführungslogik berücksichtigen.

Diese Art der Überprüfung ist komplex, insbesondere bei Anwendungen, die vor Jahrzehnten geschrieben und über einen längeren Zeitraum von mehreren Teams gepflegt wurden. Programme basieren oft auf unstrukturiertem Kontrollfluss, dynamischer Nutzung von Kommunikationsbereichen und wiederverwendeten Programm-IDs, wodurch die Autoritätsebene verschleiert wird.

Analyse des COBOL-CICS-Quellflusses auf Vertrauensgrenzen

In modernen Anwendungsumgebungen werden Vertrauensgrenzen typischerweise durch Schichten definiert, beispielsweise zwischen einer Front-End-Benutzeroberfläche und einer API. In CICS sind Vertrauensgrenzen oft implizit und in Programmverknüpfungen verborgen. Statische Analysen müssen nachvollziehen, welche Programme die Kontrolle an andere weitergeben, wo Eingaben in das System gelangen und ob deren Ursprung vertrauenswürdig ist.

Beispielsweise kann eine Kette, die mit einer Login-Transaktion beginnt, die Kontrolle über fünf oder mehr Programme weitergeben. Akzeptiert eines dieser Programme neue Benutzereingaben (z. B. über ein aktualisiertes Kommunikationssegment), ohne diese erneut zu validieren, wird die Vertrauensgrenze überschritten. Statische Analysen sollten diese Übergangspunkte zur Überprüfung kennzeichnen.

Zu den kritischen Aspekten, die untersucht werden müssen, gehören:

  • Einstiegspunkte, an denen externe Daten in den Ausführungspfad gelangen
  • Aufrufe von LINK oder XCTL, die ohne Überprüfung des Anrufers erfolgen
  • Bereiche, in denen die Ausführung vom authentifizierten zum nicht authentifizierten Fluss wechselt

Erkennen von fest codierten Anmeldeinformationen und Berechtigungseskalationslogik

Fest codierte Sicherheitstoken, Benutzer-IDs oder APPLIDs werden manchmal während der schnellen Entwicklung oder bei Notfallpatches eingeführt. Diese Werte können Standardzugriffskontrollen außer Kraft setzen oder einen Fallback-Zugriff ermöglichen, wenn die echte Authentifizierung fehlschlägt.

Beispielsweise ein COBOL-Segment wie:

IF USER-ID = 'SECADMIN' THEN
MOVE 'Y' TO AUTH-FLAG
END-IF

mag auf den ersten Blick nicht gefährlich erscheinen, aber wenn USER-ID Da sie extern beeinflusst oder in anderen Programmen wiederverwendet werden können, besteht ein anhaltendes Risiko.

Statische Analyse-Engines sollten nach Folgendem suchen:

  • Sicherheitsrelevante Werte in IF-Anweisungen oder Zuweisungen
  • Autoritätsflags, die direkt und ohne Überprüfung gesetzt werden
  • Verwendung generischer APPLIDs oder Benutzernamen, die die Steuerlogik umgehen

Diese Muster sind subtil, doch ihr Vorhandensein weist oft auf größere Designprobleme hin, bei denen Sicherheitslogik mit Geschäftsregeln verflochten ist. Die Isolierung dieser Muster durch statische Analyse hilft Teams, Code sicher und ohne versteckte Berechtigungspfade zu refaktorieren.

Umfang der statischen Analyse in einer CICS-Umgebung

CICS-Systeme unterscheiden sich erheblich von herkömmlichen Anwendungsstapeln. Während moderne Dienste APIs und ereignisgesteuerte Abläufe bereitstellen, werden CICS-Anwendungen oft als eng gekoppelte Programmketten ausgeführt, die auf Daten basieren, die über Kommunikationsbereiche, Terminaleingaben und gemeinsam genutzten Speicher übertragen werden. Diese Architektur macht die statische Analyse besonders anspruchsvoll. Analysten suchen nicht nur nach bekannten anfälligen Aufrufen, sondern müssen den Ausführungsfluss über mehrere Programme hinweg rekonstruieren, von denen einige Jahrzehnte alter Entwicklungszeit umfassen können.

Eine aussagekräftige statische Überprüfung muss berücksichtigen, wie Daten in das System gelangen, wie die Steuerung von einem Modul zum nächsten übergeben wird und wo eine Validierung erwartet wird, aber fehlt. Sicherheitsverletzungen in CICS entstehen nicht immer durch offensichtlich gefährliche Aufrufe. Häufiger sind sie auf übersehene Vertrauensannahmen, fehlende Kontextprüfungen oder Berechtigungskonflikte zurückzuführen, die in verschachtelten oder verzögerten Ausführungsabläufen auftreten.

Analyse des COBOL-CICS-Quellflusses auf Vertrauensgrenzen

Eine typische COBOL-CICS-Transaktion besteht nicht aus einem einzigen monolithischen Block. Sie umfasst oft mehrere Programme, die durch EXEC CICS LINK, XCTLden RETURN, wobei Kommunikationsbereiche zum Datenaustausch genutzt werden. Viele Programme validieren die empfangenen Kommunikationsbereiche nicht eigenständig, sondern gehen davon aus, dass ein vertrauenswürdiger Aufrufer die Validierung bereits durchgeführt hat. Diese Annahme ist eine der häufigsten Ursachen für Privilegienabweichungen und unberechtigten Zugriff.

Die statische Analyse muss die Ausgangspunkte des Dateneingangs identifizieren und deren Ausbreitung über diese Aufrufe hinweg verfolgen. Beispiel:

MOVE WS-USERID TO COMM-USERID  
EXEC CICS LINK PROGRAM('ACCTUPD') COMMAREA(COMMAREA-BLOCK) LENGTH(COMM-LEN)

Dann in ACCTUPD, kann Folgendes angezeigt werden:

IF COMM-USERID = 'ADMIN01'  
PERFORM ADMIN-ROUTINE

Dadurch entsteht eine implizite Vertrauensgrenze. Wenn WS-USERID wurde jemals zuvor im Flow überschrieben oder gefälscht, ACCTUPD würde blind Admin-Routinen ausführen. Statische Analyse muss korrelieren COMM-USERID's Ursprung und kennzeichnen Sie allen nachgelagerten Code, der ihn für sensible Entscheidungen verwendet, ohne erneute Validierung.

Zu den typischen Verletzungen von Vertrauensgrenzen, die durch statische Scans erkannt werden können, gehören:

  • Entscheidungszweige basierend auf Kommunikationsfeldern ohne lokale Authentifizierung
  • Ausführung der Logik abhängig von Terminal- oder APPLID-Werten
  • Gebrauch von EIBTRMID, EIBTASKNden EIBRESP in der Steuerlogik ohne Herkunftsprüfung
  • Fehlende erneute Validierung der Benutzersitzung beim erneuten Eintritt in eine Pseudo-Konversationskette

Erkennen von fest codierten Anmeldeinformationen und Berechtigungseskalationslogik

Statische Überprüfungen decken häufig fest codierte Benutzer-IDs, spezielle Codes oder APPLIDs auf, die direkt in COBOL-Anweisungen eingebettet sind. Diese wurden zwar möglicherweise für interne Tests oder betriebliche Umgehungen hinzugefügt, verbleiben aber oft in Produktionsumgebungen und stellen ein ernstes Risiko dar.

Hier sind Beispiele für häufig festgestellte Muster aus der Praxis:

IF USER-ID = 'SYSROOT'  
MOVE 'FULL' TO ACCESS-LEVEL

or

IF EIBTRMID = 'TSTTERM1'  
MOVE 'Y' TO BYPASS-SECURITY-FLAG

Diese schaffen unkontrollierte Pfade für erweiterten Zugriff. Wenn ein Angreifer Zugriff auf ein Terminal erhält oder eine fest codierte Benutzer-ID entdeckt, verhält sich der Rest der Anwendung möglicherweise so, als hätte eine vollständige Authentifizierung stattgefunden.

Ein subtileres Beispiel:

IF SUBSTR(COMMAREA-DATA, 1, 5) = 'DEBUG'  
PERFORM DIAGNOSTIC-ROUTINES

Wenn diese Logik nicht entfernt oder geschützt wird, könnte eine manipulierte Eingabe Funktionen aktivieren, die Protokolle, Dateizeiger oder Speicherdiagnosen offenlegen, die nicht für allgemeine Benutzer bestimmt sind.

Konzentrieren Sie sich beim Erstellen statischer Regeln zum Erkennen solcher Fehler auf:

  • IF or EVALUATE Anweisungen mit fest codierten Literalwerten, die an Benutzer oder Terminals gebunden sind
  • Direkte Zuordnung von fest codierten Anmeldeinformationen zu Zugriffsflags
  • Flaggen wie BYPASS, OVERRIDEden DEBUG die bedingte Logik auslösen
  • Codeabschnitte werden nur durch oberflächliche Überprüfungen des Benutzernamens oder der Terminal-ID geschützt

In vielen Fällen wurden diese Prüfungen informell hinzugefügt und nie überprüft. Statische Scans sollten sie zur manuellen Überprüfung kennzeichnen oder bei wiederholtem Missbrauch musterbasierte Warnungen erzwingen.

Durch die Erweiterung der statischen Analyselinse zur Erfassung dieser Randbedingungen und fest codierten Fallbacks können Prüfer und Sicherheitsingenieure einen besseren Einblick gewinnen, wo CICS-Anwendungen die Vertrauenskette unterbrechen können – selbst wenn der Rest des Systems scheinbar sicher funktioniert.

Codestrukturmuster, die auf Sicherheitsrisiken hinweisen

Einzelne CICS-Befehle mögen isoliert betrachtet zwar sicher erscheinen, doch die umgebende Struktur der Programmlogik entscheidet oft darüber, ob eine Transaktion tatsächlich geschützt ist. Statische Analysen müssen über das zeilenweise Scannen hinausgehen, um zu verstehen, wie Programme interagieren, wie Berechtigungen abgeleitet werden und wo implizites Vertrauen in den Kontrollfluss eingebettet ist.

Legacy-Systeme sind besonders anfällig für diese Muster. Im Laufe der Zeit führen Entwicklungsteams temporäre Logik, Privilegienverkürzungen und Mehrzwecktransaktionen ein, die die Trennung der Belange verwischen. Die Identifizierung dieser strukturellen Antimuster ist entscheidend für die Erhöhung der Transaktionssicherheit.

Transaktions-Programm-Zuordnung mit erweiterten Berechtigungen

Jede CICS-Transaktions-ID ist typischerweise einem bestimmten Programm oder einer Dispatch-Routine zugeordnet. Viele Systeme verwenden Transaktionscodes jedoch in verschiedenen Modulen wieder oder weisen umfassende Programmhandler zu, die basierend auf Benutzereingaben mehrere sensible Funktionen ausführen können.

Dies wird gefährlich, wenn ein allgemeiner Handler ohne ausreichende Filterung an eine Transaktion mit hohen Berechtigungen gebunden ist. Die statische Analyse muss nachverfolgen, welche Transaktions-IDs welchen Programmen zugeordnet sind, und bestimmen, welche Logik jedes Programm im jeweiligen Transaktionskontext ausführt.

Ejemplo:

EXEC CICS RETRIEVE INTO(COMM-AREA)  
EVALUATE COMM-AREA-FUNCTION
WHEN 'UPDATE'
PERFORM UPDATE-ROUTINE
WHEN 'DELETE'
PERFORM DELETE-ROUTINE
WHEN OTHER
PERFORM INQUIRY-ROUTINE
END-EVALUATE

Wenn das oben genannte auf eine Transaktion wie FINTRN01und dieser Transaktion erhöhte Systemprivilegien zugewiesen sind, ist jeder Missbrauch der COMM-AREA-FUNCTION kann es einem Benutzer ermöglichen, Rollenbeschränkungen zu umgehen und Lösch- oder Aktualisierungslogik aufzurufen.

Zu den Risikoindikatoren zählen:

  • Einzelne Programme, die mehrere privilegierte Aktionen basierend auf vom Benutzer bereitgestellten Flags ausführen
  • Keine fest codierten Transaktions-zu-Funktion-Einschränkungen
  • Gemeinsam genutzte Transaktionscodes für verschiedene Umgebungen oder Geschäftseinheiten
  • Fehlende an bestimmte Zweigstellen gebundene Zugriffskontrollen innerhalb eines Dispatch-Moduls

Statische Scans sollten ermitteln, wo Kommunikationsbereichsflags den Fluss steuern und ob diese Flüsse durch Authentifizierung, Rollenvalidierung oder Einschränkungen auf Ressourcenebene geschützt sind.

Schwächen des Aufrufpfads auf Befehlsebene im Vergleich zur Makroebene

Eine weitere Risikoquelle ist die Inkonsistenz zwischen Programmen auf Befehls- und Makroebene. Systeme, die sich im Laufe der Zeit weiterentwickelt haben, enthalten oft eine Mischung aus beiden Stilen. Während Code auf Befehlsebene von strukturierter Syntax und besserer Lesbarkeit profitiert, bietet Code auf Makroebene tendenziell einen niedrigeren Zugriff und weniger Sicherheitsvorkehrungen.

Wenn beide Typen zusammen verwendet werden, können sie subtile Schwachstellen im Aufrufpfad verursachen, insbesondere wenn Programme auf Makroebene dynamisch verknüpft werden, ohne dass zwischenzeitlich eine Sicherheitsdurchsetzung erfolgt.

Ejemplo:

  • Ein Programm auf Befehlsebene stellt eine LINKS zu einem Modul auf Makroebene her, das den gemeinsam genutzten Speicher direkt liest oder ändert.
  • Das Modul auf Makroebene geht davon aus, dass das aufrufende Programm die Daten bereits validiert hat.
  • Zwischen der Eingabe und der Ausführung werden keine Zwischenprüfungen durchgeführt.

Eine vereinfachte Ansicht des Ablaufs:

* In command-level handler  
EXEC CICS LINK PROGRAM('LEGACYIO') COMMAREA(DATA-BLOCK)

* In macro-level module LEGACYIO
L R1,=V(DATA-BLOCK)
ST R1,=V(SYSTEM-FILE-POINTER)

Hier wird darauf vertraut, dass das Modul auf Makroebene direkt auf Speicherzeiger operiert. Wenn das aufrufende Programm die Validierung nicht bestanden hat DATA-BLOCKEin Angreifer könnte Speicherbereiche manipulieren oder auf nicht autorisierte Datensätze verweisen.

Bei der statischen Analyse sollte besonders auf Folgendes geachtet werden:

  • LINK- oder XCTL-Aufrufe aus strukturierten Programmen in Legacy-Module
  • Parameterübergabe zwischen Code auf Befehls- und Makroebene
  • Verwendung von Speicherzeigern oder Systemdateikennungen ohne Grenzwertprüfung
  • Wiederverwendete Module, bei denen davon ausgegangen wird, dass die Eingabevalidierung an anderer Stelle stattgefunden hat

Diese werden bei Tests selten erkannt, da die Bedingungen für eine Ausnutzung oft eine genaue Abstimmung zwischen Terminalkontext, Taskparametern und Ausführungsfluss erfordern. Statische Scans können jedoch die strukturellen Voraussetzungen erkennen, die diese Schwachstellen ermöglichen.

Durch die Identifizierung struktureller Risiken – nicht nur fehlerhafter Codezeilen – können Analysten die allgemeine Sicherheitslage von CICS-Systemen besser beurteilen und die Behebung anhand des Auswirkungspotenzials priorisieren.

Statische Erkennung von CICS-spezifischem API-Missbrauch

CICS bietet eine Vielzahl von EXEC-Befehlen und Makros, die mit Ressourcen auf Systemebene interagieren. Dazu gehören Terminalkennungen, Tasknummern, Sitzungsspeicher und Transaktionsroutinglogik. Diese Funktionen bieten zwar Flexibilität, können aber auch Schwachstellen mit sich bringen, wenn sie ohne ausreichende Sicherheitsvorkehrungen verwendet werden. Der Missbrauch dieser Schnittstellen kann zu unbeabsichtigter Rechteerweiterung, Umgehung von Kontrollen oder Zugriff auf nicht autorisierte Systembereiche führen.

Mithilfe statischer Analysen können Entwickler und Prüfer solche Risiken identifizieren. Sie untersuchen, wie diese APIs aufgerufen werden, welche Parameter sie verwenden und ob der Aufrufkontext eine ausreichende Validierung bietet. Eine ordnungsgemäße Implementierung erfordert eine sorgfältige Prüfung des Ausführungskontexts, der Zugriffsmuster und der Datenflussgrenzen zwischen Transaktionen.

Verfolgung unsicherer Verwendung von EXEC CICS ASSIGN und ADDRESS

Das ASSIGN , ADDRESS Befehle ermöglichen direkten Zugriff auf interne CICS-Strukturen. Dazu gehören kritische Metadaten wie Terminal-IDs, Anwendungskennungen und taskspezifische Speicherorte. Diese Werte werden zwar häufig für die Protokollierung oder Sitzungsverfolgung verwendet, werden aber gefährlich, wenn die Steuerungslogik für Sicherheitsentscheidungen von ihnen abhängt.

Nehmen Sie dieses Beispiel:

EXEC CICS ASSIGN TERMINALID(TERM-ID)
IF TERM-ID = 'DEVBYPASS'
PERFORM SKIP-AUTH-CHECKS

Hier ist die Zugriffskontrolle direkt an die Terminal-ID gebunden. Ein Benutzer, der den Wert kennt oder die Terminaleinstellungen fälschen kann, kann diese Logik ausnutzen, um Sicherheitsmechanismen zu umgehen.

Oder betrachten Sie eine Variante mit ADDRESS:

EXEC CICS ADDRESS EIBTASKN
MOVE EIBTASKN TO TRACE-BUFFER

Für sich genommen scheint dies harmlos. Wenn jedoch EIBTASKN Wird es später zur Authentifizierung oder Transaktionsautorisierung verwendet, besteht das Risiko der Vorhersehbarkeit und des unbefugten Identitätswechsels der Sitzung.

Zu den häufigsten Anzeichen für eine unsichere Verwendung von ASSIGN und ADDRESS zählen:

  • Steuerung von Zweigen ausschließlich basierend auf Terminal-ID, APPLID oder Tasknummer
  • Direkte Verwendung zugewiesener Werte zur Zugriffsvalidierung oder zum Umgehen von Flags
  • Zeigerreferenzen ohne strukturelle Validierung nach ADDRESS-Befehlen
  • Fest codierte Werte im Vergleich zu systemseitig zugewiesenen Kennungen in IF-Bedingungen

Statische Scan-Tools sollten so konfiguriert werden, dass sie diese Bedingungen kennzeichnen, insbesondere wenn die zugewiesenen Daten das Programmrouting oder die Berechtigungslogik beeinflussen.

Manipulation des Transaktionsflusses über alternative Ausführungspfade

In vielen CICS-Anwendungen wird Fallback oder alternatives Transaktionsrouting verwendet, um die Fehlertoleranz zu verbessern. Leider fehlt diesen alternativen Pfaden möglicherweise die ordnungsgemäße Zugriffsvalidierung oder sie können unter unbeabsichtigten Bedingungen erreicht werden. Dies eröffnet Angreifern die Möglichkeit, sensible Logik außerhalb des normalen Transaktionsflusses auszulösen.

Betrachten Sie diesen Fall:

IF EIBCALEN = 0
EXEC CICS XCTL PROGRAM('RETRYTX')

Dieser Code leitet die Ausführung um, wenn kein Kommunikationsbereich übergeben wurde. Aber RETRYTX ist möglicherweise nur für vertrauenswürdige Sequenzen konzipiert. Wenn die Validierung nicht erzwungen wird, kann ein Benutzer durch einfaches Auslösen einer Transaktion mit der Länge Null auf sensible Funktionen zugreifen.

Ein weiteres Beispiel betrifft die stille Eskalation:

IF AUTH-FAILS
EXEC CICS START TRANSID('ALTID')
EXEC CICS RETURN

If ALTID Dieser Fallback ist auf eine Transaktion mit größeren Berechtigungen oder umfassenderer Funktionalität abgebildet und weist keine Rollenprüfungen auf. Dadurch kommt es zu unbeabsichtigtem Zugriff.

Risiken ergeben sich hier typischerweise aus:

  • Verwendung von START, XCTL oder LINK zum Wechseln von Programmen basierend auf Fehlerzuständen
  • Programm-IDs, die für mehrere Transaktionscodes wiederverwendet werden
  • RETURN-Logik, die die Validierung auf nachgelagerte Module verschiebt
  • Kommunikationswerte, die den Fluss ohne Integritätsprüfungen bestimmen

Die statische Analyse sollte einen vollständigen Transaktionsgraphen erstellen, um Programme mit mehreren Einstiegspfaden zu identifizieren und diejenigen hervorzuheben, die nach unvollständiger Validierung die Kontrolle erhalten. Selbst wenn Funktionen isoliert erscheinen, können versteckte Abläufe es Angreifern ermöglichen, privilegierte Operationen außerhalb der erwarteten Nutzung auszulösen.

Umgang mit komplexer Verschleierung der Sicherheitslogik

Einer der schwierigsten Aspekte bei der Sicherung älterer CICS-Anwendungen ist die Entschlüsselung verschleierter oder tief verschachtelter Sicherheitslogik. Viele CICS-Programme wurden über Jahrzehnte entwickelt, durchliefen verschiedene Teams und beinhalteten mehrere Ebenen der Zugriffsverwaltung. Daher sind wichtige Sicherheitsentscheidungen oft in unerreichbaren Pfaden verborgen, werden über Module repliziert oder in fragmentierte Routinen aufgeteilt. Statische Analysen müssen diese Muster rekonstruieren und aufdecken, wo Annahmen oder Versäumnisse Risiken verursacht haben.

Identifizieren geteilter Autorisierungspfade über mehrere Programme hinweg

CICS-Entwickler implementieren häufig pseudokonversationelle Programmierung, um den Status über mehrere Benutzerinteraktionen hinweg aufrechtzuerhalten. Dabei können sie unbeabsichtigt Authentifizierung und Autorisierung trennen. Ein Programm überprüft Anmeldeinformationen, ein anderes setzt Sitzungsflags und ein drittes führt Zugriffsprüfungen durch. Wird ein Teil dieser Kette getrennt oder in einem anderen Kontext wiederverwendet, entsteht eine Sicherheitslücke.

Ejemplo:

Programm 1:

IF USERID = 'SUPPORT1'
MOVE 'OK' TO SESSION-AUTH
EXEC CICS RETURN TRANSID('TX02')

Programm 2:

IF SESSION-AUTH = 'OK'
PERFORM PROCESS-ADMIN-DATA

Dies scheint sicher, wenn es wie vorgesehen verwendet wird. Wenn jedoch eine andere Transaktion Programm 2 direkt startet, ohne über Programm 1 zu gehen, wird die Variable SESSION-AUTH möglicherweise nicht initialisiert oder gefälscht. Das zweite Programm vertraut allein aufgrund einer Variable auf die Gültigkeit der Sitzung, ohne die Anmeldeinformationen erneut zu überprüfen.

Die statische Analyse muss die Variablenzuweisungen über Programmübergänge hinweg verfolgen, insbesondere:

  • Wenn ein Programm ein Flag setzt, das ein anderes Programm für Zugriffsentscheidungen liest
  • Wenn Autorisierungslogik außerhalb der Authentifizierungslogik existiert
  • Wenn Programme direkt gestartet werden können und die normale Eingabevalidierung umgehen

Diese Muster kommen in älteren Designs äußerst häufig vor und werden bei manuellen Überprüfungen oft übersehen.

Kontrollflussumleitungen über interne Debug- oder Testmodi

Entwickler integrieren manchmal versteckte Flags oder Debug-Modi, um das Testen zu erleichtern. Werden diese Funktionen vor der Bereitstellung nicht entfernt oder sind sie von Produktionsterminals aus zugänglich, können sie eine Hintertür zu sensiblen Teilen der Anwendung bieten.

Ejemplo:

IF COMM-FLAG = 'DEBUG'
PERFORM BYPASS-AUTH-CHECK

Oder subtiler:

IF CURRENT-TIME > '210000'  
PERFORM EMERGENCY-ROUTINE

Im zweiten Fall kann eine Routine außerhalb der Geschäftszeiten einige normale Sicherheitsprüfungen umgehen, die möglicherweise für Batch-Jobs oder Notfallmaßnahmen vorgesehen sind. Kann sie jedoch aus einer interaktiven Sitzung heraus ausgelöst werden, eröffnet sie einen zeitbasierten Angriffsvektor.

Beim Scannen nach verschleierter oder riskanter Logik sollte die statische Analyse folgende Punkte priorisieren:

  • Ungewöhnliche Bedingungen, die die Sicherheitslogik steuern (Tageszeit, Terminal-ID, Regionalcode)
  • Flags wie DEBUG, DEV, OVERRIDE, TEST oder BACKDOOR
  • Zugriffsprüfungen, die unter bestimmten Laufzeitbedingungen übersprungen werden
  • GOTO- oder PERFORM-Pfade, die Validierungszweige umgehen

Das Ziel besteht darin, alles aufzudecken, was die Ausführung in privilegiertem Code ohne direkte, sichtbare Autorisierungsprüfung ermöglicht.

Wiederverwendete Routinen mit inkonsistenter Zugriffskontrolle

In vielen großen CICS-Anwendungen verwenden Entwickler gemeinsame Routinen für den Datenzugriff oder die Geschäftslogik wieder. Diese Routinen können sowohl von öffentlichen Transaktionen als auch von internen Verwaltungsprogrammen aufgerufen werden. Wenn die gemeinsame Logik davon ausgeht, dass der Aufrufer die Rolle des Benutzers bereits validiert hat, und diese Annahme nicht immer zutrifft, entsteht eine indirekte Sicherheitslücke.

Eine klassische Struktur sieht folgendermaßen aus:

PERFORM UPDATE-ACCT-INFO

...

UPDATE-ACCT-INFO.
IF ROLE = 'ADMIN'
EXEC CICS WRITE FILE('ACCTDB')

Dies ist nur dann sicher, wenn jeder Anrufer von UPDATE-ACCT-INFO setzt die ROLE Variable. Wenn ein anderer Teil der Anwendung diese Routine mit ROLE Wenn es nicht initialisiert ist oder der Anrufer es aufgrund einer schwachen Prüfung falsch einstellt, kann es zu einem unbefugten Zugriff kommen.

Statische Scans sollten Folgendes kennzeichnen:

  • Gemeinsam genutzte Routinen, die sicherheitsrelevante Aktionen ausführen
  • Fehlende lokale Validierung innerhalb gemeinsam genutzter Routinen
  • Für Zugriffsentscheidungen verwendete Variablen, die extern definiert sind
  • Rollenzuweisungen, die weit entfernt vom Durchsetzungsort erfolgen

Diese Form der Verschleierung resultiert nicht aus absichtlicher Verschleierung, sondern aus einer langfristigen Architekturabweichung. Durch die Wiederverwendung von Komponenten in verschiedenen Modulen verschlechtern sich die ursprünglichen Zugriffsannahmen. Nur eine gründliche Codeverfolgung und Kontextkorrelation können diese Risiken aufdecken.

Die Verwendung von SMART TS XL zum Erkennen und Beseitigen von CICS-Transaktionsschwachstellen

Die Durchführung von Sicherheitsanalysen in älteren Mainframe-Systemen ist von Natur aus komplex. CICS-Umgebungen verfügen oft nicht über eine zentralisierte Struktur, verfügen nur über minimale moderne Dokumentation und umfassen Jahrzehnte der Verfahrensentwicklung. SMART TS XL behebt diese Probleme durch eine statische Analyse-Engine, die speziell für COBOL-, PL/I-, JCL- und CICS-spezifische Muster entwickelt wurde. Im Gegensatz zu allgemeinen Tools versteht sie die Architektur und Konventionen, die für Mainframe-Ökosysteme typisch sind.

Mehrstufige Flussrekonstruktion für CICS

SMART TS XL scannt komplette Bewerbungsportfolios und erstellt eine programmübergreifende Flow Map. Dies beinhaltet:

  • Transaktions-Programm-Zuordnungen
  • Programm-zu-Programm-Übergänge mit LINK, XCTL und RETURN
  • Variablen- und Kommabereichsverbreitung
  • Rollenbasierte Steuerungslogik und Verfolgung von Eintrittsbedingungen

Durch die Rekonstruktion vollständiger Ausführungsketten kann erkannt werden, wenn ein Programm, das einen vertrauenswürdigen Kontext voraussetzt, tatsächlich von mehreren Punkten aus erreichbar ist, darunter auch von möglicherweise nicht verifizierten.

Beispielanwendungsfall:

Eine interne Prüfung ergab eine Sicherheitslücke bei der TX94 hat ein Programm ausgelöst, das ursprünglich nur für die Verwendung durch Administratoren vorgesehen war. SMART TS XL verfolgte den Aufrufgraphen des Programms, stellte fest, dass das Steuerflag über ein ungeprüftes Kommunikationsfeld übergeben wurde, und identifizierte fünf weitere Transaktionen mit Zugriff auf denselben Programmeintrag. Dies wurde bei der manuellen Verfolgung übersehen.

Erkennen versteckter Kontrollflags und verschleierter Zugriffspfade

Viele Legacy-Programme enthalten eingebettete Override-Bedingungen oder Notfallroutinen. Diese sind aufgrund tiefer Verschachtelung, ungewöhnlicher Variablennamen oder Platzierung in der Fallback-Logik oft schwer manuell zu finden. SMART TS XL verwendet regelbasierte und Mustervergleichsscans, um Folgendes zu extrahieren:

  • Bedingte Verzweigungen, die durch selten verwendete Flagwerte gesteuert werden
  • Ausgelöste Logik basierend auf Terminal-ID, Tageszeit oder Aufgabenmetadaten
  • Umgehen von Verzweigungen mithilfe von Kommunikationsbereichsflags, fest codierten Benutzer-IDs oder Routinen auf Makroebene

Es zeigt alle Instanzen potenziell privilegierter Entscheidungspunkte an und ordnet sie nach Erreichbarkeit, Transaktionsrisiko und Potenzial zur Privilegienerweiterung.

Automatisierte Sicherheitslückenregeln für CICS-Konstrukte

Im Gegensatz zu Oberflächenscannern SMART TS XL Enthält integrierte Regeln, die auf COBOL-CICS-Programme zugeschnitten sind. Diese identifizieren Schwachstellen in Bezug auf:

  • Unsichere EXEC CICS ASSIGN- und ADDRESS-Verwendung
  • Inkonsistente Zugriffslogik in PERFORMed-Routinen
  • Fehlende Validierung vor WRITE-, DELETE- oder START-Befehlen
  • Veraltete Pseudo-Konversationsabläufe mit schwacher Zustandsverwaltung

Diese Regeln können je nach Umgebung, Geschäftsfunktion oder Prüfkriterien angepasst werden. Sie sind besonders hilfreich, um falsche Annahmen älterer Entwicklungsteams zu identifizieren.

Beschleunigte Behebung mit Impact Traceback

Sobald eine Schwachstelle erkannt wurde, kann die Behebung beschleunigt werden durch SMART TS XLTrace-Funktion. Für jeden Logikzweig oder jede Programmfunktion kann Folgendes angezeigt werden:

  • Alle Transaktionen, die dazu führen
  • Alle Module, die es aufruft
  • Alle Variablen, von denen es abhängt
  • Jede Zugriffslogik, die es umgeht

Mithilfe dieser Trace Map können Entwickler und Prüfer sofort erkennen, ob ein Fehler isoliert oder systembedingt ist. Sie reduziert außerdem den Zeitaufwand für die manuelle Zuordnung von Abhängigkeiten und verringert das Risiko, beim Patchen neue Fehler einzuführen.

Fazit und nächste Schritte der Sicherheitsüberprüfung

Ältere CICS-Anwendungen enthalten kritische Geschäftslogik, doch ihr Alter und ihre Komplexität führen zu Sicherheitslücken, die Standardmethoden oft übersehen. Statische Analysen bieten eine zuverlässige Möglichkeit, versteckte Risiken aufzudecken, bevor sie ausgenutzt werden können. Dies gilt insbesondere, wenn sie nicht nur Syntax oder Codeausschnitte, sondern den gesamten Kontrollfluss und die Zugriffsannahmen über Transaktionen hinweg berücksichtigen.

In diesem Artikel haben wir die Arten von Fehlern untersucht, die nur bei CICS-Systemen auftreten:

  • Autorisierungslogik über lose gekoppelte Programme verstreut
  • Anfällige Befehlsmuster wie ASSIGN und ADDRESS ohne Validierung
  • Fallback-Transaktionen und Debug-Pfade, die normale Prüfungen umgehen
  • Wiederverwendete Routinen, die vertrauenswürdige Eingaben von Anrufern voraussetzen

Für Unternehmen mit großen CICS-Portfolios ist ein stückweiser Sicherheitsansatz nicht mehr praktikabel. Moderne Bedrohungen können ein einzelnes Versehen in Hunderten von Modulen ausnutzen. Statische Analysen können diese Probleme aufdecken, bevor sie sich bemerkbar machen oder in Audits münden.

Hier sind die wichtigsten Maßnahmen, die Sie als nächste Schritte in Betracht ziehen sollten:

  • Erstellen Sie eine vollständige Transaktion-zu-Programm-Zuordnung, einschließlich aller XCTL- und LINK-Pfade
  • Identifizieren und refaktorieren Sie die gemeinsame Geschäftslogik, die privilegierte Vorgänge ausführt.
  • Überprüfen Sie alle Zweige, die von Commarea-Flags oder terminalbasierten Entscheidungen beeinflusst werden
  • Etablieren Sie eine Sicherheitsvalidierung am Einstiegspunkt jeder Transaktion
  • Überprüfen Sie die Fallback-Logik und Notfallpfade auf unbeabsichtigte Offenlegung

Für Teams, die diesen Prozess beschleunigen und den manuellen Aufwand reduzieren möchten, gibt es Tools wie SMART TS XL bieten eine auf die CICS-Architektur zugeschnittene statische Analyse und ermöglichen so sicheres Refactoring mit vollständiger Flussrückverfolgbarkeit.

Der Schutz von Mainframe-Umgebungen erfordert nicht nur Wachsamkeit, sondern auch Transparenz. Statische Analysen sind eine der wenigen Techniken, die beides bieten.