หมวดหมู่ OWASP: MASVS-PLATFORM: การโต้ตอบกับแพลตฟอร์ม
ภาพรวม
Broadcast Receiver ที่ติดตั้งใช้งานอย่างไม่เหมาะสมอาจทำให้ผู้โจมตีส่ง Intent ที่เป็นอันตรายเพื่อทำให้แอปพลิเคชันที่มีช่องโหว่ดำเนินการต่างๆ ที่ไม่ได้มีไว้สำหรับผู้เรียกภายนอก
โดยทั่วไป ช่องโหว่จะหมายถึงกรณีที่ Broadcast Receiver ถูกส่งออกโดยไม่ได้ตั้งใจ ไม่ว่าจะด้วยการตั้งค่า android:exported="true" ใน
the AndroidManifest หรือด้วยการสร้าง Broadcast Receiver แบบเป็นโปรแกรม ซึ่ง
ทำให้ Receiver เป็นสาธารณะโดยค่าเริ่มต้น หาก Receiver ไม่มีตัวกรอง Intent ค่าเริ่มต้นจะเป็น "false" แต่หาก Receiver มีตัวกรอง Intent อย่างน้อย 1 รายการ ค่าเริ่มต้นของ android:exported จะเป็น "true".
Broadcast Receiver ที่ส่งออกโดยเจตนาโดยไม่มีการควบคุมการเข้าถึงที่เหมาะสมอาจถูกนำไปใช้ในทางที่ผิดหากนักพัฒนาแอปไม่ได้ตั้งใจให้แอปพลิเคชันทั้งหมดเรียกใช้
ผลกระทบ
ผู้โจมตีอาจนำ Broadcast Receiver ที่ติดตั้งใช้งานอย่างไม่ปลอดภัยไปใช้ในทางที่ผิดเพื่อเข้าถึงโดยไม่ได้รับอนุญาตเพื่อดำเนินการต่างๆ ในแอปพลิเคชันที่นักพัฒนาแอปไม่ได้ตั้งใจจะเปิดเผยต่อบุคคลที่สาม
การบรรเทาผลกระทบ
หลีกเลี่ยงปัญหาโดยสิ้นเชิง
หากต้องการแก้ไขปัญหาโดยสิ้นเชิง ให้ตั้งค่า exported เป็น false
<receiver android:name=".MyReceiver" android:exported="false">
<intent-filter>
<action android:name="com.example.myapp.MY_ACTION" />
</intent-filter>
</receiver>
ใช้การเรียกและการเรียกกลับ
ในกรณีที่คุณใช้ Broadcast Receiver เพื่อวัตถุประสงค์ภายในแอป (เช่น การแจ้งเตือนการดำเนินการของเหตุการณ์เสร็จสมบูรณ์) คุณสามารถปรับโครงสร้างโค้ดเพื่อส่งการเรียกกลับที่จะเริ่มทำงานหลังจากเหตุการณ์เสร็จสมบูรณ์แทน
Listener การดำเนินการของเหตุการณ์เสร็จสมบูรณ์
Kotlin
interface EventCompletionListener {
fun onEventComplete(data: String)
}
Java
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")
}
}
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");
}
}
}
กิจกรรมหลัก
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
// ...
}
}
รักษาความปลอดภัยให้ Broadcast Receiver ด้วยสิทธิ์
ลงทะเบียนเฉพาะ Receiver แบบไดนามิกสำหรับการออกอากาศที่ได้รับการปกป้อง (การออกอากาศที่ แอปพลิเคชันระดับระบบเท่านั้นที่ส่งได้) หรือที่มีสิทธิ์ระดับลายเซ็นที่ประกาศเอง
แหล่งข้อมูล
- องค์ประกอบ Receiver ที่ส่งออก
- เอกสารประกอบเกี่ยวกับสิทธิ์ของ Broadcast Receiver
- Intent การออกอากาศที่ได้รับการปกป้อง