외부 입력 기반 권한 검사

사용자 입력 기반 권한 검사

설명

Subject.isPermitted, checkPermission, checkCallingOrSelfPermission 같은 권한 검사 API에 외부 입력으로 만든 권한 문자열을 전달하면 공격자가 검사 대상을 바꿀 수 있습니다. 실제로 보호해야 하는 권한이 아닌 공격자가 선택한 권한을 검사하게 되어 권한 검증이 무력화될 수 있습니다.

잠재적 영향

  • 민감 기능 접근 제어 우회
  • 내부 API 또는 컴포넌트 오용
  • 잘못된 권한 판단에 따른 데이터 노출

해결 방법

  1. 권한 이름은 상수 또는 allowlist에서 선택합니다.
  2. Intent extra, request parameter, IPC 입력을 권한 문자열로 직접 사용하지 않습니다.
  3. 권한 검사 이후에도 호출자 UID, 패키지, 서명 검증을 필요한 수준으로 함께 수행합니다.

예시

변경 전

java
String action = request.getParameter("action");
if (subject.isPermitted("account:read:" + action)) {
    doIt();
}

변경 후

java
String action = request.getParameter("action");
if (Set.of("profile", "settings").contains(action)
        && subject.isPermitted("account:read:" + action)) {
    doIt();
}

설명:

  • 변경 전: 요청 파라미터로 받은 action을 검증 없이 권한 문자열 suffix로 붙이면 공격자가 검사할 권한 이름을 선택할 수 있습니다.
  • 변경 후: 동적 권한 suffix가 필요할 때는 서버 측 allowlist를 통과한 값만 권한 문자열에 사용합니다. 고정 기능은 상수 권한 문자열로 검사합니다. 생략된 doIt()의 실제 작업과 대상도 검사한 권한에 대응해야 합니다.

참조