설명
Subject.isPermitted, checkPermission, checkCallingOrSelfPermission 같은 권한 검사 API에 외부 입력으로 만든 권한 문자열을 전달하면 공격자가 검사 대상을 바꿀 수 있습니다. 실제로 보호해야 하는 권한이 아닌 공격자가 선택한 권한을 검사하게 되어 권한 검증이 무력화될 수 있습니다.
잠재적 영향
- 민감 기능 접근 제어 우회
- 내부 API 또는 컴포넌트 오용
- 잘못된 권한 판단에 따른 데이터 노출
해결 방법
- 권한 이름은 상수 또는 allowlist에서 선택합니다.
- Intent extra, request parameter, IPC 입력을 권한 문자열로 직접 사용하지 않습니다.
- 권한 검사 이후에도 호출자 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()의 실제 작업과 대상도 검사한 권한에 대응해야 합니다.