Security Advisory

mendelson AS2 Admin Service Unauthenticated Remote Code Execution

Eine Deserialisierungsschwachstelle im Admin-Service erlaubt unauthentifizierten Angreifern das Ausführen von beliebigem Code.

Advisory ID: MLSA-2023-002
CVE: None
CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N
Kritikalität: high
Betroffene Versionen: ≤ mendelson AS2 2023
Behoben in: ≥ mendelson AS2 2023 B569
Gefunden von: Hans-Martin Münch

Produktbeschreibung (englisch)

The mendelson AS2 software is a JAVA-based easy to use but highly configurable implementation of the EDIINT AS2 standard. This is your solution for secure and reliable automated data transfer with your communication partners. We make sure that your platforms are also supported - no matter if you are running Windows, Linux, Mac OS, AIX or others.

Details

mendelson AS2 bietet einen Administrationsdienst, der auf Port 1234 erreichbar ist und über eine Swing-basierten grafischen Anwendung die Konfiguration der Systemeinstellungen erlaubt. Dieser Dienst basiert auf Apache Mina, einem Java-basierten Netzwerk-Framework, das die Erstellung asynchroner APIs erlaubt.

Standardmäßig verwendet Apache Mina zur Kommunikation einfache Speicherpuffer, was jedoch nicht die Übertragung komplexer Java-Objekte erlaubt. Für diesen Fall bietet Mina die Konfiguration so genannter CODES, (vereinfachte) Filter die angewendet werden, bevor das Objekt über das Netzwerk gesendet wird.

mendelson AS bietet einen solchen Filter im Package “de.mendelson.util.clientserver.codec”. Der folgende Code stammt aus der Klasse “ClientServerDecoder”:

 1protected boolean doDecode(IoSession ioSession, IoBuffer in, ProtocolDecoderOutput decoderOutput) throws Exception {
 2  int position = in.position();
 3  byte[] headerData = new byte[4];
 4  if (in.remaining() >= 4) {
 5    in.get(headerData);
 6  } else {
 7    
 8    return false;
 9  } 
10  int contentLength = decodeLengthHeader32Bit(headerData);
11  
12  if (in.remaining() < contentLength) {
13    
14    in.position(position);
15    
16    return false;
17  } 
18  
19  byte[] objectBuffer = new byte[contentLength];
20  in.get(objectBuffer);
21  ByteArrayInputStream objectInStream = new ByteArrayInputStream(objectBuffer);
22  ObjectInput objectInput = new ObjectInputStream(objectInStream);
23  try {
24    Object object = objectInput.readObject();
25    objectInput.close();
26    decoderOutput.write(object);
27  } catch (InvalidClassException ex) {
28    ex.printStackTrace();
29    this.logger.severe(this.rb.getResourceString("client.incompatible"));
30    if (this.clientCallback != null) {
31      this.clientCallback.clientIsIncompatible(this.rb.getResourceString("client.incompatible"));
32    }
33  } 
34  
35  return true;
36}
37

Der Code erstellt einen ByteArrayInputStream aus dem Mina-Speicherpuffer und verwendet anschließend native Java-Deserialisierung (Zeile 24), um das eigentliche Java-Objekt auszulesen. Da hier keine “look ahead” Deserialisierung durchgeführt wird ist dieser Diens für die Deserialisierungs-Angriffe anfällig. Die Deserialisierung wird vor jeglicher Berechtigungsprüfung durchgeführt, weshalb diese Schwachstelle ohne vorherige Authentifizierung ausgenutzt werdne kann.

mendelson AS2 verwendet die Apache HttpClient Bibliothek, welche wiederum einer Kopie von CommonBeanutils 1.9.4 beinhaltet. Diese Bibliothek beinhaltet einen bekannten Deserialisierungs-Gadget (CommonsBeanutils1), welcher mit Hilfe der Gadgetsammlung ysoserial ausgenutzt werden kann.

Die mendelson AS2 Community Edition erlaubt nur Verbindungen von localhost, was die Angriffsfläche dieses Angriffs reduziert. Die kommerzielle Version erlaubt den Zugriff von beliebigen Hosts aus, wenn ein entsprechendes Kommandozeilenargument gesetzt wurde. Dies spiegelt sich in der Bewertung der Angriffskomplexität nach CVSS wider.

Workarounds

Es ist möglich, die Deserialisierung der Klasse BeanComparator (die vom CommonsBeanutils1-Gadget verwendet wird) zu blockieren. Dies kann durch das Setzen eines globalen Filters erreicht werden, den mann per Kommandozeile an die JRE übergibt:

$JAVAEXEC  -Djdk.serialFilter='!org.apache.commons.beanutils.BeanComparator;' -Xmx$MAX_HEAP -Xms92M -classpath $CLASSPATH de.mendelson.comm.as2.AS2 $1 $2 $3 $3 $4 $5 $6 $7 $8 $9

Dies verhindert eine Ausnutzung der Schwachstelle, in diesem Fall wird die folgende Fehlermeldung in das mendelson AS2 Log geschrieben:

Unable to establish the client-server connection. The server is not able to deserialize the client messages. The main reason for this is different versions of client and server.

Es ist anzumerken, dass dieser Ansatz nur die Ausnutzung des CommonsBeanutils-Gadgets verhindert, unter Umständen könnten weitere Gadgets existieren, die in diesem Fall aber nicht geblockt werden.

Coordinated Disclosure Zeitverlauf

  • 02/02/2023 Initialer Kontakt zum mendelson Service, inklusive Link zum Download der Beschreibung und einem PoC.
  • 02/02/2023 Rückmeldung von mendelson, diese weigern aufgrund von Sicherheitsbedenken auf den Link zu klicken.
  • 02/02/2023 Antwort an mendelson, Versenden der Schwachstellenbeschreibung als Markdown Datei. Verweis auf den Download für ein PoC.
  • 02/02/2023 mendelson bestätigt den Empfang und analysiert die übermittelten Schwachstellendetails
  • 02/02/2023 Rückmeldung von mendelson, es soll ein Filter implemenetiert werden. Stellung zusätzlicher Fragen.
  • 02/02/2023 Antwort von MOGWAI LABS, Versuch die zusätzlichen Fragen zu beantworten.
  • 02/02/2023 Antwort von mendelson service, weitere Fragen
  • 02/02/2023 Antwort von MOGWAI LABS, mit einer detaillierteren Erklärung.
  • 02/02/2023 Bestätigung von mendelson, als Quick-Fix soll ein Wrapper implementiert werden.
  • 03/02/2022 Mail von mendelson mit weiteren Fragen.
  • 03/02/2022 Antwort von MOGWAI LABS, mit zusätzlichen Referenzen, wie Deserialisierungs-Schwachstellen behoben werden sollten.
  • 03/02/2022 Mail von mendelson, mehr Fragen.
  • 03/02/2022 Antwort von MOGWAI LABS zur Behebung der Fragen.
  • 03/02/2022 Mail von mendelson, mit Code wie die Schwachstelle behoben werden soll.
  • 03/02/2022 Mail von mendelson mit weiteren Anmerkungen.
  • 04/02/2022 Antwort von MOGWAI LABS, Beantwortung der Fragen.
  • 06/02/2022 Antwort von mendelson, Bestätigung der empfohlenen Behebung.
  • 07/02/2022 mendelson veröffentlicht eine neue AS2 Version (B569), merkt die Behebung einer Schwachstelle an.
  • 08/02/2022 Email von MOGWAI LABS, mit der Frage ob eine CVE beantragt wurde.
  • 08/02/2022 Antwort von Mendelson, es wurde keine CVE beantragt.