스티키 브로드캐스트

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

개요

Android 앱과 Android 시스템은 브로드캐스트를 메시지 시스템으로 사용하여 다른 앱에 관심 있을 만한 이벤트를 알릴 수 있습니다. 스티키 브로드캐스트는 전송된 인텐트 객체가 브로드캐스트가 완료된 후 캐시에 유지되는 특수한 유형의 브로드캐스트입니다. 시스템은 스티키 인텐트를 이후 수신기 등록으로 다시 브로드캐스트할 수 있습니다. 안타깝게도 스티키 브로드캐스트 API에는 여러 보안 관련 단점이 있어 Android 5.0(API 수준 21)에서 지원 중단되었습니다.

누구나 스티키 브로드캐스트에 액세스할 수 있음

스티키 브로드캐스트는 특정 권한을 보유한 수신기로 제한될 수 없습니다. 따라서 민감한 정보를 브로드캐스트하는 데는 적합하지 않습니다. 브로드캐스트 Intent에서 애플리케이션 패키지 이름을 지정하면 BroadcastReceivers 집합이 제한된다고 생각하기 쉽습니다.

Kotlin

val intent = Intent("com.example.NOTIFY").apply {
    setPackage("com.example.myapp")
}
applicationContext.sendBroadcast(intent)

자바

Intent intent = new Intent("com.example.NOTIFY");
intent.setPackage("com.example.myapp");
getApplicationContext().sendBroadcast(intent);

이 예에서는 com.example.myapp 패키지의 수신기만 브로드캐스트가 전송될 때 인텐트를 수신합니다. 그러나 패키지 이름 필터는 인텐트가 스티키 캐시에서 다시 브로드캐스트될 때 적용되지 않습니다. registerReceiver() 메서드를 사용하여 수신기를 등록할 때 지정된 필터와 일치하는 스티키 캐시의 모든 인텐트는 수신기가 있는 패키지 이름과 관계없이 수신기로 다시 브로드캐스트됩니다.

누구나 스티키 브로드캐스트를 전송할 수 있음

스티키 브로드캐스트를 전송하려면 앱에 android.permission.BROADCAST_STICKY 권한만 있으면 됩니다. 이 권한은 앱이 설치될 때 자동으로 부여됩니다. 따라서 공격자는 어떤 수신기로도 인텐트를 전송할 수 있어 잠재적으로 다른 앱에 무단으로 액세스할 수 있습니다. broadcast receiver는 발신자를 특정 권한이 있는 사용자로 제한할 수 있습니다. 하지만 이렇게 하면 수신기가 스티키 캐시에서 브로드캐스트를 수신할 수 없습니다. 이러한 브로드캐스트는 앱 ID의 컨텍스트에서 전송되지 않고 어떠한 권한으로도 브로드캐스트되지 않기 때문입니다.

누구나 스티키 브로드캐스트를 수정할 수 있음

인텐트가 스티키 브로드캐스트의 일부인 경우 이 인텐트는 스티키 캐시에서 동일한 작업, 데이터, 유형, 식별자, 클래스, 카테고리를 가진 이전 인스턴스를 대체합니다. 따라서 공격자는 합법적인 앱에서 스티키 인텐트의 추가 데이터를 쉽게 덮어쓸 수 있으며, 그러면 다른 수신기로 다시 브로드캐스트될 수 있습니다.

sendStickyOrderedBroadcast() 메서드를 사용하여 전송된 브로드캐스트는 우선순위가 낮은 수신기에 전달되기 전에 우선순위가 높은 수신기에서 브로드캐스트를 사용할 수 있도록 한 번에 하나의 수신기에 전달됩니다. 각 수신기는 차례로 실행되므로 다음 수신기에 결과를 전파하거나(예: setResultData() 호출) 브로드캐스트를 취소하여 후속 수신기가 브로드캐스트를 수신하지 못하도록 할 수 있습니다. 합법적인 앱으로부터 순서가 지정된 스티키 브로드캐스트를 수신할 수 있는 공격자는 우선순위가 높은 수신기를 만들어 브로드캐스트 결과 데이터를 조작하거나 브로드캐스트를 완전히 삭제할 수 있습니다.

영향

영향은 스티키 브로드캐스트가 사용되는 방식과 broadcast receiver에 전달되는 데이터에 따라 다릅니다. 일반적으로 스티키 브로드캐스트를 사용하면 민감한 정보 노출, 데이터 조작, 무단 액세스(다른 앱에서의 동작 실행), 서비스 거부가 발생할 수 있습니다.

완화 조치

스티키 브로드캐스트를 사용해서는 안 됩니다. 권장 패턴은 로컬 데이터베이스와 같은 다른 메커니즘과 함께 비 스티키 브로드캐스트를 사용하여 필요할 때마다 현재 값을 가져오는 것입니다.

개발자는 권한을 사용하거나 인텐트에 애플리케이션 패키지 이름을 설정하여 비 스티키 브로드캐스트를 수신할 수 있는 사용자를 제어할 수 있습니다. 또한 앱 외부의 구성요소로 브로드캐스트를 전송할 필요가 없으면 관찰자 패턴을 구현하는 LiveData를 사용하세요.

브로드캐스트 보호에 관한 자세한 내용은 브로드캐스트 개요 페이지를 참고하세요.