개발자 도구 · JWT 디코더
alg:none 공격 및 키 혼란: 검증자가 알고리즘을 고정해야 하는 이유
· 그것이 중요한 이유
jwt 보안 암호화
검증자가 토큰이 자체 알고리즘을 선택하도록 허용하는 경우 공격자는 없음을 선택하거나 RSA를 HMAC로 교체할 수 있습니다. 이 게시물에서는 공격과 이를 방지하는 규칙에 대해 설명합니다.
자신을 확인한 토큰 — 헤더 필드가 공격 표면이 된 방법
알고리즘 레이블은 공격자가 제어하는 토큰 입력 내부에 있습니다. 검증자가 해당 레이블을 사용 가능한 검증 모드를 선택할 수 있는 권한으로 취급하면 토큰은 자체 판단에 사용되는 규칙에 영향을 미치기 시작합니다. ToolAcre는 검토자가 볼 수 있도록 레이블을 정확하게 노출하지만 암호화 방식으로 작동하지는 않습니다.
안전한 방향은 반대입니다. 신뢰할 수 있는 서비스 구성은 허용 가능한 알고리즘 계열 및 관련 키를 정의한 다음 수신 헤더가 해당 정책과 일치해야 합니다. 디코드 패널은 해당 정책을 제공할 수 없으며 의심스러운 값을 강조한다는 이유만으로 보호 패널로 오해되어서는 안 됩니다.
저장소는 alg:none 플래그를 지정하지만 보안되지 않은 JWT 뒤에 사양 기록을 설정하지 않습니다.
구현에서는 `alg: none`을 서명되지 않은 선언으로 처리하고 이를 수락하면 임의의 콘텐츠가 허용된다는 경고를 표시합니다. 또한 빈 세 번째 세그먼트를 별도로 보고합니다. 저장소 증거는 인증된 작업 흐름에서 이러한 입력을 거부하도록 지원합니다. 보안되지 않은 JWT가 원래 사양에 포함된 이유를 문서화하지 않습니다.
따라서 해당 역사적 표현은 창안된 것이 아니라 수정되었습니다. 운영상 중요한 것은 분명합니다. 서명된 자격 증명을 기대하는 서비스는 토큰 헤더가 서명 확인을 비활성화하도록 허용해서는 안 됩니다. ToolAcre 자체는 확인을 수행하지 않으므로 `none` 표시 기능은 검사용 감지일 뿐입니다.
alg:none 공격 — 서명을 제거하고 검증자에게 빈 서명을 수락하도록 요청
서명되지 않은 공격은 헤더를 변경하여 `none`을 요청하고 원하는 경우 클레임을 변경하며 서명 바이트를 제공하지 않습니다. 모든 세그먼트는 여전히 구문적으로 유효할 수 있으며 처음 두 세그먼트는 세련된 JSON로 디코딩됩니다. 허용적 검증자는 공격자의 선호를 인증 우회로 전환합니다.
엄격한 검증자에는 서명된 토큰이 필요할 때 이 입력을 신뢰할 수 있는 상태로 업그레이드하는 분기가 없습니다. ToolAcre의 경고는 디버깅 중에 모양을 식별하는 데 도움이 되지만 `none`라는 단어를 읽어도 백엔드가 잘못된 결정을 내리는 것을 막지는 못합니다. 시행은 자격 증명이 사용되는 곳에 속합니다.
키 혼란 — 공개 키를 HMAC 비밀로 제시하여 RS256 토큰이 HS256으로 확인되도록 함
검증자가 호환되지 않는 키 역할을 가진 알고리즘 계열을 허용하고 각 선택 사항을 올바른 키 유형에 바인딩하지 못할 때 키 혼란이 발생합니다. 공개 RSA 확인 키는 HMAC 비밀이 아닙니다. 공격자가 알고리즘 레이블을 변경한 후 해당 바이트를 1로 처리하면 의도된 public/private 분리가 무너집니다.
해당 오류 클래스를 방지하려면 서명 모양 세그먼트를 확인하는 것 이상이 필요합니다. 서비스는 신뢰할 수 있는 구성을 통해 예상 알고리즘, 키 유형, 발급자 및 토큰 프로필을 쌍으로 연결해야 합니다. RS256 또는 HS256을 표시하는 디코더는 백엔드가 해당 바인딩을 유지하는지 여부를 알 수 없습니다.
수정 사항 — 검증자에 허용된 알고리즘을 고정하고 토큰에서 파생시키지 마세요.
검증자 구성에서 허용된 알고리즘을 고정하고 발행자 계약이 허용하는 한 목록을 좁게 유지합니다. 다른 알고리즘을 시도하는 대신 서명된 자격 증명 흐름에 대해 `none`을 거부하고 불일치를 거부합니다. 확인되지 않은 헤더나 페이로드 클레임에서 허용 목록을 파생하지 마세요.
키 조회는 동일한 원칙을 따릅니다. `kid`은(는) 이미 신뢰할 수 있는 후보 중에서 선택할 수 있지만 새 신뢰 소스를 생성해서는 안 됩니다. 단지 토큰이 요청한다는 이유만으로 헤더 URL이나 내장된 키를 따라가서는 안 됩니다. 검증자는 소스를 독립적으로 결정합니다.
작업된 예 — ToolAcre JWT 디코더에서 헤더를 읽어 alg:none을 발견하고 이를 발견하는 것이 보호되는 것과 같지 않은 이유
`none`을 선언하는 무해한 토큰 헤더를 생성하고 세 번째 세그먼트를 비워 둡니다. ToolAcre는 JSON을 디코딩하고, 선언된 알고리즘을 보고하고, 서명되지 않았음을 경고하고 서명이 없음을 기록합니다. 이는 검사 도구에서 예상되는 동작과 정확히 같습니다.
연습은 API가 토큰을 거부한다는 것을 증명하지 않습니다. 실제 검증자 및 구성에 대해 통제된 부정 테스트를 통해 별도로 확인합니다. API가 이를 수락하면 수정 사항은 해당 확인 경계에 속합니다. 디코더에 더 큰 경고를 추가하면 요청이 보호되지 않습니다.
여기서 다루지 않는 내용 — 다양한 라이브러리 관련 수정 사항; RFC 8725 및 라이브러리의 변경 로그를 참조하세요.
라이브러리 API, 기본값 및 기록 수정 사항은 제품 및 버전에 따라 다릅니다. 이 모듈은 스택에 어떤 옵션 이름이 알고리즘을 고정하는지 설정하지 않으며 이 문서에서는 의도적으로 아무것도 만들지 않습니다. 선택한 라이브러리의 현재 문서와 변경 로그를 읽은 다음 자체 테스트 스위트에서 거부 사례를 실행해 보세요.
또한 잘못된 키 유형, 알 수 없는 `kid` 값, 누락된 서명 및 예상치 못한 토큰 프로필을 테스트하세요. 목표는 구성이 토큰 제안보다 우선한다는 것을 보여주는 것입니다. 구문 성공은 모든 악성 예제와 호환되므로 성공적인 디코드는 이러한 승인 주장에 속하지 않습니다.
요점: 토큰이 아니라 검증자가 결정합니다. 디코더는 헤더를 보는 데 도움이 되지만 고정된 검증만이 사용자를 보호합니다.
검증자가 결정합니다. 토큰은 그렇지 않습니다. ToolAcre는 익숙하지 않은 알고리즘 또는 놀라운 키 식별자인 `none`라는 헤더를 표시할 수 있습니다. 이러한 가시성은 분류에 도움이 되지만 고정된 알고리즘 정책과 올바르게 바인딩된 신뢰할 수 있는 키만 승인을 방해합니다.
`none`을 활성화하거나 신뢰할 수 없는 헤더에서 확인 키를 선택하거나 표시된 서명 길이를 유효성 검사로 처리하는 것은 권장하지 않습니다. 검사를 위해 디코딩한 다음 제어된 테스트를 통해 실제 암호화 경계에서 거부 및 수락 동작을 증명합니다.