소프트웨어 개발보안 가이드 분석(2021) : 적절한 인증 없는 중요 기능 허용

"적절한 인증 없는 중요기능 허용" 항목은 CWE-306으로 등록되어 있으며, MITRE에서 발표한 가장 위험한 소프트웨어 취약점 25가지 목록에도 포함 되었습니다.

이 문제는 사용자가 적절한 인증 절차 없이 애플리케이션의 핵심 기능에 접근할 수 있게 하는 보안 취약점을 지칭합니다. 이로 인해 민감한 정보의 노출, 데이터의 무단 변경, 심지어 시스템의 제어권 탈취까지 이어질 수 있는 심각한 위협이라고 볼 수 있습니다.

 

취약점 이해

"적절한 인증 없는 중요 기능 허용" 취약점은 주로 인증 절차의 구현 미비나 오류, 세션 관리 취약점 등으로 인해 발생합니다. 이는 애플리케이션의 보안 모델 내에서 중요 기능에 대한 접근 제어가 충분히 이루어지지 않았음을 의미합니다. 예를 들어, 관리자 페이지 접근 권한 검증 없이 일반 사용자가 관리자 기능을 수행할 수 있다면, 이는 "적절한 인증 없는 중요 기능 허용" 취약점의 전형적인 사례로 볼 수 있습니다.

공격자가 초기 접근을 통해 인증의 약점을 이용하여 시스템 내의 중요 기능을 실행하고, 이는 민감한 데이터의 접근이나 조작, 시스템의 무결성 침해 또는 전체 제어권을 획득하는 것을 포함할 수 있습니다

"적절한 인증 없는 중요 기능 허용" 취약점은 주로 인증과 권한 부여 과정에서의 미흡한 구현으로 인해 발생합니다. 공격자는 이러한 취약점을 이용하여 다음과 같은 공격을 수행할 수 있습니다.

  1. 세션 하이재킹: 공격자가 사용자의 세션 ID를 탈취하여 인증된 사용자로서 시스템에 접근합니다.
  2. 직접 객체 참조: 사용자 입력을 통해 시스템 내부 객체에 직접 접근하여 민감한 정보에 접근하거나 수정합니다.
  3. 크로스 사이트 스크립팅(XSS): 애플리케이션의 취약점을 이용해 사용자 측 스크립트를 주입하여 사용자의 세션 토큰을 탈취합니다.
  4. 크로스 사이트 요청 위조(CSRF): 사용자가 이미 인증된 상태에서 공격자가 조작된 요청을 전송하여 중요 기능을 실행시킵니다.

이러한 공격 방법들은 애플리케이션의 중요 기능을 무단으로 사용할 수 있게 하며, 결과적으로 데이터 유출, 시스템 손상 등을 초래할 수 있습니다.

취약한 웹 어플리케이션의 예

자바 기반의 웹 애플리케이션에서 취약한 코드 예시는 다음과 같습니다.

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
    String function = request.getParameter("function");
    
    if ("importantFunction".equals(function)) {
        // 중요 기능 실행, 인증 절차 없음
        performImportantFunction();
    }
}

이 예시에서 doGet 메소드는 사용자의 입력을 통해 중요 기능을 수행하지만, 사용자의 인증 상태나 권한을 확인하지 않습니다. 이로 인해 누구나 중요 기능에 접근할 수 있게 됩니다.

 

시큐어 코딩 적용 방법

 

클라이언트의 보안검사를 우회하여 서버에 접근하지 못하도록 설계하고 중요한 정보가 있는 페이지는 재인증을 적용(은행 계좌이체 등)한다. 또한 안전하다고 검증된 라이브러리나 프레임워크 (OpenSSL 이나 ESAPI의 보안기능 등)를 사용하는 것이 중요하다.

소프트웨어 개발보안가이드, 한국인터넷진흥원(2021)

적절한 인증을 통한 중요 기능의 보호를 위한 방법은 다음과 같습니다.

  • 인증 및 권한 검증: 모든 중요 기능에 대해 사용자의 인증 상태와 권한을 철저히 검증합니다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
    HttpSession session = request.getSession(false);
    String function = request.getParameter("function");

    if (session != null && "admin".equals(session.getAttribute("role")) && "importantFunction".equals(function)) {
        // 중요 기능 실행, 인증 및 권한 검증 완료
        performImportantFunction();
    } else        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
    }
}
  • 세션 관리 강화: 세션 타임아웃 설정, 세션 ID의 안전한 생성 및 관리를 통해 세션 관리의 안전성을 높입니다.
  • 접근 제어: 접근 제어 목록(ACL)이나 역할 기반 접근 제어(RBAC)와 같은 접근 제어 기술을 적용하여 사용자의 역할과 행동에 따라 접근 권한을 세분화하고 중요 기능에 대한 접근을 엄격하게 제한합니다.

  • 이전 소프트웨어 개발보안 가이드 분석(2021) : 포맷 스트링 삽입
  • 다음 소프트웨어 개발보안 가이드 분석(2021) : 부적절한 인가