proot-me / proot-rs

Rust implementation of PRoot, a ptrace-based sandbox
GNU General Public License v3.0
129 stars 21 forks source link

Cannot run Debian in Termux #62

Open oxr463 opened 3 years ago

oxr463 commented 3 years ago
curl -LO https://github.com/proot-me/proot-rs/releases/download/v0.1.0/proot-rs-v0.1.0-aarch64-linux-android.tar.gz
tar -xf proot-rs-v0.1.0-aarch64-linux-android.tar.gz
curl -LO https://us.images.linuxcontainers.org/images/debian/sid/arm64/default/20210821_05:28/rootfs.tar.xz
mkdir debian
cd debian
tar -xf ../rootfs.tar.xz
cd ..
./proot-rs -r debian /bin/sh
echo $?
159
imlk0 commented 3 years ago

Just to summarize what is known so far. proot-rs does not currently work in termux (but can run proot-rs in the adb shell).

Two errors have been found so far.

  1. Bad address The error is exactly the one you mentioned here: https://github.com/proot-me/proot-rs/issues/35#issuecomment-898981925

    I tried testing in Termux on my Motorola G7, Android 10, and here is what I got:

    ./proot-rs --rootfs=./alpine --bind /dev:/dev --bind /proc:/proc
    bash: ./proot-rs: Bad address
    echo $?
    126

    The characteristic is that echo $? results in 126

    The strange thing is that once I run again with RUST_LOG=trace (which will generate more log):

    RUST_LOG=trace ./proot-rs --rootfs=./alpine --bind /dev:/dev --bind /proc:/proc

    This error disappears and does not appear anymore, even after restarting termux. I no longer see any Bad address, and the exit code is no longer 126.

    So I think it's a bug of termux.

  2. Exit with code 159

    This is the main error mentioned in current issue.

    By setting RUST_LOG=trace, we could get more logs:

    image

    The logs show that the first tracee process was successfully loaded by our loader-shim, but was killed by a SIGSYS signal shortly after leaving from the loader-shim.

    By analyzing the generated core dump file, it was found that the tracee was calling system call setgid32().

    Since the problem did not occur when testing proot-rs in the adb shell, I think it may be related to seccomp.

    ➜  ~ adb shell
    enchilada:/ $ whoami
    shell
    enchilada:/ $ cat /proc/self/status | grep Seccomp
    Seccomp:        0
    enchilada:/ $ cat /proc/`pidof com.termux`/status | grep Seccomp                                                                                                              
    Seccomp:        2