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.