
인증 및 권한 부여
인증 (AuthN) 및 권한 부여 (AuthZ) 의 주제는 둘 중 하나와 관련된 취약성이 자주 발생하기 때문에 매우 중요합니다.이러한 문제가 너무 자주 발생하는 것 같기 때문에 일반적으로 이러한 문제가 무엇인지, 심지어 원인이 무엇인지에 대해 약간의 불확실성이 있다는 뜻입니다.
참고로 각 용어에는 다음이 포함됩니다.
- 인증: 사용자는 누구인가요?
- 권한 부여: 사용자는 무엇을 이용할 수 있어야 합니까?
아래에서 별도로 살펴 보겠습니다.
인증 (식별 및 인증 실패)
부적절한 인증은 다음과 같은 다양한 취약점을 해결할 수 있습니다.
- 특정 페이지/엔드포인트에 인증이 없는 경우
- 무차별 대입 공격에 대한 보호 부족 (자격 증명 스터핑)
- 안전하지 않은 계정/암호 복구 프로세스
- 안전하지 않은 인증 토큰 생성, 검증, 만료, 전송 또는 저장
- 사용자가 2FA로 인증했다는 유효성이 부적절하거나 누락됨 (해당하는 경우)
목록의 첫 번째 항목 (인증 없음) 은 단연코 현존하는 가장 일반적인 문제입니다.대부분의 경우 개발자는 페이지 또는 엔드포인트에서 요구하는 인증 수준에 명시적으로 주석을 달거나 구성해야 하는데, 이 단계는 쉽게 놓칠 수 있습니다.
시스템이 제대로 작동하지 않도록 하는 것이 좋습니다. 닫혔습니다, 열지 않는 것이 아니라따라서 각 엔드포인트에 인증된 사용자 세션이 필요하다는 정보를 주석으로 추가하는 대신 기본값은 다음과 같아야 합니다. 모든 특별히 재정의되지 않은 한 라우트에는 인증된 사용자 세션이 필요합니다.이렇게 하면 오류가 발생할 여지를 크게 줄일 수 있습니다.
권한 부여 (깨진 액세스 제어)
권한 부여 문제는 매우 일반적인 여러 가지 방식으로 나타날 수 있습니다.
- 안전하지 않은 직접 객체 참조 (IDOR)
- 함수 수준 액세스 제어 누락 (AuthZ 누락)
- 권한 에스컬레이션 (수평 또는 수직)
안전하지 않은 직접 객체 참조
객체에는 객체를 참조하는 키로 사용되는 고유 식별자 (ID) 가 있는 경향이 있습니다.사용자가 주문, 계정 등을 조회해 달라는 요청을 보내면 일반적으로 이 ID가 포함됩니다.“안전하지 않은 직접 객체 참조”는 애플리케이션에서 사용자가 특정 객체에 액세스할 수 있어야 하는지 (또는 해당 권한이 없는 경우) 검증하지 못할 때 발생합니다.
기능 수준 액세스 제어 기능 누락
또 다른 일반적인 취약점은 객체가 아닌 페이지나 엔드포인트에 대한 인증 검사가 없다는 것입니다.
사용되는 프레임워크에 따라 개발자가 핸들러에서 권한 부여를 확인하거나 엔드포인트에 주석을 달고 엔드포인트를 호출하는 데 필요한 요구 사항을 지정해야 하는 것이 일반적입니다.
안타깝게도 이러한 추가 단계는 잊어버리기도 매우 쉬우며, 이로 인해 일부 인증 취약성이 어떻게 발생하는지를 설명하는 경우가 많습니다.
권장 사항
기본값은 열림 대신 닫힌 상태로 설정됩니다.
인증과 권한 부여의 경우 기본적으로 공개 대신 폐쇄형으로 설정하는 원칙이 중요합니다.
언어/프레임워크에 따라 애플리케이션으로 연결되는 모든 경로의 기본값에는 가능한 가장 높은 역할 또는 권한을 가진 인증된 세션이 필요한지 확인하는 것이 좋습니다.이렇게 하면 개발자가 경로에 대한 요구 사항을 재정의해야 합니다.
cs
//기본 동작이 요청을 인증하는 것인지 확인하고 요청이 관리자인지 확인합니다.
[인증]
[승인 (“관리자”)]
퍼블릭 클래스 시큐어 컨트롤러: 컨트롤러
{
}
퍼블릭 클래스 MyController: 시큐어 컨트롤러
{
//상속된 Authorize 속성을 대체하여 모든 사용자가 페이지에 액세스할 수 있도록 합니다.
[승인 (“사용자”)]
공개 페이지 쇼 사용자 프로필 () {
}
//관리자 사용자만 액세스할 수 있습니다.
공개 페이지 표시관리자페이지 () {
}
//ME를 허용하도록 인증 및 권한 부여 속성을 재정의합니다.
[익명 허용]
공개 페이지 표시 로그인 페이지 () {
}
}
서비스에서 권한 확인 적용
데이터에 액세스할 때는 모든 데이터 액세스가 일관된 방식으로 관련 액세스 및 권한 검사를 적용하는지 확인하는 것이 매우 중요합니다.이는 일반적으로 도메인 서비스를 사용하여 이루어집니다.
추가 예시
아래에는 보안 인증과 비보안 인증 및 권한 부여의 차이점을 잘 보여주는 간단한 예제가 나와 있습니다.
C# - 안전하지 않음
인증 누락
퍼블릭 클래스 어드민 컨트롤러: 컨트롤러
{
//INSECURE: 관리자 페이지를 표시하기 전에 사용자가 로그인했는지 여부를 확인하지 않습니다.
공개 페이지 표시관리자페이지 () {
}
}
승인 누락