mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
79 lines
4.6 KiB
Markdown
79 lines
4.6 KiB
Markdown
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
Udostępnianie danych w ramach i między aplikacjami na urządzeniach iOS jest ułatwione dzięki mechanizmowi [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard), który dzieli się na dwie główne kategorie:
|
|
|
|
- **Ogólny schowek systemowy**: Służy do udostępniania danych **w dowolnej aplikacji** i jest zaprojektowany tak, aby utrzymywać dane po ponownym uruchomieniu urządzenia i odinstalowaniu aplikacji, co jest dostępne od iOS 10.
|
|
- **Niestandardowe / nazwane schowki**: Służą specjalnie do udostępniania danych **w obrębie aplikacji lub z inną aplikacją**, która dzieli ten sam identyfikator zespołu, i nie są zaprojektowane do utrzymywania danych poza czasem życia procesu aplikacji, która je tworzy, zgodnie ze zmianami wprowadzonymi w iOS 10.
|
|
|
|
**Rozważania dotyczące bezpieczeństwa** odgrywają znaczącą rolę przy korzystaniu ze schowków. Na przykład:
|
|
|
|
- Nie ma mechanizmu, który pozwalałby użytkownikom zarządzać uprawnieniami aplikacji do dostępu do **schowka**.
|
|
- Aby zminimalizować ryzyko nieautoryzowanego monitorowania schowka w tle, dostęp jest ograniczony do momentu, gdy aplikacja jest na pierwszym planie (od iOS 9).
|
|
- Użycie trwałych nazwanych schowków jest odradzane na rzecz wspólnych kontenerów z powodu obaw o prywatność.
|
|
- Funkcja **Uniwersalny schowek**, wprowadzona w iOS 10, umożliwiająca udostępnianie treści między urządzeniami za pośrednictwem ogólnego schowka, może być zarządzana przez programistów w celu ustawienia wygasania danych i wyłączenia automatycznego transferu treści.
|
|
|
|
Zabezpieczenie, aby **wrażliwe informacje nie były przypadkowo przechowywane** w globalnym schowku, jest kluczowe. Dodatkowo aplikacje powinny być zaprojektowane tak, aby zapobiegać niewłaściwemu wykorzystaniu danych z globalnego schowka do niezamierzonych działań, a programiści są zachęcani do wdrażania środków zapobiegających kopiowaniu wrażliwych informacji do schowka.
|
|
|
|
### Analiza statyczna
|
|
|
|
W przypadku analizy statycznej przeszukaj kod źródłowy lub binarny w poszukiwaniu:
|
|
|
|
- `generalPasteboard`, aby zidentyfikować użycie **ogólnego schowka systemowego**.
|
|
- `pasteboardWithName:create:` i `pasteboardWithUniqueName` do tworzenia **niestandardowych schowków**. Sprawdź, czy trwałość jest włączona, chociaż jest to przestarzałe.
|
|
|
|
### Analiza dynamiczna
|
|
|
|
Analiza dynamiczna polega na podłączaniu lub śledzeniu konkretnych metod:
|
|
|
|
- Monitoruj `generalPasteboard` w celu użycia systemowego.
|
|
- Śledź `pasteboardWithName:create:` i `pasteboardWithUniqueName` dla niestandardowych implementacji.
|
|
- Obserwuj wywołania przestarzałej metody `setPersistent:`, aby sprawdzić ustawienia trwałości.
|
|
|
|
Kluczowe szczegóły do monitorowania obejmują:
|
|
|
|
- **Nazwy schowków** i **zawartość** (na przykład sprawdzanie ciągów, adresów URL, obrazów).
|
|
- **Liczba elementów** i **typy danych** obecnych, wykorzystując standardowe i niestandardowe kontrole typów danych.
|
|
- **Opcje wygasania i lokalne** poprzez inspekcję metody `setItems:options:`.
|
|
|
|
Przykładem użycia narzędzia monitorującego jest **monitor schowka objection**, który co 5 sekund sprawdza generalPasteboard pod kątem zmian i wyświetla nowe dane.
|
|
|
|
Oto prosty przykład skryptu JavaScript, inspirowany podejściem objection, do odczytu i rejestrowania zmian ze schowka co 5 sekund:
|
|
```javascript
|
|
const UIPasteboard = ObjC.classes.UIPasteboard
|
|
const Pasteboard = UIPasteboard.generalPasteboard()
|
|
var items = ""
|
|
var count = Pasteboard.changeCount().toString()
|
|
|
|
setInterval(function () {
|
|
const currentCount = Pasteboard.changeCount().toString()
|
|
const currentItems = Pasteboard.items().toString()
|
|
|
|
if (currentCount === count) {
|
|
return
|
|
}
|
|
|
|
items = currentItems
|
|
count = currentCount
|
|
|
|
console.log(
|
|
"[* Pasteboard changed] count: " +
|
|
count +
|
|
" hasStrings: " +
|
|
Pasteboard.hasStrings().toString() +
|
|
" hasURLs: " +
|
|
Pasteboard.hasURLs().toString() +
|
|
" hasImages: " +
|
|
Pasteboard.hasImages().toString()
|
|
)
|
|
console.log(items)
|
|
}, 1000 * 5)
|
|
```
|
|
## Odniesienia
|
|
|
|
- [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8)
|
|
- [https://hackmd.io/@robihamanto/owasp-robi](https://hackmd.io/@robihamanto/owasp-robi)
|
|
- [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0073/](https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0073/)
|
|
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|