OWASP 카테고리: MASVS-PLATFORM: 플랫폼 상호작용
개요
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
를 사용하세요.
브로드캐스트 보호에 관한 자세한 내용은 브로드캐스트 개요 페이지를 참고하세요.