That's why I had to do the hackery of having the script pretend to be the mobile app to set that up.
532 karma · joined June 12, 2020
That's why I had to do the hackery of having the script pretend to be the mobile app to set that up.
They used to support TOTP directly, but removed it in favor of their proprietary mobile apps. It's still TOTP under the hood though, just requires a couple API calls to "activate" it.
I wrote more details about it works under the hood here: https://news.ycombinator.com/item?id=35856171
At least one of my cards required Google Play Services to have the location permission when initially adding the card though.
It is compatible with both older devices that configure USB via init scripts and newer devices that use Android's USB gadget HAL, but it does require Android 11+.
It's really just running the tests on Mac that I rely on it for. For Windows and Android, I can (and regularly do) use wine and qemu-user-static to run the tests on Linux. My project (a computationally heavy CLI tool) is simple though. It doesn't need much from the OS besides memory allocation, thread spawning, and opening a user-specified file.
adb shell settings put global package_verifier_user_consent -1
This does not require root access and prevents Android from invoking Play Protect in the first place. (This is what AOSP's own test suite does, along with other test suites in eg. Unreal Engine, etc.)I personally won't be doing this verification for my open-source apps. I have no interest in any kind of business relationship with anyone just to publish an .apk. If that limits those who can install it to people who disable Play Protect globally, then oh well.
latest=$(printf '%s\0' <glob> | sort -zrV | head -zn1)
or with long args: latest=$(printf '%s\0' <glob> | sort --zero-terminated --reverse --version-sort | head --zero-terminated --lines 1It worked flawlessly with the GlobalProtect VPN we had to use at my last job. A few folks ended up switching to using openconnect on Mac too. The official client seems to be quite bad on both platforms.
Many carriers implement this via "silent SMS" + IMAP (the same IMAP as for emails). The device will send an activation or status message to the carrier's visual voicemail number and the carrier will respond with an SMS containing the IMAP credentials.
The version of this I'm familiar with is T-Mobile's old CVVM protocol. During initial setup, the device will send a text message containing "Activate:dt=6" to the number 122 and T-Mobile will reply with (in decoded form):
pw_len=4-9
vs_len=10
u=<IMAP username>
pw=IMAP password>
rc=0
st=R
ipt=148
srv=e7.vvm.mstore.msg.t-mobile.com
lang=1|2|3|4
g_len=180
If visual voicemail is already enabled, then sending the "Status:dt=6" SMS to 122 will also result in the same reply. Putting the credentials in an IMAP client will work and it doesn't have to go over the phone's cellular connection. You can even use curl: curl -v imaps://<USERNAME>:<PASSWORD>@e7.vvm.mstore.msg.t-mobile.com/
T-Mobile has deprecated this protocol though. New activation messages will fail with a blocked status: rc=0
st=B
srv=vvm.mstore.msg.t-mobile.com
T-Mobile replaced this CVVM protocol with two HTTP based protocols: "mstore" (used by OEMs like in the dialer app on Google Pixels and OnePlus devices) and "cpaas" (used by T-Mobile's first party visual voicemail app). I've been working on an open source client for mstore for use with open source Android OS's, like GrapheneOS.In case anyone is interested, the vvmd wiki (visual voicemail implementation for Linux phones) has information on how several carriers implement VVM: https://gitlab.com/kop316/vvmplayer/-/wikis/Visual-Voicemail.... AT&T's is especially nasty.
They set the vbmeta header flags field to 0x3, which effectively turns off all of AVB (Android Verified Boot). I'm guessing they do this because they want to allow the system partition to be writable (eg. for folks who flash additional things on top of LineageOS).
With unmodified LineageOS, if you configured the bootloader to use LineageOS' public key and relocked it, there would be no security benefit. To enable AVB's signature checks, the flags field needs to be set to 0, which requires re-signing LineageOS with your own key.
I know at least Android and Linux + Pipewire support this. I haven't encountered a single application on desktop Linux that doesn't support this properly. All the standard video players and browsers work. It works for HDMI too, when the TV/AV receiver is well designed and communicates the latency in the EDID.
Unfortunately, my main use case for a hex editor is editing very large files (firmware images, disk images, etc.), which hexabyte doesn't seem to handle too well. For a few smaller test files I tried, it allocates memory about ~2.7x the size of the input file.
If you don't care about any of the extra functionality, you can configure it to always open your preferred browser and convert Custom Tabs intents to regular ones. No root access required.
(Though this article also explains how to enable MTE for user apps and verify that it's enabled.)
With root access, things can be persistently whitelisted on a per-app basis [2]:
su -c 'setprop persist.arm64.memtag.app.<package name> off'
or based on basename(argv[0]) [3]: su -c 'setprop persist.device_config.memory_safety_native.mode_override.process.<basename> off'
[1] https://googleprojectzero.blogspot.com/2023/11/first-handset...[2] https://cs.android.com/android/platform/superproject/main/+/...
[3] https://cs.android.com/android/platform/superproject/main/+/...
The Fastmail app is actually a good example of something that uses the WebView APIs though. Fastmail's UI is entirely web-based and their whole app is rendered inside of a WebView, provided by the Chromium-based "Android System WebView" app. If I remember correctly, the list of allowed signatures for a WebView provider is baked into the OS, so no third party can provide an implementation without root access.
I suppose a parser could try to compare the CRC and uncompressed size fields every time it encounters the data descriptor magic bytes until it finds one that matches, but the magic bytes aren't even mandatory. The data descriptor can just be CRC + compressed size + uncompressed size with no marker.
From basic testing, `unzip`, libarchive/bsdtar, and the Python zipfile module all choke on files like this when read from a stream (as expected).
Why were data descriptors ever included in the spec?
With root access, it should be possible to disable just that component without breaking other functionality by running:
pm disable com.android.vending/com.google.android.finsky.verifier.impl.PackageVerificationReceiver
To reenable: pm default-state com.android.vending/com.google.android.finsky.verifier.impl.PackageVerificationReceiver
Without root access, disabling the Play Store completely (if you don't need it) via the normal Android settings should also do the trick.[1] https://android.googlesource.com/platform/frameworks/base/+/...