enkilee opened a new pull request, #5134:
URL: https://github.com/apache/rocketmq-dashboard/pull/5134

   <!-- Make sure the base branch is `master`: that is the RocketMQ Studio 
trunk. -->
   
   ### Which Issue(s) This PR Fixes
   
   <!-- Link the issue with a keyword so it closes on merge. Trivial fixes need 
no issue.
        
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue
 -->
   
   - Fixes #<issue-id>
   
   ### Brief Description
   
   <!-- What changes and why. Keep it short — the diff already shows how. -->
   
   ## Summary
   - Close a username-enumeration timing side channel in 
`AuthService.loginDatabaseUser`.
     When the supplied username did not exist, the method threw 401 immediately 
without
     running any PBKDF2 derivation. The "user exists but disabled" and "user 
exists but
     wrong password" paths both run a full 210 k-iteration PBKDF2 match before 
returning
     401, so an unauthenticated caller could distinguish "user not found" 
(fast) from
     "user found but wrong password" (slow) by measuring response time and 
enumerate
     valid usernames.
   ## Changes
   - `AuthService.loginDatabaseUser`: when `findUserByUsername` returns empty, 
execute
     `passwordHasher.matches(request.getPassword(), DUMMY_PASSWORD_HASH)` 
before throwing
     401, so every 401 path pays the same PBKDF2 cost. This mirrors the 
existing dummy-hash
     guard already present on the "disabled account" branch.
   - Add regression test 
`unknownUserLoginBurnsDummyHashToPreventTimingSideChannelTest` in
     `AuthServiceDatabaseTest` that uses a mock `PasswordHasher` to verify the 
dummy
     derivation runs exactly once when the user is not found.
   ## Root Cause
   The original `orElseThrow` lambda returned the exception without performing 
any work.
   The disabled-account branch (added in the same PR #2313) already burned a 
dummy hash
   with an explicit comment explaining the timing-equalization intent, but the
   user-not-found branch was overlooked, leaving a detectable timing gap.
   
   ### How Did You Test This Change?
   
   <!-- Paste the commands you ran and what they printed. Typical verification:
        backend  `cd server && mvn -B -ntp test`   (integration tests need 
MySQL 8, see CONTRIBUTING.md)
        frontend `cd web && npm test && npm run lint && npm run build`
        A pull request with no verification will not be merged. -->
   
   ### Checklist
   
   - [ ] One coherent change; unrelated modifications are not bundled in
   - [ ] Commit subject follows Conventional Commits (`feat:` / `fix:` / 
`refactor:` / `chore:` / `docs:` / `perf:`)
   - [ ] Tests added or updated for non-trivial changes, test methods named 
`...Test`
   - [ ] New UI text has both Chinese and English entries under `web/src/i18n/`
   - [ ] Architecture constraints stay green (`mvn test` runs the ArchUnit 
checks)
   - [ ] New source files carry the ASF license header
   - [ ] Documentation touched where behaviour changed (README / `docs/` / 
in-app help)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to