Code Injection Schwachstellen in SAP Application Server ABAP - Solution Tools Plugin ST-PI

vulnerability

SAP ist einer der größten Anbieter für Unternehmenssoftware weltweit. Schwere Sicherheitslücken in SAP Produkten könnten sich gravierend auf die Sicherheit von Unternehmens-IT-Infrastrukturen auswirken.

Kommandozeile zeigt Code Injection in SAP Main - SEC Consult Vulnerability Lab

Motivation

Im Zuge einer Analyse verschiedener Remote Function Modules (RFMs), die auf dem SAP NetWeaver Application Server ABAP aufbauen, identifizierte das SEC Consult Vulnerability Lab eine kritische Schwachstelle im proprietären ABAP Quellcode. Im RFM Modul /SDF/GEN_FUNCS_FUNC_CALL wurde eine ABAP Code Injection Schwachstelle erkannt, die es einem Angreifer ermöglichte, unauthorisierten Code auszuführen, sensible Daten zu extrahieren und Denial-of-Service (DoS) Angriffe auszuführen. Dieser Artikel beschreibt bisher unveröffentlichte, technische Details der Schwachstelle CVE-2020-6262.

Das Modul /SDF/GEN_FUNCS_FUNC_CALL ist Bestandteil des ST-PI Plugins, welches in SAP-Landschaften für die zentrale Administration durch den Solution Manager (SolMan) zum Einsatz kommt. Das Modul ist auf allen ABAP-Satellitensystemen präsent, die mit dem Solution Manager verbunden sind.

Überblick

Screenshot zeigt das Function Module - SEC Consult Vulnerability Lab
Abbildung 1: Funktionsmodul /SDF/GEN_FUNCS_FUNC_CALL in Transaktion SE37.

Das RFM /SDF/GEN_FUNCS_FUNC_CALL der Funktionsgruppe /SDF/GEN_FUNCS ermöglicht das Aufrufen und Ausführen weiterer RFMs. Dafür wird der Parameter FUNCNAME gesetzt, der das gewünschte Funktionsmodul spezifiziert und die nötigen Import- und Export Parameter über zwei Tabellen PT_IMPORTING und PT_EXPORTINGübergibt. Der Benutzer kann die entsprechenden Tabellen nutzen, um Parameternamen, Parametertypen sowie die Werte der Parameter zu definieren (siehe Abbildungen 1 und 2).

Screenshot zeigt Einstellungen zum Function Builder Module - SEC Consult Vulnerability Lab
Abbildung 2: Spezifikation des Funktionsmoduls /SDF/GEN_FUNCS_FUNC_CALL.

Vor dem Aufruf des spezifizierten RFM führt das Modul  /SDF/GEN_FUNCS_FUNC_CALL zunächst einige Eingabe-Validierungen der Benutzereingabe durch. Die Auswahl möglicher RFMs wird durch diese Prüfung eingeschränkt

Einschränkungen Zeile
Das angegebene Funktionsmodul (Parameter FUNCNAME) muss remote-fähig sein 85-90
Der Aufrufende muss über die nötigen S_RFC (FUGR; ACTVT 16) Berechtigungen für die Funktionsgruppe des definierten RFM verfügen 91-97
Beim Aufruf von APPL_LOG_DISPLAY, SUSR_USER_MAINT_WITH_DIALOG oder TOPOLOGY_BROWSER sind weitere Berechtigungen nötig 48-79
Die angegebenen Import- und Exportparameter müssen das richtige Format für die Einträge in der Tabelle FUPARAREF besitzen 31-64 (/SDF/GEN_FUNCS_IF_CHECK)
Es ist nicht möglich, RFMs mit nicht-optionalen Tabellenparametern aufzurufen (PARAMTYPE T in der TabelleFUPARAREF) 24-30 (/SDF/GEN_FUNCS_IF_CHECK)
Screenshot mit Hervorhebung im Quellcode des Subroutine Pools - SEC Consult
Abbildung 3: Konstruktion zur Erstellung des Quellcodes in /SDF/GEN_FUNCS_FUNC_CALL

Um das angegebene RFM aufzurufen, erstellt das Modul /SDF/GEN_FUNCS_FUNC_CALL zur Laufzeit dynamisch einen ABAP Report (Subroutinen Pool). Dazu werden vordefinierte Anweisungen und Benutzereingaben in die Variablen lf_code beziehungsweise lt_code verkettet und durch Zuhilfenahme der programmatischen Anweisungen GENEREATE SUBROUTINE POOL in temporären ABAP Code übersetzt (siehe Code-Zeile 217). Der Quellcode des Unterprogramms  (siehe Code-Zeilen 103-214) wird dabei durch den Inhalt der Tabelle  PT_IMPORTING konstruiert (siehe Abbildung 3).

ABAP Debugger Screenshot zeigt Subroutine Pool - SEC Consult
Abbilung 4: Ausführung des Subroutinen-Pools in SDF_GEN_FUNCS_FUNC_CALL.

