Security
- Critical: unauthenticated admin bypass. Route and role checks matched on the raw request URI with a substring
contains()instead of the container-normalized servlet path. A crafted URI like/x;/manage/viewUsers.ktrlcould reach any/manage/*or/admin/*controller — including full account creation — with zero authentication. Now matched ongetServletPath()with an exact match. - SSH terminal WebSocket had no real auth gate. The
/admin/terms.wsupgrade request bypasses the servlet-containerAuthFilterentirely; it was only "failing safe" by accident, via an uncaught NPE.SecureShellWS.onOpennow explicitly validates a live admin auth token before allowing the connection. - Added login throttling. Brute-force login attempts were previously unbounded. Now rate-limited per client IP (configurable via
maxLoginAttemptsPerIP/loginThrottleWindowMinutes, default 10 attempts / 5 minutes) rather than per-account, so an attacker can't lock out a known admin by deliberately failing their password. - Fixed a file upload path traversal.
UploadAndPushKtrl.push()didn't sanitize the uploaded filename before using it to build SFTP push/cleanup paths, allowing a crafted../../../etc/passwd-style value to read or delete arbitrary local files. - Hardened DB connection handling. All 12 DAO classes moved to try-with-resources, closing two real connection leaks: one in the terminal output-polling loop (a leak every 25ms on exception) and one on every failed external-auth attempt.
Added
- SAML 2.0 SSO, alongside the existing LDAP/JAAS auth — works with Entra ID, Okta, ADFS, or any SAML 2.0 IdP.
- Self-signed SP signing/encryption keys generated automatically (no config needed); every outgoing
AuthnRequestis signed. - New
/saml/metadataendpoint for IdP-side setup via URL import. - Optional encrypted-assertion support (
samlWantEncryptedAssertions). - Config is entirely env-var/file driven — no new admin UI, matching the LDAP pattern.
- SAML role/group claims map onto Bastillion profiles the same way LDAP groups already do.
- Self-signed SP signing/encryption keys generated automatically (no config needed); every outgoing
Changed
- Modernized UI throughout: new logo/branding (SVG), responsive navbar, consistent button styling across admin and manage views.
- Terminal polish: fixed resizing, cursor/clipboard input, selection clearing after copy, and a duplicate-session output race.
- Fixed zsh sessions leaking
PROMPT_EOL_MARKmarkers into terminal/audit output. - Raised the free system limit.
- Refreshed all product screenshots.
- Upgraded embedded Jetty from 11 (Jakarta EE 9) to 12 (Jakarta EE 10).
Dependencies
xmlsec2.2.6 → 4.0.4 (also closes CVE-2023-44483, pinned similarly to the existingmina-corepin)jakarta.servlet-api6.0.0 → 6.1.0commons-codec1.22.0 → 1.22.1com.github.mwiede:jsch2.28.4 → 2.28.6org.bouncycastle:bcprov-jdk18on1.85 → 1.85.2org.junit.jupiter:junit-jupiter6.1.2 → 6.1.3maven-clean-plugin3.4.1 → 3.5.0frontend-maven-plugin2.0.1 → 2.0.2grunt1.6.2 → 1.6.3,brace-expansion(npm, transitive)github/codeql-action4 → 4.37.7
Upgrade note: if you run behind LDAP/JAAS today, this release is a drop-in upgrade — no config changes required. SAML is opt-in via new env vars. Given the auth-bypass and WS-terminal-auth fixes above, upgrading promptly is strongly recommended for all deployments.