signature 미확인
JWT는 헤더(Header), 페이로드(Payload), 서명(Signature) 세 부분으로 구성되며, 토큰의 무결성과 인증을 보장한다.
헤더와 페이로드는 JSON 형태로 인코딩되어 Base64로 표현되며, 서명은 토큰의 변조 여부를 확인하는 역할을 한다. Signature 미확인 취약점에서는 서명을 확인하지 않아 변조된 토큰이 무조건 신뢰되는 문제가 발생할 수 있다.
- 일반적인 JWT 토큰은 헤더와 페이로드를 생성한 후, 비밀 키를 사용하여 서명을 생성한다.
- 서명은 토큰의 헤더와 페이로드, 알고리즘 정보를 조합하여 생성된다.
- 토큰 수신자는 헤더와 페이로드를 디코딩하고, 동일한 알고리즘과 비밀 키를 사용하여 서명을 검증한다.
- 헤더 인코딩: 헤더의 내용을 Base64로 인코딩하여 토큰에 포함시킨다.
- 서명 검증: 토큰 수신자가 헤더, 페이로드, 서명 정보를 조합하여 서명을 재생성하고, 생성된 서명과 토큰에 포함된 서명을 비교하여 무결성을 검증한다.
예시
import jwt
# 변조된 토큰
malicious_token = "eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJ1c2VyX2lkIjogMTIzNDU2Nzg5MCJ9."
# 서명 검증 생략하고 토큰 디코딩 시도
try:
decoded_payload = jwt.decode(malicious_token, verify=False)
print("Decoded Payload:", decoded_payload)
except jwt.ExpiredSignatureError:
print("Token has expired.")
except jwt.InvalidTokenError:
print("Invalid token.")
위 코드 예시에서는 서명을 검증하지 않고 변조된 토큰을 디코딩하려고 시도하는 과정을 보여준다.
이로인해
- 서명을 확인하지 않고 토큰을 디코딩하여 변조된 내용을 사용할 수 있다.
- 변조된 토큰을 유효한 것으로 간주하여 인증 우회를 시도할 수 있다.
대응 방법
서버 측에서 Signature 검증을 수행(보통, verify 함수를 이용해 디코딩된 Header.Data 값과 복호화된 Signature를 비교 검증하는 방식으로 수행), 신뢰할 수 있는 라이브러리 사용
None 알고리즘 사용
일반적으로 토큰 생성 시 헤더의 "alg" 필드에 알고리즘 값을 설정하여 서명을 생성하고 검증한다.
None 알고리즘 사용 취약점에서는 헤더의 "alg" 값을 None으로 설정하여 서명을 생략하고 토큰을 변조할 수 있게 된다.
- 일반적인 JWT 토큰은 헤더와 페이로드를 생성한 후, 알고리즘에 따라 비밀 키를 사용하여 서명을 생성한다.
- 악의적인 사용자는 토큰의 헤더의 "alg" 값을 None으로 설정하여 서명을 생략한다.
- 검증 과정에서 토큰의 헤더의 "alg" 값이 None인 경우 서명 검증을 생략하고 토큰을 변조한 내용을 사용한다.
- 헤더 인코딩: 헤더의 내용을 Base64로 인코딩하여 토큰에 포함시킨다.
- None 알고리즘: 토큰의 서명을 생략하는 알고리즘으로, 보안 검증 과정을 우회할 수 있게 된다.
예시
{
"alg": "none",
"typ": "JWT"
}
위 JSON 예시는 None 알고리즘을 사용하여 토큰의 헤더 부분을 나타내며, "alg" 값으로 none을 설정하고 있다.
- 토큰 헤더의 "alg" 값을 None으로 설정하여 서명 검증을 우회하고 변조된 토큰을 사용한다.
- 변조된 내용이 유효한 것으로 간주되어 인증 우회를 시도할 수 있다.
대응방법
- 엄격한 검증 강화: 토큰 검증 시 항상 서명을 검증하도록 설정하여 None 알고리즘을 사용한 토큰을 거부한다.
- 신뢰할 수 있는 라이브러리 사용: JWT 라이브러리를 최신 버전으로 유지하고, 취약점이 발견되면 업데이트를 진행한다.
비대칭 알고리즘을 대칭 알고리즘으로 변경
JWT는 헤더(Header), 페이로드(Payload), 서명(Signature) 세 부분으로 구성되며, 서명은 토큰의 무결성을 검증하는 역할을 하며 비대칭 알고리즘은 공개 키와 개인 키를 사용하여 서명을 생성하고 검증한다. 공격자가 비대칭 알고리즘을 대칭 알고리즘으로 변경하면서 토큰을 변조할 수 있다.
- 일반적으로 JWT 토큰은 비대칭 알고리즘(예: RS256)을 사용하여 서명이 생성되고 검증된다.
- 공격자는 토큰의 페이로드를 변조한 후, 토큰 헤더의 알고리즘을 대칭 알고리즘(예: HS256)으로 변경한다.
- 대칭 알고리즘에서는 같은 키를 서명과 검증에 사용하므로 공격자가 서명을 생성할 수 있게 된다.
- 비대칭 알고리즘: 공개 키와 개인 키를 사용하는 알고리즘으로, 서명 생성과 검증에 서로 다른 키를 사용한다.
- 대칭 알고리즘: 동일한 키를 서명과 검증에 사용하는 알고리즘으로, 키의 보안 관리가 중요하다.
대응방법
공개키를 알아내어 우회가 가능하므로 verify 시 HS256 알고리즘을 사용하지 않게 해야 한다.
JKW injection
일반적으로는 토큰 생성 시 비밀 키를 사용하여 서명을 생성하고, 검증 시에도 같은 비밀 키를 사용한다. JWK Injection 취약점에서는 공격자가 토큰 검증 시 사용되는 키를 조작하여 토큰을 위조할 수 있게 된다.
- JWT 토큰의 서명 검증은 알고리즘과 비밀 키를 사용하여 서명을 재생성하고, 생성된 서명과 토큰에 포함된 서명을 비교하는 과정이다.
- JWK Injection 취약점에서는 공격자가 토큰 검증 시 사용되는 JWK를 외부에서 조작한 악의적인 JWK로 대체한다.
- 조작된 JWK를 사용하여 서명을 재생성하여 토큰을 검증하면, 토큰의 무결성을 조작한 내용으로 변경할 수 있다.
- JWK(공개 키 집합): 공개 키를 나타내는 JSON 형식으로, 비대칭 암호화에서 사용된다.
- 서명 검증: 토큰 수신자가 헤더, 페이로드, 서명 정보를 조합하여 서명을 재생성하고, 생성된 서명과 토큰에 포함된 서명을 비교하여 무결성을 검증한다.
JKU spoofing
토큰 검증 시에는 토큰의 헤더의 "jku" 필드에 지정된 URL에서 공개 키 집합을 가져와 검증에 사용한다. JKU Spoofing 취약점에서는 공격자가 JKU URL을 조작하여 위조된 공개 키를 사용할 수 있게 된다
- JWT 토큰의 검증은 알고리즘과 JKU URL을 사용하여 공개 키 집합을 가져오고, 이를 활용하여 토큰의 서명을 검증하는 과정이다.
- JKU Spoofing 취약점에서는 공격자가 JKU URL을 조작하여 다른 위치에서 위조된 공개 키 집합을 제공한다.
- 조작된 JKU URL에서 가져온 위조된 공개 키로 서명을 검증하면, 토큰의 무결성을 조작한 내용으로 변경할 수 있다.
- JKU(공개 키 집합 URL): 공개 키를 포함하는 JSON 형식의 공개 키 집합을 가져오기 위한 URL이다.
- 서명 검증: 토큰 수신자가 헤더, 페이로드, 서명 정보를 조합하여 서명을 재생성하고, 생성된 서명과 토큰에 포함된 서명을 비교하여 무결성을 검증한다.
예시
{
"alg": "RS256",
"jku": "https://example.com/jwks.json",
"typ": "JWT"
}
kid injeciton
일반적으로 토큰 검증 시 토큰의 헤더의 "kid" 필드에 지정된 키를 사용하여 서명을 검증한다. Kid Injection 취약점에서는 공격자가 Kid 값을 조작하여 다른 키를 사용하도록 유도하여 토큰을 위조할 수 있다.
- JWT 토큰의 검증은 알고리즘과 Kid 값을 사용하여 해당 Kid 값에 매칭되는 키를 사용하여 토큰의 서명을 검증하는 과정이다.
- Kid Injection 취약점에서는 공격자가 Kid 값을 조작하여 다른 키의 서명을 검증하도록 유도한다.
- 조작된 Kid 값에 대응하는 서명 키를 사용하여 토큰을 검증하면, 토큰의 무결성을 조작한 내용으로 변경할 수 있다.
- Kid(키 식별자): 서명 검증에 사용될 키를 식별하는 값으로, 보통 키 집합에서 키를 선택할 때 사용된다.
- 서명 검증: 토큰 수신자가 헤더, 페이로드, 서명 정보를 조합하여 서명을 재생성하고, 생성된 서명과 토큰에 포함된 서명을 비교하여 무결성을 검증한다.
대응 방법
- 신뢰할 수 있는 키 관리: Kid 값의 무결성을 보장하기 위해 신뢰할 수 있는 저장소를 사용하고, Kid 값의 정확한 출처를 확인한다.
- 정확한 키 검증: Kid 값의 일치 여부와 신뢰할 수 있는 출처를 확인하여 검증에 활용하며, 검증 옵션을 활용하여 외부 조작을 방지한다.
참조 : https://velog.io/@thelm3716/JWTvul (추천)
'Web' 카테고리의 다른 글
[웹] 브라우저? 알아볼게요 (0) | 2023.08.18 |
---|---|
[웹] 세션, 쿠키? 알아볼게요( with . python, javascript) (1) | 2023.08.18 |
[웹] 꼭 알아야 하는 jwt 토큰 개념 (0) | 2023.08.16 |
[웹] HTTP 상태코드 한방에 정리 (2) | 2023.08.13 |
[웹]취약한 HTTPS 관련 취약점 점검 방법 (4) | 2023.06.09 |