Piaskownica aplikacji (App Sandbox) — to mechanizm izolacji, który ogranicza dostęp aplikacji do systemu plików, danych innych aplikacji oraz zasobów systemowych. Każda aplikacja działa we własnym izolowanym środowisku z minimalnymi uprawnieniami, żądając dostępu do dodatkowych funkcji poprzez zezwolenia. Według Apple Security Documentation (2025), Sandbox jest fundamentalnym elementem ochrony danych na platformach mobilnych. App Sandbox zapobiega nieautoryzowanemu dostępowi do danych użytkownika nawet w przypadku kompromitacji pojedynczej aplikacji.
Najważniejsze
Piaskownica aplikacji (App Sandbox) — to architektoniczny mechanizm bezpieczeństwa, który izoluje każdą aplikację we własnym środowisku wykonawczym z ograniczonym dostępem do zasobów systemowych. Termin pochodzi z koncepcji „piaskownicy” dla dzieci — bezpiecznej przestrzeni, w której dziecko może się bawić, nie mając dostępu do niebezpiecznych przedmiotów. Analogicznie, aplikacja działa w ograniczonym środowisku, nie mając dostępu do danych innych aplikacji ani krytycznych komponentów systemowych.
Głównym celem Sandbox jest realizacja zasady minimalnych uprawnień: każda aplikacja otrzymuje tylko te prawa, które są niezbędne do wykonywania deklarowanych funkcji. Nawet jeśli osoba atakująca znajdzie podatność w aplikacji, piaskownica nie pozwoli jej uzyskać dostępu do danych innych aplikacji, zdjęć, kontaktów ani plików systemowych. Szkoda jest ograniczona do ram jednej aplikacji.
Mobilne systemy operacyjne wdrożyły piaskownice wcześniej niż desktopowe. iOS używa Sandbox od momentu wydania pierwszej wersji SDK (2008), Android — od wersji 1.0 (2008), ale ze wzmocnieniem w Android 4.3 (2013) poprzez SELinux. Systemy desktopowe doganiają: macOS wdrożył Sandbox w 2012 roku, Windows — izolowane aplikacje UWP w Windows 8.
Izolacja w piaskownicy jest osiągana przez kombinację kilku mechanizmów na różnych poziomach systemu operacyjnego. Na poziomie systemu plików każda aplikacja otrzymuje własny chroniony katalog, do którego tylko ona ma pełny dostęp. Na poziomie procesów używany jest unikalny identyfikator użytkownika (UID) dla każdej aplikacji. Na poziomie jądra stosowana jest obowiązkowa kontrola dostępu (MAC) przez SELinux lub podobne mechanizmy.
Każda aplikacja otrzymuje własny katalog główny w systemie plików urządzenia. W iOS jest to katalog /var/mobile/Containers/Data/Application/{UUID}, w Android — /data/data/{package_name}. Aplikacja może odczytywać i zapisywać pliki tylko wewnątrz tego katalogu. Dostęp do wszelkich plików poza tym katalogiem jest blokowany na poziomie jądra systemu operacyjnego.
System udostępnia również specjalne wspólne katalogi z ograniczonym dostępem. W iOS jest to katalog Documents dla danych użytkownika, Library dla ustawień i Caches dla plików tymczasowych. W Android — pamięć wewnętrzna (getFilesDir) i pamięć zewnętrzna (getExternalFilesDir), dostęp do której nie wymaga dodatkowych zezwoleń.
W Android każda aplikacja jest uruchamiana jako oddzielny proces Linux z unikalnym UID (User ID). UID jest przypisywany podczas instalacji aplikacji i pozostaje niezmienny przez cały cykl życia. Procesy z różnymi UID są od siebie izolowane na poziomie jądra — nie mogą uzyskać dostępu do pamięci ani plików innych procesów. Podobny mechanizm działa w iOS poprzez jądro XNU i jego system ochrony.
Dodatkowy poziom ochrony w Android zapewnia SELinux (Security-Enhanced Linux) w trybie enforcing od wersji Android 4.3. SELinux realizuje obowiązkową kontrolę dostępu (MAC): każde działanie procesu jest sprawdzane pod kątem zgodności z polityką bezpieczeństwa niezależnie od praw właściciela pliku. Nawet jeśli aplikacja działa z UID root, SELinux może zablokować dostęp do określonych zasobów.
Piaskownica iOS jest uważana za jedną z najbardziej rygorystycznych wśród mobilnych systemów operacyjnych. Każda aplikacja jest izolowana na poziomie kontenera — chronionego obszaru systemu plików, do którego dostęp jest niemożliwy z innych aplikacji. iOS używa kombinacji obowiązkowej kontroli dostępu przez Sandbox Kernel Extension (Sandbox.kext) i mechanizmu entitlement do przyznawania rozszerzonych uprawnień.
Kontener aplikacji iOS składa się z kilku katalogów o różnych poziomach dostępu. Documents — dla danych użytkownika, które są zachowywane podczas tworzenia kopii zapasowej przez iCloud i iTunes. Library — dla plików konfiguracyjnych i pamięci podręcznej. tmp — dla danych tymczasowych, które system może usunąć w każdej chwili. AppName.app — sam pakiet aplikacji, który jest dostępny tylko do odczytu.
Dostęp do danych innych aplikacji jest kategorycznie zabroniony. iOS nie udostępnia API do odczytu plików z kontenera innej aplikacji. Jedynym sposobem wymiany danych są mechanizmy systemowe: UIActivityViewController do udostępniania, UIPasteboard dla schowka, App Groups dla aplikacji jednego dewelopera. Każdy z tych mechanizmów działa pod kontrolą systemu operacyjnego.
Rozszerzone możliwości poza standardową piaskownicą są udostępniane przez Entitlements — cyfrowe podpisy, które są dodawane do kodu podpisu aplikacji. Na przykład entitlement com.apple.security.application-groups pozwala aplikacjom z jednej grupy na wspólny kontener. Powiadomienia Push, iCloud, Apple Pay — wszystkie te funkcje wymagają odpowiednich entitlements.
Warto zauważyć, że entitlements w iOS to nie to samo co zezwolenia (permissions). Zezwolenia są żądane od użytkownika w czasie wykonania (na przykład dostęp do kamery), a entitlements są sprawdzane przez system na etapie instalacji i nie mogą być zmienione przez użytkownika. Entitlement jest określany przez dewelopera i podpisywany przez Apple w procesie przeglądu aplikacji.
Android używa wielowarstwowego modelu piaskownicy opartego na jądrze Linux. Każda aplikacja działa jako oddzielny użytkownik Linux z unikalnym UID, co zapewnia podstawową izolację na poziomie procesów i plików. Dodatkowe warstwy — SELinux dla obowiązkowej kontroli dostępu i Permissions dla kontroli dostępu do systemowych API.
SELinux w Android działa w trybie enforcing, co oznacza przymusowe stosowanie polityk bezpieczeństwa. Każdej aplikacji przypisywany jest kontekst bezpieczeństwa (security context), a wszystkie wywołania systemowe są sprawdzane pod kątem zgodności z polityką. SELinux w Android zawiera ponad 1500 reguł obejmujących system plików, komunikację międzyprocesową, gniazda i wywołania systemowe.
Izolacja UID zapobiega bezpośredniemu dostępowi aplikacji do plików innej aplikacji. Na przykład aplikacja A z UID 10001 nie może odczytywać plików aplikacji B z UID 10002, nawet jeśli obie są uruchomione w imieniu tego samego użytkownika telefonu. Jest to podstawowa zasada bezpieczeństwa wieloużytkownikowego Linuxa zaadaptowana dla urządzeń mobilnych.
// Dostęp do własnego katalogu aplikacji w Android
File appDir = context.getFilesDir();
File cacheDir = context.getCacheDir();
File externalDir = context.getExternalFilesDir(null);
// Próba dostępu do cudzego katalogu spowoduje wyjątek SecurityException
// File otherApp = new File("/data/data/com.other.app/shared_prefs/");
// Użycie FileProvider do bezpiecznego udostępniania plików
Uri contentUri = FileProvider.getUriForFile(
context, "com.example.fileprovider", file
);
Android udostępnia dodatkowe mechanizmy bezpiecznej wymiany danych między aplikacjami. ContentProvider — komponent Android, który pozwala aplikacji udostępniać swoje dane innym aplikacjom poprzez ściśle określony URI. FileProvider — bezpieczny sposób udostępniania plików bez ujawniania ścieżek systemu plików.
Pomimo że App Sandbox jest potężnym mechanizmem ochrony, ma fundamentalne ograniczenia. Piaskownica chroni przed dostępem horyzontalnym (aplikacja-do-aplikacji), ale nie przed wertykalnym (złośliwe oprogramowanie na poziomie jądra lub fizyczny dostęp do urządzenia). W przypadku jailbreak lub dostępu root piaskownica może być ominięta, ponieważ osoba atakująca uzyskuje uprawnienia superużytkownika.
Drugie ograniczenie — złośliwe zezwolenia. Jeśli użytkownik udzieli aplikacji dostępu do kontaktów i mikrofonu, piaskownica nie może zapobiec gromadzeniu tych danych, ponieważ aplikacja używa legalnych systemowych API. Ochrona w tym przypadku przechodzi na poziom świadomości użytkownika i przeglądu App Store oraz Google Play.
Trzecie ograniczenie — interakcja między piaskownicami. Niektóre usługi systemowe (NotificationListenerService, AccessibilityService) mają rozszerzony dostęp do danych innych aplikacji. Osoba atakująca może wykorzystać te usługi do ominięcia piaskownicy, jeśli uzyska odpowiednie zezwolenia. Google i Apple stale aktualizują polityki dla takich usług.
Pomimo ograniczeń, piaskownica jest krytycznym komponentem bezpieczeństwa mobilnych systemów operacyjnych. Według Android Security Report (2024), izolacja sandbox zapobiega ponad 99% prób międzyaplikacyjnego dostępu do danych. W połączeniu z Code Signing, App Review i runtime permissions, Sandbox tworzy wielowarstwową ochronę nowoczesnego urządzenia mobilnego.
Często zadawane pytania
Piaskownica aplikacji — to system izolacji, w którym każda aplikacja działa we własnej izolowanej przestrzeni, nie mając dostępu do danych innych aplikacji bez wyraźnej zgody użytkownika.
iOS używa ścisłej izolacji kontenerowej przez Sandbox.kext i entitlements. Android używa rozdzielenia UID na poziomie jądra Linux i SELinux. Zasada jest taka sama, ale implementacja i elastyczność się różnią.
Ominięcie piaskownicy jest możliwe tylko przy jailbreak (iOS) lub dostępie root (Android). Na standardowych urządzeniach bez modyfikacji systemu operacyjnego ominięcie piaskownicy jest niemożliwe przez legalne API.
iOS używa UIActivityViewController i App Groups. Android — ContentProvider, FileProvider i Intents. Wszystkie mechanizmy działają przez systemowe API z kontrolą bezpieczeństwa.
Zasada oznacza, że aplikacja otrzymuje tylko te prawa, które są niezbędne do jej działania. Dostęp do dodatkowych zasobów jest żądany poprzez zezwolenia i udzielany przez użytkownika.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.