[ 
https://issues.apache.org/jira/browse/KNOX-3413?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18105243#comment-18105243
 ] 

ASF subversion and git services commented on KNOX-3413:
-------------------------------------------------------

Commit d1c9e0135412dab5e005ceb91d3d88fd0acd561d in knox's branch 
refs/heads/v2.1.x from hanicz
[ https://gitbox.apache.org/repos/asf?p=knox.git;h=d1c9e0135 ]

Knox security picks into v2.1.x (#1352)

* KNOX-3188 - Token renewal and revocation should be authorized based on the 
group membership of the authenticated subject. (#1083)

(cherry picked from commit 72be9fbd53a9b19483f683025155b665011d7243)

* KNOX-3410: KnoxToken enable/disable endpoints perform no caller autho… (#1343)

* KNOX-3410: KnoxToken enable/disable endpoints perform no caller authorization

* KNOX-3410: Address review comments

(cherry picked from commit f2126008ab764003e9831e48d30302886be93496)

* KNOX-3411: KnoxToken getUserTokens returns every user's token metadat… (#1344)

* KNOX-3411: KnoxToken getUserTokens returns every user's token metadata 
without a caller authorization check

* KNOX-3411: Add test clean-up

(cherry picked from commit 049dc0cb894f907efa920a1a2c10fb6ed56fb109)

* KNOX-3416: KnoxSSO redirects to untrusted site (#1346)

* KNOX-3416: KnoxSSO redirects to untrusted site

* KNOX-3416: Clarify error message for userInfo

(cherry picked from commit c3dee56346cfb2670a114d478db0ba2b51aa01f7)

* KNOX-3417: KnoxLdapRealm builds the LDAP search filter from the client 
username without RFC-4515 escaping (#1348)

(cherry picked from commit 3cb8ef745c44b39377d855d835198de183a4cef3)

* KNOX-3413: KnoxToken passcode verification accepts a valid passcode for a 
different token (#1345)

(cherry picked from commit 5342483a2c7ff229d8819d7df479980753640fc1)

* KNOX-3413: Fix unit test

* KNOX-3418: Path traversal → arbitrary file write/overwrite in the Apache Knox 
Admin API (#1349)

(cherry picked from commit de71a60cdf34c842abb8a49f770a0e33fe33c7e9)

* KNOX-3418: Fix jdk17 -> jdk11 compilation fails

---------

Co-authored-by: Sandor Molnar <[email protected]>

>  KnoxToken passcode verification accepts a valid passcode for a different 
> token
> -------------------------------------------------------------------------------
>
>                 Key: KNOX-3413
>                 URL: https://issues.apache.org/jira/browse/KNOX-3413
>             Project: Apache Knox
>          Issue Type: Bug
>          Components: Server
>    Affects Versions: 2.1.0, 3.0.0
>            Reporter: Tamás Hanicz
>            Assignee: Tamás Hanicz
>            Priority: Blocker
>             Fix For: 3.0.0, 3.1.0
>
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> Reported by n0mi1k Security 
>  
> When KnoxToken passcodes are in use, AbstractJWTFilter validates a presented 
> (tokenId, passcode) pair, and at AbstractJWTFilter.java:504 the guard is 
> `hasSignatureBeenVerified(passcode) || validatePasscode(tokenId, passcode)`; 
> validatePasscode (:544-553) is the only check that binds the passcode to the 
> token identifier — it compares tokenMAC.hash(tokenId, issueTime, userName, 
> passcode) against the passcode stored for that specific tokenId — and on a 
> successful check it records the passcode STRING in a shared cache via 
> recordSignatureVerification(passcode). Because the cache is keyed on the 
> passcode string alone (SignatureVerificationCache.hasSignatureBeenVerified / 
> verifiedTokens.getIfPresent at :96, populated by verifiedTokens.put(passcode, 
> true) at :105), a client that has once verified its own passcode can then 
> present that same passcode paired with a different, victim token identifier: 
> hasSignatureBeenVerified(passcode) returns true, the tokenId-binding MAC 
> check is skipped entirely, and the authenticated subject is built from the 
> victim tokenId via createSubjectFromTokenIdentifier (:361). Token identifiers 
> are not secret — they are returned in token-generation responses, are 
> enumerable via the getUserTokens endpoint, and equal the public client_id in 
> the client-credentials flow — so a low-privilege KnoxToken holder can 
> authenticate as any other still-valid token's principal, which is an 
> identity-assertion / authentication bypass, the keystone property a perimeter 
> gateway is meant to uphold. The attached PoC drives the real 
> AbstractJWTFilter.validateToken + real SignatureVerificationCache + real 
> TokenMAC: after seeding the cache with (tokenA, PASSCODE_A), the call 
> validateToken(tokenB, PASSCODE_A) returns true and 
> createSubjectFromTokenIdentifier(tokenB) yields "bob" (tokenB's owner), while 
> the same call against an empty cache returns false (the real MAC check 
> rejects it). 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to