Danh mục OWASP: MASVS-PLATFORM: Tương tác với nền tảng
Tổng quan
Vi���c triển khai không đúng cách trình thu nhận thông báo truyền tin có thể cho phép kẻ tấn công gửi một ý định độc hại để khiến ứng dụng dễ bị tấn công thực hiện các hành động không dành cho phương thức gọi bên ngoài.
Lỗ hổng này thường đề cập đến các trường hợp mà broadcast receiver được xuất không chủ ý, bằng cách đặt android:exported="true"
trong AndroidManifest hoặc bằng cách tạo broadcast receiver theo phương thức lập trình, khiến receiver trở thành công khai theo mặc định. Nếu broadcast receiver không chứa bộ lọc ý định nào, thì giá trị mặc định sẽ là "false"
, nhưng nếu broadcast receiver chứa ít nhất một bộ lọc ý định, thì giá trị mặc định của android:exported sẽ là "true"
.
Các trình thu nhận thông báo truyền tin được xuất có chủ ý mà không có quyền kiểm soát truy cập thích hợp có thể bị lợi dụng nếu nhà phát triển không có ý định cho phép tất cả ứng dụng gọi trình thu nhận đó.
Tác động
Kẻ tấn công có thể lợi dụng các broadcast receiver được triển khai không an toàn để giành quyền truy cập trái phép nhằm thực thi hành vi trong ứng dụng mà nhà phát triển không có ý định tiết lộ cho bên thứ ba.
Giải pháp giảm thiểu
Tránh hoàn toàn vấn đề
Để giải quyết hoàn toàn vấn đề này, hãy đặt exported
thành false
:
<receiver android:name=".MyReceiver" android:exported="false">
<intent-filter>
<action android:name="com.example.myapp.MY_ACTION" />
</intent-filter>
</receiver>
Sử dụng lệnh gọi và lệnh gọi lại
Trong trường hợp bạn đã sử dụng broadcast receiver cho các mục đích nội bộ của ứng dụng (ví dụ: thông báo hoàn tất sự kiện), bạn có thể tái cấu trúc mã để truyền lệnh gọi lại sẽ kích hoạt sau khi sự kiện hoàn tất.
Trình nghe hoàn tất sự kiện
Kotlin
interface EventCompletionListener {
fun onEventComplete(data: String)
}
Java
public interface EventCompletionListener {
public void onEventComplete(String data);
}
Bảo mật tác vụ
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");
}
}
}
Hoạt động chính
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
// ...
}
}
Bảo mật broadcast receiver bằng quyền
Chỉ đăng ký trình thu phát động cho thông báo truyền tin được bảo vệ (thông báo truyền tin mà chỉ các ứng dụng cấp hệ thống mới có thể gửi) hoặc với quyền cấp chữ ký tự khai báo.
Tài nguyên
- Các phần tử trình nhận đã xuất
- Tài liệu về Quyền của Broadcast Receiver
- Ý định truyền tin được bảo vệ