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 güvenlik açığı bulunan uygulamanın harici arayanlar için tasarlanmamış işlemleri yapmasını sağlamak amacıyla kötü amaçlı bir intent göndermesine izin verebilir.

Güvenlik açığı genellikle AndroidManifest dosyasında android:exported="true" ayarlanarak veya yayın alıcısını varsayılan olarak herkese açık hale getiren programlı bir yayın alıcısı oluşturularak yayın alıcısının kasıtsız olarak dışa aktarıldığı durumları ifade eder. Alıcı herhangi bir intent filtresi içermiyorsa varsayılan değer "false" olur ancak alıcı en az bir intent filtresi içeriyorsa android:exported için varsayılan değer "true" olur.

Geliştiricinin tüm uygulamalar tarafından çağrılmasını amaçlamadığı, 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 göstermek istemediği davranışları uygulamada yürütmek için saldırganlar tarafından kötüye kullanılabilir.

Çözümler

Sorunu tamamen önleme

İkilemden tamamen kurtulmak için exported değerini false olarak ayarlayın:

<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

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

Etkinlik tamamlama işleyici

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

Yayın alıcılarını izinlerle güvence altına alma

Dinamik alıcıları yalnızca korunan yayınlar (yalnızca sistem düzeyindeki uygulamaların gönderebileceği yayınlar) için veya kendi beyan edilen imza düzeyi izinleriyle kaydedin.

Kaynaklar