SAP ABAP CDS // Access Controls unbemerkt abschalten

Mit SAP S/4HANA bilden CDS Views das Rückgrat einer jeden SAP ABAP Entwicklung. Dies reicht von der klassischen Report Programmierung bis zu dem SAP RESTful Application Programming Model.

Die entwickelten CDS Views werden über die Zugriffskontrolle (Access Control / AC) abgesichert. Zur Aktivierung der Zugriffskontrolle wird im CDS die Annotation @AccessControl.authorizationCheck in drei Stufen angelegt:

  • #CHECK à Es sollte gecheckt werden. Bei Nichtbeachtung erscheint eine Syntaxwarnung.
  • #NOT_REQUIRED à Es sollte gecheckt werden, aber es erscheint keine Syntaxwarnung.
  • #NOT_ALLOWED à Es darf nicht gecheckt werden. Anlage eines Access Controls führt hier zu einer Syntaxwarnung.

Als sicherheitsbewusster Entwickler wünscht man sich die Stufe #OMG_NEVER_ACTIVATE_WITHOUT_CHECK, denn selbst in der sichersten Stufe wird lediglich geprüft, dass überhaupt eine Zugriffskontrolle angelegt wurde. Die Zugriffskontrolle (CDS Access Control) muss keine Prüfung enthalten.

Eine CDS Zugriffskontrolle selbst hat nun zwei Ausprägungsformen. Zum einen können SAP Berechtigungsobjekte verwendet werden, zum zweiten können Literale angegeben werden.

Die Berechtigungsobjekte stellen, wie auch in der klassischen ABAP Programmierung, keinen Anspruch an irgendeinen semantischen Zusammenhang. Es darf, wie aus CALL-AUTHORITY Befehlen gewohnt, der Benutzername gegen die CarrierID geprüft werden:

Where ( username ) = aspect pfcg_auth( S_CARRID, CARRID )

Fehlt hier eine Zugriffsberechtigung, wird dies in neueren Systemen sowohl in der Berechtigungsprüfung SU53 als auch in der TransaktionSTAUTHTRACE angezeigt. Dies gilt leider nicht für alle SAP-Systeme mit Kernel Release <= 7.51.

Anders ist dies bei den einprogrammierten Literalen. Sollten hier Daten beschnitten werden, so ist dies nicht ohne Codekenntnisse sichtbar. Würde der eben genannte Benutzername gegen ein Literal geprüft werden, so fällt dies erst auf, wenn danach explizit gesucht wird:

where username LIKE 'S4H%'

Diese Literale im Fehlerfall zu finden, ist äußerst zeitintensiv. Außerdem werden Beschränkungen durch Literale in keinem SAP Trace angezeigt.

Code Security

Die SAP CDS Zugriffskontrollen (Access Controls) werden, wie alle anderen Objekte im SAP auch, in Tabellen gespeichert und von dort verwaltet. Dabei wird ebenfalls der Sourcecode in der Tabelle ACMDCLSRC gesichert und kann so mittels ABAP Coding abgefragt werden.  In der Tabelle sind zwar Felder enthalten, die anzeigen welcher User zuletzt Änderungen vorgenommen hat, allerdings beziehen sich diese Felder nur auf offizielle Änderungen durch Eclipse oder einen Transport. Böswillige Änderungen am Standardframework vorbei werden dort nicht erfasst, da auch die Änderungsbelege nicht automatisch aktiviert sind.

Diese Situation sorgt nun für eine Herausforderung. Gleichgültig wie kompliziert und atomar die Zugriffskontrolle konzipiert wurde, sie kann mittels der folgenden vier einfachen Schritte in einem ABAP Code ausgehebelt werden:

  1. Lese den Sourcecode der Zugriffskontrolle
  2. Ersetze „where“ durch „where True or“
  3. Schreibe den Sourcecode zurück in die Tabelle
  4. Aktiviere die Zugriffskontrolle

Wenn dieser Quellcode im SAP zur Verfügung steht, wird an keiner Stelle die Änderung bemerkt oder vermerkt, und auch an keiner Stelle verhindert, dass der Quellcode geändert wird.

Unter Berücksichtigung dieses Ansatzes lässt sich erkennen, dass die Code-Sicherheit auch bei Tabellenzugriffen relevant geworden ist. Durch eine Aktivierung der Änderungsbelege an den entsprechenden Tabellen können unrechtmäßige Zugriffe zumindest bemerkt, wenn auch nicht aufgehalten werden.