OWASP 카테고리: MASVS-PLATFORM: 플랫폼 상호작용
개요
broadcast receiver가 잘못 구현되면 공격자가 악성 인텐트를 전송하여 취약한 애플리케이션이 외부 호출자를 위해 의도되지 않은 작업을 실행하도록 할 수 있습니다.
이 취약점은 일반적으로 broadcast receiver가
의도치 않게 내보내지는 인스턴스를 나타냅니다. 이는 AndroidManifest에서 android:exported="true"를 설정하거나 broadcast receiver를 프로그래매틱 방식으로 만들어 수신기를 기본적으로 공개하는 방식으로 이루어집니다. 수신기에 인텐트
필터가 포함되어 있지 않으면 기본값은 "false"이지만 수신기에 인텐트
필터가 하나 이상 포함되어 있으면 android:exported의 기본값은 "true"입니다.
적절한 액세스 제어 없이 의도적으로 내보낸 broadcast receiver는 개발자가 모든 애플리케이션에서 호출하도록 의도하지 않은 경우 악용될 수 있습니다.
영향
안전하지 않게 구현된 broadcast receiver는 공격자가 악용하여 개발자가 서드 파티에 노출할 의도가 없었던 애플리케이션의 동작을 실행하기 위해 무단 액세스 권한을 얻을 수 있습니다.
완화 조치
문제를 완전히 방지
딜레마를 완전히 해결하려면 exported를 false로 설정하세요.
<receiver android:name=".MyReceiver" android:exported="false">
<intent-filter>
<action android:name="com.example.myapp.MY_ACTION" />
</intent-filter>
</receiver>
호출 및 콜백 사용
내부 앱 목적으로 broadcast receiver를 사용한 경우 (예: 이벤트 완료 알림) 이벤트 완료 후 실행되는 콜백을 전달하도록 코드를 재구성할 수 있습니다.
이벤트 완료 리스너
Kotlin
interface EventCompletionListener {
fun onEventComplete(data: String)
}
자바
public interface EventCompletionListener {
public void onEventComplete(String data);
}
보안 작업
Kotlin
class SecureTask(private val listener: EventCompletionListener?) {
fun executeTask() {
// Do some work...
// Notify that the event is complete
listener?.onEventComplete("Some secure data")
}
}
자바
public class SecureTask {
final private EventCompletionListener listener;
public SecureTask(EventCompletionListener listener) {
this.listener = listener;
}
public void executeTask() {
// Do some work...
// Notify that the event is complete
if (listener != null) {
listener.onEventComplete("Some secure data");
}
}
}
기본 활동
Kotlin
class MainActivity : AppCompatActivity(), EventCompletionListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val secureTask = SecureTask(this)
secureTask.executeTask()
}
override fun onEventComplete(data: String) {
// Handle event completion securely
// ...
}
}
자바
public class MainActivity extends AppCompatActivity implements EventCompletionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SecureTask secureTask = new SecureTask(this);
secureTask.executeTask();
}
@Override
public void onEventComplete(String data) {
// Handle event completion securely
// ...
}
}
권한으로 broadcast receiver 보호
보호된 브로드캐스트 (시스템 수준 애플리케이션만 전송할 수 있는 브로드캐스트) 또는 자체 선언된 서명 수준 권한이 있는 브로드캐스트에만 동적 수신기를 등록합니다.