Zum Hauptinhalt springen

Java · SAST

Java-SAST, das vollständig offline läuft

Auditieren Sie Spring Boot, JEE, Hibernate und JDBC auf OWASP-Top-10-Schwachstellen, Framework-Fehlkonfigurationen und Supply-Chain-Risiken — ohne Code in die Cloud hochzuladen.

Geprüfte Frameworks & Bibliotheken

Wir testen die Abdeckung über Fixtures auf diesen Frameworks. Neue Muster werden in jedem Builtin-Regel-Release ergänzt.

Spring Boot Spring MVC Spring Security JEE Jakarta EE Hibernate JPA MyBatis JDBC Apache Struts JSF Jersey Apache Commons Jackson log4j slf4j BouncyCastle

Häufigste erkannte CWE-Klassen

Diese CWE-Klassen treten in modernen Codebasen dieser Sprache am häufigsten auf. StaticCodeAudit liefert dedizierte Regeln für jede, gemappt auf OWASP Top 10 / ISO 27001 / ASVS, sofern relevant.

CWE-89

SQL-Injection

String-Konkatenation in JDBC Statement, JPA createQuery mit Concat, MyBatis ${...} statt #{...}, Hibernate HQL mit String-Format.

Erkannt von SCA-Regel: sql_injection_concat_java

CWE-611

XML External Entity (XXE)

DocumentBuilderFactory, SAXParserFactory, XMLReader ohne FEATURE_SECURE_PROCESSING oder DTD deaktiviert. Erlaubt Datei-Disclosure und SSRF.

Erkannt von SCA-Regel: xxe_injection

CWE-502

Unsichere Deserialisierung

Natives Java ObjectInputStream.readObject auf nicht vertrauenswürdigen Bytes (die « Java Serialization Gadget »-Bug-Klasse, die zu log4shell führte). Apache Commons Collections-Payloads funktionieren noch 2026.

Erkannt von SCA-Regel: unsafe_deserialization

CWE-78

OS-Befehlsinjektion

Runtime.getRuntime().exec(userString) mit Shell-String, ProcessBuilder mit Concat. Beide interpretieren Shell-Metazeichen.

Erkannt von SCA-Regel: command_injection_java

CWE-798

Hartkodierte Zugangsdaten

Anmeldedaten in commitetem application.properties, AWS-Keys in application.yml, JWT-Signatur-Secret als String-Konstante.

Erkannt von SCA-Regel: hardcoded_secret

CWE-22

Path Traversal

new File(userPath), Files.readAllBytes(Paths.get(userPath)) ohne Root-Anchor-Check — typisch bei Multi-Tenant-Datei-Storage-Endpoints.

Erkannt von SCA-Regel: path_traversal_python

Verwundbar vs. sicher — drei kurze Beispiele

CWE-89 Erkannt von SCA-Regel: sql_injection_concat_java
❌ Verwundbar
// Verwundbar — Statement-Konkatenation
String sql = "SELECT * FROM users WHERE name = \'" + name + "\'";
ResultSet rs = stmt.executeQuery(sql);
✅ Sicher
// Sicher — PreparedStatement mit Bind
PreparedStatement ps = conn.prepareStatement(
    "SELECT * FROM users WHERE name = ?");
ps.setString(1, name);
ResultSet rs = ps.executeQuery();
CWE-611 Erkannt von SCA-Regel: xxe_injection
❌ Verwundbar
// Verwundbar — DocumentBuilderFactory Default
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
Document doc = dbf.newDocumentBuilder().parse(input);
✅ Sicher
// Sicher — DTD deaktivieren + Secure Processing
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
Document doc = dbf.newDocumentBuilder().parse(input);
CWE-78 Erkannt von SCA-Regel: command_injection_java
❌ Verwundbar
// Verwundbar — Shell-String
Runtime.getRuntime().exec("ping -c 1 " + userInput);
✅ Sicher
// Sicher — Argument-Array, keine Shell-Interpretation
ProcessBuilder pb = new ProcessBuilder("ping", "-c", "1", userInput);
pb.start();

