Translated ['src/mobile-pentesting/android-app-pentesting/android-applic

This commit is contained in:
Translator 2025-07-28 14:16:52 +00:00
parent ef59eb8605
commit 481fca60ea

View File

@ -15,29 +15,29 @@
### Κοινή Χρήση UID
**Δύο εφαρμογές μπορούν να ρυθμιστούν να χρησιμοποιούν την ίδια UID**. Αυτό μπορεί να είναι χρήσιμο για την κοινή χρήση πληροφοριών, αλλά αν μία από αυτές παραβιαστεί, τα δεδομένα και των δύο εφαρμογών θα παραβιαστούν. Γι' αυτόν τον λόγο αυτή η συμπεριφορά είναι **απαγορευτική**.\
**Δύο εφαρμογές μπορούν να ρυθμιστούν να χρησιμοποιούν την ίδια UID**. Αυτό μπορεί να είναι χρήσιμο για την κοινή χρήση πληροφοριών, αλλά αν μία από αυτές παραβιαστεί, τα δεδομένα και των δύο εφαρμογών θα παραβιαστούν. Γι' αυτόν τον λόγο αυτή η συμπεριφορά **αποθαρρύνεται**.\
**Για να μοιραστούν την ίδια UID, οι εφαρμογές πρέπει να ορίσουν την ίδια τιμή `android:sharedUserId` στα μανιφέστα τους.**
### Sandbox
Η **Sandbox Εφαρμογών Android** επιτρέπει να εκτελείται **κάθε εφαρμογή** ως **ξεχωριστή διαδικασία υπό μια ξεχωριστή Ταυτότητα Χρήστη**. Κάθε διαδικασία έχει τη δική της εικονική μηχανή, έτσι ο κώδικας μιας εφαρμογής εκτελείται σε απομόνωση από άλλες εφαρμογές.\
Η **Sandbox Εφαρμογών Android** επιτρέπει να εκτελούνται **κάθε εφαρμογή** ως **ξεχωριστή διαδικασία υπό μια ξεχωριστή Ταυτότητα Χρήστη**. Κάθε διαδικασία έχει τη δική της εικονική μηχανή, έτσι ο κώδικας μιας εφαρμογής εκτελείται σε απομόνωση από άλλες εφαρμογές.\
Από το Android 5.0(L) **επιβάλλεται το SELinux**. Βασικά, το SELinux αρνείται όλες τις αλληλεπιδράσεις διαδικασιών και στη συνέχεια δημιουργεί πολιτικές για **να επιτρέπει μόνο τις αναμενόμενες αλληλεπιδράσεις μεταξύ τους**.
### Άδειες
Όταν εγκαθιστάτε μια **εφαρμογή και ζητά άδειες**, η εφαρμογή ζητά τις άδειες που έχουν ρυθμιστεί στα στοιχεία **`uses-permission`** στο αρχείο **AndroidManifest.xml**. Το στοιχείο **uses-permission** υποδεικνύει το όνομα της ζητούμενης άδειας μέσα στο **attribute name**. Έχει επίσης το **maxSdkVersion** attribute που σταματά να ζητά άδειες σε εκδόσεις υψηλότερες από αυτή που έχει καθοριστεί.\
Σημειώστε ότι οι εφαρμογές Android δεν χρειάζεται να ζητούν όλες τις άδειες στην αρχή, μπορούν επίσης να **ζητούν άδειες δυναμικά**, αλλά όλες οι άδειες πρέπει να είναι **δηλωμένες** στο **μανιφέστο**.
Όταν εγκαθιστάτε μια **εφαρμογή και ζητά άδειες**, η εφαρμογή ζητά τις άδειες που έχουν ρυθμιστεί στα στοιχεία **`uses-permission`** στο αρχείο **AndroidManifest.xml**. Το στοιχείο **uses-permission** υποδεικνύει το όνομα της ζητούμενης άδειας μέσα στο **attribute name**. Έχει επίσης το **maxSdkVersion** attribute που σταματά να ζητά άδειες σε εκδόσεις υψηλότερες από αυτήν που έχει καθοριστεί.\
Σημειώστε ότι οι εφαρμογές Android δεν χρειάζεται να ζητούν όλες τις άδειες στην αρχή, μπορούν επίσης να **ζητούν άδειες δυναμικά** αλλά όλες οι άδειες πρέπει να είναι **δηλωμένες** στο **μανιφέστο**.
Όταν μια εφαρμογή εκθέτει λειτουργικότητα, μπορεί να περιορίσει την **πρόσβαση μόνο σε εφαρμογές που έχουν μια συγκεκριμένη άδεια**.\
Όταν μια εφαρμογή εκθέτει λειτουργικότητα μπορεί να περιορίσει την **πρόσβαση μόνο σε εφαρμογές που έχουν μια καθορισμένη άδεια**.\
Ένα στοιχείο άδειας έχει τρία attributes:
- Το **όνομα** της άδειας
- Το **permission-group** attribute, το οποίο επιτρέπει την ομαδοποίηση σχετικών αδειών.
- Το attribute **permission-group**, το οποίο επιτρέπει την ομαδοποίηση σχετικών αδειών.
- Το **protection-level** που υποδεικνύει πώς χορηγούνται οι άδειες. Υπάρχουν τέσσερις τύποι:
- **Normal**: Χρησιμοποιείται όταν δεν υπάρχουν **γνωστές απειλές** για την εφαρμογή. Ο χρήστης **δεν απαιτείται να την εγκρίνει**.
- **Dangerous**: Υποδεικνύει ότι η άδεια παρέχει στην αιτούμενη εφαρμογή κάποια **υψηλή πρόσβαση**. **Οι χρήστες ζητούνται να τις εγκρίνουν**.
- **Signature**: Μόνο **εφαρμογές που υπογράφονται από το ίδιο πιστοποιητικό με αυτό που εξάγει το στοιχείο** μπορούν να λάβουν άδεια. Αυτός είναι ο ισχυρότερος τύπος προστασίας.
- **SignatureOrSystem**: Μόνο **εφαρμογές που υπογράφονται από το ίδιο πιστοποιητικό με αυτό που εξάγει το στοιχείο ή **εφαρμογές που εκτελούνται με πρόσβαση σε επίπεδο συστήματος** μπορούν να λάβουν άδειες.
- **Signature**: Μόνο **εφαρμογές που υπογράφονται με το ίδιο πιστοποιητικό με αυτό που εξάγει το στοιχείο** μπορούν να λάβουν άδεια. Αυτός είναι ο ισχυρότερος τύπος προστασίας.
- **SignatureOrSystem**: Μόνο **εφαρμογές που υπογράφονται με το ίδιο πιστοποιητικό με αυτό που εξάγει το στοιχείο ή **εφαρμογές που εκτελούνται με πρόσβαση σε επίπεδο συστήματος** μπορούν να λάβουν άδειες.
## Προεγκατεστημένες Εφαρμογές
@ -50,7 +50,7 @@
## Rooting
Για να αποκτήσετε πρόσβαση root σε μια φυσική συσκευή Android, γενικά χρειάζεται να **εκμεταλλευτείτε** 1 ή 2 **ευπάθειες** που συνήθως είναι **συγκεκριμένες** για τη **συσκευή** και την **έκδοση**.\
Αφού η εκμετάλλευση έχει λειτουργήσει, συνήθως το δυαδικό `su` του Linux αντιγράφεται σε μια τοποθεσία που καθορίζεται στη μεταβλητή PATH του χρήστη όπως `/system/xbin`.
Αφού η εκμετάλλευση έχει λειτουργήσει, συνήθως το δυαδικό `su` του Linux αντιγράφεται σε μια τοποθεσία που καθορίζεται στη μεταβλητή περιβάλλοντος PATH του χρήστη όπως `/system/xbin`.
Αφού το δυαδικό su έχει ρυθμιστεί, χρησιμοποιείται μια άλλη εφαρμογή Android για να αλληλεπιδράσει με το δυαδικό `su` και να **επεξεργαστεί αιτήματα για πρόσβαση root** όπως **Superuser** και **SuperSU** (διαθέσιμα στο Google Play store).
@ -62,7 +62,7 @@
Είναι δυνατόν να **αντικαταστήσετε το OS εγκαθιστώντας ένα προσαρμοσμένο firmware**. Κάνοντας αυτό, είναι δυνατό να επεκτείνετε τη χρησιμότητα μιας παλιάς συσκευής, να παρακάμψετε περιορισμούς λογισμικού ή να αποκτήσετε πρόσβαση στον τελευταίο κώδικα Android.\
**OmniROM** και **LineageOS** είναι δύο από τα πιο δημοφιλή firmware που χρησιμοποιούνται.
Σημειώστε ότι **δεν είναι πάντα απαραίτητο να κάνετε root τη συσκευή** για να εγκαταστήσετε ένα προσαρμοσμένο firmware. **Ορισμένοι κατασκευαστές επιτρέπουν** την ξεκλείδωσή των bootloaders τους με έναν καλά τεκμηριωμένο και ασφαλή τρόπο.
Σημειώστε ότι **δεν είναι πάντα απαραίτητο να κάνετε root τη συσκευή** για να εγκαταστήσετε ένα προσαρμοσμένο firmware. **Ορισμένοι κατασκευαστές επιτρέπουν** την ξεκλείδωσή των bootloaders τους με καλά τεκμηριωμένο και ασφαλή τρόπο.
### Επιπτώσεις
@ -70,11 +70,11 @@
## Θεμελιώδη Στοιχεία Εφαρμογών Android <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
- Η μορφή των εφαρμογών Android αναφέρεται ως _APK file format_. Είναι ουσιαστικά ένα **ZIP αρχείο** (με την αλλαγή της επέκτασης αρχείου σε .zip, το περιεχόμενο μπορεί να εξαχθεί και να προβληθεί).
- Η μορφή των εφαρμογών Android αναφέρεται ως _APK file format_. Είναι ουσιαστικά ένα **ZIP αρχείο** (με την αλλαγή της επέκτασης αρχείου σε .zip, τα περιεχόμενα μπορούν να εξαχθούν και να προβληθούν).
- Περιεχόμενα APK (Όχι εξαντλητικά)
- **AndroidManifest.xml**
- resources.arsc/strings.xml
- resources.arsc: περιέχει προετοιμασμένους πόρους, όπως δυαδικό XML.
- resources.arsc: περιέχει προcompiled resources, όπως δυαδικό XML.
- res/xml/files_paths.xml
- META-INF/
- Εδώ βρίσκεται το Πιστοποιητικό!
@ -95,7 +95,7 @@
Στην ανάπτυξη Android, χρησιμοποιείται **Java ή Kotlin** για τη δημιουργία εφαρμογών. Αντί να χρησιμοποιεί την JVM όπως στις επιτραπέζιες εφαρμογές, το Android μεταγλωττίζει αυτόν τον κώδικα σε **Dalvik Executable (DEX) bytecode**. Παλαιότερα, η εικονική μηχανή Dalvik χειριζόταν αυτόν τον bytecode, αλλά τώρα, το Android Runtime (ART) αναλαμβάνει σε νεότερες εκδόσεις Android.
Για την αντίστροφη μηχανική, το **Smali** γίνεται κρίσιμο. Είναι η αναγνώσιμη από άνθρωπο έκδοση του DEX bytecode, λειτουργώντας σαν γλώσσα συναρμολόγησης μεταφράζοντας τον πηγαίο κώδικα σε εντολές bytecode. Το Smali και το baksmali αναφέρονται στα εργαλεία συναρμολόγησης και αποσυναρμολόγησης σε αυτό το πλαίσιο.
Για την αντίστροφη μηχανική, το **Smali** γίνεται κρίσιμο. Είναι η αναγνώσιμη από άνθρωπο έκδοση του DEX bytecode, λειτουργώντας σαν γλώσσα assembly μεταφράζοντας τον πηγαίο κώδικα σε εντολές bytecode. Το Smali και το baksmali αναφέρονται στα εργαλεία assembly και disassembly σε αυτό το πλαίσιο.
## Intents
@ -110,7 +110,7 @@
- Για να αποκτήσει πρόσβαση σε δεδομένα μέσω ContentProviders
- Ως callbacks για να χειριστεί γεγονότα
Αν είναι ευάλωτα, **τα Intents μπορούν να χρησιμοποιηθούν για την εκτέλεση διαφόρων επιθέσεων**.
Αν είναι ευάλωτα, **τα Intents μπορούν να χρησιμοποιηθούν για την εκτέλεση ποικιλίας επιθέσεων**.
### Intent-Filter
@ -118,7 +118,7 @@
Τα Intent Filters αποτελούνται από κατηγορίες, ενέργειες και φίλτρα δεδομένων, με τη δυνατότητα να περιλαμβάνουν επιπλέον μεταδεδομένα. Αυτή η ρύθμιση επιτρέπει στα στοιχεία να χειρίζονται συγκεκριμένα Intents που ταιριάζουν με τα δηλωμένα κριτήρια.
Μια κρίσιμη πτυχή των στοιχείων Android (δραστηριότητες/υπηρεσίες/παρόχοι περιεχομένου/δέκτες ραδιοφωνικών εκπομπών) είναι η ορατότητά τους ή η **δημόσια κατάσταση**. Ένα στοιχείο θεωρείται δημόσιο και μπορεί να αλληλεπιδράσει με άλλες εφαρμογές αν είναι **`exported`** με τιμή **`true`** ή αν έχει δηλωθεί ένα Intent Filter γι' αυτό στο μανιφέστο. Ωστόσο, υπάρχει τρόπος για τους προγραμματιστές να κρατήσουν ρητά αυτά τα στοιχεία ιδιωτικά, διασφαλίζοντας ότι δεν αλληλεπιδρούν με άλλες εφαρμογές κατά λάθος. Αυτό επιτυγχάνεται ρυθμίζοντας το **`exported`** attribute σε **`false`** στις δηλώσεις του μανιφέστου τους.
Ένας κρίσιμος τομέας των στοιχείων Android (δραστηριότητες/υπηρεσίες/content providers/broadcast receivers) είναι η ορατότητά τους ή η **δημόσια κατάσταση**. Ένα στοιχείο θεωρείται δημόσιο και μπορεί να αλληλεπιδράσει με άλλες εφαρμογές αν είναι **`exported`** με τιμή **`true`** ή αν έχει δηλωθεί ένα Intent Filter γι' αυτό στο μανιφέστο. Ωστόσο, υπάρχει τρόπος για τους προγραμματιστές να κρατήσουν αυτά τα στοιχεία ιδιωτικά, διασφαλίζοντας ότι δεν αλληλεπιδρούν με άλλες εφαρμογές κατά λάθος. Αυτό επιτυγχάνεται ρυθμίζοντας το **`exported`** attribute σε **`false`** στις δηλώσεις τους στο μανιφέστο.
Επιπλέον, οι προγραμματιστές έχουν τη δυνατότητα να ασφαλίσουν περαιτέρω την πρόσβαση σε αυτά τα στοιχεία απαιτώντας συγκεκριμένες άδειες. Το **`permission`** attribute μπορεί να ρυθμιστεί ώστε να επιβάλλει ότι μόνο οι εφαρμογές με την καθορισμένη άδεια μπορούν να έχουν πρόσβαση στο στοιχείο, προσθέτοντας ένα επιπλέον επίπεδο ασφάλειας και ελέγχου σχετικά με το ποιος μπορεί να αλληλεπιδράσει με αυτό.
```java
@ -147,9 +147,9 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
Η διαδικασία "Επίλυσης Intent" καθορίζει ποια εφαρμογή θα λάβει κάθε μήνυμα. Αυτή η διαδικασία εξετάζει το **χαρακτηριστικό προτεραιότητας**, το οποίο μπορεί να οριστεί στην **δήλωση intent-filter**, και **αυτό με την υψηλότερη προτεραιότητα θα επιλεγεί**. Αυτή η προτεραιότητα μπορεί να οριστεί μεταξύ -1000 και 1000 και οι εφαρμογές μπορούν να χρησιμοποιήσουν την τιμή `SYSTEM_HIGH_PRIORITY`. Εάν προκύψει μια **σύγκρουση**, εμφανίζεται ένα παράθυρο "chooser" ώστε ο **χρήστης να αποφασίσει**.
### Ρητές Intents
### Explicit Intents
Ένα ρητό intent καθορίζει το όνομα της κλάσης που στοχεύει:
Ένα explicit intent καθορίζει το όνομα της κλάσης που στοχεύει:
```java
Intent downloadIntent = new (this, DownloadService.class):
```
@ -161,7 +161,7 @@ context.startService(intent);
```
### Pending Intents
Αυτά επιτρέπουν σε άλλες εφαρμογές να **εκτελούν ενέργειες εκ μέρους της εφαρμογής σας**, χρησιμοποιώντας την ταυτότητα και τις άδειες της εφαρμογής σας. Για να κατασκευάσετε ένα Pending Intent, θα πρέπει να **καθοριστεί μια πρόθεση και η ενέργεια που θα εκτελεστεί**. Εάν η **δηλωμένη πρόθεση δεν είναι Explicit** (δεν δηλώνει ποια πρόθεση μπορεί να την καλέσει), μια **κακόβουλη εφαρμογή θα μπορούσε να εκτελέσει την δηλωμένη ενέργεια** εκ μέρους της εφαρμογής-θύματος. Επιπλέον, **εάν δεν καθοριστεί κάποια ενέργεια**, η κακόβουλη εφαρμογή θα είναι σε θέση να εκτελέσει **οποιαδήποτε ενέργεια εκ μέρους του θύματος**.
Αυτά επιτρέπουν σε άλλες εφαρμογές να **εκτελούν ενέργειες εκ μέρους της εφαρμογής σας**, χρησιμοποιώντας την ταυτότητα και τις άδειες της εφαρμογής σας. Για να κατασκευάσετε ένα Pending Intent, θα πρέπει να **καθοριστεί μια πρόθεση και η ενέργεια που θα εκτελεστεί**. Εάν η **δηλωμένη πρόθεση δεν είναι Explicit** (δεν δηλώνει ποια πρόθεση μπορεί να την καλέσει), μια **κακόβουλη εφαρμογή θα μπορούσε να εκτελέσει την δηλωμένη ενέργεια** εκ μέρους της εφαρμογής-θύματος. Επιπλέον, **εάν δεν καθοριστεί μια ενέργεια**, η κακόβουλη εφαρμογή θα είναι σε θέση να εκτελέσει **οποιαδήποτε ενέργεια εκ μέρους του θύματος**.
### Broadcast Intents
@ -169,7 +169,7 @@ context.startService(intent);
Εναλλακτικά, είναι επίσης δυνατό να **καθοριστεί μια άδεια κατά την αποστολή του broadcast**. Η εφαρμογή παραλήπτης θα χρειαστεί να έχει αυτή την άδεια.
Υπάρχουν **δύο τύποι** Broadcasts: **Normal** (ασύγχρονα) και **Ordered** (σύγχρονα). Η **σειρά** βασίζεται στην **ρυθμισμένη προτεραιότητα εντός του στοιχείου παραλήπτη**. **Κάθε εφαρμογή μπορεί να επεξεργαστεί, να μεταφέρει ή να απορρίψει το Broadcast.**
Υπάρχουν **δύο τύποι** Broadcasts: **Normal** (ασύγχρονα) και **Ordered** (συγχρονισμένα). Η **σειρά** βασίζεται στην **καθορισμένη προτεραιότητα εντός του στοιχείου παραλήπτη**. **Κάθε εφαρμογή μπορεί να επεξεργαστεί, να μεταφέρει ή να απορρίψει το Broadcast.**
Είναι δυνατό να **σταλεί** ένα **broadcast** χρησιμοποιώντας τη λειτουργία `sendBroadcast(intent, receiverPermission)` από την κλάση `Context`.\
Μπορείτε επίσης να χρησιμοποιήσετε τη λειτουργία **`sendBroadcast`** από τον **`LocalBroadCastManager`** που διασφαλίζει ότι το **μήνυμα δεν θα φύγει ποτέ από την εφαρμογή**. Χρησιμοποιώντας αυτό, δεν θα χρειαστεί καν να εξάγετε ένα συστατικό παραλήπτη.
@ -184,9 +184,9 @@ context.startService(intent);
## Deep links / URL schemes
Στις εφαρμογές Android, οι **deep links** χρησιμοποιούνται για να ξεκινήσουν μια ενέργεια (Intent) απευθείας μέσω ενός URL. Αυτό γίνεται δηλώνοντας ένα συγκεκριμένο **URL scheme** εντός μιας δραστηριότητας. Όταν μια συσκευή Android προσπαθεί να **προσεγγίσει ένα URL με αυτό το scheme**, η καθορισμένη δραστηριότητα εντός της εφαρμογής εκκινείται.
Στις εφαρμογές Android, οι **deep links** χρησιμοποιούνται για να ξεκινήσουν μια ενέργεια (Intent) απευθείας μέσω μιας διεύθυνσης URL. Αυτό γίνεται δηλώνοντας ένα συγκεκριμένο **URL scheme** εντός μιας δραστηριότητας. Όταν μια συσκευή Android προσπαθεί να **προσεγγίσει μια διεύθυνση URL με αυτό το scheme**, η καθορισμένη δραστηριότητα εντός της εφαρμογής εκκινείται.
Το scheme πρέπει να δηλωθεί στο **`AndroidManifest.xml`** αρχείο:
Το scheme πρέπει να δηλωθεί στο αρχείο **`AndroidManifest.xml`**:
```xml
[...]
<activity android:name=".MyActivity">
@ -221,7 +221,7 @@ android:host="example"
### Βασικές Έννοιες
- **Δεσμευμένες Υπηρεσίες**: Αυτές οι υπηρεσίες χρησιμοποιούν την AIDL για IPC, επιτρέποντας σε δραστηριότητες ή συστατικά να συνδεθούν με μια υπηρεσία, να κάνουν αιτήματα και να λαμβάνουν απαντήσεις. Η μέθοδος `onBind` στην κλάση της υπηρεσίας είναι κρίσιμη για την έναρξη της αλληλεπίδρασης, καθιστώντας την μια ζωτική περιοχή για έλεγχο ασφαλείας στην αναζήτηση ευπαθειών.
- **Δεσμευμένες Υπηρεσίες**: Αυτές οι υπηρεσίες χρησιμοποιούν AIDL για IPC, επιτρέποντας σε δραστηριότητες ή συστατικά να συνδεθούν με μια υπηρεσία, να κάνουν αιτήματα και να λαμβάνουν απαντήσεις. Η μέθοδος `onBind` στην κλάση της υπηρεσίας είναι κρίσιμη για την έναρξη της αλληλεπίδρασης, καθιστώντας την μια ζωτική περιοχή για έλεγχο ασφαλείας στην αναζήτηση ευπαθειών.
- **Messenger**: Λειτουργώντας ως δεσμευμένη υπηρεσία, ο Messenger διευκολύνει την IPC με έμφαση στην επεξεργασία δεδομένων μέσω της μεθόδου `onBind`. Είναι απαραίτητο να εξετάσετε αυτή τη μέθοδο προσεκτικά για οποιαδήποτε μη ασφαλή διαχείριση δεδομένων ή εκτέλεση ευαίσθητων συναρτήσεων.
@ -233,7 +233,7 @@ android:host="example"
### Δραστηριότητα Εκκίνησης και άλλες δραστηριότητες
Στις εφαρμογές Android, οι **δραστηριότητες** είναι σαν οθόνες, που δείχνουν διαφορετικά μέρη της διεπαφής χρήστη της εφαρμογής. Μια εφαρμογή μπορεί να έχει πολλές δραστηριότητες, καθεμία από τις οποίες παρουσιάζει μια μοναδική οθόνη στον χρήστη.
Στις εφαρμογές Android, οι **δραστηριότητες** είναι σαν οθόνες, δείχνοντας διάφορα μέρη της διεπαφής χρήστη της εφαρμογής. Μια εφαρμογή μπορεί να έχει πολλές δραστηριότητες, καθεμία από τις οποίες παρουσιάζει μια μοναδική οθόνη στον χρήστη.
Η **δραστηριότητα εκκίνησης** είναι η κύρια πύλη σε μια εφαρμογή, που εκκινείται όταν πατάτε το εικονίδιο της εφαρμογής. Είναι καθορισμένη στο αρχείο μανιφέστ της εφαρμογής με συγκεκριμένα MAIN και LAUNCHER intents:
```html
@ -276,7 +276,7 @@ super.onCreate();
[Υπηρεσίες](https://developer.android.com/guide/components/services) είναι **λειτουργίες παρασκηνίου** ικανές να εκτελούν εργασίες χωρίς διεπαφή χρήστη. Αυτές οι εργασίες μπορούν να συνεχίσουν να εκτελούνται ακόμη και όταν οι χρήστες αλλάζουν σε διαφορετικές εφαρμογές, καθιστώντας τις υπηρεσίες κρίσιμες για **μακροχρόνιες λειτουργίες**.
Οι υπηρεσίες είναι ευέλικτες; μπορούν να ξεκινήσουν με διάφορους τρόπους, με τις **Intents** να είναι η κύρια μέθοδος για την εκκίνηση τους ως σημείο εισόδου μιας εφαρμογής. Μόλις ξεκινήσει μια υπηρεσία χρησιμοποιώντας τη μέθοδο `startService`, η μέθοδος `onStart` ενεργοποιείται και συνεχίζει να εκτελείται μέχρι να κληθεί ρητά η μέθοδος `stopService`. Εναλλακτικά, αν ο ρόλος μιας υπηρεσίας εξαρτάται από μια ενεργή σύνδεση πελάτη, χρησιμοποιείται η μέθοδος `bindService` για τη σύνδεση του πελάτη με την υπηρεσία, ενεργοποιώντας τη μέθοδο `onBind` για τη μεταφορά δεδομένων.
Οι υπηρεσίες είναι ευέλικτες; μπορούν να ξεκινήσουν με διάφορους τρόπους, με τις **Intents** να είναι η κύρια μέθοδος για την εκκίνησή τους ως σημείο εισόδου μιας εφαρμογής. Μόλις ξεκινήσει μια υπηρεσία χρησιμοποιώντας τη μέθοδο `startService`, η μέθοδος `onStart` ενεργοποιείται και συνεχίζει να εκτελείται μέχρι να κληθεί ρητά η μέθοδος `stopService`. Εναλλακτικά, αν ο ρόλος μιας υπηρεσίας εξαρτάται από μια ενεργή σύνδεση πελάτη, χρησιμοποιείται η μέθοδος `bindService` για τη σύνδεση του πελάτη με την υπηρεσία, ενεργοποιώντας τη μέθοδο `onBind` για τη μεταφορά δεδομένων.
Μια ενδιαφέρουσα εφαρμογή των υπηρεσιών περιλαμβάνει την αναπαραγωγή μουσικής παρασκηνίου ή την ανάκτηση δεδομένων δικτύου χωρίς να εμποδίζεται η αλληλεπίδραση του χρήστη με μια εφαρμογή. Επιπλέον, οι υπηρεσίες μπορούν να γίνουν προσβάσιμες σε άλλες διεργασίες στην ίδια συσκευή μέσω **εξαγωγής**. Αυτή δεν είναι η προεπιλεγμένη συμπεριφορά και απαιτεί ρητή ρύθμιση στο αρχείο Android Manifest:
```xml
@ -286,7 +286,7 @@ super.onCreate();
**Broadcast receivers** λειτουργούν ως ακροατές σε ένα σύστημα μηνυμάτων, επιτρέποντας σε πολλές εφαρμογές να ανταποκριθούν στα ίδια μηνύματα από το σύστημα. Μια εφαρμογή μπορεί να **καταχωρήσει έναν δέκτη** με **δύο κύριους τρόπους**: μέσω του **Manifest** της εφαρμογής ή **δυναμικά** μέσα στον κώδικα της εφαρμογής μέσω του **`registerReceiver`** API. Στο Manifest, οι εκπομπές φιλτράρονται με άδειες, ενώ οι δυναμικά καταχωρημένοι δέκτες μπορούν επίσης να καθορίσουν άδειες κατά την καταχώρηση.
**Intent filters** είναι κρίσιμα και στους δύο τρόπους καταχώρησης, καθορίζοντας ποιες εκπομπές ενεργοποιούν τον δέκτη. Μόλις σταλεί μια αντίστοιχη εκπομπή, η μέθοδος **`onReceive`** του δέκτη καλείται, επιτρέποντας στην εφαρμογή να αντιδράσει ανάλογα, όπως προσαρμόζοντας τη συμπεριφορά της σε μια ειδοποίηση χαμηλής μπαταρίας.
**Intent filters** είναι κρίσιμα και στους δύο τρόπους καταχώρησης, καθορίζοντας ποιες εκπομπές ενεργοποιούν τον δέκτη. Μόλις σταλεί μια αντίστοιχη εκπομπή, η μέθοδος **`onReceive`** του δέκτη καλείται, επιτρέποντας στην εφαρμογή να αντιδράσει αναλόγως, όπως η προσαρμογή της συμπεριφοράς σε απάντηση σε μια ειδοποίηση χαμηλής μπαταρίας.
Οι εκπομπές μπορεί να είναι είτε **ασύγχρονες**, φτάνοντας σε όλους τους δέκτες χωρίς σειρά, είτε **σύγχρονες**, όπου οι δέκτες λαμβάνουν την εκπομπή με βάση καθορισμένες προτεραιότητες. Ωστόσο, είναι σημαντικό να σημειωθεί ο πιθανός κίνδυνος ασφαλείας, καθώς οποιαδήποτε εφαρμογή μπορεί να δώσει προτεραιότητα στον εαυτό της για να παρεμποδίσει μια εκπομπή.
@ -294,7 +294,7 @@ super.onCreate();
### Content Provider
**Content Providers** είναι απαραίτητοι για **την κοινή χρήση δομημένων δεδομένων** μεταξύ εφαρμογών, τονίζοντας τη σημασία της εφαρμογής **αδειών** για την εξασφάλιση της ασφάλειας των δεδομένων. Επιτρέπουν στις εφαρμογές να έχουν πρόσβαση σε δεδομένα από διάφορες πηγές, συμπεριλαμβανομένων βάσεων δεδομένων, συστημάτων αρχείων ή του διαδικτύου. Συγκεκριμένες άδειες, όπως **`readPermission`** και **`writePermission`**, είναι κρίσιμες για τον έλεγχο της πρόσβασης. Επιπλέον, προσωρινή πρόσβαση μπορεί να παραχωρηθεί μέσω ρυθμίσεων **`grantUriPermission`** στο manifest της εφαρμογής, αξιοποιώντας χαρακτηριστικά όπως `path`, `pathPrefix` και `pathPattern` για λεπτομερή έλεγχο πρόσβασης.
**Content Providers** είναι απαραίτητοι για **την κοινή χρήση δομημένων δεδομένων** μεταξύ εφαρμογών, τονίζοντας τη σημασία της εφαρμογής **αδειών** για την εξασφάλιση της ασφάλειας των δεδομένων. Επιτρέπουν στις εφαρμογές να έχουν πρόσβαση σε δεδομένα από διάφορες πηγές, συμπεριλαμβανομένων βάσεων δεδομένων, συστημάτων αρχείων ή του διαδικτύου. Συγκεκριμένες άδειες, όπως **`readPermission`** και **`writePermission`**, είναι κρίσιμες για τον έλεγχο της πρόσβασης. Επιπλέον, προσωρινή πρόσβαση μπορεί να παραχωρηθεί μέσω ρυθμίσεων **`grantUriPermission`** στο manifest της εφαρμογής, εκμεταλλευόμενη χαρακτηριστικά όπως `path`, `pathPrefix` και `pathPattern` για λεπτομερή έλεγχο πρόσβασης.
Η επικύρωση εισόδου είναι πρωταρχικής σημασίας για την αποφυγή ευπαθειών, όπως η SQL injection. Οι Content Providers υποστηρίζουν βασικές λειτουργίες: `insert()`, `update()`, `delete()`, και `query()`, διευκολύνοντας τη χειρισμό και την κοινή χρήση δεδομένων μεταξύ εφαρμογών.
@ -323,7 +323,7 @@ android:resource="@xml/filepaths" />
## WebViews
WebViews είναι σαν **μικροί περιηγητές ιστού** μέσα σε εφαρμογές Android, αντλώντας περιεχόμενο είτε από το διαδίκτυο είτε από τοπικά αρχεία. Αντιμετωπίζουν παρόμοιους κινδύνους με τους κανονικούς περιηγητές, ωστόσο υπάρχουν τρόποι για να **μειωθούν αυτοί οι κίνδυνοι** μέσω συγκεκριμένων **ρυθμίσεων**.
WebViews είναι σαν **μικροί περιηγητές ιστού** μέσα σε εφαρμογές Android, αντλώντας περιεχόμενο είτε από το διαδίκτυο είτε από τοπικά αρχεία. Αντιμετωπίζουν παρόμοιους κινδύνους με τους κανονικούς περιηγητές, ωστόσο υπάρχουν τρόποι για **μείωση αυτών των κινδύνων** μέσω συγκεκριμένων **ρυθμίσεων**.
Η Android προσφέρει δύο κύριους τύπους WebView:
@ -336,7 +336,7 @@ WebViews είναι σαν **μικροί περιηγητές ιστού** μέ
Η JavaScript "Bridge" επιτρέπει στα αντικείμενα Java να αλληλεπιδρούν με τη JavaScript, απαιτώντας οι μέθοδοι να είναι επισημασμένες με `@JavascriptInterface` για ασφάλεια από την Android 4.2 και μετά.
Η επιτρεπόμενη πρόσβαση περιεχομένου (`setAllowContentAccess(true)`) επιτρέπει στις WebViews να προσεγγίζουν Content Providers, κάτι που θα μπορούσε να είναι κίνδυνος εκτός αν οι διευθύνσεις URL περιεχομένου επαληθευτούν ως ασφαλείς.
Η επιτρεπόμενη πρόσβαση περιεχομένου (`setAllowContentAccess(true)`) επιτρέπει στις WebViews να προσεγγίζουν τους Content Providers, οι οποίοι θα μπορούσαν να είναι κίνδυνος εκτός αν οι διευθύνσεις URL περιεχομένου επαληθευτούν ως ασφαλείς.
Για τον έλεγχο πρόσβασης σε αρχεία:
@ -346,15 +346,15 @@ WebViews είναι σαν **μικροί περιηγητές ιστού** μέ
### **Ψηφιακή Υπογραφή Εφαρμογών**
- **Ψηφιακή υπογραφή** είναι απαραίτητη για τις εφαρμογές Android, διασφαλίζοντας ότι είναι **αυθεντικά συγγραφείς** πριν από την εγκατάσταση. Αυτή η διαδικασία χρησιμοποιεί ένα πιστοποιητικό για την αναγνώριση της εφαρμογής και πρέπει να επαληθευτεί από τον διαχειριστή πακέτων της συσκευής κατά την εγκατάσταση. Οι εφαρμογές μπορούν να είναι **αυτο-υπογεγραμμένες ή πιστοποιημένες από μια εξωτερική CA**, προστατεύοντας από μη εξουσιοδοτημένη πρόσβαση και διασφαλίζοντας ότι η εφαρμογή παραμένει αμετάβλητη κατά την παράδοσή της στη συσκευή.
- **Ψηφιακή υπογραφή** είναι απαραίτητη για τις εφαρμογές Android, διασφαλίζοντας ότι είναι **αυθεντικά συγγραφείς** πριν από την εγκατάσταση. Αυτή η διαδικασία χρησιμοποιεί ένα πιστοποιητικό για την αναγνώριση της εφαρμογής και πρέπει να επαληθευτεί από τον διαχειριστή πακέτων της συσκευής κατά την εγκατάσταση. Οι εφαρμογές μπορούν να είναι **αυτο-υπογεγραμμένες ή πιστοποιημένες από εξωτερικό CA**, προστατεύοντας από μη εξουσιοδοτημένη πρόσβαση και διασφαλίζοντας ότι η εφαρμογή παραμένει αμετάβλητη κατά την παράδοσή της στη συσκευή.
### **Επαλήθευση Εφαρμογών για Αυξημένη Ασφάλεια**
- Ξεκινώντας από την **Android 4.2**, μια δυνατότητα που ονομάζεται **Verify Apps** επιτρέπει στους χρήστες να ελέγχουν τις εφαρμογές για ασφάλεια πριν από την εγκατάσταση. Αυτή η **διαδικασία επαλήθευσης** μπορεί να προειδοποιήσει τους χρήστες για πιθανώς επιβλαβείς εφαρμογές ή ακόμη και να αποτρέψει την εγκατάσταση ιδιαίτερα κακόβουλων, ενισχύοντας την ασφάλεια των χρηστών.
- Ξεκινώντας από την **Android 4.2**, μια δυνατότητα που ονομάζεται **Verify Apps** επιτρέπει στους χρήστες να ελέγχουν τις εφαρμογές για ασφάλεια πριν από την εγκατάσταση. Αυτή η **διαδικασία επαλήθευσης** μπορεί να προειδοποιήσει τους χρήστες για πιθανώς επιβλαβείς εφαρμογές, ή ακόμη και να αποτρέψει την εγκατάσταση ιδιαίτερα κακόβουλων, ενισχύοντας την ασφάλεια του χρήστη.
### **Διαχείριση Κινητών Συσκευών (MDM)**
- **Λύσεις MDM** παρέχουν **επίβλεψη και ασφάλεια** για κινητές συσκευές μέσω του **Device Administration API**. Απαιτούν την εγκατάσταση μιας εφαρμογής Android για να διαχειρίζονται και να ασφαλίζουν αποτελεσματικά τις κινητές συσκευές. Οι βασικές λειτουργίες περιλαμβάνουν **επιβολή πολιτικών κωδικών πρόσβασης**, **υποχρεωτική κρυπτογράφηση αποθήκευσης**, και **άδεια απομακρυσμένης διαγραφής δεδομένων**, διασφαλίζοντας πλήρη έλεγχο και ασφάλεια πάνω στις κινητές συσκευές.
- Οι **λύσεις MDM** παρέχουν **επίβλεψη και ασφάλεια** για κινητές συσκευές μέσω του **Device Administration API**. Απαιτούν την εγκατάσταση μιας εφαρμογής Android για να διαχειρίζονται και να ασφαλίζουν αποτελεσματικά τις κινητές συσκευές. Οι κύριες λειτουργίες περιλαμβάνουν **επιβολή πολιτικών κωδικών πρόσβασης**, **υποχρεωτική κρυπτογράφηση αποθήκευσης**, και **άδεια απομακρυσμένης διαγραφής δεδομένων**, διασφαλίζοντας πλήρη έλεγχο και ασφάλεια πάνω στις κινητές συσκευές.
```java
// Example of enforcing a password policy with MDM
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
@ -365,4 +365,106 @@ if (dpm.isAdminActive(adminComponent)) {
dpm.setPasswordMinimumLength(adminComponent, 8);
}
```
## Εντοπισμός και Εκμετάλλευση Υπηρεσιών AIDL / Binder
Android *Binder* IPC εκθέτει πολλές **υπηρεσίες συστήματος και προμηθευτών**. Αυτές οι υπηρεσίες γίνονται μια **επιφάνεια επίθεσης** όταν εξάγονται χωρίς κατάλληλο έλεγχο δικαιωμάτων (η ίδια η AIDL δεν εκτελεί *κανέναν* έλεγχο πρόσβασης).
### 1. Ανακάλυψη τρεχουσών υπηρεσιών
```bash
# from an adb shell (USB or wireless)
service list # simple one-liner
am list services # identical output, ActivityManager wrapper
```
1. Εισαγωγή
2. Βασικές έννοιες
3. Αρχιτεκτονική εφαρμογών Android
4. Ανάλυση εφαρμογών
5. Δοκιμές ασφαλείας
6. Εργαλεία και τεχνικές
7. Συμπεράσματα
```
145 mtkconnmetrics: [com.mediatek.net.connectivity.IMtkIpConnectivityMetrics]
146 wifi : [android.net.wifi.IWifiManager]
```
* Ο **δείκτης** (πρώτη στήλη) ανατίθεται κατά την εκτέλεση ***μην*** βασίζεστε σε αυτόν κατά τις επανεκκινήσεις.
* Το **όνομα Binder** (π.χ. `mtkconnmetrics`) είναι αυτό που θα περαστεί στη `service call`.
* Η τιμή μέσα στις αγκύλες είναι η πλήρως προσδιορισμένη **διεπαφή AIDL** από την οποία δημιουργήθηκε το stub.
### 2. Απόκτηση του περιγραφέα διεπαφής (PING)
Κάθε Binder stub υλοποιεί αυτόματα τον **κωδικό συναλλαγής `0x5f4e5446`** (`1598968902` δεκαδικό, ASCII "_NTF").
```bash
# "ping" the service
service call mtkconnmetrics 1 # 1 == decimal 1598968902 mod 2^32
```
Μια έγκυρη απάντηση επιστρέφει το όνομα διεπαφής κωδικοποιημένο ως UTF-16 string μέσα σε ένα `Parcel`.
### 3. Κλήση μιας συναλλαγής
Σύνταξη: `service call <name> <code> [type value ...]`
Κοινές καθοριστές παραμέτρων:
* `i32 <int>` υπογεγραμμένη τιμή 32-bit
* `i64 <long>` υπογεγραμμένη τιμή 64-bit
* `s16 <string>` UTF-16 string (Android 13+ χρησιμοποιεί `utf16`)
Παράδειγμα εκκίνηση παρακολούθησης δικτύου με uid **1** σε συσκευή MediaTek:
```bash
service call mtkconnmetrics 8 i32 1
```
### 4. Brute-forcing unknown methods
Όταν τα αρχεία κεφαλίδας δεν είναι διαθέσιμα, μπορείτε να **επικαλείστε τον κώδικα** μέχρι να αλλάξει το σφάλμα από:
```
Result: Parcel(00000000 00000000) # "Not a data message"
```
σε μια κανονική `Parcel` απάντηση ή `SecurityException`.
```bash
for i in $(seq 1 50); do
printf "[+] %2d -> " $i
service call mtkconnmetrics $i 2>/dev/null | head -1
done
```
Αν η υπηρεσία έχει μεταγλωττιστεί **με proguard**, η αντιστοίχιση πρέπει να μαντευτεί δείτε το επόμενο βήμα.
### 5. Αντιστοίχιση κωδικών ↔ μεθόδων μέσω onTransact()
Αποσυμπιέστε το jar/odex που υλοποιεί τη διεπαφή (για AOSP stubs ελέγξτε το `/system/framework`; οι OEMs συχνά χρησιμοποιούν το `/system_ext` ή το `/vendor`).
Αναζητήστε το `Stub.onTransact()` περιέχει ένα γιγαντιαίο `switch(transactionCode)`:
```java
case TRANSACTION_updateCtaAppStatus: // 5
data.enforceInterface(DESCRIPTOR);
int appId = data.readInt();
boolean ok = data.readInt() != 0;
updateCtaAppStatus(appId, ok);
reply.writeNoException();
return true;
```
Τώρα το πρωτότυπο και οι **τύποι παραμέτρων** είναι απολύτως σαφή.
### 6. Εντοπισμός ελλειπόντων ελέγχων άδειας
Η υλοποίηση (συχνά μια εσωτερική κλάση `Impl`) είναι υπεύθυνη για την εξουσιοδότηση:
```java
private void updateCtaAppStatus(int uid, boolean status) {
if (!isPermissionAllowed()) {
throw new SecurityException("uid " + uid + " rejected");
}
/* privileged code */
}
```
Η απουσία τέτοιας λογικής ή μιας λευκής λίστας προνομιακών UIDs (π.χ. `uid == 1000 /*system*/`) είναι ένας **δείκτης ευπάθειας**.
Μελέτη περίπτωσης *MediaTek* `startMonitorProcessWithUid()` (συναλλαγή **8**) εκτελεί πλήρως ένα μήνυμα Netlink **χωρίς** καμία πύλη άδειας, επιτρέποντας σε μια μη προνομιακή εφαρμογή να αλληλεπιδράσει με το module Netfilter του πυρήνα και να σπαμάρει το σύστημα καταγραφής.
### 7. Αυτοματοποίηση της αξιολόγησης
Εργαλεία / σενάρια που επιταχύνουν την αναγνώριση Binder:
* [binderfs](https://android.googlesource.com/platform/frameworks/native/+/master/cmds/binderfs/) εκθέτει το `/dev/binderfs` με κόμβους ανά υπηρεσία
* [`binder-scanner.py`](https://github.com/adenflare/binder-scanner) διασχίζει τον πίνακα binder και εκτυπώνει ACLs
* Συντόμευση Frida: `Java.perform(()=>console.log(android.os.ServiceManager.listServices().toArray()))`
---
## Αναφορές
- [Android Services 101 Pentest Partners](https://www.pentestpartners.com/security-blog/android-services-101/)
- [Android Developer Docs AIDL](https://developer.android.com/guide/components/aidl)
- [Android Developer Docs IBinder](https://developer.android.com/reference/android/os/IBinder)
- [Understanding Binder, Talk @ Google](https://www.youtube.com/watch?v=O-UHvFjxwZ8)
{{#include ../../banners/hacktricks-training.md}}