메뉴 건너뛰기

app

대문 열린 금고: CWE-306 중요기능에 대한 인증 누락

suritam92026.01.17 21:11조회 수 1댓글 0

    • 글자 크기

1. 적절한 인증 없는 중요기능 허용의 위험성

CWE-306은 계좌 이체, 개인정보 수정, 시스템 설정 변경, 관리자 페이지 접근 등 보안상 민감한 기능을 실행할 때 사용자의 신원을 확인하는 절차(인증)가 아예 없거나 불충분할 때 발생합니다. 공격자는 로그인하지 않은 상태에서 해당 기능의 URL을 직접 입력(Direct Object Reference)하거나, API를 호출하여 타인의 정보를 가로채고 시스템을 조작할 수 있습니다. 이는 시스템의 기밀성과 무결성을 한꺼번에 무너뜨리는 치명적인 설계 결함입니다.

2. 흔히 발생하는 취약한 패턴

가장 대표적인 사례는 특정 페이지가 "눈에 보이지 않는다"는 이유로 보안 처리를 생략하는 경우입니다.

관리자 기능 노출: admin_delete_user.do와 같은 관리자 전용 URL이 별도의 로그인 체크 없이 접근 가능한 경우.

민감 로직 인증 누락: 결제 단계나 비밀번호 변경 단계에서 세션 유효성을 다시 확인하지 않는 경우.

모바일/API 사각지대: 웹 페이지에는 인증을 적용했으나, 동일한 기능을 수행하는 모바일 API 서버에는 인증 필터를 누락하는 경우.

3. 실무적 대응: 중앙 집중식 인증 필터와 재인증 도입

보안 결정은 각 페이지가 아닌 시스템 전체의 진입점에서 강제되어야 합니다.

인증 필터(Interceptor/Filter) 적용: Spring Security나 서블릿 필터를 사용하여 모든 보호 자원에 대해 인증된 세션이 있는지 전역적으로 검사합니다.

중요 기능 재인증(Step-up Authentication): 일반적인 로그인 상태더라도 결제나 개인정보 변경과 같은 고위험 작업 직전에는 비밀번호 재입력이나 OTP 인증을 추가로 요구합니다.

화이트리스트 기반 접근 제어: 인증이 필요 없는 페이지(로그인, 메인 등)만 명시적으로 허용하고, 나머지는 모두 인증을 거치도록 설정(Deny by Default)합니다.

4. CWE-306 대응 및 안전한 인증 검증 자바 코드 예시

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
 
public class SecurityCheckService {
    private static final Logger logger = LoggerFactory.getLogger(SecurityCheckService.class);
 
    // [CWE-306 조치] 중요 기능 수행 전 인증 세션 존재 여부 확인
    public void executeCriticalTask(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
 
        // 1. 세션 존재 여부 및 로그인 정보 확인 (중앙 필터에서 처리하는 것이 베스트)
        if (session == null || session.getAttribute("LOGIN_USER") == null) {
            logger.debug("Security Violation: Unauthorized access attempt to critical function.");
            throw new SecurityException("Authentication required to perform this task.");
        }
 
        // 2. 추가 보안: 중요 작업인 경우 재인증 여부 확인 (Step-up Auth)
        Boolean isReauthenticated = (Boolean) session.getAttribute("RE_AUTH_SUCCESS");
        if (isReauthenticated == null || !isReauthenticated) {
            logger.debug("Security Violation: Re-authentication required for sensitive task.");
            throw new SecurityException("Please confirm your password again.");
        }
 
        logger.debug("Access granted for critical task. User: {}", session.getAttribute("LOGIN_USER"));
        // 실제 중요 로직 수행...
    }
}

코멘트: 시큐어 코딩의 핵심은 "인증은 옵션이 아닌 기본값(Default)"이어야 한다는 점입니다. 개발자가 실수로 특정 페이지의 인증 체크를 누락하더라도, 중앙 통제 장치(필터)가 이를 막아 세울 수 있는 구조를 갖춰야 합니다. logger.debug()를 통해 인증되지 않은 접근 시도를 철저히 기록하되, 금고의 대문을 열어두고 운에 맡기는 식의 설계를 배제하는 것이 가장 강력한 방어 전략입니다.

 
    • 글자 크기
보이지 않는 권한의 경계: CWE-285 부적절한 인가 (by suritam9) 출력을 조작하여 메모리를 읽다: CWE-134 포맷 스트링 삽입 (by suritam9)

댓글 달기

첨부 (0)
위로