Nach der erfolgreichen Initialisierung des Subroutinen-Pools, wird das generierte Codesegment ausgeführt, was innerhalb der Programmlogik zum Aufruf des spezifizierten RFMs führt. In der  Tabelle PT_EXPORTING in /SDF/GEN_FUNCS_FUNC_CALL wird das Ergebnis des ausgeführten Aufrufs über das VALUE Feld ausgegeben (siehe Abbildung 4).

Screenshot vom Quellcode des Subroutine Pools - SEC Consult
Abbildung 5: Einfaches Beispiel zur Codeausführung über das VALUE-Feld der Tabelle PT_IMPORTING.

Der Einsatz des Funktionsmoduls /SDF/GEN_FUNCS_FUNC_CALL kann somit zusammengefasst werden. Als Proxy-Modul ermöglicht es die Ausführung von bestimmten RFMs. Während das Modul die Existenz der zugehörigen S_RFC Authorisierung des Benutzers prüft, kann das aufgerufene RFM durch seine programmatische Umsetzung noch weitergehende Authorisierungsprüfungen beinhalten.

Im Zuge unserer Untersuchung wurde festgestellt, dass der der Inhalt aus dem VALUE Feld in der Tabelle PT_IMPORTING nie auf schadhafte Inhalte geprüft oder in irgendeiner Art und Weise validiert oder bereinigt wird. Durch Injektion von ABAP Code innerhalb des VALUE-Feldes ist es dem Angreifer möglich, den Quellcode des generierten Subroutinen-Pools zu manipulieren. Mangels Validierung kann mit Zeichen wie ‘ und . aus der der Syntax ausgebrochen und semantisch korrekter ABAP Code eingeschleust werden, welcher darauffolgend vom Applikations-Server ausgeführt wird (siehe Abbildungen 5 und 6).

Proof-of-Concept

Durch Auswahl geeigneter RFMs, welche keine weitere Autorisierung erfordern, kann die Anzahl der gesamten Autorisierungsabfragen für einen erfolgreichen Exploit relativ gering gehalten werden. Hierfür können sogar RFMs aus der Funktionsgruppe /SDF/GEN_FUNCS selbst genutzt werden, womit ein potenzieller Angreifer lediglich über die S_RFC Authorisationen für diese Gruppe verfügen muss (siehe Abbilung 7). Weitere Überprüfungen innerhalb des ausgewählten RFM sind hinfällig, weil der eingeschleuste Quellcode vor der restlichen Anwendungslogik des RFM zur Ausführung gebracht wird.

Screenshot vom injizierten ABAP Code - SEC Consult
Abbildung 7. Trace in der Authorisierung während des Exploits in Transaktion ST01.

Hinweis: Der Einsatz von Wildcard (*) S_RFC Authorisierungen sind nicht unüblich. Besonders System- oder Service-Benutzer werden des öfteren mit vollen Zugriffsrechten auf das Objekt versehen, um potenzielle Komplikationen bei Remote- und Hintergrundservices präventiv zu vermeiden.

Um den Schweregrad der Schwachstelle einschätzen zu können, wurden mehrere Payloads getestet. Es wurde das Funktionsmodul /SDF/GEN_FUNCS_S4_RELEVAN_CHK als Importparameter für die folgenden Angriffszenarien herangezogen, weil es keine weiteren Berechtigungen benötigt. Ein Angreifer kann alle drei Säulen der IT-Sicherheit (Integrität, Verfügbarkeit, Vertraulichkeit) mit unterschiedlichen Payloads untergraben und bestehende Sicherheitsvorkehrungen umgehen. Die Screenshots zeigen den Exploit mittels Transaktion SE37. Außerdem ist in Abbildung 12 zu sehen, wie eine Ausnutzung auch automatisiert und über das Netzwerk ausgeführt werden kann.

Beispiel 1: Kompromittierung der Integrität und Eskalierung der Privilegien

Das folgende Proof-of-Concept zeigt, wie sich ein Angreifer den Referenzbenutzer DDIC durch Einfügen einer OpenSQL-Abfrage zunutze machen kann und so unbegrenzte Berechtigungen für das betroffene SAP-System erhält (siehe Abbildung 8).

Payload im Feld VALUE des Parameters IV_CONV_TARGET_STACK:

'. UPDATE USREFUS SET REFUSER ='DDIC' WHERE BNAME ='ATTACKER

 

Screenshot zeigt wie sich ein Angreifer mithilfe der DDIC Benutzer-Referenztabelle authentifizieren kann- SEC Consult
Abbildung 8: Tabelle der Referenzbenutzer zeigt, dass der Angreifer die Berechtigungen des mächtigen DDIC-Benutzer erbt.

Mit dem gleichen taktischen Ziel könnte der Angreifer auch zusätzliche SAP_ALL Authorisierungen in den Benutzer-Buffer einfügen (Tabelle USRBF2).

Payload im Feld VALUE des Parameters IV_CONV_TARGET_STACK:

