보안

[주통기] DBMS 패스워드 확인 함수 취약점 진단 쿼리 문제 해결

오늘 할 일을 내일로 2025. 11. 14. 17:40

※ 해당 게시글은 AWS RDS Oracle 환경을 기반으로 작성되었습니다

 

주통기 취약점 가이드를 기반으로 DBMS 취약점을 진단하던 중, 가이드의 패스워드 확인 함수 관련 쿼리가 올바르게 작동하지 않는 다는 것을 발견하였다. 

이 포스트는 위 오류를 발견한 과정과 올바른 쿼리에 대한 설명이다. 

 

 

사용자 패스워드 사용기간 및 복잡도 취약점

 

이 취약점은 패스워드의 사용 기간 및 복잡도 설정 유무를 점검하여 비인가자의 패스워드 추측 공격으로 인한 DB 접근 위험에 대비가 되어있는지 확인하기 위해 점검한다. 

 

SELECT
    PROFILE,
    RESOURCE_NAME,
    LIMIT
FROM
    DBA_PROFILES
WHERE
    RESOURCE_NAME IN (
        'FAILED_LOGIN_ATTEMPTS',
        'PASSWORD_LIFE_TIME',
        'PASSWORD_REUSE_TIME',
        'PASSWORD_REUSE_MAX',
        'PASSWORD_VERIFY_FUNCTION',
        'PASSWORD_GRACE_TIME'
    )
ORDER BY
    PROFILE,
    RESOURCE_NAME;

 

위의 쿼리를 실행하면, 사용자 profile에 대해 어떤 패스워드 정책이 어떻게 적용되고 있는지를 알 수 있다. 

 

위의 쿼리 결과는 다음과 같다. 

 

 

default profile은 

- 로그인 실패 횟수

- 패스워드 사용 최대 기간

- 패스워드 재사용 전 변경 횟수

- 이전 패스워드 재사용 최소 기간 

- 패스워드 검증 함수 

위의 항목들이 설정되어 있지 않다.

 

rdsadmin profile은

- 패스워드 사용 최대 기간

- 패스워드 재사용 전 변경 횟수

- 이전 패스워드 재사용 최소 기간

- 패스워드 검증 함수

의 항목이 설정되어 있지 않다.

 

이를 통해, default, rdsadmin profile에 대하여 패스워드 사용 기간 및 복잡도 취약점이 존재한다는 것을 알 수 있다.

 

 

패스워드 확인 함수 설정 취약점

 

이 취약점은 password_verify_function 값을 설정하여 로그인에 대한 보안성을 강화하여 공격에 의한 데이터 유출, 수정, 삭제 등의 위험을 방지하기 위해 진단한다. 

 

주통기 쿼리 예시

주통기의 취약점 진단 가이드에 따르면 위의 쿼리 실행 시 반환 레코드가 존재하는 경우 취약점이 존재한다고 본다.

profile의 password_verify_function 값이 null이거나 unlimited인 profile의 정보를 조회하는 쿼리 인것이다. 

 

해당 쿼리를 실행하였을 때, 아무 레코드도 반환 되지 않았다. 

 

즉, 주통기 가이드에 따르면 패스워드 확인 함수 설정에 취약점이 존재하지 않는다는 것이다. 

 

 

하지만, 사용자 패스워드 사용기간 및 복잡도 취약점을 확인하기 위해 사용했던 쿼리문에서는 default, rdsadmin profile에 대하여 password_verify_function 값이 모두 null 이었다. 

 

따라서, 주통기 문서의 쿼리에는 오류가 발생한다는 것을 알 수 있는데, 아래의 쿼리를 사용하면 제대로 된 결과를 확인할 수 있다.

 

SELECT profile, limit
FROM dba_profiles, (
    SELECT NVL(limit, 'NULL') AS def_pwd_verify_func
    FROM dba_profiles
    WHERE resource_name = 'PASSWORD_VERIFY_FUNCTION'
    AND profile = 'DEFAULT'
)
WHERE resource_name = 'PASSWORD_VERIFY_FUNCTION'
AND NVL(limit, def_pwd_verify_func) IN ('UNLIMITED', 'NULL');

 

수정 쿼리 실행 결과

 

수정된 쿼리를 실행하면 정상적인 결과가 나오는 것을 확인할 수 있다. 

 

기존 쿼리에 NVL 함수를 활용하여 limit의 컬럼 값 (password_verify_fuction)이 'NULL' 문자열로 설정되어 있거나, 실제 NULL 값이 경우 모두를 포함하여 출력하도록 수정한다. 

 

기존 쿼리의 경우 'NULL' 이라는 문자열이 설정된 값에 대해서만 출력하기 때문에 원하는 결과가 나오지 않았던 것이다.