안전하지 않은 broadcast receiver

OWASP 카테고리: MASVS-PLATFORM: 플랫폼 상호작용

개요

잘못 구현된 Broadcast receiver로 인해 공격자가 악의적인 인텐트를 전송하여 취약한 애플리케이션이 외부 호출자를 위한 것이 아닌 작업을 실행하도록 할 수 있습니다.

이 취약점은 일반적으로 AndroidManifest에서 android:exported="true"를 설정하거나 기본적으로 수신기를 공개로 만드는 broadcast receiver를 프로그래매틱 방식으로 만들어 broadcast receiver가 의도치 않게 내보내지는 경우를 말합니다. broadcast receiver에 인텐트 필터가 포함되어 있지 않으면 기본값은 "false"이지만 broadcast receiver에 인텐트 필터가 하나 이상 포함되어 있으면 android:exported의 기본값은 "true"입니다.

적절한 액세스 제어 없이 의도적으로 내보낸 Broadcast receiver는 개발자가 모든 애플리케이션에서 호출되도록 의도하지 않은 경우 악용될 수 있습니다.

영향

안전하지 않게 구현된 broadcast receiver는 공격자가 악용하여 개발자가 서드 파티에 노출할 의도가 없었던 애플리케이션에서 동작을 실행하기 위해 무단으로 액세스할 수 있습니다.

완화 조치

문제를 완전히 방지

이 문제를 완전히 해결하려면 exportedfalse로 설정합니다.

<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 보호

보호된 브로드캐스트 (시스템 수준 애플리케이션만 보낼 수 있는 브로드캐스트) 또는 자체 선언된 서명 수준 권한에 대해서만 동적 수신기를 등록합니다.

리소스