'. UPDATE USRBF2 SET AUTH ='&_SAP_ALL' WHERE BNAME ='ATTACKER

 

Beispiel 2: Kompromittierung der Verfügbarkeit

Screenshot zeigt die erfolgreiche Löschung der Systemtabelle - SEC Consult
Abbildung 9: Erfolgreich gelöschte Systemtabelle USR02.

Das folgende Proof-of-Concept zeigt, wie ein Angreifer mit nativen SQL-Anfragen die Funktionalität eines SAP-Systems durch Löschen relevanter Systemtabellen beeinträchtigen kann, wie z.B. Tabelle USR02 (siehe auch Abbildung 9).

Payload im Feld VALUE des Parameters IV_CONV_TARGET_STACK:

'. EXEC SQL. DROP TABLE USR02 ENDEXEC. DATA IRRELEVANT TYPE I"

 

Beispiel 3: Kompromitierung der Vertraulichkeit und Exfiltration von Daten

Screenshot zeigt Payload für die Exfiltration der Daten mit mehreren Parametern screen - SEC Consult
Abbildung 10: Erstellung der Payload-Inhalte zum Auslesen von Daten mittels verschiedener Eingabeparameter in der Tabelle PT_IMPORTING.

Das folgende Proof-of-Concept zeigt, wie ein Angreifer Daten z.B. Benutzerkennwort-Hashes eines SAP-Systems entwenden kann.

Es sei darauf hingewiesen, dass ein Angreifer zwar auf eine maximale Eingabelänge von 71 Zeichen des Feldes VALUE der Tabelle PT_IMPORTING beschränkt ist, jedoch erreichen alle bisher gezeigten Payloads diese Grenze nicht. Selbst wenn für umfassende Datenabfragen mehr Platz notwendig wäre, können Payload-Substrings durch verschiedene Import-Parameter kombiniert und damit die maximale Zeichenlänge umgangen werden (siehe Abbildung 10 und 11). Auf diese Weise könnte jegliche Information aus der Datenbank (z.B. Transaktionsdaten oder Kundendaten) von einem Angreifer über die Tabelle PT_EXPORTING ausgelesen werden (Abbildungen 12 und 13).

Die Payload-Substrings im Feld VALUE der Parameter IV_TEST_API (1), IV_RESULT_EXPIRE_DAY (2) und IV_CONV_TARGET_STACK (3) müssen in einer bestimmten Reihenfolge zusammengebaut werden:

(1) '.DATA: P TYPE STRING VALUE 'DDIC', S TYPE STRING VALUE 'PWDSALTEDHASH
(2) '.SELECT (S) INTO PT_EXPORTING+31 FROM USR02 WHERE BNAME EQ P.DATA: R"
(3) '.ENDSELECT.APPEND PT_EXPORTING"

 

Hinweis: In den zuvor beschriebenen Proof-of-Concepts wurden Alternativen zusammengefasst, um die Vertraulichkeit, Integrität und Verfügbarkeit der betroffenen SAP-Systeme zu untergraben. Insbesondere Beispiel 3 zeigt, dass der Angreifer selbst Zeichenlängenbeschränkungen umgehen kann und daher bei der Injektion von beliebigem ABAP-Code nicht eingeschränkt ist. So entstehen mehrere zusätzliche Angriffsvektoren:

  1. Aufrufen von Betriebssystembefehlen im Kontext des<sid>adm Benutzers über verschiedene Kernelaufrufe (z.B. CALL SYSTEM)
  2. Gefährdung verbundener SAP-Systeme durch Missbrauch gespeicherter RFC-Destinationen (z.B. über CALL FUNCTION <RFM> DESTINATION)
  3. Gefährdung vernetzter SAP-Systeme durch Exfiltration des Inhalts sicherer Speicherbereiche (z.B. Secure Storage in the DatabaseRSECTAB)
  4. Einrichtung von Backdoors für den späteren Zugang.

DIE LÖSUNG

SEC Consult hat sich im April 2020 an das SAP® Product Security Response Team gewandt, welches sehr rasch einen Sicherheitshinweis 2835979 veröffentlichte, um das Problem zu beheben. Der Hinweis wurde im Rahmen des nächsten Patch-Tuesday im Mai 2020 zur Verfügung gestellt. Daher empfiehlt SEC Consult allen SAP-Kunden, sofern noch nicht erfolgt, den Hinweis 2835979 sofort zu implementieren.

SEC Consult bedankt sich beim SAP® Product Security Response Team für den sehr schnellen und professionellen Umgang der dokumentierten Schwachstelle.

Weitere Informationen finden Sie unter:

https://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=545396222

https://launchpad.support.sap.com/#/notes/2835979

Dieser Research wurde von Alexander Meier und Fabian Hagg im Auftrag des SEC Consult Vulnerability Lab durchgeführt.

Wollen Sie Ihre Cybersicherheit mit den SEC Consult Experten verbessern?