Important note on file paths and line numbers: The viral post analyzed APK v4.6.186, while this report analyzes v4.6.188. Android apps use ProGuard/R8 obfuscation, which renames classes and shifts line numbers between builds. Furthermore, different JADX versions and settings produce different output. Throughout this report, where we state that a specific file path from the viral post was "not found," this means not found in our specific decompilation of v4.6.188 — the underlying functionality may exist at different paths. The viral post's file paths may have been valid for their version and toolchain. We have independently verified the presence or absence of each claimed behavior, regardless of file paths.
A viral Facebook post accused Kahf Guard of being a "remote-controlled trojan" that "sells user data to Facebook" and conducts "extreme surveillance." This report independently verifies each claim against the decompiled APK code, the published privacy policy, and the CEO's public statements.
Understanding the product context: Kahf Guard is primarily a content-blocking and digital wellbeing app designed to help users avoid haram content on the internet. It uses DNS-level blocking to filter harmful websites and Accessibility Service permissions to block specific content within apps (e.g., Reels, Shorts, adult content in browsers). For such a product to be effective, the developers need analytics to measure whether their blocking is actually working — are users spending less time on harmful content? Are the filters effective? Which features are most used? This is a legitimate need, similar to how any product needs feedback loops to improve. The question is not whether analytics should exist, but whether the specific analytics choices are proportionate and properly disclosed.
Key findings:
| Aspect | Verdict |
|---|---|
| Facebook SDK present? | TRUE — Confirmed in KahfGuardApp.m4516b() |
| AdvertiserID enabled? | TRUE — com.facebook.sdk.AdvertiserIDCollectionEnabled = true |
| AutoLogEvents enabled? | TRUE — com.facebook.sdk.AutoLogAppEventsEnabled = true |
| Advanced Matching infrastructure present? | TRUE (but passive) — Facebook SDK's UserDataStore code exists in ec/C3439k.java with fields for email, first_name, last_name, phone. However, Kahf Guard's own code does NOT actively call setUserData(), setUserEmail(), etc. Zero calls to these methods were found in the com/kahf/dns/ package. The UserDataStore code is latent SDK library code that ships with every Facebook SDK integration, not something the app actively uses to push PII to Meta. |
| "Sold to Facebook"? | FALSE — SDK telemetry for ad attribution is not a direct data sale. Furthermore, no evidence was found of the app actively sending user email/name/phone to Facebook. |
File path hg/l0.java lines 97-109? | Not found — Not found in our v4.6.188 decompilation. May have existed in v4.6.186. The corresponding SDK code is in ec/C3439k.java in our build. |
What Facebook SDK actually collects in this integration: With AdvertiserID and AutoLogEvents enabled, the SDK automatically collects: Google Advertising ID (GAID), app install/launch events, device metadata (OS, model, carrier, etc.). These are standard SDK auto-events. The Advanced Matching feature (which could send email/name/phone) exists as library code but is not actively invoked by Kahf Guard's application code — the data fields for email, name, and phone that users provide during account creation are stored in Kahf's own SharedPreferences, not passed to Facebook's UserDataStore.
Standard practice context: Facebook SDK / Meta SDK is used by millions of apps for install attribution and ad campaign measurement. Its presence is standard industry practice.
Is Kahf Guard a "privacy app"? The website markets Kahf Guard as a content-blocking and digital wellbeing app... The app is not primarily marketed as an anti-Big-Tech-tracking tool. It's a haram content blocker and parental control app. The CEO's claims about "zero surveillance" and "no data collection" create a privacy expectation, but the website itself focuses on content blocking, not privacy protection per se.
Privacy policy disclosure: The privacy policy does list "Facebook Analytics" under Third Party Access. The privacy policy claims "Only aggregated, anonymized data is periodically transmitted to external services." Regarding whether the Facebook SDK actually sends Personally Identifiable Information (PII): the SDK sends the Google Advertising ID (GAID) and auto-logged events, which are device-level identifiers — not PII like email or name.
| Aspect | Verdict |
|---|---|
| Reads browser URLs? | TRUE — KahfBlockerService uses Android Accessibility Service |
| 17 browsers? | CLOSE — Actually 18 browser package IDs in the code |
File path ei/a.java lines 24/287? | Not found — Not found in our v4.6.188 decompilation. Actual code is in KahfBlockerService.java (line 81 area) in our build. |
The 18 monitored browsers: Chrome, Chrome Dev, Firefox, Firefox Rocket, Samsung Browser, Opera, Opera Mini, Microsoft Edge, Brave, DuckDuckGo, Vivaldi, Tor Browser, Spin Browser, Ecosia, Free Adblocker Browser, IDM Browser, Cast Web Video Browser, Kahf Browser.
Standard practice context: This is how ALL Android content blockers that need URL-level filtering work. DNS-level blocking cannot see HTTPS paths. To block Instagram Reels while allowing DMs, or block specific YouTube content, the app must read the URL from the browser's accessibility nodes. This is the necessary mechanism, not evidence of surveillance.
| Aspect | Verdict |
|---|---|
| Secondary signature exists? | TRUE — ALLOWLISTED_SIG = "Vn3kj4p..." in com.pairip.SignatureCheck |
| "Anyone can sign malware with it"? | FALSE — Only the holder of the corresponding private key can produce a matching signature |
| Is this a backdoor? | FALSE — Standard dual-signing pattern for multi-channel distribution (Play Store, direct APK, etc.) |
Standard practice context: PairIP is a legitimate anti-piracy/anti-tamper library used by many Android apps. Allowlisted signatures are standard for enterprise/official builds across different distribution channels. This is not a security vulnerability.
| Aspect | Verdict |
|---|---|
| evaluateJavascript used? | TRUE — In p176hl/C5181p.java and p000/C12905z0.java |
| Remote server pushes arbitrary JS? | NOT PROVEN — The JavaScript strings come from the app's internal state machine, not directly from a remote endpoint |
File path bl/r.java lines 56-63? | Not found — Not found in our v4.6.188 decompilation. |
Standard practice context: evaluateJavascript() is the standard Android API for injecting JavaScript into WebViews. It's used here for content filtering (removing Reels from Instagram web view, etc.). The injected JS is app-defined, not server-pushed. All apps that use WebViews for content modification use this API. This is not a backdoor.
| Aspect | Verdict |
|---|---|
| Multiple system events monitored? | TRUE |
| 12 events? | TRUE — Combined across HeartbeatReceiver and SystemEventReceiver |
| Purpose is surveillance? | MISLEADING — Purpose is to keep the blocking service alive |
12 events confirmed: BOOT_COMPLETED, LOCKED_BOOT_COMPLETED, MY_PACKAGE_REPLACED, DATE_CHANGED, ACTION_POWER_CONNECTED, ACTION_POWER_DISCONNECTED, USER_PRESENT, TIME_SET, TIMEZONE_CHANGED, PACKAGE_REPLACED, SCREEN_ON, BATTERY_OKAY
Standard practice context: Any Android service that must run persistently (content blockers, parental controls, VPNs, fitness trackers) needs to restart after system events. If the blocking service dies, the user loses protection. This is a standard and necessary pattern, not evidence of surveillance.
| Aspect | Verdict |
|---|---|
| Social apps monitored? | TRUE — 14 social apps total |
| WhatsApp chat list tracking? | MISLEADING — The app monitors which tab/screen the user is on (e.g., whether the "Updates"/Status tab is selected), NOT the actual chat list contents or contact names. It reads accessibility node IDs like com.whatsapp:id/navigation_bar_item_large_label_view to detect tab labels ("Updates") and com.whatsapp:id/updates_list for the Status container. This is screen-state detection for blocking WhatsApp Status/Stories, not reading who you're chatting with. |
| Telegram text reading? | TRUE — Reads accessibility nodes for content/word detection (for "risky word" blocking feature) |
| Instagram monitoring? | TRUE — Monitors for Reels blocking via node IDs like reel_recycler, clips_viewer_view_pager |
| All installed apps sent to server? | TRUE — GetChildDevicesQuery includes installedApps { packageName, appName, isSystemApp } |
File path xg/o0.java line 18? | Not found — actual file is p081dh/C3057o0.java in our build |
Core set (6 apps): YouTube, Instagram, Facebook, Telegram, WhatsApp, WhatsApp Business
Extended set (8 apps): Twitter/X, TikTok, Snapchat, Reddit, Threads, Pinterest, Discord, Tumblr
Standard practice context: Content-blocking / parental-control apps MUST monitor app screens to implement blocking features. To block Reels without blocking all of Instagram, the app needs to distinguish screen context via accessibility nodes. This is how Screen Time, Google Family Link, and similar products work. The monitoring is the mechanism for the product's core feature — users grant explicit accessibility permission, which Android explains.
Why installed app list and usage data sync is legitimate for ALL users (not just parental control): Kahf Guard was originally built as a personal accountability tool before parental control was added later. For the app to fulfill its primary mission — helping users stay away from harmful content — the developers need to understand user patterns: Are users finding ways to bypass blocking? Which apps are users gravitating toward? Is the app actually reducing time on problematic apps? This data helps improve the blocking algorithms and detect circumvention patterns.
That said, it would be better practice to clearly disclose this in the privacy policy and give users granular control over what data is synced.
| Aspect | Verdict |
|---|---|
| Server can silently trigger data sync? | TRUE — FCM data messages with "Silent sync message, no notification displayed" |
| Installed apps sync triggered? | TRUE — installed_apps_sync enqueues InstalledAppsSyncWorker |
| App usage sync triggered? | TRUE — app_usage_sync enqueues AppUsageSyncWorker |
| Is it a "trojan"? | FALSE — These are parental control infrastructure, not malware |
| File path lines 1580/1663? | CANNOT VERIFY — The onMessageReceived method (2344 instruction units) did not fully decompile; --show-bad-code output is fragmented |
6 confirmed FCM message types: restriction_update, permission_sync, metadata_update, DNS sync, installed_apps_sync, app_usage_sync, supervision_update
Standard practice context: Silent FCM pushes for parental control sync are used by Google Family Link, Qustodio, Bark, and similar products. Parents need to remotely check their child's device status without the child dismissing a notification. This is standard parental control architecture.
Legitimate concern: The same mechanism that allows a parent to check their child's device also allows Kahf's server to request data from ANY user's device silently. There is no visible code-level distinction between "parent requesting" and "server collecting." The trust model depends entirely on server-side logic, which cannot be verified through static analysis.
| Aspect | Verdict |
|---|---|
| UUID backed up to Google Cloud? | PARTIALLY TRUE — backup_rules.xml backs up user_prefs.xml and device_data/ |
| "Forever tracking"? | FALSE — Standard Android Auto Backup; not a tracking mechanism |
Standard practice context: This is standard Android Auto Backup — a convenience feature so that if a user loses their phone or switches devices, their app settings are automatically restored when they reinstall. Think of it like how your Chrome bookmarks sync across devices, or how WhatsApp restores your settings on a new phone. Thousands of apps use this. The user doesn't have to reconfigure everything from scratch. This has nothing to do with tracking — it's a user convenience feature built into Android itself.
| Aspect | Verdict |
|---|---|
| 11 third-party IP services? | PARTIALLY TRUE — In our analysis, we found 6 geolocation services + 7 IP-retrieval endpoints = 13 total IP-related endpoints. The viral post's count of 11 doesn't exactly match, but the general claim of multiple IP services is accurate. |
| Plain HTTP service? | TRUE — http://ip-api.com/json/{ip} (no TLS) is used as Fallback #3 |
6 geolocation services (fallback chain in p000/C11771x0.java):
1. https://api.ipify.org (IP retrieval)
2. https://api.bigdatacloud.net/data/ip-geolocation?ip= (Fallback #1)
3. https://freeipapi.com/api/json/ (Fallback #2)
4. http://ip-api.com/json/ (Fallback #3 — PLAIN HTTP)
5. https://ipapi.co/{ip}/country_name/ (Fallback #4)
6. https://ipinfo.io/{ip}/json (Final fallback)
7 additional IP-retrieval endpoints (in sg/C9792j.java):
api.ipify.org, api.myip.com, checkip.amazonaws.com, api.ip.sb/ip, icanhazip.com, ipecho.net/plain, ipinfo.io/ip (all HTTPS)
Standard practice context: Using multiple IP geolocation services as fallbacks is common for apps that need country detection (for DNS server selection, pricing, language defaults). The IP services are only used to determine the user's country for routing purposes.
On the plain HTTP service (ip-api.com): The viral post flags this as a security vulnerability. In practice, this service simply tells the app what the user's public IP is. Anyone monitoring the user's network traffic would already know their IP address — it's visible in every packet header. So while using HTTPS is always better practice, the "security risk" here is minimal: the data being "leaked" (your IP address) is already inherently visible to any network observer. The free tier of ip-api.com does not support HTTPS, which is why developers use it over HTTP. It's a minor best-practice issue, not a meaningful security vulnerability.
| Aspect | Verdict |
|---|---|
| VMRunner.invoke used at boot? | TRUE — BootReceiver.onReceive() calls VMRunner.invoke("WYWlOOlYRm2t3AHk", ...) |
| Encrypted/obfuscated code? | TRUE — VMRunner loads bytecode from the PairIP native library (libpairipcore.so) |
| "Can't analyze what it does"? | PARTIALLY TRUE — Static analysis alone cannot determine what runs in the VM; dynamic analysis (instrumentation) would be needed |
Standard practice context: PairIP is a commercial anti-piracy/anti-tamper solution used by many Android apps to protect against cracking and redistribution. It's common for boot-initialization code to be protected this way. While this does make auditing harder, it's not evidence of malicious intent — it's evidence of commercial software protection.
| Aspect | Verdict |
|---|---|
| OpenReplay present in our build? | NOT FOUND — No OpenReplay integration found in our decompilation |
openreplay.kahf.co.uk endpoint? | ENDPOINT IS LIVE — While not present in our v4.6.188 build code, the domain openreplay.kahf.co.uk resolves to a live web application. This confirms the viral post author likely found it in their v4.6.186 build, and the endpoint still exists on Kahf's infrastructure. It may have been replaced by PostHog in newer versions, or may coexist for other products/builds. |
| Session replay exists in current build? | TRUE — PostHog (not OpenReplay) with session replay infrastructure at https://p.kahf.co.uk |
| Can capture taps/swipes/keystrokes? | TRUE (of Kahf Guard's own screens only) — PostHog replay includes RRMouseInteraction, RRFullSnapshotEvent, keyboard events |
File path com/openreplay/tracker/listeners/Analytics.java? | Not found — may have existed in the viral post author's v4.6.186 build |
PostHog configuration:
- API Key: phc_OmqCNJqYWGInDc1b3GQEGWDnPPIV6etPJ1bO7pLRL8N
- Session replay: enabled in client config
- captureLogcat: NOT hardcoded as enabled — controlled by server-side PostHog config (consoleLogRecordingEnabled), defaults to false
- Default masking: text inputs masked, images masked, passwords always masked
Critical scope clarification: PostHog session replay can only capture Kahf Guard's own app screens (settings, onboarding, dashboard). It CANNOT see your activity in Chrome, WhatsApp, Instagram, or any other app. Android's application sandbox (each app gets a unique UID and kernel-level process isolation) prevents any SDK from seeing other apps' content. The viral post's implication that session replay records "everything you type" across all apps is technically impossible on Android — this is a fundamental misunderstanding of how mobile operating systems work.
Is session replay within the app concerning? Realistically, Kahf Guard's own screens contain only settings toggles (enable/disable blocking, configure filters, etc.) and dashboard views. There is no personal content within the app itself — no messages, no browsing history, no sensitive data entry beyond the initial account creation. Recording how users interact with settings screens is standard UX analytics that helps developers understand which features are confusing, which settings are most toggled, and where users get stuck. Thousands of apps (banking, e-commerce, social media) use session replay for exactly this purpose. PostHog is a well-respected open-source analytics platform, and using it for in-app UX analytics is normal developer practice.
However: PostHog is NOT disclosed in the privacy policy. This is a significant omission that should be corrected, regardless of how benign the data captured is. Transparency is important.
The viral post directly challenges specific CEO statements. Here's the fact-check:
| Verdict | Likely true in the literal sense |
|---|
"Sell" implies a direct commercial transaction. There is no evidence that Kahf receives payment from Meta for user data. The Facebook SDK sends device-level advertising identifiers (GAID) and auto-logged events for ad attribution, but the app does not actively push PII (email, name, phone) to Facebook. The CEO's statement is likely accurate in the narrow sense — they don't "sell" data. However, SDK telemetry IS shared with Meta's ad network as a side-effect of using the Facebook SDK, which the CEO should acknowledge.
| Verdict | Needs clarification — local monitoring is functional, not surveillance; server-side analytics could be better disclosed |
|---|
The app:
- Monitors 18 browsers' URL bars via Accessibility Service
- Reads accessibility nodes from 14 social apps
- Syncs installed app lists every 6 hours
- Syncs per-app usage data every 6 hours
- Can be silently triggered via FCM to sync both immediately
- Integrates Facebook SDK with advertiser tracking
- Has PostHog session replay infrastructure (for its own screens)
However, not all of this is "surveillance" in any meaningful sense. The local device monitoring (browser URLs, social app screens, installed apps detection) is the core mechanism by which content blocking and digital wellbeing features work. You cannot block Reels without knowing the user is looking at Reels. You cannot enforce screen time limits without tracking app usage. This is functional monitoring required by the product, not surveillance for its own sake — the same way a security camera at a bank isn't "surveillance" in the pejorative sense.
Where the CEO's claim falls short: The analytics that go to external servers (Facebook SDK telemetry, PostHog analytics, periodic usage/app data syncs to Kahf's backend) are not "zero surveillance." A more honest framing would be: "We collect analytics to measure our blocking effectiveness, improve the product, and help parents monitor children's devices. The data collected is primarily device-level identifiers and usage patterns, not personal content." The CEO should have been transparent about this instead of using absolutes like "zero."
| Verdict | Contradicted by the code and the privacy policy |
|---|
AppUsageSyncWorker uploads per-app usage durations every 6 hoursInstalledAppsSyncWorker uploads the full app inventory every 6 hoursThe CEO's own privacy policy contradicts this statement. However, an important nuance: the usage data is synced using a device ID (deviceId), not a user ID or email address. The GraphQL mutation UpdateDeviceInstalledApps($deviceId: ID!, $apps: [InstalledAppInput!]!) identifies data by device, not by person. While this is not fully "anonymized" (a device ID can be correlated to a user account), it does suggest the data is handled at a device level rather than being tied to a personal profile. The CEO should have said something like: "We collect device-level usage data to measure blocking effectiveness and improve our product, as described in our privacy policy."
| Verdict | Ironic but technically valid |
|---|
Credit where due — the app can be decompiled and analyzed. It's not completely locked down, and this entire analysis was possible. However, key parts (BootReceiver) are protected by PairIP's VMRunner, which is specifically designed to resist decompilation.
Policy effective date: 2024-12-04 (per website footer)
p.kahf.co.uk is never mentionedThe policy is a reasonable framework — it does disclose the major third-party integrations (Facebook, Firebase) and the types of data collected. It does not try to claim zero data collection. However, it has significant gaps (PostHog, session replay, FCM triggers) and makes one claim ("only aggregated, anonymized data") that is directly contradicted by the SDKs' actual behavior.
Verified against both JADX outputs (jadx_out and jadx_out_showbad) in the com.kahf.dns package:
| Output | Log calls found | Unique source files |
|---|---|---|
jadx_out (standard decompilation) | 150 | 20 |
jadx_out_showbad (--show-bad-code) | 225 | 21 |
The extra 75 calls in the --show-bad-code output come primarily from AndroidNotificationService.java, which was too large for the standard decompiler to fully reconstruct. The sensitive log lines discussed below are only visible in jadx_out_showbad — they were not recoverable from standard JADX output.
captureLogcat: PostHog's Android SDK has an optional logcat capture mode. In Kahf Guard's decompiled code, captureLogcat is NOT enabled. The default is false. These logs are NOT sent to PostHog.Crashlytics.log()). It does not automatically read device logcat statements.Bottom line: Developer logs stay on the device and are not captured or transmitted by any analytics SDK in this build.
Low sensitivity (operational/debug):
- AccessibilityMonitor (AccessibilityMonitorService.java): logs service enable/disable transitions, grace period states, safety-net polling
- BlockOverlay (C2486o.java, C2488p.java): overlay creation errors, animation failures — 40+ log calls
- BlockPauseManager (C2497u.java): logs pause/unpause actions for blocked apps
- HeartbeatReceiver.java: logs service restart attempts
Medium sensitivity (configuration data):
- KahfGuardApp.java: "AndroidBillingManager initialized", "Failed to initialize billing/restriction/silence" — all from the AutoSilencePro tag
- RescheduleWorker.java, SilenceModeWorker.java: prayer scheduling and silence mode logs
Higher sensitivity — confirmed in AndroidNotificationService.java (jadx_out_showbad only):
AndroidNotificationService.java:436:
Log.d("KG_SYNC", "[FCM_TOKEN] New token generated: " + AbstractC10230n.m14287O0(20, token) + "...")
Logs the first 20 characters of the Firebase Cloud Messaging registration token. The truncation helper (m14287O0(20, ...)) limits exposure, but a portion of a sensitive credential is still written to logcat.
AndroidNotificationService.java:554:
Log.d("SZ_NOTI", "Message received: data - " + remoteMessage.getData())
Logs the complete key-value map of every incoming FCM push. This can include notification_id, image_url, title, body, click_url, compose_screen, and server-defined restriction/sync parameters.
AndroidNotificationService.java:332, 336:
Log.d("SZ_NOTI", "createPendingIntent: Received clickUrl = ".concat(str7))
Log.d("SZ_NOTI", "createPendingIntent: Opening URL - ".concat(str7))
Full URL from the FCM notification's click_url field is logged when building the pending intent.
MainActivity.java:387:
Log.d("Auth", "Got token from deep link: " + AbstractC10230n.m14287O0(10, strM10946a))
Logs the first 10 characters of an authentication token received via deep link URL. Again truncated with the same m14287O0 helper, but still partially exposed.
These are developer debug logs left in a production build — a common but sloppy practice. The risk level depends on context:
- On Android 4.1+: logcat is process-private — other installed apps cannot read these logs without special permissions.
- Via ADB (USB debugging): if debugging is enabled and the device is connected to a computer, all logs are readable by the connected machine.
- Truncated token logging (20 chars for FCM token, 10 chars for auth token) is better than logging the full secret, but is still unnecessary exposure.
- Full FCM payload logging is the most concerning item — it logs every server-originated command as plaintext, which would reveal restriction configurations, device IDs, and sync types to anyone with ADB access.
Important note: these logs are not visible in the standard jadx_out decompilation because AndroidNotificationService.onMessageReceived() is a 2344-instruction method that the standard decompiler stubbed out. They only became visible with --show-bad-code. This does not mean the logs don't exist at runtime — they are compiled into the APK.
These logs are not surveillance, but they represent developer negligence. A production release should strip debug Log.d calls out (via ProGuard rules) or at minimum avoid logging partial secrets and full server payloads.
| Capability | Why it's needed | Industry comparison |
|---|---|---|
| Browser URL monitoring via Accessibility | DNS can't see HTTPS paths | All Android content blockers (NetGuard, AdGuard, etc.) |
| Social app screen monitoring | Block Reels/Shorts/Status specifically | Bark, Qustodio, Google Family Link |
| Installed app list (child devices) | Parents need to see what kids install | Google Family Link, Apple Screen Time |
| Usage duration tracking | Measure if blocking is effective | Screen Time, Digital Wellbeing |
| Firebase Analytics + Crashlytics | Standard crash reporting and usage metrics | Used by ~80% of Android apps |
| Boot/system event receivers | Keep blocking service alive across reboots | All persistent services |
| FCM silent sync (parental control) | Parents remotely check child devices | Google Family Link uses similar patterns |
| Capability | Blocking need? | Present? | Concern level |
|---|---|---|---|
| Facebook SDK with AdvertiserID | Not needed for blocking | Yes | MEDIUM — Not needed for blocking functionality; the CEO claims no data is collected, yet SDK telemetry flows to Meta's ad network. The app is not primarily marketed as a privacy app, but the CEO's claims create a privacy expectation that this contradicts. |
| PostHog session replay (own screens) | Useful for UX improvement | Infrastructure present | LOW — Records only Kahf Guard's own settings/dashboard screens. Standard developer practice for UX optimization. However, not disclosed in privacy policy. |
| Installed apps sync for ALL users | Useful for blocking effectiveness | Yes (all users) | LOW-MEDIUM — Helps detect circumvention patterns and know which apps to target. Was part of the product before parental control was added. Should be clearly disclosed. |
| Usage sync for ALL users | Useful for measuring blocking goals | Yes (all users) | LOW-MEDIUM — Necessary to know if the app is achieving its goal (reducing time on harmful content). Data is device-identified, not user-identified. Should be clearly disclosed. |
| Plain HTTP IP service fallback | Minor best-practice issue | Yes (ip-api.com) | LOW — The "leaked" data (your IP) is inherently visible to network observers already. |
| # | Claim | Accuracy | Notes |
|---|---|---|---|
| 1 | Facebook SDK sends data to Meta | PARTIALLY TRUE | SDK telemetry (GAID, auto-events) flows to Meta, but app does NOT actively send PII. "Sold" is wrong framing. |
| 2 | Reads URLs from 17 browsers | TRUE (18 actually) | Standard for content blockers |
| 3 | ALLOWLISTED_SIG is a backdoor | FALSE | Standard dual-signing |
| 3b | evaluateJavascript = remote code exec | FALSE | Local WebView content filtering |
| 4 | 12 system events restart tracking | TRUE | Standard for persistent services |
| 5 | Monitors WhatsApp/Telegram/Instagram | TRUE | Standard for content/parental control. WhatsApp: monitors screen state/tabs, NOT chat content. |
| 6 | FCM silently uploads data | TRUE | Standard for parental control and accountability tools |
| 7a | UUID persists after uninstall | MISLEADING | Standard Android backup for user convenience, not a tracking mechanism |
| 7b | 11 IP services, one HTTP | PARTIALLY TRUE | 13 total IP endpoints found in our build; 1 plain HTTP confirmed (minimal real-world risk) |
| 8 | BootReceiver code is hidden | TRUE | PairIP anti-tamper; standard commercial practice |
| 9 | OpenReplay records everything | WRONG NAME, but endpoint exists | PostHog in v4.6.188, but openreplay.kahf.co.uk is a live endpoint. Either way: records own screens only — literally impossible to record other apps on Android. |
| 10 | CEO statements are lies | PARTIALLY TRUE | Some claims are contradicted by code and privacy policy, but the app is less malicious than portrayed |
| Claim | Accuracy | Notes |
|---|---|---|
| "Never sell your data" | Likely true | No evidence of direct data sale. SDK telemetry flows to Meta but app doesn't actively push PII. |
| "Zero surveillance" | Misleading | Local monitoring is functional (required for blocking), but server-side analytics should be acknowledged |
| "No data collection" | FALSE | Contradicted by code AND their own privacy policy |
| "Data is safe / sacred trust" | Unverifiable | Depends on server-side security, which static analysis cannot assess |
| Privacy policy is complete | FALSE | PostHog, session replay, and FCM triggers not disclosed |
Kahf Guard is not a trojan. It is a legitimate content-blocking, digital wellbeing, and parental-control app that requires monitoring capabilities to function. Most of its "surveillance" features are standard for the product category and are used by comparable products from Google, Apple, and established parental control vendors.
The app has a legitimate need for analytics. Kahf Guard's core mission is helping users avoid haram content and reduce digital addiction. To know whether the app is actually achieving this goal, the developers need data: Are blocked sites being bypassed? Is time on social media decreasing? Which blocking features are most effective? Without this feedback loop, they cannot improve the product. Firebase Analytics, Crashlytics, and a self-hosted analytics tool like PostHog are reasonable choices for these questions.
However, Kahf Guard has real transparency problems:
The viral post raises valid questions but wraps them in dangerous hyperbole. Calling a legitimate app a "trojan," claiming users are "sold to Facebook," and describing standard Android backup as permanent tracking are factual errors that undermine the post's credibility. Many of the specific file paths cited were either from a different version or fabricated. The post also fundamentally misunderstands Android's application sandbox — session replay SDKs CANNOT see what you do in other apps, which is one of the scariest-sounding claims and is technically impossible.
The real issue is not malice, but communication. Kahf Guard is a useful product for its target audience. Its monitoring capabilities exist because the product requires them, not for surveillance. But the gap between the CEO's marketing ("zero surveillance," "no data collection") and the actual code (Facebook SDK, PostHog, periodic syncs) creates a trust problem that the viral post exploited. The solution is straightforward: update the privacy policy, be honest about analytics in marketing materials, and consider whether the Facebook SDK is truly necessary for a product in this category.
This report is an independent technical assessment based on static code analysis of APK v4.6.188 using JADX 1.5.5. The viral post analyzed v4.6.186 with potentially different tooling — file paths and line numbers differ between versions due to obfuscation. Server-side behavior, runtime feature flags, and data handling practices cannot be verified through APK decompilation. The findings here represent what the code is capable of, not necessarily what is actively deployed for all users at all times. AI was heavily used throughout the research, analysis and verification process. Human involvement was also significant at the last step of verifying the final report for accuracy, coherence and readability. The report is intended to be factual and balanced, but readers should be aware of the limitations of static analysis and the potential for undisclosed server-side behavior.
ফাইলের পাথ এবং লাইন নম্বর সম্পর্কে গুরুত্বপূর্ণ নোট: ভাইরাল পোস্টটিতে APK v4.6.186 বিশ্লেষণ করা হয়েছিল, যেখানে এই রিপোর্টটি v4.6.188 বিশ্লেষণ করেছে। অ্যান্ড্রয়েড অ্যাপগুলো ProGuard/R8 অবসফাসকেশন ব্যবহার করে, যা প্রতিটি বিল্ডের সময় ক্লাসের নাম পরিবর্তন করে এবং লাইন নম্বর শিফট করে। তাছাড়া ভিন্ন JADX ভার্সন ভিন্ন আউটপুট দেয়। এই রিপোর্টে যেখানেই বলা হয়েছে যে ভাইরাল পোস্টের কোনো নির্দিষ্ট ফাইলের পাথ "পাওয়া যায়নি," তার অর্থ হলো আমাদের v4.6.188 ডিকম্পাইলেশনে সেটি পাওয়া যায়নি — মূল ফাংশনালিটি ভিন্ন কোনো পাথে থাকতে পারে। আমরা ফাইলের পাথ যাই হোক না কেন, প্রতিটি দাবিকৃত বিহেভিয়ার (আচরণ) স্বাধীনভাবে যাচাই করেছি।
একটি ভাইরাল ফেসবুক পোস্টে কাহফ গার্ডকে "রিমোট-কন্ট্রোলড ট্রোজান" বলে অভিযোগ করা হয়েছে, যা "ফেসবুকের কাছে ব্যবহারকারীর ডেটা বিক্রি করে" এবং "চরম নজরদারি" (extreme surveillance) চালায়। এই রিপোর্টটি ডিকম্পাইল করা APK কোড, পাবলিশ করা প্রাইভেসি পলিসি এবং সিইও-র পাবলিক স্টেটমেন্টের বিপরীতে স্বাধীনভাবে প্রতিটি দাবি যাচাই করেছে।
প্রোডাক্ট কনটেক্সট বোঝা: কাহফ গার্ড মূলত একটি কন্টেন্ট-ব্লকিং এবং ডিজিটাল ওয়েলবিয়িং অ্যাপ, যা ব্যবহারকারীদের ইন্টারনেটে হারাম কন্টেন্ট থেকে দূরে থাকতে সাহায্য করে। ক্ষতিকর ওয়েবসাইট ফিল্টার করতে এটি DNS-লেভেল ব্লকিং এবং অ্যাপের ভেতরের নির্দিষ্ট কন্টেন্ট (যেমন: রিলস, শর্টস, ব্রাউজারে অ্যাডাল্ট কন্টেন্ট) ব্লক করতে Accessibility Service পারমিশন ব্যবহার করে। এমন একটি প্রোডাক্টকে কার্যকর করতে ডেভেলপারদের অ্যানালিটিক্স প্রয়োজন হয়, যাতে তারা বুঝতে পারেন তাদের ব্লকিং ঠিকমতো কাজ করছে কি না—ব্যবহারকারীরা কি ক্ষতিকর কন্টেন্টে কম সময় দিচ্ছেন? ফিল্টারগুলো কি কার্যকর? কোন ফিচারগুলো সবচেয়ে বেশি ব্যবহৃত হচ্ছে? এগুলো যেকোনো প্রোডাক্টের উন্নতির জন্যই একটি বৈধ প্রয়োজন। মূল প্রশ্নটি এটা নয় যে অ্যানালিটিক্স থাকা উচিত কি না, বরং প্রশ্ন হলো অ্যানালিটিক্সের নির্দিষ্ট পছন্দগুলো আনুপাতিক কি না এবং তা সঠিকভাবে ডিসক্লোজ (প্রকাশ) করা হয়েছে কি না।
মূল ফাইন্ডিংস (Key findings):
| বিষয় (Aspect) | রায় (Verdict) |
|---|---|
| Facebook SDK কি আছে? | সত্য — KahfGuardApp.m4516b()-এ নিশ্চিত করা হয়েছে |
| AdvertiserID এনাবল করা? | সত্য — com.facebook.sdk.AdvertiserIDCollectionEnabled = true |
| AutoLogEvents এনাবল করা? | সত্য — com.facebook.sdk.AutoLogAppEventsEnabled = true |
| Advanced Matching ইনফ্রাস্ট্রাকচার আছে? | সত্য (কিন্তু প্যাসিভ) — Facebook SDK-এর UserDataStore কোড ec/C3439k.java-এ আছে, যেখানে email, first_name, last_name, phone এর ফিল্ড রয়েছে। তবে, কাহফ গার্ডের নিজস্ব কোড সক্রিয়ভাবে setUserData(), setUserEmail() ইত্যাদি কল করে না। com/kahf/dns/ প্যাকেজে এগুলো কলের কোনো প্রমাণ পাওয়া যায়নি। এটি নিছক একটি ল্যাটেন্ট (সুপ্ত) SDK লাইব্রেরি কোড যা প্রতিটি Facebook SDK ইন্টিগ্রেশনের সাথেই থাকে। |
| "ফেসবুকের কাছে বিক্রি করেছে"? | মিথ্যা — অ্যাড অ্যাট্রিবিউশনের জন্য SDK টেলিমেট্রি মানে সরাসরি ডেটা বিক্রি নয়। তাছাড়া ব্যবহারকারীর ইমেইল/নাম/ফোন ফেসবুকের কাছে সক্রিয়ভাবে পাঠানোর কোনো প্রমাণ পাওয়া যায়নি। |
ফাইলের পাথ hg/l0.java লাইন ৯৭-১০৯? | পাওয়া যায়নি — আমাদের v4.6.188 ডিকম্পাইলেশনে পাওয়া যায়নি। সম্ভবত v4.6.186-এ ছিল। আমাদের বিল্ডে এর কোড ec/C3439k.java-তে রয়েছে। |
এই ইন্টিগ্রেশনে Facebook SDK আসলে কী সংগ্রহ করে: AdvertiserID এবং AutoLogEvents এনাবল থাকলে SDK স্বয়ংক্রিয়ভাবে সংগ্রহ করে: Google Advertising ID (GAID), অ্যাপ ইনস্টল/লঞ্চ ইভেন্ট এবং ডিভাইস মেটাডেটা (OS, মডেল, ক্যারিয়ার ইত্যাদি)। Advanced Matching ফিচারটি (যা ইমেইল/নাম পাঠাতে পারে) লাইব্রেরি কোড হিসেবে থাকলেও কাহফ গার্ডের কোড দ্বারা তা সক্রিয়ভাবে কল করা হয় না।
স্ট্যান্ডার্ড প্র্যাকটিস কনটেক্সট: Facebook SDK / Meta SDK অ্যাড অ্যাট্রিবিউশন এবং ক্যাম্পেইন পরিমাপের জন্য মিলিয়ন মিলিয়ন অ্যাপ ব্যবহার করে। এটি স্ট্যান্ডার্ড ইন্ডাস্ট্রি প্র্যাকটিস।
প্রাইভেসি পলিসি ডিসক্লোজার: প্রাইভেসি পলিসিতে 'Third Party Access'-এর নিচে "Facebook Analytics"-এর কথা উল্লেখ আছে। তবে পলিসিতে দাবি করা হয়েছে যে "কেবলমাত্র অ্যাগ্রিগেটেড, অ্যানোনিমাইজড ডেটা পাঠানো হয়।"
| বিষয় (Aspect) | রায় (Verdict) |
|---|---|
| ব্রাউজারের URL পড়ে? | সত্য — KahfBlockerService অ্যান্ড্রয়েড অ্যাক্সেসিবিলিটি সার্ভিস ব্যবহার করে |
| ১৭টি ব্রাউজার? | কাছাকাছি — আসলে কোডে ১৮টি ব্রাউজার প্যাকেজ আইডি রয়েছে |
ফাইলের পাথ ei/a.java লাইন ২৪/২৮৭? | পাওয়া যায়নি — আমাদের v4.6.188 ডিকম্পাইলেশনে পাওয়া যায়নি। আসল কোড KahfBlockerService.java (লাইন ৮১-এর আশেপাশে) রয়েছে। |
স্ট্যান্ডার্ড প্র্যাকটিস কনটেক্সট: URL-লেভেল ফিল্টারিংয়ের জন্য অ্যান্ড্রয়েডের সব কন্টেন্ট ব্লকার এভাবেই কাজ করে। DNS-লেভেল ব্লকিং HTTPS পাথ দেখতে পারে না। ইনস্টাগ্রামের রিলস ব্লক করে ডিএম (DM) চালু রাখতে হলে অ্যাক্সেসিবিলিটি নোড থেকেই URL পড়তে হবে। এটি কাজের জন্য প্রয়োজনীয় মেকানিজম, নজরদারির প্রমাণ নয়।
| বিষয় (Aspect) | রায় (Verdict) |
|---|---|
| সেকেন্ডারি সিগনেচার আছে? | সত্য — com.pairip.SignatureCheck-এ ALLOWLISTED_SIG = "Vn3kj4p..." আছে |
| "যে কেউ এটা দিয়ে ম্যালওয়্যার সাইন করতে পারবে"? | মিথ্যা — শুধুমাত্র যার কাছে সংশ্লিষ্ট প্রাইভেট কী (private key) আছে, তিনিই ম্যাচিং সিগনেচার তৈরি করতে পারবেন। |
| এটি কি ব্যাকডোর? | মিথ্যা — বিভিন্ন ডিস্ট্রিবিউশন চ্যানেলের (প্লে স্টোর, ডিরেক্ট এপিকে) জন্য এটি স্ট্যান্ডার্ড ডুয়াল-সাইনিং প্যাটার্ন। |
| বিষয় (Aspect) | রায় (Verdict) |
|---|---|
| evaluateJavascript ব্যবহার হয়েছে? | সত্য — p176hl/C5181p.java এবং p000/C12905z0.java-তে আছে |
| রিমোট সার্ভার ইচ্ছামতো JS পুশ করে? | প্রমাণিত নয় — জাভাস্ক্রিপ্ট স্ট্রিংগুলো অ্যাপের অভ্যন্তরীণ স্টেট মেশিন থেকে আসে, রিমোট এন্ডপয়েন্ট থেকে সরাসরি নয়। |
স্ট্যান্ডার্ড প্র্যাকটিস কনটেক্সট: WebView-এ জাভাস্ক্রিপ্ট ইনজেক্ট করার জন্য evaluateJavascript() হলো স্ট্যান্ডার্ড অ্যান্ড্রয়েড API। এটি এখানে কন্টেন্ট ফিল্টারিংয়ের (যেমন ইনস্টাগ্রাম ওয়েব ভিউ থেকে রিলস সরানো) জন্য ব্যবহার করা হয়েছে। এটি কোনো ব্যাকডোর নয়।
| বিষয় (Aspect) | রায় (Verdict) |
|---|---|
| একাধিক সিস্টেম ইভেন্ট মনিটর করা হয়? | সত্য |
| ১২টি ইভেন্ট? | সত্য — HeartbeatReceiver এবং SystemEventReceiver মিলিয়ে |
| উদ্দেশ্য কি নজরদারি? | বিভ্রান্তিকর — মূল উদ্দেশ্য হলো ব্লকিং সার্ভিসটিকে সচল (alive) রাখা। |
স্ট্যান্ডার্ড প্র্যাকটিস কনটেক্সট: যেকোনো অ্যান্ড্রয়েড সার্ভিস যা সার্বক্ষণিক চলতে হয় (কন্টেন্ট ব্লকার, ভিপিএন, ফিটনেস ট্র্যাকার), তাকে সিস্টেম ইভেন্টের পর রিস্টার্ট হতে হয়। ব্লকিং সার্ভিস বন্ধ হয়ে গেলে ব্যবহারকারী সুরক্ষা হারাবেন। এটি নজরদারির প্রমাণ নয়।
| বিষয় (Aspect) | রায় (Verdict) |
|---|---|
| সোশ্যাল অ্যাপ মনিটর করে? | সত্য — মোট ১৪টি সোশ্যাল অ্যাপ। |
| WhatsApp চ্যাট লিস্ট ট্র্যাকিং? | বিভ্রান্তিকর — অ্যাপটি মনিটর করে ব্যবহারকারী কোন ট্যাব/স্ক্রিনে আছেন (যেমন "Updates"/Status ট্যাব), চ্যাট লিস্টের কন্টেন্ট বা নাম নয়। এটি অ্যাক্সেসিবিলিটি নোড আইডি যেমন com.whatsapp:id/updates_list পড়ে শুধু Status/Stories ব্লক করার জন্য। |
| Telegram টেক্সট পড়া? | সত্য — "risky word" ব্লকিং ফিচারের জন্য অ্যাক্সেসিবিলিটি নোড থেকে টেক্সট পড়ে। |
| Instagram মনিটরিং? | সত্য — রিলস ব্লক করার জন্য reel_recycler ইত্যাদি নোড আইডি মনিটর করে। |
| ইন্সটল করা সব অ্যাপ সার্ভারে পাঠানো হয়? | সত্য — GetChildDevicesQuery-তে installedApps অন্তর্ভুক্ত আছে। |
স্ট্যান্ডার্ড প্র্যাকটিস কনটেক্সট: কন্টেন্ট-ব্লকিং বা প্যারেন্টাল-কন্ট্রোল অ্যাপগুলোকে তাদের ফিচার বাস্তবায়নের জন্য অ্যাপের স্ক্রিন মনিটর করতেই হয়। পুরো ইনস্টাগ্রাম ব্লক না করে শুধু রিলস ব্লক করতে হলে অ্যাক্সেসিবিলিটি নোডের মাধ্যমে স্ক্রিনের কনটেক্সট বুঝতে হবে। Screen Time বা Google Family Link-ও ঠিক এভাবেই কাজ করে।
| বিষয় (Aspect) | রায় (Verdict) |
|---|---|
| সার্ভার নীরবে ডেটা সিঙ্ক ট্রিগার করতে পারে? | সত্য — "Silent sync message" এর মাধ্যমে। |
| Installed apps সিঙ্ক ট্রিগার হয়? | সত্য |
| App usage সিঙ্ক ট্রিগার হয়? | সত্য |
| এটি কি "ট্রোজান"? | মিথ্যা — এগুলো প্যারেন্টাল কন্ট্রোল ইনফ্রাস্ট্রাকচার, ম্যালওয়্যার নয়। |
স্ট্যান্ডার্ড প্র্যাকটিস কনটেক্সট: প্যারেন্টাল কন্ট্রোলের জন্য সাইলেন্ট FCM পুশ Google Family Link, Qustodio ইত্যাদি অ্যাপ ব্যবহার করে। পিতামাতার জন্য সন্তানের ডিভাইসের স্ট্যাটাস নীরবে চেক করতে এটি প্রয়োজন। তবে বৈধ উদ্বেগের বিষয় হলো, একই মেকানিজম ব্যবহার করে কাহফের সার্ভার যেকোনো ব্যবহারকারীর ডেটা নীরবে আপলোড করতে পারে। এটি সম্পূর্ণ সার্ভার-সাইড লজিকের ওপর নির্ভরশীল যা স্ট্যাটিক অ্যানালাইসিসে যাচাই করা সম্ভব নয়।
| বিষয় (Aspect) | রায় (Verdict) |
|---|---|
| Google Cloud-এ UUID ব্যাকআপ হয়? | আংশিক সত্য — backup_rules.xml user_prefs.xml ব্যাকআপ করে। |
| "চিরস্থায়ী ট্র্যাকিং"? | মিথ্যা — এটি স্ট্যান্ডার্ড অ্যান্ড্রয়েড অটো ব্যাকআপ (Android Auto Backup); ট্র্যাকিং মেকানিজম নয়। |
এটি অ্যান্ড্রয়েডের একটি সুবিধাজনক ফিচার (যেমন হোয়াটসঅ্যাপ বা ক্রোম সেটিং রিস্টোর হয়)। হাজার হাজার অ্যাপ এটি ব্যবহার করে।
| বিষয় (Aspect) | রায় (Verdict) |
|---|---|
| ১১টি থার্ড-পার্টি IP সার্ভিস? | আংশিক সত্য — আমরা আমাদের বিশ্লেষণে ১৩টি IP-রিলেটেড এন্ডপয়েন্ট পেয়েছি। সাধারণ দাবিটি সত্য। |
| প্লেইন HTTP সার্ভিস? | সত্য — http://ip-api.com/json/{ip} (বিনা TLS-এ) Fallback #3 হিসেবে ব্যবহৃত হয়। |
সিকিউরিটি ঝুঁকি: ভাইরাল পোস্টে এটিকে বড় সিকিউরিটি ঝুঁকি বলা হলেও বাস্তবে এর মাধ্যমে শুধু আপনার পাবলিক আইপি জানা যায়। আপনার নেটওয়ার্ক ট্র্যাফিক যে মনিটর করছে, সে এমনিতেই আপনার আইপি জানে। যদিও HTTPS ব্যবহার করা বেস্ট প্র্যাকটিস, তবে এখানে বাস্তব ঝুঁকি নগণ্য।
| বিষয় (Aspect) | রায় (Verdict) |
|---|---|
| বুটের সময় VMRunner.invoke ব্যবহার হয়? | সত্য |
| এনক্রিপ্টেড/অবসফাসকেটেড কোড? | সত্য — VMRunner libpairipcore.so থেকে বাইটকোড লোড করে। |
| "কী কাজ করে তা বিশ্লেষণ করা যায় না"? | আংশিক সত্য — শুধুমাত্র স্ট্যাটিক অ্যানালাইসিসের মাধ্যমে বোঝা সম্ভব নয়; ডায়নামিক অ্যানালাইসিস প্রয়োজন। |
স্ট্যান্ডার্ড প্র্যাকটিস কনটেক্সট: PairIP একটি কমার্শিয়াল অ্যান্টি-পাইরেসি সলিউশন যা ক্র্যাকিং ঠেকাতে অনেক অ্যান্ড্রয়েড অ্যাপ ব্যবহার করে। এটি ম্যালওয়্যারের প্রমাণ নয়, বরং কমার্শিয়াল সফটওয়্যার প্রটেকশনের প্রমাণ।
| বিষয় (Aspect) | রায় (Verdict) |
|---|---|
| আমাদের বিল্ডে OpenReplay আছে? | পাওয়া যায়নি — আমাদের ডিকম্পাইলেশনে কোনো OpenReplay ইন্টিগ্রেশন পাওয়া যায়নি। |
openreplay.kahf.co.uk এন্ডপয়েন্ট? | এন্ডপয়েন্টটি লাইভ আছে — কোডে না থাকলেও ডোমেইনটি লাইভ আছে, যা নির্দেশ করে পূর্ববর্তী ভার্সনে এটি হয়তো ছিল। |
| বর্তমান বিল্ডে সেশন রিপ্লে আছে? | সত্য — OpenReplay নয়, বরং PostHog ব্যবহার করে সেশন রিপ্লে ইনফ্রাস্ট্রাকচার (https://p.kahf.co.uk) আছে। |
| ট্যাপ/সোয়াইপ/কীস্ট্রোক রেকর্ড করতে পারে? | সত্য (শুধুমাত্র কাহফ গার্ডের নিজস্ব স্ক্রিনে) |
অত্যন্ত গুরুত্বপূর্ণ ব্যাখ্যা: PostHog সেশন রিপ্লে শুধুমাত্র কাহফ গার্ডের নিজস্ব অ্যাপ স্ক্রিন (সেটিংস, ড্যাশবোর্ড) ক্যাপচার করতে পারে। এটি কোনোভাবেই ক্রোম, হোয়াটসঅ্যাপ, ইনস্টাগ্রাম বা অন্য কোনো অ্যাপের অ্যাক্টিভিটি দেখতে পারে না। অ্যান্ড্রয়েডের অ্যাপ্লিকেশন স্যান্ডবক্স এটি সম্পূর্ণভাবে প্রতিরোধ করে। ভাইরাল পোস্টের দাবি যে এটি "সব অ্যাপে সব রেকর্ড করে" তা অ্যান্ড্রয়েডে টেকনিক্যালি অসম্ভব।
তবে: প্রাইভেসি পলিসিতে PostHog-এর কথা বলা নেই। এটি একটি বড় গাফিলতি যা সংশোধন করা উচিত।
| রায় | আক্ষরিক অর্থে সম্ভবত সত্য |
|---|
অ্যাপটি সক্রিয়ভাবে ব্যবহারকারীর PII (ইমেইল/নাম) ফেসবুকের কাছে পুশ করে না। তবে, Facebook SDK ব্যবহারের কারণে অ্যাড নেটওয়ার্কে টেলিমেট্রি শেয়ার হয়, যা সিইও-র স্বীকার করা উচিত।
| রায় | ব্যাখ্যা প্রয়োজন — লোকাল মনিটরিং কাজের জন্য দরকারি, সার্ভেইল্যান্স নয়; কিন্তু সার্ভার-সাইড অ্যানালিটিক্সগুলো পরিষ্কারভাবে বলা উচিত ছিল। |
|---|
| রায় | কোড এবং প্রাইভেসি পলিসির সাথে সাংঘর্ষিক |
|---|
অ্যাপটি প্রতি ৬ ঘণ্টায় ইনস্টল করা অ্যাপের লিস্ট এবং অ্যাপ ইউসেজ ডেটা সিঙ্ক করে। সিইও-র নিজস্ব প্রাইভেসি পলিসিই এই দাবির বিরোধিতা করে।
| রায় | আইরনিক কিন্তু টেকনিক্যালি বৈধ |
|---|
কার্যকর হওয়ার তারিখ: ০৪-১২-২০২৪
p.kahf.co.uk-এর কথা কোথাও নেই।"শুধুমাত্র অ্যাগ্রিগেটেড, অ্যানোনিমাইজড ডেটা পাঠানো হয়" — Facebook SDK যে Google Advertising ID (GAID) পাঠায় এবং প্রতি-অ্যাপ ইউসেজ ডেটাতে যে প্যাকেজের নাম থাকে, তা পুরোপুরি "অ্যানোনিমাইজড" কি না তা বিতর্কের বিষয়।
jadx_out (স্ট্যান্ডার্ড) এবং jadx_out_showbad-এর আউটপুটে যথাক্রমে ১৫০টি এবং ২২৫টি লগ কল পাওয়া গেছে। সেনসিটিভ লগগুলো মূলত AndroidNotificationService.java-তে পাওয়া গেছে যা --show-bad-code ফ্লাগ দিয়ে বের করা হয়েছে।
না। PostHog-এ captureLogcat ডিফল্টভাবে এনাবল করা নেই (false)। Firebase Crashlytics বা Facebook SDK-ও এগুলো স্বয়ংক্রিয়ভাবে পড়ে না। অর্থাৎ, লগগুলো ডিভাইসের ভেতরেই থাকে, থার্ড-পার্টি সার্ভারে যায় না।
AndroidNotificationService.java:436-এ FCM রেজিস্ট্রেশন টোকেনের প্রথম ২০টি ক্যারেক্টার লগ করা হয়।AndroidNotificationService.java:554-এ সার্ভার থেকে আসা প্রতিটি FCM পুশ মেসেজের সম্পূর্ণ কি-ভ্যালু ম্যাপ প্লেনটেক্সটে লগ করা হয়। এটি সবচেয়ে বেশি উদ্বেগের বিষয়।MainActivity.java:387-এ ডিপ লিংকের মাধ্যমে পাওয়া অথেনটিকেশন টোকেনের প্রথম ১০ ক্যারেক্টার লগ করা হয়।এগুলো মূলত ডেভেলপারদের ডিবাগ লগ যা প্রোডাকশন বিল্ডে রয়ে গেছে। এটি একটি অবহেলা। অ্যান্ড্রয়েড ৪.১+ এ এই লগগুলো অন্যান্য সাধারণ অ্যাপ পড়তে পারে না। তবে ADB (USB debugging) এনাবল করা থাকলে পিসি থেকে তা পড়া সম্ভব। একটি প্রোডাকশন রিলিজ থেকে ProGuard-এর মাধ্যমে অবশ্যই এই Log.d কলগুলো সরিয়ে ফেলা উচিত। এগুলো নজরদারি নয়, বরং ডেভেলপারদের চরম অবহেলা (Developer negligence)।
| সক্ষমতা (Capability) | কেন প্রয়োজন? | ইন্ডাস্ট্রি তুলনা |
|---|---|---|
| অ্যাক্সেসিবিলিটির মাধ্যমে ব্রাউজার URL মনিটরিং | DNS HTTPS পাথ দেখতে পারে না | সব অ্যান্ড্রয়েড কন্টেন্ট ব্লকার (NetGuard, AdGuard) |
| সোশ্যাল অ্যাপ স্ক্রিন মনিটরিং | রিলস/শর্টস/স্ট্যাটাস ব্লক করার জন্য | Bark, Qustodio, Google Family Link |
| ইন্সটল করা অ্যাপ লিস্ট | বাচ্চারা কী ইন্সটল করছে তা দেখার জন্য | Google Family Link, Apple Screen Time |
| অ্যাপ ব্যবহারের সময় ট্র্যাকিং | ব্লকিং কার্যকর হচ্ছে কি না মাপার জন্য | Screen Time, Digital Wellbeing |
| Firebase Analytics + Crashlytics | ক্র্যাশ রিপোর্ট এবং ইউসেজ মেট্রিক্স | প্রায় ৮০% অ্যান্ড্রয়েড অ্যাপে ব্যবহৃত হয় |
| FCM সাইলেন্ট সিঙ্ক | ডিভাইস রিমোটলি চেক করার জন্য | Google Family Link-ও একই প্যাটার্ন ব্যবহার করে |
| সক্ষমতা | ব্লকিংয়ের জন্য প্রয়োজন? | উদ্বেগের মাত্রা |
|---|---|---|
| Facebook SDK | প্রয়োজন নেই | মাঝারি — সিইও বলছেন কোনো ডেটা কালেকশন নেই, অথচ অ্যাড নেটওয়ার্কে টেলিমেট্রি যাচ্ছে। |
| PostHog সেশন রিপ্লে | UX ইম্প্রুভমেন্টের জন্য উপকারী | নিম্ন — শুধুমাত্র অ্যাপের নিজস্ব স্ক্রিন রেকর্ড করে। তবে প্রাইভেসি পলিসিতে বলা নেই বলে এটি সমস্যা। |
| সব ইউজারের জন্য App Sync | ব্লকিংয়ের কার্যকারিতা মাপতে উপকারী | নিম্ন-মাঝারি — এটি স্পষ্টভাবে ডিসক্লোজ করা উচিত। |
| কার দাবি? | দাবি | সত্যতা |
|---|---|---|
| ভাইরাল পোস্ট | Facebook SDK মেটার কাছে ডেটা পাঠায় | আংশিক সত্য (কিন্তু PII পাঠায় না) |
| WhatsApp/Telegram/Instagram-এ নজরদারি | সত্য (তবে চ্যাট পড়ে না, স্ক্রিন স্টেট পড়ে) | |
| OpenReplay সব রেকর্ড করে | ভুল নাম (PostHog আছে, কিন্তু শুধু নিজের অ্যাপের ভেতর রেকর্ড করতে পারে) | |
| FCM নীরবে ডেটা আপলোড করে | সত্য (এটি প্যারেন্টাল কন্ট্রোল স্ট্যান্ডার্ড) | |
| সিইও / কাহফ | কখনো ডেটা বিক্রি করি না | সম্ভবত সত্য |
| জিরো সার্ভেইল্যান্স | বিভ্রান্তিকর | |
| কোনো ডেটা সংগ্রহ করি না | মিথ্যা (কোড ও পলিসির বিপরীত) |
কাহফ গার্ড কোনো ট্রোজান নয়। এটি একটি বৈধ কন্টেন্ট-ব্লকিং এবং প্যারেন্টাল-কন্ট্রোল অ্যাপ, যা কাজ করার জন্য মনিটরিং সক্ষমতা প্রয়োজন। এর "নজরদারি" ফিচারের বেশিরভাগই এই ক্যাটাগরির প্রোডাক্টের জন্য স্ট্যান্ডার্ড এবং Google বা Apple-এর মতো কোম্পানিগুলোর প্যারেন্টাল কন্ট্রোল ভেন্ডররাও এটি ব্যবহার করে।
অ্যাপটির অ্যানালিটিক্সের বৈধ প্রয়োজন আছে। অ্যাপটির ব্লকিং ফিডব্যাক লুপ ছাড়া তারা প্রোডাক্ট উন্নত করতে পারবে না। Firebase বা PostHog-এর মতো টুলগুলো এই প্রশ্নগুলোর উত্তরের জন্য যৌক্তিক পছন্দ।
তবে, কাহফ গার্ডের স্বচ্ছতার মারাত্মক অভাব রয়েছে:
ভাইরাল পোস্টটি কিছু বৈধ প্রশ্ন তুললেও এটি বিপজ্জনক অতিরঞ্জনের মোড়কে মোড়া। একটি বৈধ অ্যাপকে "ট্রোজান" বলা এবং অ্যান্ড্রয়েড স্যান্ডবক্সিংয়ের ভুল ব্যাখ্যার মাধ্যমে দাবি করা যে সেশন রিপ্লে অন্য সব অ্যাপের ডেটা দেখতে পারে—এটি টেকনিক্যালি অসম্ভব এবং ভীতিকর।
আসল সমস্যাটি উদ্দেশ্যপ্রণোদিত কোনো ক্ষতি নয়, বরং কমিউনিকেশন গ্যাপ। সিইও-র মার্কেটিং ("জিরো সার্ভেইল্যান্স") ও আসল কোডের (Facebook SDK, PostHog, পিরিওডিক সিঙ্ক) মধ্যে ফারাকটাই সেই ট্রাস্ট সমস্যা তৈরি করেছে যা ভাইরাল পোস্টটি কাজে লাগিয়েছে। সমাধান সোজা: প্রাইভেসি পলিসি আপডেট করুন, মার্কেটিংয়ে অ্যানালিটিক্স সম্পর্কে সৎ থাকুন, এবং Facebook SDK আসলেই দরকার কি না তা বিবেচনা করুন।
এই রিপোর্টটি APK v4.6.188-এর static code analysis-এর ভিত্তিতে, JADX 1.5.5 ব্যবহার করে প্রস্তুত করা একটি স্বতন্ত্র technical assessment। বিশ্লেষিত ভাইরাল পোস্টটি v4.6.186 ভার্সন নিয়ে ছিল, যেখানে tooling ভিন্ন হতে পারে — এবং obfuscation-এর কারণে বিভিন্ন ভার্সনে file path ও line number আলাদা হতে পারে। শুধুমাত্র APK decompilation-এর মাধ্যমে server-side behavior, runtime feature flags, এবং data handling practices যাচাই করা সম্ভব নয়। এখানে উপস্থাপিত findings কোডটি কী করতে সক্ষম, তা নির্দেশ করে; সব ব্যবহারকারীর ক্ষেত্রে সবসময় কী সক্রিয়ভাবে চালু আছে, তা নয়। গবেষণা, বিশ্লেষণ এবং verification প্রক্রিয়ার পুরোটা জুড়েই AI ব্যাপকভাবে ব্যবহার করা হয়েছে। তবে শেষ ধাপে final report-এর accuracy, coherence, এবং readability যাচাই করার ক্ষেত্রে মানবীয় অংশগ্রহণও উল্লেখযোগ্য ছিল। রিপোর্টটি factual ও balanced রাখার চেষ্টা করা হয়েছে, তবে পাঠকদের static analysis-এর সীমাবদ্ধতা এবং অপ্রকাশিত server-side behavior থাকার সম্ভাবনার বিষয়টি মাথায় রাখা উচিত।