Transport System Abuse
The Change and Transport System (CTS) moves over 1,000 different object types from development into production. One object type deserves special attention from an offensive perspective: R3TR/XPRA (“eXecution of PRogram After import”). A transport request containing this object type causes SAP to execute a named ABAP report immediately after the transport is imported into the target system - a legitimate mechanism for post-transport cleanup work, and an equally effective way to run attacker-chosen ABAP code the moment a poisoned transport lands.
Two properties make XPRA execution distinctive as an attack primitive:
- Execution always targets client
000, and it always runs under the identity of the transport-import user - by defaultDDIC, which commonly still holdsSAP_ALL. STMS_TCRI(tableTMSTCRI), the standard mechanism for blocking the transport of critical objects, cannot block it.STMS_TCRIblocks transport content (e.g.R3TR/TABUrows for a sensitive table);XPRAis not content, it is an instruction to execute a program - the export-time check has nothing to inspect.
The transport system also depends on a technical RFC user, TMSADM, configured on every RFC connection between systems in the transport domain, and on the transport directory (/usr/sap/trans - data, cofiles, bin, buffer) shared at the OS level across the whole landscape, extending the attack surface beyond the ABAP layer entirely.
An attacker who can get a transport request released and imported - via a compromised developer account, a compromised transport directory, or an inserted foreign transport that mimics a legitimate one - can execute arbitrary ABAP as DDIC (frequently SAP_ALL) in client 000 of every downstream system, without that transport ever being blockable by STMS_TCRI. Because DDIC typically carries full authorization, the resulting code execution is equivalent to full system compromise, and because it lands via the normal release/import pipeline, it can ride alongside a batch of legitimate changes with low operator suspicion. A default or weak TMSADM password additionally exposes the RFC connections that hold the whole transport domain together; OS-level write access to the shared transport directory allows payload poisoning or foreign-transport insertion independent of any ABAP-layer control at all.
R3TR/XPRApayload - attach the object type “Program, Executed After Transport” (R3TR/XPRA) to a transport request (visible/creatable viaSE10) referencing an attacker-controlled report; on import it executes with no parameter-passing (no variant support) asDDICin client000. This works whether the request also contains legitimate content or is XPRA-only.- Confirm the blocking gap - if
STMS_TCRI/TMSTCRIwithCHK_CRIOBJ_AT_EXPORTis configured to block a target object (e.g. tableNRIV), verify the export-time error only fires for genuine content objects; anXPRA-only request exports and imports cleanly regardless. - Transport-directory-level attacks (OS access to
/usr/sap/transrequired) - payload poisoning: modify an in-flight request’sdata/cofilesfiles to implant a backdoor or logic bomb before import. Foreign transport insertion: craft a complete transport (data + cofile) that mimics a legitimate one and drop it into the buffer/queue so it imports alongside a scheduled release. DoS: flood the transport directory to disrupt legitimate import processing. TMSADMtargeting - check for the known default password (SAP Note 1414256; see Default SAP users and passwords) viaRSUSR003, which reports standard-user default-password status across all clients. A compromisedTMSADMyields the RFC connections (TMSADM@<SID>.<domain>, read-only;TMSUP@<SID>.<domain>, change access) that hold the entire transport domain together.DDICas the standing target - because import execution defaults toDDIC, any technique that recovers or resets theDDICpassword (weak/default credential, or via underlying database access toUSR02) yields the same privilege theXPRApayload runs with, without needing a transport at all.- Tooling:
SE10/SE01(transport organizer, to inspect/craft requests if developer access is held),STMS/STMS_IMPORT/STMS_QUEUE(queue and route visibility),tp/R3trans(kernel-level transport tools, for direct transport-directory manipulation once OS access is held). Cross-link the existing transport playbook pages for the standard import/creation workflow this technique piggybacks on:import_transport,transport_creation.
- Set
CHK_CRIOBJ_AT_EXPORT = EinSTMS_TCRI/TMSTCRIfor genuinely critical content objects, but do not rely on it as a complete control - it does not, and cannot, blockR3TR/XPRA. - Replace
DDICas the transport-import user: create a copy ofDDICwith a distinct name in client000(SU01, copyingSAP_ALLif genuinely required), log on as that user and run reportRDDNEWPPto reschedule the internal transport-execution job under the new identity, then set the new user’s type toSystemand disable its password (preventing SAP GUI logon), and finally disable and lockDDICitself. This does not close the underlyingXPRAmechanism, but it removes the well-known, high-privilege identity the payload would otherwise inherit. - Change the
TMSADMpassword per SAP Note 1568362 (reportTMS_UPDATE_PWD_OF_TMSADM) and removeTMSADMfrom every client except000; strip all authorizations beyond profileS_A.TMSADM. - Run
RSUSR003regularly to catch any standard user, includingTMSADM/DDIC, still on a default or known password. - Restrict OS-level access and permissions on
/usr/sap/trans(and itsdata/cofiles/bin/buffersubdirectories) to the minimal required Basis/transport-administrator population; treat it as an extension of the ABAP-layer trust boundary. - Enforce release approval workflow (
S_TRANSPRTrestricted to transport administrators for release activity; developers restricted to releasing only their own requests) and require review of transport contents - including object type - before import into production.
- Transport logs and
SE01/SE03history for any request containing object typeR3TR/XPRAprior to import into a production system - this object type should be rare and always attributable to a known, reviewed maintenance activity. RSUSR003output forTMSADM/DDICdefault-password status across all clients.- OS-level audit (e.g. Linux
auditd) on/usr/sap/trans, particularlydata/cofiles;ausearch -k DIR_TRANS -f <transport-id>surfaces manipulation of a specific transport’s files. - Any successful logon as
DDIC(or its designated replacement) outside a known, scheduled transport-import event. - Security Audit Log (
SM20) for RFC logons usingTMSADM/TMSUPfrom unexpected source systems.
- SAP Note 1414256 - TMSADM password change
- SAP Note 1568362 - TMSADM password change
- Book: SAP-Systeme schützen (Rheinwerk/SAP PRESS), Chapter 11 “Schutz des Transportsystems”, §11.2.2 “Schutz vor Angriffen mit speziellen Transportobjekten” (
R3TR/XPRAmechanism,STMS_TCRI/TMSTCRI/CHK_CRIOBJ_AT_EXPORT, pp.269–271), §11.2.3 “Schutz vor Angriffen über die Systembenutzer des TMS” (TMSADMhardening,RSUSR003,DDICreplacement viaRDDNEWPP, pp.271–273) - Book: SAP® System Security (SAP PRESS, 2026), §11.4 “Viewing CTS from a Security Perspective” - transport-directory payload poisoning, foreign transport insertion, DoS attack scenarios
- Default SAP users and passwords
- Underlying database access
- Import transport
- Transport creation
