Güvenli olmayan yayın alıcıları

OWASP kategorisi: MASVS-PLATFORM: Platform Etkileşimi

Genel Bakış

Yanlış uygulanan yayın alıcılar, saldırganların kötü amaçlı bir niyet göndermesine ve güvenlik açığı olan uygulamanın, harici arayanlar için tasarlanmamış işlemler gerçekleştirmesine olanak tanıyabilir.

Güvenlik açığı genellikle yayın alıcısının, AndroidManifest'te android:exported="true" ayarlanarak veya alıcıyı varsayılan olarak herkese açık hale getiren bir yayın alıcısı programatik olarak oluşturularak istemeden dışa aktarıldığı durumları ifade eder. Alıcı herhangi bir intent filtresi içermiyorsa varsayılan değer "false" olur. Alıcı en az bir intent filtresi içeriyorsa android:exported'in varsayılan değeri "true" olur.

Geliştiricinin tüm uygulamalar tarafından çağrılmasını istemediği durumlarda, uygun erişim denetimi olmadan kasıtlı olarak dışa aktarılan yayın alıcılar kötüye kullanılabilir.

Etki

Güvenli olmayan şekilde uygulanan yayın alıcılar, geliştiricinin üçüncü taraflara sunmak istemediği davranışları uygulamada yürütmek için saldırgan tarafından kötüye kullanılabilir.

Çözümler

Sorunu tamamen önleme

Bu ikilemi tamamen çözmek için exported ayarını false olarak belirleyin:

<receiver android:name=".MyReceiver" android:exported="false">
    <intent-filter>
        <action android:name="com.example.myapp.MY_ACTION" />
    </intent-filter>
</receiver>

Aramaları ve geri aramaları kullanma

Dahili uygulama amaçları için yayın alıcıları kullandıysanız (ör. etkinlik tamamlama bildirimi), kodunuzu, etkinlik tamamlandıktan sonra tetiklenecek bir geri çağırma işlevi geçirecek şekilde yeniden yapılandırabilirsiniz.

Etkinlik tamamlama işleyicisi

Kotlin

interface EventCompletionListener {
    fun onEventComplete(data: String)
}

Java

public interface EventCompletionListener {
    public void onEventComplete(String data);
}
Güvenli görev

Kotlin

class SecureTask(private val listener: EventCompletionListener?) {
    fun executeTask() {
        // Do some work...

        // Notify that the event is complete
        listener?.onEventComplete("Some secure data")
    }
}

Java

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");
        }
    }
}
Ana etkinlik

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
        // ...
    }
}

Java

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
        // ...
    }
}

İzinlerle yayın alıcıları güvenli hale getirme

Yalnızca korumalı yayınlar (yalnızca sistem düzeyindeki uygulamaların gönderebileceği yayınlar) veya kendi beyan ettiği imza düzeyi izinlerine sahip yayınlar için dinamik alıcıları kaydedin.

Kaynaklar