Was StaticCodeAudit erkennt (diese Sprache)

  • SQL-Injection in JDBC Statement, JPA, MyBatis, Hibernate HQL mit Concat
  • XXE in DocumentBuilderFactory, SAXParserFactory, XMLReader
  • Native Java-Deserialisierung auf nicht vertrauenswürdigen Streams
  • Befehlsinjektion via Runtime.exec, ProcessBuilder mit Shell-String
  • Hartkodierte Secrets in application.properties, application.yml
  • Path Traversal in new File, Files.readAllBytes ohne Root-Anchor
  • LDAP-Injection in DirContext.search
  • Unsichere Cookies (setSecure, setHttpOnly in Servlet-API fehlen)
  • CSRF: Spring Security .csrf().disable() in Produktionskonfiguration
  • Unsichere Krypto (MD5/SHA1 für Security, DES, RC4, hartkodierter IV)
  • JWT none-Algorithmus, hartkodierter HS256-Secret
  • Log4j Sinks (CVE-2021-44228 Muster-Erkennung)
  • Veraltete APIs (SSLv3, javax.xml.ws Endpoint, sun.misc.Unsafe)
  • CI/CD-Fehlkonfigurationen (Maven/Gradle-Wrappers, GitHub-Actions-Tokens)

Neugierig, wie die Erkennungsqualität tatsächlich gemessen wird? Sehen Sie sich die vollständige sprachübergreifende Benchmark-Methodik an (OWASP Benchmark, NIST Juliet, Precision/Recall/F1 pro Sprache) →

OWASP BenchmarkJava v1.2 — unabhängige Validierung

StaticCodeAudit wurde gegen das OWASP BenchmarkJava v1.2 gemessen — eine öffentliche, reproduzierbare Test-Suite mit 2.740 Java-Testfällen, die 11 Schwachstellenkategorien abdeckt.

98,8%
F1-Score
100%
Recall
2.740
Testfälle

9 von 11 Kategorien mit F1 = 100%

99,8%
SQL-Injection
100%
XSS
100%
Befehlsinjektion
100%
Path Traversal
100%
Kryptografie
100%
Schwacher Zufall
100%
LDAP-Injection
100%
Trust Boundary
100%
Sicheres Cookie
100%
XPath-Injection
≈89%
Hash

34 verbleibende False Positives insgesamt: 33 in der Hash-Kategorie — MessageDigest.getInstance(algorithm), wo der Algorithmus-String aus einer externen .properties-Datei stammt, statisch nicht von einer Konstante unterscheidbar — plus 1 bei SQL-Injection, bedingt durch die dateiübergreifende Analyse.

Echte Schwachstellen passen selten in eine einzige Datei

Spring-Anwendungen verteilen die Logik auf mehrere Schichten: ein Controller empfängt die Anfrage, ein Service baut die Abfrage. Ein Scanner, der jeweils nur eine Datei sieht, verbindet die beiden nie — er sieht die Nutzereingabe in Controller.java und den Datenbankaufruf in Service.java, aber nie die Verbindung dazwischen. StaticCodeAudit verfolgt die Daten jetzt über Dateigrenzen hinweg, genau wie bereits bei Python.

Controller.java
@GetMapping("/orders")
public String findOrder(@RequestParam String id, Model model) {
    model.addAttribute("order", orderService.findOrder(id));
    return "order-view";
}
Service.java
public Order findOrder(String id) {
    String sql = "SELECT * FROM orders WHERE id = " + id;
    return jdbcTemplate.queryForObject(sql, Order.class);
}

id stammt aus der HTTP-Anfrage im Controller und erreicht die SQL-Abfrage zwei Dateien später unverändert — StaticCodeAudit meldet dies genau in der Zeile, in der die Abfrage ausgeführt wird.

Auditieren Sie Ihren Code

Auditieren Sie Spring Boot, JEE, Hibernate und JDBC auf OWASP-Top-10-Schwachstellen, Framework-Fehlkonfigurationen und Supply-Chain-Risiken — ohne Code in die Cloud hochzuladen.

Demo-Binary herunterladen Geführte Demo buchen