Android Intent URI 권한 조작

사용자 제공 Intent를 결과로 반환

설명

외부 입력으로부터 받은 Intent에 URI 권한 플래그(FLAG_GRANT_READ_URI_PERMISSION, FLAG_GRANT_WRITE_URI_PERMISSION 등)를 유지한 채 전달하면 공격자가 앱이 접근 가능한 콘텐츠 URI 권한을 다른 컴포넌트로 전달하게 만들 수 있습니다.

잠재적 영향

  • 앱 내부 파일 또는 콘텐츠 URI 노출
  • 쓰기 권한 위임을 통한 데이터 변조
  • 권한 경계 우회

해결 방법

  1. 외부 Intent를 전달하기 전에 불필요한 grant 플래그를 제거합니다.
  2. URI와 대상 컴포넌트를 allowlist로 검증합니다.
  3. 필요한 최소 권한만 명시적으로 부여하고, 사용 후 권한을 회수합니다.

예시

변경 전

java
Intent result = getIntent();
result.putExtra("status", "ok");
setResult(RESULT_OK, result);
finish();

변경 후

java
Intent result = new Intent();
result.putExtra("status", "ok");
setResult(RESULT_OK, result);
finish();

설명:

  • 변경 전: 외부에서 받은 Intent를 setResult로 그대로 반환하면 공격자가 URI 권한 플래그를 포함시켜 앱의 ContentProvider 접근 권한을 우회하게 만들 수 있습니다.
  • 변경 후: setResult에는 새 Intent를 생성해 필요한 데이터만 복사합니다.

참조