Why permissions are where you start
An app can lie about its name. It can use a Google-looking icon. It can call itself "System Update". The one thing it cannot do is read your text messages without asking the operating system for READ_SMS, and that request is written into the app’s manifest where anyone with the right tool can read it.
That is what the GuestSpy permission audit does. For an APK you scan, or for the list of installed apps the GuestSpy Android app reads from the device, it takes every permission the app declares, sorts it into a risk tier, explains in one sentence what it really lets the app do, and then looks at the combinations. Because a single permission is rarely the story. The story is an app that can read your messages and your location and your call log and starts itself at boot and has no icon.
Three kinds of "allowed"
Android does not treat all permissions the same way, and knowing which kind you are looking at tells you how it got granted and how to take it back.
Install-time (normal) permissions. INTERNET, WAKE_LOCK, RECEIVE_BOOT_COMPLETED, FOREGROUND_SERVICE, VIBRATE and similar are granted automatically the moment the app is installed. Nobody tapped "Allow". That is why the Medium and Low tiers are mostly install-time: the app simply has them. You cannot revoke most of them from Settings; the only way to remove them is to remove the app.
Runtime (dangerous) permissions.
SMS, call log, contacts, calendar, location, microphone, camera, storage, phone, nearby devices, body sensors, notifications. Since Android 6, these need a prompt, and the user has to tap Allow. On recent versions, location, camera and microphone can be granted "only while using the app", and location can be approximate rather than precise. A monitoring app wants "all the time" and "precise", and the setup instructions stalkerware vendors give their customers walk through exactly those prompts on the victim’s phone. These can be revoked in Permission manager, and Android will also auto-revoke them from apps you haven’t opened in months (which, incidentally, is one reason stalkerware fakes activity).
Special app access.
Accessibility, device admin, notification access, usage access, display over other apps, install unknown apps, all-files access, battery optimisation exemption, modify system settings. Each has its own screen, its own warning text, and in some cases a deliberately awkward path (accessibility services on Android 13+ are blocked for sideloaded apps until you go through "restricted settings" on the app’s info page). These are the ones that matter most and the ones a quick glance at Permission manager will not show you. The audit lists them in their own group for that reason.
One practical consequence: if an app has BIND_ACCESSIBILITY_SERVICE granted on a phone running Android 13 or later and it was sideloaded, someone had to open its App info page, tap the three-dot menu, choose "Allow restricted settings", and then go to Accessibility and switch it on. That is not an accident. That is a procedure, and it was done by someone holding your phone.
A scenario, start to finish
Here is how the audit plays out in a real situation, with the kind of app that turns up.
You notice your phone is warm in your pocket and the battery is draining faster than it used to. Your partner has mentioned, twice, things you only said in messages. You open Settings > Battery and see an app called "Device Health Services" near the top of the usage list. You don’t remember installing it. There is no icon for it in the app drawer.
You scan it. The audit section shows:
Critical: READ_SMS, RECEIVE_SMS, READ_CALL_LOG, RECORD_AUDIO, ACCESS_FINE_LOCATION, ACCESS_BACKGROUND_LOCATION, plus an accessibility service and a notification listener, both granted.
High: READ_CONTACTS, SYSTEM_ALERT_WINDOW, PACKAGE_USAGE_STATS (granted), QUERY_ALL_PACKAGES.
Medium: RECEIVE_BOOT_COMPLETED, REQUEST_IGNORE_BATTERY_OPTIMIZATIONS (granted), FOREGROUND_SERVICE, GET_ACCOUNTS, READ_PHONE_STATE, WAKE_LOCK.
Combination rules: GS-R-030, GS-R-031, GS-R-033, GS-R-034, GS-R-039. Component rules: GS-R-014 hidden icon, GS-R-021 accessibility can read screen content, GS-R-023 notification listener, GS-R-011 boot start.
Grant status (from the GuestSpy app): every runtime permission allowed, location set to "All the time" and "Precise". Install source: Chrome. Install date: a Sunday six weeks ago, which you remember as the weekend your partner "fixed your phone’s storage".
Nothing in that list is ambiguous. A real "device health" service from Google would be a system app, would not be installed from Chrome, would not read SMS, and would not hide its icon. The audit tells you what the app can do (everything), how sure the scanner is (the certificate also matched a known family, so: very), and what to do about it (deactivate device admin and accessibility, then uninstall), with the safety note at the top.
What the audit does not do is tell you how to feel about it or what to do about the person. That is what the safety page and the organisations it links to are for.
Dangerous combinations: the GS-R rules
A single permission rarely tells you much. RECORD_AUDIO is in every voice-memo app. ACCESS_FINE_LOCATION is in every map and every weather app. What the scanner weighs heavily is the combinations that only make sense if the app’s purpose is to watch someone.
These are expressed as evidence rules with IDs in the format GS-R-0xx. Each one that fires appears in the report with the exact permissions and components that triggered it. Here are the main combination rules the permission audit applies.
| Rule | Name | Triggers when |
|---|---|---|
GS-R-030 |
Reads SMS + call log + location together | READ_SMS or RECEIVE_SMS, plus READ_CALL_LOG, plus ACCESS_FINE_LOCATION or ACCESS_BACKGROUND_LOCATION. No normal app category needs all three. |
GS-R-031 |
Records audio with background location and boot start | RECORD_AUDIO + ACCESS_BACKGROUND_LOCATION + RECEIVE_BOOT_COMPLETED. A device that listens, knows where it is, and restarts itself. |
GS-R-032 |
Silent call answer | ANSWER_PHONE_CALLS + RECORD_AUDIO + READ_PHONE_STATE, without the app being a dialer. The "hot mic" pattern. |
GS-R-033 |
Double message capture | Notification listener + accessibility service. Messages are captured both from notifications and from screen text, covering apps that hide content in notifications. |
GS-R-034 |
Persistence stack | RECEIVE_BOOT_COMPLETED + REQUEST_IGNORE_BATTERY_OPTIMIZATIONS + FOREGROUND_SERVICE + WAKE_LOCK. Legitimate in messaging apps; in anything else, it means "never let me die". |
GS-R-035 |
Install and hide | REQUEST_INSTALL_PACKAGES + hidden launcher icon (GS-R-014). A dropper. |
GS-R-036 |
High-priority SMS or call interception | SMS or outgoing-call receiver with priority at or near the maximum integer. The app wants to see the message or call before anything else does, and can abort the broadcast. |
GS-R-037 |
Overlay plus accessibility | SYSTEM_ALERT_WINDOW + accessibility service. Can draw a fake screen and then tap through it on its own. |
GS-R-038 |
Discovers security software | QUERY_ALL_PACKAGES or PACKAGE_USAGE_STATS + strings naming antivirus or anti-stalkerware package names. |
GS-R-039 |
Full-surveillance profile | Five or more Critical-tier items in a single app. |
Separate component rules feed into these. GS-R-014 (Hides launcher icon), GS-R-018 (Device administrator receiver), GS-R-021 (Accessibility service can read screen content), GS-R-023 (Notification listener) and GS-R-011 (Starts at boot) are all documented on the app scanner page.
The scoring is deliberately non-linear. GS-R-030 adds more severity than READ_SMS, READ_CALL_LOG and ACCESS_FINE_LOCATION would add on their own, because the combination is far more specific than any of its parts.
How legitimate apps differ
The same permission means different things depending on who is asking. This is the judgement the audit asks you to make, and here is how to make it.
Ask whether the permission is the product.
A messaging app’s product is messages, so READ_SMS and RECEIVE_SMS are the product. A navigation app’s product is your position, so ACCESS_FINE_LOCATION is the product and background location is defensible for turn-by-turn directions. A flashlight’s product is the LED. A flashlight that wants your SMS and your location has a second product, and you are it.
Ask whether it is visible.
Legitimate apps want to be seen. They have an icon, they post notifications, they appear in Recents. An app that hides its icon, suppresses its notifications, and names itself after a system component is optimising for not being found. The audit shows a hidden launcher icon right next to the permissions for this reason.
Ask who is on the Play Store. Google requires a declaration form and a specific use case for SMS, call log, accessibility, QUERY_ALL_PACKAGES and MANAGE_EXTERNAL_STORAGE. Many of the combinations above are simply not allowed in Play Store apps any more. If an app has them and was sideloaded, the sideloading is itself the tell. The audit shows the installer source when the GuestSpy Android app provides it.
Ask whether it needs the whole stack. A legitimate call recorder has RECORD_AUDIO, READ_PHONE_STATE and maybe an accessibility service (a common workaround for call-recording restrictions). It does not need READ_SMS, your location, a device admin receiver and a boot receiver. The stack is the signal.
Some concrete comparisons:
| App type | Expected | Unexpected |
|---|---|---|
| Messaging (SMS) app | READ_SMS, RECEIVE_SMS, SEND_SMS, READ_CONTACTS, notifications |
Location in background, RECORD_AUDIO without a voice-note feature, device admin |
| Navigation / maps | Fine and background location, FOREGROUND_SERVICE typed location |
SMS, call log, accessibility service |
| Password manager | Accessibility service (autofill on older Android), SYSTEM_ALERT_WINDOW on some |
SMS, location, boot start plus battery exemption |
| Corporate MDM agent | Device admin or device owner, QUERY_ALL_PACKAGES, Wi-Fi config |
Hidden icon, personal SMS reading, C2 domains outside the vendor |
| Parental / family app (watchware) | Location, usage stats, sometimes notification listener; visible icon and a clear notification | Hidden icon, accessibility keylogging, silent call answer |
| Keyboard | INTERNET for cloud suggestions (debatable), VIBRATE, READ_USER_DICTIONARY |
Location, SMS, accessibility service (a keyboard already sees your keystrokes; an accessibility service means it wants everything else too) |
| Flashlight, wallpaper, QR scanner | CAMERA (QR), FLASHLIGHT |
Anything in the Critical tier |
Watchware is a special case. Apps in the WCH class – family locators, parental controls, employee monitoring with a visible agent – are built to monitor and say so. GuestSpy labels them in purple rather than red because the technical facts are the same as stalkerware and the difference is consent. If you are an adult and did not agree to being tracked by that app, or you did agree and now want to stop, the label does not change what you should do next. Our safety page covers that.
Reviewing permissions on your own phone
You do not need the scanner to see most of this. Android shows it, though the paths have moved around between versions and manufacturers. Names vary; the structure below is Pixel first, with Samsung differences noted.
Android 12 and newer: Privacy dashboard
Settings > Security & privacy > Privacy > Privacy dashboard (on Samsung: Settings > Security and privacy > Privacy > Permissions used in last 24 hours, or Permission manager).
The dashboard shows which apps used location, camera and microphone in the last 24 hours, as a timeline. This is the single most useful screen for catching a tracker, because it shows use, not just grant. An app you have never opened appearing in the location timeline at 3am is a finding.
Tap any permission to see the full list of apps that hold it. Tap an app to revoke it.
Permission manager (Android 10 and newer)
Settings > Security & privacy > Privacy > Permission manager (Samsung: Settings > Apps > three-dot menu > Permission manager; or Settings > Security and privacy > Permission manager).
This lists permissions by type: Body sensors, Calendar, Call logs, Camera, Contacts, Files, Location, Microphone, Nearby devices, Notifications, Phone, Physical activity, SMS. Open each Critical-tier one and read the "Allowed" list. Anything you don’t recognise, or that you recognise and can’t explain, is worth noting.
Per-app view
Settings > Apps > See all apps > (choose app) > Permissions. This is also where you can see "Unused app settings" and the install source ("Installed from Play Store" / "Installed from Chrome" / "Installed from Files"). The install source matters: see the previous section.
The three special-access screens
These are not in Permission manager. They have their own screens because they are powerful enough that Android makes you go and find them.
- Accessibility: Settings > Accessibility. Scroll to Downloaded apps or Installed apps (the wording varies). Anything listed here that is not a screen reader, a password manager or an app you deliberately set up should be investigated. Tap it to see whether it is On.
- Device admin apps: Settings > Security & privacy > More security settings (or More security & privacy) > Device admin apps. Samsung: Settings > Security and privacy > Other security settings > Device admin apps. Find My Device is normally here. Your employer’s MDM may be. "System Service" should not be.
- Notification access: Settings > Notifications > Device & app notifications (Android 13+), or Settings > Apps > Special app access > Notification access. Samsung: Settings > Notifications > Advanced settings > Notification access. Wearable companions and some automation apps belong here. Anything else, question it.
Two more special-access screens are worth a look: Display over other apps and Install unknown apps (both under Settings > Apps > Special app access). The second one shows which apps have been allowed to sideload. If Chrome, a file manager and a messaging app are all enabled, someone used them to install something.
Usage access
Settings > Apps > Special app access > Usage access (Samsung: Settings > Security and privacy > Other security settings > Usage data access, on some versions). This is PACKAGE_USAGE_STATS. Digital Wellbeing and launchers use it. Monitoring apps use it to report what you open.
Older Android (9 and below)
Settings > Apps & notifications > App permissions (Pixel) or Settings > Apps > Permissions (Samsung). No dashboard, no timeline. Background location is not a separate grant, which means any app with location can use it in the background. The special-access screens exist but are harder to find; search Settings for "accessibility", "device admin" and "notification access".
If you find something, screenshot the permission screen, the accessibility screen and the app info page before you change anything. Dates and app names on those screenshots are evidence. The GuestSpy PDF report does the same job for a scanned APK.
What the audit screen shows, and why
When you scan an APK, the permission audit section of the deep report shows:
- 1
Tier groups
Critical at the top, each permission with its one-sentence meaning and ATT&CK technique. - 2
Combination rules
that fired, with the exact permissions they are built from highlighted. - 3
Special-access components
(accessibility, device admin, notification listener) pulled up from the Components section, because they belong in the same mental model. - 4
Comparison to the declared purpose
where the app’s category can be inferred from its label and Play Store listing. This is advisory, not a verdict. - 5
Grant status
when the scan came from the GuestSpy Android app rather than a loose APK: whether each permission is actually allowed on this device right now, not just declared. A declared-but-deniedREAD_SMSis a request; a granted one is a capability.
Sync Services v2.4.1
com.guest · APK · 4.2 MB · SHA-256 7f3a9c…e21bIdentity
- Package
- com.guest
- Label
- Sync Services
- SDK
- API 19 → API 22
- Launcher icon
- none
- Signer
- CN=Unknown, O=Unknown · RSA 2048
- Valid
- 2015-03-02 → 2042-07-19
Permissions by tier
- CREAD_SMS
- CREAD_CALL_LOG
- CACCESS_BACKGROUND_LOCATION
- CRECORD_AUDIO
- CBIND_ACCESSIBILITY_SERVICE
- CBIND_DEVICE_ADMIN
Network indicators
- guestspy.com known infrastructure
- media-sync-a.thetruthspy.com known infrastructure
- api.github.com
- 69.64.81.166 known C2 IP
ATT&CK techniques
Frequently asked questions
Does an app need to be open to use a permission?
No. Once a permission is granted, an app with a background service, a boot receiver or a scheduled job can use it when the screen is off and the app is not in Recents. This is why the Medium tier matters: it is the set of permissions that let an app be alive when you are not looking at it.
My partner’s family-tracking app asks for a lot of these. Is it stalkerware?
The technical answer is that it is probably watchware (class WCH) if it is a visible, Play Store app with a clear notification. The human answer is that monitoring between adults without ongoing, freely given consent is a problem regardless of the app’s class. If you want it gone and are worried about the reaction, see the safety page first.
Can I trust the "Installed from" line?
Mostly. Android records which app performed the install. A sideloaded app will say Chrome, Files, a messaging app or "Unknown". A device-admin app or a factory-installed app can show as "System". It is good evidence but not proof on its own.
Why does the scanner list permissions the app doesn’t actually use?
The audit reads what is declared in the manifest. Developers sometimes declare permissions they no longer use, and some libraries pull in permissions the app never calls. Declared permissions are still a capability, and still appear in the system’s grant screens. Combination rules are designed to be resistant to this noise; a stray WAKE_LOCK does not make an app suspicious.
Can an app read my WhatsApp or Signal messages?
Not through SMS permissions. But an accessibility service can read the message text as it appears on screen, and a notification listener can read the message text in the notification. Both are explained above, and both are listed in the Critical tier for exactly this reason.
Run a free scan right now
Drop an APK, a file, your installed-apps list or an iPhone configuration profile into the GuestSpy Web Scanner. Everything is analysed inside your browser. Nothing is uploaded.