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.