Remote Control blocks ChatGPT Android enrollment on official unrooted GrapheneOS
What version of Codex / ChatGPT is affected?
ChatGPT for Android 1.2026.216 (build 2621629)
Subscription
ChatGPT account with Remote Control available
Host
Codex Remote Control host enrollment succeeds and fresh QR/manual pairing codes are generated. The host receives no client claim when the Android failure occurs.
Summary
Codex Remote Control cannot enroll a controller from ChatGPT Android on GrapheneOS. The Android app rejects the request before it claims or contacts the waiting host.
This reproduces on both:
- an unrooted Pixel 5 running an official GrapheneOS release, with sandboxed Google Play services and Play Store installed; and
- a Pixel 8 Pro running GrapheneOS with a user-controlled AVB signing key.
The unrooted official GrapheneOS reproduction rules out root, Magisk, and custom signing as necessary causes.
Steps to reproduce
- Install ChatGPT from Google Play on an unrooted Pixel running an official GrapheneOS release.
- Install sandboxed Google Play services and Google Play Store.
- Sign into the same ChatGPT account used by the Remote Control host.
- Open Remote Control in ChatGPT Android.
- Scan a fresh QR code or enter a fresh manual pairing code.
- Observe:
Pairing failed. Something went wrong while pairing. Try scanning the code again.
The same result occurs with repeated fresh codes.
Android-side evidence
During the failed attempt, ChatGPT Android sends:
POST https://android.chat.openai.com/backend-api/codex/remote/control/client/enroll/start
The response is:
HTTP 403
{"cf_details":"Request is not allowed. Please try again later.","type":"dc"}
The application classifies it as a Cloudflare error.
The failure occurs at the initial controller enrollment request, before Android device-key creation, step-up authentication, pairing-code claim, or communication with the host. The waiting host receives no pairing claim.
The APK contains Play Integrity/device-check integration including the _playintegrity cookie and oai-android-play-integrity-token handling. GrapheneOS's Play Store reports the device as not certified even on the unrooted official installation.
This makes a Play Integrity or device-certification gate the strongest explanation. Please confirm the actual policy because the generic UI message currently hides it.
Why this is not an authentication failure
Both endpoints are already authenticated to the same ChatGPT account:
- ChatGPT Android works normally.
- Codex/Desktop works normally.
- Remote Control host enrollment and pairing-code generation work.
- The controller enrollment endpoint rejects the phone before the pairing protocol begins.
Google Play certification does not establish account authorization. It also rejects locked, verified and current alternative operating systems while accepting any OS licensed by Google.
Requested changes
- Confirm and document whether Android controller enrollment requires a Play Integrity verdict.
- Support standard Android hardware key attestation and permit official GrapheneOS verified-boot keys.
- Provide an account-bound fallback using explicit host approval plus password/OTP step-up.
- Return a specific diagnostic error for device-policy rejection instead of “Pairing failed.”
- Ensure the security property is possession of an enrolled non-exportable key, not Google certification of the operating system.
GrapheneOS publishes a signed, maintained verified-boot-key feed and implementation guidance:
https://grapheneos.org/articles/attestation-compatibility-guide
This permits verification of genuine hardware, verified boot, OS patch level, application identity and hardware-backed key possession without weakening the Remote Control security model or requiring Google Play certification.
Related issue
- #37897 reports the same generic Android failure and absence of host-side activity, but attributes it to the Linux host. The evidence above shows the Android controller is rejected at
client/enroll/start, before host type or the pairing code is evaluated.
I can provide sanitized Android telemetry privately if an OpenAI engineer needs the Cloudflare Ray IDs or full event sequence.
4 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Reviewed #37897. This is related but not a duplicate.
#37897 reports the generic UI symptom against a Linux CLI host and infers that the failure is in Android or the pairing backend. This issue adds the missing root-cause boundary:
client/enroll/start;Closing this as a duplicate would lose the device-policy reproduction and attestation request. I have cross-linked #38128 from #37897 so maintainers can correlate the shared user-visible symptom.
Additional reproduction on Linux desktop + Android:
Environment:
Reproduction:
Result:
Could maintainers check the response from the Android client enrollment endpoint for this device/account and whether the failure occurs before device-key creation or host claim, as described in this issue? No pairing codes, subscription URLs, or account tokens are included here.
I’m independently affected by this exact issue.
Setup:
Behavior:
“Pairing failed. Something went wrong while pairing. Try scanning the code again.”
So this does not appear to be a QR decoding, camera, local network, firewall, or Windows-side connectivity problem. The failure happens on the Android side before the Codex host is involved.
If the Android Remote enrollment flow currently requires Google Play certification / Play Integrity, please consider supporting a fallback for non-certified Android installations. An authenticated OpenAI-account flow with explicit desktop approval, 2FA, or another device-verification mechanism would be preferable to making Google certification a hard dependency.
At minimum, the app should return a specific error explaining that device certification or attestation caused the rejection. The current generic “Pairing failed” message makes the problem look like a broken QR code or networking issue and leads users down the wrong troubleshooting path.
I’d be happy to provide further device/app details if useful.