안전하지 않은 broadcast receiver

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

개요

broadcast receiver가 잘못 구현되면 공격자가 악성 인텐트를 전송하여 취약한 애플리케이션이 외부 호출자를 위해 의도되지 않은 작업을 실행하도록 할 수 있습니다.

이 취약점은 일반적으로 broadcast receiver가 의도치 않게 내보내지는 인스턴스를 나타냅니다. 이는 AndroidManifest에서 android:exported="true"를 설정하거나 broadcast receiver를 프로그래매틱 방식으로 만들어 수신기를 기본적으로 공개하는 방식으로 이루어집니다. 수신기에 인텐트 필터가 포함되어 있지 않으면 기본값은 "false"이지만 수신기에 인텐트 필터가 하나 이상 포함되어 있으면 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 보호

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

리소스