4 ms·
So I decided to check if this is really as described. I downloaded a copy of the app from here, which is the Pixel 8 firmware for June 2024: https://dumps.tadi
by anvilspoke 2y ago
So I decided to check if this is really as described.
I downloaded a copy of the app from here, which is the Pixel 8 firmware for June 2024: https://dumps.tadiphone.dev/dumps/google/shiba/-/raw/shiba-user-14-AP2A.240605.024-11860263-release-keys/product/priv-app/Showcase/Showcase.apk https://dumps.tadiphone.dev/dumps/google/shiba/-/raw/shiba-u...
The app has two components that are exported:
- broadcast receiver com.customermobile.preload.StartOnBoot, which receives the ACTION_BOOT_COMPLETED broadcast that is sent by the system after the device is booted and first unlocked by the user
- activity com.customermobile.preload.DebugActivity
The onReceive method in StartOnBoot is this:
public void onReceive(Context context, Intent intent) {
Log.d(LOG_ID, "on boot called: " + (intent != null ? intent.toString() : "null"));
boolean demoEnabled = getDemoEnabled(context);
boolean checkAppPermissions = checkAppPermissions(context);
Log.d(LOG_ID, "demoEnabled: " + demoEnabled);
Log.d(LOG_ID, "permissionsCheck: " + checkAppPermissions);
if (demoEnabled && checkAppPermissions) {
startDemoStub(context);
} else {
if (!demoEnabled || checkAppPermissions) {
return;
}
startPermissionsCheck(context);
}
}
It relies on the getDemoEnabled method returning true to do anything:
public static boolean getDemoEnabled(Context context) {
int iStoreDemoMode = 0;
int iVzwStoreDemoMode = 0;
String szStoreDemoMode;
String szVzwStoreDemoMode;
try {
iStoreDemoMode = Settings.Secure.getInt(context.getContentResolver(), "store_demo_mode");
} catch (Exception ignored) {}
try {
iVzwStoreDemoMode = Settings.Secure.getInt(context.getContentResolver(), "verizonwireless_store_demo_mode");
} catch (Exception ignored) {}
try {
szStoreDemoMode = Settings.Secure.getString(context.getContentResolver(), "store_demo_mode");
} catch (Exception ignored) {}
try {
szVzwStoreDemoMode = Settings.Secure.getString(context.getContentResolver(), "verizonwireless_store_demo_mode");
} catch (Exception ignored) {}
return
(iStoreDemoMode > 0) ||
(iVzwStoreDemoMode > 0) ||
"true".equalsIgnoreCase(szStoreDemoMode) ||
"true".equalsIgnoreCase(szVzwStoreDemoMode)
}
Which will only happen if system settings "store_demo_mode" or "verizonwireless_store_demo_mode" are set to a positive integer or to "true".
As neither of these are set by default, none of the code behind the startDemoStub method will be executed when the device boots.
The DebugActivity layout is as follows, and consists of a single button labelled "Simulate StartOnBoot":
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/startOnBoot"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginRight="8dp"
android:text="Simulate StartOnBoot"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline"/>
<androidx.constraintlayout.widget.Guideline
android:orientation="horizontal"
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintGuide_percent="0.1"/>
</androidx.constraintlayout.widget.ConstraintLayout>
All this does if clicked is send an intent which will end up at the onReceive of the StartOnBoot receiver:
public class DebugActivity extends AppCompatActivity implements View.OnClickListener {
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_debug);
findViewById(R.id.startOnBoot).setOnClickListener(this);
}
public void onClick(View view) {
if (view.getId() == R.id.startOnBoot) {
sendStartOnBootIntent();
}
}
private void sendStartOnBootIntent() {
sendBroadcast(new Intent("com.customermobile.preload.StartOnBoot"), "com.customermobile.preload.StartOnBoot.PERMISSION");
}
}
We know this because the receiver filters for this action:
<receiver
android:name="com.customermobile.preload.StartOnBoot"
android:enabled="true"
android:exported="true">
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
<intent-filter>
<action android:name="com.customermobile.preload.ManualStart"/>
</intent-filter>
<intent-filter>
<action android:name="com.customermobile.preload.StartOnBoot"/>
</intent-filter>
</receiver>
So, nothing to worry about. The app does nothing unless one of the two system settings described above are set.
- trompetenaccoun 2y agoWhy was this installed on all their devices in the first place? I have nothing to do with Verizon, I've never even been to the US. This is something to worry about because all it takes is someone having access to your unlocked device. For example a border guard demanding to have a look at something. When the user doesn't know this vulnerability exists, it's a problem. It's a company making remote access software. Who honestly wants this pre-installed on their devices? They can install their malware on their own phones, after having purchased them.
- anvilspoke 2y agoIt doesn't do anything though. The "store_demo_mode" and "verizonwireless_store_demo_mode" settings are not set by default, and there doesn't appear to be any way to set these through the UI. Also, according to other comments, the app is disabled by default. From examining the CarrierSettings app, this does indeed appear to be the case. It seems to require a certain carrier configuration to enable it. Anyone who wants to enable the functionality of this app would have to go to some effort to do so, including enabling the Developer Settings - which requires the user's PIN, password or pattern - and then connecting to the device over ADB, enabling the app (if not already enabled by the carrier), and changing one of the two settings above. This really is nothing to worry about. If you disagree, do please feel free to do some analysis of the software yourself so we can discuss this based on the facts.
- strcat 2y agoThe Verizon packages are only enabled when using a Verizon / Verizon MVNO SIM. They're equivalent to uninstalled when not using one. This is a requirement from Verizon for all Android devices to fully use their network features. GrapheneOS has always omitted these apps and therefore is missing certain features like Wi-Fi calling on Verizon which work fine on T-Mobile and other carriers internationally. Aside from the packages not being enabled without a Verizon SIM, this retail demo app iVerify/Palantir claim is a serious vulnerability has the extra layer of being disabled unless it's manually set up. The access needed to set it up or especially to enable the package in the first place is already very invasive. They're also trying to portray it as if Google unnecessarily or accidentally included this without knowing what it is but that's really not the case. Verizon was using this for actual demos in their stores and required OEMs to install it to have Verizon selling their phones. Pixels made sure the packages were completely disabled along with the other Verizon apps when not using Verizon and then it's also disabled even when using them. Issues in these apps are an overall Verizon Android problem, not Pixel specific, and hardly something which was overlooked on Pixels. They know it's unfortunate that these apps are needed and have gradually gotten rid of the need for most carrier app. Verizon is the only significant holdout. One carrier in the whole world has this problem. The retail demo app is hardly part of the issue. Turned out Verizon doesn't actually use it anymore so Google removed it in Android 15 which can be seen from the Android 15 Beta releases that are available. It appears entirely correct that Google deemed this was not even a Low severity vulnerability. Android 15 will probably be released in September where the app is gone. Incredibly strange that this got portrayed as a serious issue when it's not really relevant to anyone. Meanwhile, tons of serious vulnerabilities get fixed in both Android and iOS on a regular basis. Non-Pixel Android devices don't ship Low/Moderate severity patches for the most part until the next yearly release since they skip monthly/quarterly releases and only apply High/Critical severity backports. They've got a lot of other weaknesses compared to Pixels too. iPhones and Pixels with the stock OS are both still getting exploited by Cellebrite Premium with no sign of stopping it for more than a couple months at a time after certain updates: https://grapheneos.social/@GrapheneOS/112826067364945164 https://grapheneos.social/@GrapheneOS/112826067364945164 As a bonus, there was a whole inaccurate news cycle about that too recently with the same publications falsely claiming Cellebrite couldn't exploit the latest iOS based on leaked docs from April 2024. They simply fell a bit behind after a release as often happens and had already caught up BEFORE the news cycle. We posted the new July 2024 docs as the news cycle was still propagating. Now they're onto their next fake story, and they'll simply move on to the next and the next without ever correcting or retracting all the false claims. Even the New York Times and Washington Post published this fake Showcase story promoting iVerify/Palantir.