App Sandbox là một cơ chế cô lập, hạn chế quyền truy cập của ứng dụng vào hệ thống tệp, dữ liệu của các ứng dụng khác và tài nguyên hệ thống của hệ điều hành. Mỗi ứng dụng chạy trong môi trường cô lập riêng với các đặc quyền tối thiểu, yêu cầu quyền truy cập vào các khả năng bổ sung thông qua các quyền. Theo Apple Security Documentation (2025), Sandbox là một yếu tố cơ bản của bảo vệ dữ liệu trên các nền tảng di động. App Sandbox ngăn chặn truy cập trái phép vào dữ liệu người dùng ngay cả khi một ứng dụng cá nhân bị xâm phạm.
Điểm chính
App Sandbox là một cơ chế bảo mật kiến trúc, cô lập mỗi ứng dụng trong môi trường thực thi riêng với quyền truy cập hạn chế vào tài nguyên hệ thống. Thuật ngữ này bắt nguồn từ khái niệm hộp cát cho trẻ em — một không gian an toàn nơi trẻ có thể chơi mà không tiếp cận các vật nguy hiểm. Tương tự, một ứng dụng chạy trong môi trường hạn chế mà không có quyền truy cập vào dữ liệu của ứng dụng khác hoặc các thành phần hệ thống quan trọng.
Mục tiêu chính của Sandbox là thực hiện nguyên tắc đặc quyền tối thiểu: mỗi ứng dụng chỉ nhận được các quyền cần thiết để thực hiện các chức năng đã khai báo. Ngay cả khi kẻ tấn công tìm thấy lỗ hổng trong một ứng dụng, sandbox ngăn chặn quyền truy cập vào dữ liệu của các ứng dụng khác, ảnh, danh bạ hoặc tệp hệ thống. Thiệt hại chỉ giới hạn trong phạm vi của một ứng dụng duy nhất.
Các hệ điều hành di động đã triển khai sandbox sớm hơn các hệ thống máy tính để bàn. iOS đã sử dụng Sandbox kể từ bản phát hành SDK đầu tiên (2008), Android kể từ phiên bản 1.0 (2008), với sự tăng cường trong Android 4.3 (2013) thông qua SELinux. Các hệ thống máy tính để bàn đang bắt kịp: macOS giới thiệu Sandbox vào năm 2012, Windows giới thiệu các ứng dụng UWP cô lập trong Windows 8.
Cơ chế cô lập trong sandbox đạt được thông qua sự kết hợp của nhiều cơ chế ở các cấp độ khác nhau của hệ điều hành. ở cấp hệ thống tệp, mỗi ứng dụng được cấp một thư mục được bảo vệ riêng mà chỉ nó có quyền truy cập đầy đủ. ở cấp tiến trình, một định danh người dùng duy nhất (UID) được sử dụng cho mỗi ứng dụng. ở cấp nhân, kiểm soát truy cập bắt buộc (MAC) được áp dụng thông qua SELinux hoặc các cơ chế tương tự.
Mỗi ứng dụng nhận được thư mục gốc riêng trên hệ thống tệp của thiết bị. Trong iOS, đây là thư mục /var/mobile/Containers/Data/Application/{UUID}, trong Android — /data/data/{package_name}. Ứng dụng chỉ có thể đọc và ghi tệp trong thư mục này. Quyền truy cập vào bất kỳ tệp nào bên ngoài thư mục này đều bị chặn ở cấp nhân hệ điều hành.
Hệ thống cũng cung cấp các thư mục dùng chung đặc biệt với quyền truy cập hạn chế. Trong iOS, đó là thư mục Documents cho dữ liệu người dùng, Library cho cài đặt và Caches cho tệp tạm thời. Trong Android — bộ nhớ trong (getFilesDir) và bộ nhớ ngoài (getExternalFilesDir), quyền truy cập vào đó không yêu cầu quyền bổ sung.
Trong Android, mỗi ứng dụng chạy như một tiến trình Linux riêng biệt với UID duy nhất (ID người dùng). UID được chỉ định khi cài đặt ứng dụng và không thay đổi trong suốt vòng đời của nó. Các tiến trình có UID khác nhau được cô lập với nhau ở cấp nhân — chúng không thể truy cập bộ nhớ hoặc tệp của nhau. Một cơ chế tương tự hoạt động trong iOS thông qua nhân XNU và hệ thống bảo vệ của nó.
Một lớp bảo vệ bổ sung trong Android được cung cấp bởi SELinux (Security-Enhanced Linux) ở chế độ enforcing kể từ Android 4.3. SELinux triển khai kiểm soát truy cập bắt buộc (MAC): mỗi hành động của tiến trình được kiểm tra dựa trên chính sách bảo mật bất kể quyền của chủ sở hữu tệp. Ngay cả khi một ứng dụng chạy với UID root, SELinux có thể chặn quyền truy cập vào một số tài nguyên nhất định.
Sandbox iOS được coi là một trong những sandbox nghiêm ngặt nhất trong các hệ điều hành di động. Mỗi ứng dụng được cô lập ở cấp container — một khu vực được bảo vệ của hệ thống tệp mà các ứng dụng khác không thể truy cập. iOS sử dụng sự kết hợp của kiểm soát truy cập bắt buộc thông qua Sandbox Kernel Extension (Sandbox.kext) và cơ chế entitlement để cấp các đặc quyền mở rộng.
Container của ứng dụng iOS bao gồm nhiều thư mục với các cấp độ truy cập khác nhau. Documents — cho dữ liệu người dùng được lưu khi sao lưu qua iCloud và iTunes. Library — cho tệp cấu hình và bộ nhớ đệm. tmp — cho dữ liệu tạm thời mà hệ thống có thể xóa bất cứ lúc nào. AppName.app — chính gói ứng dụng, chỉ đọc.
Quyền truy cập vào dữ liệu của các ứng dụng khác bị nghiêm cấm. iOS không cung cấp API để đọc tệp từ container của ứng dụng khác. Cách duy nhất để chia sẻ dữ liệu là thông qua các cơ chế hệ thống: UIActivityViewController để chia sẻ, UIPasteboard cho clipboard, App Groups cho các ứng dụng của cùng nhà phát triển. Mỗi cơ chế này hoạt động dưới sự kiểm soát của hệ điều hành.
Các khả năng mở rộng ngoài sandbox tiêu chuẩn được cung cấp thông qua Entitlements — chữ ký số được thêm vào chữ ký mã của ứng dụng. Ví dụ, entitlement com.apple.security.application-groups cho phép các ứng dụng trong cùng nhóm có một container dùng chung. Thông báo push, iCloud, Apple Pay — tất cả các tính năng này đều yêu cầu entitlements tương ứng.
Điều quan trọng cần lưu ý là entitlements trong iOS không giống như quyền (permissions). Quyền được yêu cầu từ người dùng trong thời gian chạy (ví dụ, quyền truy cập máy ảnh), trong khi entitlements được hệ thống kiểm tra khi cài đặt và không thể thay đổi bởi người dùng. Entitlements được xác định bởi nhà phát triển và được Apple ký trong quá trình xem xét ứng dụng.
Android sử dụng mô hình sandbox nhiều lớp dựa trên nhân Linux. Mỗi ứng dụng chạy như một người dùng Linux riêng biệt với UID duy nhất, cung cấp cô lập cơ bản ở cấp tiến trình và tệp. Các lớp bổ sung bao gồm SELinux cho kiểm soát truy cập bắt buộc và Quyền (Permissions) để kiểm soát quyền truy cập vào API hệ thống.
SELinux trong Android chạy ở chế độ enforcing, có nghĩa là áp dụng bắt buộc các chính sách bảo mật. Mỗi ứng dụng được gán một bối cảnh bảo mật (security context) và tất cả các lời gọi hệ thống đều được kiểm tra dựa trên chính sách. SELinux trong Android chứa hơn 1500 quy tắc bao gồm hệ thống tệp, giao tiếp giữa các tiến trình, socket và lời gọi hệ thống.
Cô lập UID ngăn chặn một ứng dụng truy cập trực tiếp vào tệp của ứng dụng khác. Ví dụ, ứng dụng A có UID 10001 không thể đọc tệp của ứng dụng B có UID 10002, ngay cả khi cả hai đang chạy dưới cùng một tài khoản người dùng điện thoại. Đây là nguyên tắc cơ bản của bảo mật đa người dùng trong Linux, được thích ứng cho thiết bị di động.
// Truy cập thư mục riêng của ứng dụng trong Android
File appDir = context.getFilesDir();
File cacheDir = context.getCacheDir();
File externalDir = context.getExternalFilesDir(null);
// Cố gắng truy cập thư mục của ứng dụng khác sẽ gây ra SecurityException
// File otherApp = new File("/data/data/com.other.app/shared_prefs/");
// Sử dụng FileProvider để chia sẻ tệp an toàn
Uri contentUri = FileProvider.getUriForFile(
context, "com.example.fileprovider", file
);
Android cung cấp các cơ chế bổ sung để trao đổi dữ liệu an toàn giữa các ứng dụng. ContentProvider — một thành phần Android cho phép ứng dụng cung cấp quyền truy cập dữ liệu của mình cho các ứng dụng khác thông qua một URI được xác định chặt chẽ. FileProvider — một cách an toàn để chia sẻ tệp mà không tiết lộ đường dẫn hệ thống tệp.
Mặc dù App Sandbox là một cơ chế bảo mật mạnh mẽ, nó có những giới hạn cơ bản. Sandbox bảo vệ khỏi truy cập ngang (ứng dụng-đến-ứng dụng), nhưng không bảo vệ khỏi truy cập dọc (phần mềm độc hại ở cấp nhân hoặc truy cập vật lý vào thiết bị). Khi jailbreak hoặc root, sandbox có thể bị vượt qua vì kẻ tấn công có được đặc quyền siêu người dùng.
Giới hạn thứ hai là các quyền độc hại. Nếu người dùng cấp cho ứng dụng quyền truy cập danh bạ và micro, sandbox không thể ngăn chặn việc thu thập dữ liệu này vì ứng dụng sử dụng API hệ thống hợp pháp. Bảo vệ trong trường hợp này chuyển sang cấp nhận thức của người dùng và quy trình xem xét của App Store và Google Play.
Giới hạn thứ ba là tương tác giữa các sandbox. Một số dịch vụ hệ thống (NotificationListenerService, AccessibilityService) có quyền truy cập mở rộng vào dữ liệu của các ứng dụng khác. Kẻ tấn công có thể sử dụng các dịch vụ này để vượt qua sandbox nếu có được quyền thích hợp. Google và Apple liên tục cập nhật các chính sách cho các dịch vụ như vậy.
Bất chấp những giới hạn, sandbox là thành phần bảo mật quan trọng của hệ điều hành di động. Theo Android Security Report (2024), cô lập sandbox ngăn chặn hơn 99% các nỗ lực truy cập dữ liệu giữa các ứng dụng. Kết hợp với Code Signing, App Review và quyền runtime, Sandbox tạo thành một lớp bảo vệ đa tầng cho thiết bị di động hiện đại.
Câu hỏi thường gặp
App Sandbox là một hệ thống cô lập trong đó mỗi ứng dụng hoạt động trong không gian riêng biệt của nó, không có quyền truy cập vào dữ liệu của các ứng dụng khác mà không có sự cho phép rõ ràng của người dùng.
iOS sử dụng cô lập container nghiêm ngặt thông qua Sandbox.kext và entitlements. Android sử dụng phân tách UID ở cấp nhân Linux và SELinux. Nguyên tắc giống nhau, nhưng triển khai và tính linh hoạt khác nhau.
Vượt qua sandbox chỉ có thể thực hiện với jailbreak (iOS) hoặc root (Android). Trên các thiết bị tiêu chuẩn không sửa đổi hệ điều hành, việc vượt qua sandbox thông qua API hợp pháp là không thể.
iOS sử dụng UIActivityViewController và App Groups. Android sử dụng ContentProvider, FileProvider và Intents. Tất cả các cơ chế đều thông qua API hệ thống với kiểm soát bảo mật.
Nguyên tắc có nghĩa là một ứng dụng nhận được chỉ các quyền cần thiết cho hoạt động của nó. Quyền truy cập vào các tài nguyên bổ sung được yêu cầu thông qua quyền và được người dùng cấp.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm