Debian on the Toshiba Excite Pro AT10LE-A

After trying tool-based rooting first (and failing), the next and successful attempt was via dirtycow directly as done for the Lenovo B8000 with minimal changes as the Toshiba didn't have SELinux set to enforced.

root@tostab12BA:/data/local/tmp # ls -la
-rwxr-xr-x shell    shell       21728 2021-03-17 21:37 debuggerd.orig
-rwxrwxrwx shell    shell       17880 2021-01-21 00:28 dirtycow
-rwxr-xr-x shell    shell       71304 2021-03-17 21:37 netd.orig
-rwxrwxrwx shell    shell         122 2021-03-17 21:44 root.sh
-rwxrwxrwx shell    shell         295 2021-03-17 21:49 start-su.sh
-rwxrwxrwx shell    shell       13940 2021-01-21 22:53 su

root@tostab12BA:/data/local/tmp # cat root.sh
#!/system/bin/sh

cd /data/local/tmp
./dirtycow start-su.sh /system/bin/debuggerd
./dirtycow start-su.sh /system/bin/netd

root@tostab12BA:/data/local/tmp # cat start-su.sh
#!/system/bin/sh

if ! /data/local/tmp/su -c id; then
        mount -o remount,suid /data
        /data/local/tmp/su --daemon
fi

# repair daemons
/data/local/tmp/dirtycow /data/local/tmp/debuggerd.orig /system/bin/debuggerd
/data/local/tmp/dirtycow /data/local/tmp/netd.orig /system/bin/netd

exec "$0" "$@"

A debian jessie was copied over from elsewhere.

lifetab / % tar -czvf /sdcard/root.tgz --exclude '/run/*' --exclude '/proc/*' --exclude '/sys/*' --exclude '/sdcard/*' --exclude '/dev/pts/*' /

As the android shell did not provide a busybox, I had to push a static Armv7 binary. And re-modify the start.sh similar to how it is set up on the B8000:

setprop ctl.stop media
setprop ctl.stop zygote
sleep 1
setprop ctl.stop bootanim
sleep 1
setprop ctl.stop bootanim

mount -o remount,rw /system
mount -t proc proc /data/debian-jessie/proc
mount -t sysfs sysfs /data/debian-jessie/sys
mount -t devpts devpts /data/debian-jessie/dev/pts
mount -o bind /storage/emulated/legacy /data/debian-jessie/sdcard
mount -o remount,rw,suid,dev /data

During the "normal" setup process, however I was not able to remount /system read-write:

root@tostab12BA:/data/debian-jessie # mount -o remount,rw /system
mount: Operation not permitted

So, the libc should better live under /data instead of /system (for now at least). Quickly adb pulling /data/debian-jessie/usr/sbin/chroot.android and editing the dynamic linker path from /system/ld-lx-armhf.so.3 to /data/ld-linx-armhf.so.3 did the trick.

However

root@tostab12BA:/data/debian-jessie # ./enter.sh
/data/debian-jessie/usr/sbin/chroot.android: cannot change root directory to /data/debian-jessie: Operation not permitted
125|root@tostab12BA:/data/debian-jessie # cat /proc/$$/status
...
CapPrm: ffffffffffffffff
CapEff: ffffffffffffffff
CapBnd: ffffffffffffffff
Cpus_allowed:   f
Cpus_allowed_list:      0-3
voluntary_ctxt_switches:        1137
nonvoluntary_ctxt_switches:     223
root@tostab12BA:/data/debian-jessie # getenforce
Permissive

What kind of new permission system is this now?

So the internet says Toshiba has built a kernel module sealime.ko to "protect" its tablets, but it's easy enough to work around that using a loopback device.

The really brazen way of accessing the system partition did not work

root@tostab12BA:/data/local/tmp # ./busybox losetup /dev/loop0 /dev/block/mmcblk0p4

... so it seems one really needs to use offset from mmcblk0. Correct values (in 512 sectors) are here

root@tostab12BA:/data/local/tmp # cat /sys/block/mmcblk0/mmcblk0p4/start
65536
root@tostab12BA:/data/local/tmp # cat /sys/block/mmcblk0/mmcblk0p4/size
3145728

Unfortunately, the loopback-device hack seems to have been made impossible by later updates:

root@tostab12BA:/data/local/tmp # ./busybox losetup -o $((65536 * 512)) -r /dev/loop0 /dev/block/mmcblk0 
losetup: /dev/block/mmcblk0: Operation not permitted
root@tostab12BA:/data/local/tmp # dd if=/dev/block/mmcblk0 bs=512 count=1
/dev/block/mmcblk0: cannot open for read: Operation not permitted

So, Toshiba has pushed a security update and closed the above loophole. Challenge accepted.

Given DirtyCow is modifying pages directly, it could potentially replace whatever that module contains in-place and everything should work (with near-zero risk of bricking).

Unfortunately, /modules/sealime.ko cannot be open(2)ed, due to sealime.ko, so it's hard to target dirtycow.

Surely there is a way to evade this sealime thing... Look at this:

root@tostab12BA:/system/lib/modules # lsmod
inv_mpu 42968 0 - Live 0x00000000
bcmdhd 497053 0 - Live 0x00000000
sealime 39996 1 - Live 0x00000000 (PO)
root@tostab12BA:/system/lib/modules # insmod gps_drv.ko
root@tostab12BA:/system/lib/modules # lsmod
gps_drv 5412 0 - Live 0x00000000
inv_mpu 42968 0 - Live 0x00000000
bcmdhd 497053 0 - Live 0x00000000
sealime 39996 1 - Live 0x00000000 (PO)
root@tostab12BA:/system/lib/modules # rmmod gps_drv
root@tostab12BA:/data/local/tmp # ./dirtycow start-su.sh /system/lib/modules/gps_drv.ko
warning: new file size (295) and destination file size (154278) differ

[*] size 154278
[*] mmap 0xb6f07000
[*] currently 0xb6f07000=464c457f
[*] using /proc/self/mem method
[*] madvise = 0xb6f07000 154278
[*] madvise = 0 64347
[*] /proc/self/mem 48597570 315
[*] exploited 0 0xb6f07000=732f2123
root@tostab12BA:/data/local/tmp # insmod /system/lib/modules/gps_drv.ko
insmod: init_module '/system/lib/modules/gps_drv.ko' failed (Exec format error)

So, let's build a module. /proc/version says

Linux version 3.4.57-gc710e6f (android-toshiba@tesibuild7) (gcc version 4.6.x-google 20120106 (prerelease) (GCC) ) #1 SMP PREEMPT Mon Dec 2 17:16:19 IST 2013

so let's busy a PI with an ARM build.

root@raspberrypi:~/linux# make tegra-defconfig
root@raspberrypi:~/linux# make -j8 bzImage
include/linux/compiler-gcc.h:100:1: fatal error: linux/compiler-gcc8.h: No such file or directory
 #include gcc_header(__GNUC__)

Wonderful. Luckily gcc-4.9 is still available in Raspian.

perl: warning: Falling back to a fallback locale ("en_GB.UTF-8").
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.

Yeah, maybe let's.

With a quick copy of the example module code from the kernel documentation, we now have:

root@tostab12BA:/data/local/tmp # insmod glomus.ko
insmod: can't open 'glomus.ko'

(Glomus being a genus of Fungus which helps plants take root, as shown experimentally for Sea Lyme in https://doi.org/10.1007/BF02803153 )

Nice extra protection you have there, would be sad if a kernel bug would exist which replaced file contents in the page cache...

root@tostab12BA:/data/local/tmp # ./dirtycow glomus.ko /system/lib/modules/gps_drv.ko
root@tostab12BA:/data/local/tmp # insmod /system/lib/modules/gps_drv.ko
insmod: init_module '/system/lib/modules/gps_drv.ko' failed (Exec format error)

Hrm... according to the internet, this is due to incorrect version information in the module. Indeed dmesg shows:

<3>[ 5491.018487] glomus: version magic '3.4.0-dirty SMP preempt mod_unload ARMv7 p2v8 ' should be '3.4.57-gc710e6f SMP preempt mod_unload ARMv7 p2v8 '

Ok, I guess...

laptop % cat Makefile
KDIR = ../linux

kbuild:
 echo '#define UTS_RELEASE "3.4.57-gc710e6f"' > $(KDIR)/include/generated/utsrelease.h
 make -C $(KDIR) M=`pwd`

clean:
 make -C $(KDIR) M=`pwd` clean

With these modifications, the kernel accepts the module and the device crashes. Hrm. Maybe dirtycow-ing only half of a kernel-module was a bad idea?

Maybe, if we dirtycow the entire module (to get a clean state):

root@laptop:/tmp# dd if=glomus.ko of=gps_drv.ko conv=notrunc
47+1 records in
47+1 records out

Nope, still crash.

So, maybe some other avenue:

root@tostab12BA:/ # cat /init.rc
...
on post-fs
    insmod /modules/sealime.ko
    copy /data/data/com.toshiba.drm.wdapp2/files/conf/dmbeini.so /proc/seandroid/sec_setting

However, creation of that file is blocked.

Back to un-sealiming again...

root@tostab12BA:/ # echo 0 > /proc/sys/kernel/kptr_restrict
root@tostab12BA:/ # cat /proc/kallsyms
...
bf0061c0 t cleanup_module       [sealime]
...
c0bc6d28 t register_sealime     [sealime]
...

Ok, that's something. What would be a good way to get kernel execution, hrm...

objdump -x gps_drv.ko

gps_drv.ko:     file format elf32-little
gps_drv.ko
architecture: UNKNOWN!, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000a6c  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .init.text    000000fc  00000000  00000000  00000aa0  2**2
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE

and with 0xaa0 == 2720, we can just "improve" the existing gps_drv.ko:

#!/bin/sh

cp gps_drv.ko glomus.ko
# mov %r0, #1
# bx lr
echo -ne '\x01\x00\x00\xe3\x1e\xff\x2f\xe1' | dd bs=1 seek=2720 of=glomus.ko conv=notrunc

using the result

root@tostab12BA:/data/local/tmp # ./dirtycow glomus.ko /system/lib/modules/gps_drv.ko
root@tostab12BA:/data/local/tmp # insmod /system/lib/modules/gps_drv.ko
root@tostab12BA:/data/local/tmp # dmesg
...
<4>[ 1164.230458] sys_init_module: 'gps_drv'->init suspiciously returned 1, it should follow 0/-E convention
<4>[ 1164.230481] sys_init_module: loading module anyway...
<4>[ 1164.231313] [<c001580c>] (unwind_backtrace+0x0/0x140) from [<c00ba450>] (sys_init_module+0x1a0/0x1bc)
<4>[ 1164.231806] [<c00ba450>] (sys_init_module+0x1a0/0x1bc) from [<c000e800>] (ret_fast_syscall+0x0/0x30)

Glorious success, aka kernel-level execution. And with some bits of ARMv7 fiddling, the possibility to dump the code from register_sealime (thank you print_hex_dump from lib/hexdump.c):

.../toshiba-excite-pro % arm-none-eabi-objdump -D -b binary -m armv7 register_sealime

register_sealime:     file format binary

Disassembly of section .data:

00000000 <.data>:
   0:   e92d4000        stmfd   sp!, {lr}
   4:   e8bd4000        ldmfd   sp!, {lr}
   8:   e3063d28        movw    r3, #27944      ; 0x6d28
   c:   e34c30bc        movt    r3, #49340      ; 0xc0bc
  10:   e5830000        str     r0, [r3]
  14:   e3a00000        mov     r0, #0
  18:   e12fff1e        bx      lr

So, this is obviously storing some callback into a pointer variable, let's undo (and also a second one from register_extra_hook):

laptop % cat glomus.as
.macro mov32, reg, val
    movw \reg, #:lower16:\val
    movt \reg, #:upper16:\val
.endm

init_module:
        push  {lr}

        mov   r0, #0
        mov32 r1, 0xc0bc6d28
        str   r0, [r1]
        str   r0, [r1, #4]

        mov   r0, #-43
        pop   {pc}
laptop % as -o glomus.bin glomus.as
laptop % cp gps_drv.ko glomus.ko
laptop % dd bs=1 count=128 skip=52 seek=2720 if=glomus.bin of=glomus.ko conv=notrunc
# kill some unhelpful relocations into our wonderful code
laptop % dd bs=1 count=1 skip=0 seek=115148 if=/dev/zero of=glomus.ko conv=notrunc
laptop % adb push glomus.ko /data/local/tmp/glomus.ko
laptop % adb shell
shell@tostab12BA:/data/local/tmp # /data/local/tmp/root.sh
shell@tostab12BA:/data/local/tmp # /data/local/tmp/su
root@tostab12BA:/data/local/tmp # ./dirtycow glomus.ko /system/lib/gps_drv.ko
root@tostab12BA:/data/local/tmp # insmod /system/lib/gps_drv.ko
insmod: init_module '/system/lib/modules/gps_drv.ko' failed (Identifier removed)
root@tostab12BA:/data/local/tmp # ./dirtycow gps_drv.ko /system/lib/gps_drv.ko
root@tostab12BA:/data/local/tmp # mount -o remount,rw /system; mount
...
/dev/block/platform/sdhci-tegra.3/by-name/APP /system ext4 rw,seclabel,relatime,data=ordered 0 0
...

Identifier removed, indeed. :P

Onwards to Xorg.

(II) FBDEV(0): checking modes against monitor...
(--) FBDEV(0): Virtual size is 2560x1600 (pitch 2560)
(**) FBDEV(0):  Built-in mode "current": 259.7 MHz, 95.5 kHz, 58.0 Hz
(II) FBDEV(0): Modeline "current"x0.0  259.67  2560 2608 2640 2720  1600 1603 1609 1646 +hsync +vsync -csync (95.5 kHz b)
(==) FBDEV(0): DPI set to (96, 96)
(II) Loading /usr/lib/xorg/modules/libfb.so
(II) Module fb: vendor="X.Org Foundation"
        compiled for 1.16.4, module version = 1.0.0
(**) FBDEV(0): using shadow framebuffer
(II) Loading /usr/lib/xorg/modules/libshadow.so
(II) Module shadow: vendor="X.Org Foundation"
        compiled for 1.16.4, module version = 1.1.0
fbdev: PreInit done
(==) Depth 24 pixmap format is 32 bpp
fbdev: FBDevScreenInit 0
(EE) FBDEV(0): FBIOPUT_VSCREENINFO: Invalid argument
(EE) FBDEV(0): mode initialization failed
(EE)
Fatal server error:
(EE) AddScreen/ScreenInit failed for driver 0
excite pro /root % gdb Xorg
(gdb) break ioctl
Function "ioctl" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y

Breakpoint 1 (ioctl) pending.
(gdb) run -sharevts -noreset -retro -verbose -fbbpp 32 -nocursor vt1
Breakpoint 1, ioctl () at ../sysdeps/unix/syscall-template.S:82
82      ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) display /x $r1
1: /x $r1 = 0x5603
(gdb) cont
Continuing.
...
[tcsetpgrp failed in terminal_inferior: Inappropriate ioctl for device]

Breakpoint 1, ioctl () at ../sysdeps/unix/syscall-template.S:82
82      in ../sysdeps/unix/syscall-template.S
1: /x $r1 = 0x4600
(gdb) print /x $r2
$10 = 0x2a199f48
(gdb) x /60lx 0x2a199f48
...
(gdb) step
[tcsetpgrp failed in terminal_inferior: Inappropriate ioctl for device]
0xb66c9932 in fbdevHWInit () from /usr/lib/xorg/modules/libfbdevhw.so
1: /x $r1 = 0x4600
(gdb) x /60lx 0x2a199f48
0x2a199f48:     0x00000a00      0x00000640      0x00000a00      0x00000c80
0x2a199f58:     0x00000000      0x00000000      0x00000000      0x00000000
0x2a199f68:     0x00000000      0x00000000      0x00000000      0x00000000
0x2a199f78:     0x00000000      0x00000000      0x00000000      0x00000000
0x2a199f88:     0x00000000      0x00000000      0x00000000      0x00000000
0x2a199f98:     0x00000000      0x00000000      0x00000087      0x000000d8
0x2a199fa8:     0x00000000      0x00000f0b      0x00000050      0x00000030
0x2a199fb8:     0x00000025      0x00000003      0x00000020      0x00000006
0x2a199fc8:     0x00000003      0x00000000      0x00000000      0x00000000
0x2a199fd8:     0x00000000      0x00000000      0x00000000      0x00000000
0x2a199fe8:     0x00000000      0x00000000      0x00000000      0x00000000
0x2a199ff8:     0x00000000      0x00000000      0x00000000      0x00000000
0x2a19a008:     0x00000000      0x00000000      0x00000000      0x00000000
0x2a19a018:     0x00000000      0x00000000      0x00000000      0x00000000
0x2a19a028:     0x00000000      0x00000000      0x00000000      0x00000000
...
Breakpoint 1, ioctl () at ../sysdeps/unix/syscall-template.S:82
82      in ../sysdeps/unix/syscall-template.S
1: /x $r1 = 0x4601
(gdb) x /60lx $r1
0x4601: Cannot access memory at address 0x4601
(gdb) x /60lx $r2
0xbefff57c:     0x00000a00      0x00000640      0x00000a00      0x00000640
0xbefff58c:     0x00000000      0x00000000      0x00000020      0x00000000
0xbefff59c:     0x00000000      0x00000008      0x00000000      0x00000000
0xbefff5ac:     0x00000008      0x00000000      0x00000000      0x00000008
0xbefff5bc:     0x00000000      0x00000000      0x00000000      0x00000000
0xbefff5cc:     0x00000000      0x00000000      0x00000087      0x000000d8
0xbefff5dc:     0x00000000      0x00000f0b      0x00000050      0x00000030
0xbefff5ec:     0x00000025      0x00000003      0x00000020      0x00000006
0xbefff5fc:     0x00000003      0x00000000      0x00000000      0x00000000
0xbefff60c:     0x00000000      0x00000000      0x00000000      0x00000000

So the FBIOPUT_VSCREENINFO tries to change virtual y resolution from 3200 to 1600. Let's try not to:

(gdb) set *(unsigned long int)(0xbefff57c + 12) = 0xC80
(gdb) x /60lx $r2
0xbefff57c:     0x00000a00      0x00000640      0x00000a00      0x00000c80
...

Not yet... Ok, kill all the differences:

Breakpoint 1, ioctl () at ../sysdeps/unix/syscall-template.S:82
82      in ../sysdeps/unix/syscall-template.S
1: /x $r1 = 0x4601
(gdb) x /20lx $r2
0xbefff57c:     0x00000a00      0x00000640      0x00000a00      0x00000640
0xbefff58c:     0x00000000      0x00000000      0x00000020      0x00000000
0xbefff59c:     0x00000000      0x00000008      0x00000000      0x00000000
0xbefff5ac:     0x00000008      0x00000000      0x00000000      0x00000008
0xbefff5bc:     0x00000000      0x00000000      0x00000000      0x00000000
(gdb) set *(unsigned long int)($r2 + 12) = 0xC80
(gdb) set *(unsigned long int)($r2 + 24) = 0
(gdb) set *(unsigned long int)($r2 + 36) = 0
(gdb) set *(unsigned long int)($r2 + 48) = 0
(gdb) set *(unsigned long int)($r2 + 60) = 0
(gdb) x /20lx $r2
0xbefff57c:     0x00000a00      0x00000640      0x00000a00      0x00000c80
0xbefff58c:     0x00000000      0x00000000      0x00000000      0x00000000
0xbefff59c:     0x00000000      0x00000000      0x00000000      0x00000000
0xbefff5ac:     0x00000000      0x00000000      0x00000000      0x00000000
0xbefff5bc:     0x00000000      0x00000000      0x00000000      0x00000000

No...

(gdb) set *(unsigned long int)($r2 + 12) = 0xC80
(gdb) set *(unsigned long int)($r2 + 16) = 16
(gdb) set *(unsigned long int)($r2 + 28) = 8
(gdb) set *(unsigned long int)($r2 + 40) = 0
(gdb) set *(unsigned long int)($r2 + 60) = 0
(gdb) x /20lx $r2

Still no... :(

https://en.wikipedia.org/wiki/Nouveau_%28software%29:
> nouveau is a free and open-source graphics device driver for
> Nvidia video cards and the Tegra family of SoCs written by independent
> software engineers, with minor help from Nvidia employees.

... but did not work for me :/

Some research points here: https://android.googlesource.com/kernel/tegra/+/refs/heads/android-tegra-molly-3.4-l-preview/drivers/video/tegra/fb.c ... as the code I'm trying to talk to on the other side of /dev/fb0

But ultimately, after some testing with hand-crafted ioctls, the working solution was to ensure DRM never gets activated and the framebuffer device be left undisturbed from boot:

root@tostab12BA:/system/bin # mount -o remount,rw /system
root@tostab12BA:/system/bin # mv drmserver drmserver.off
root@tostab12BA:/system/bin # mv bootanimation bootanim.off
root@tostab12BA:/system/bin # mv surfaceflinger surfaceflinger.off

(This being necessary, as /init.rc is loaded from an allegedly signed boot partition.)

And of course a complete faking of all ioctl(2) framebuffer activity:

excite pro /root % cat xorg-ioctls.c
// gcc -fPIC -shared -o xorg-ioctls.so xorg-ioctls.c -ldl

#define _GNU_SOURCE
#include <dlfcn.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stddef.h>
#include <linux/fb.h>

static int(*ioctl_orig)(int, unsigned long, ...) = NULL;

int ioctl(int fd, unsigned long request, void *a, void *b, void *c, void *d, void *e) {
        if(request == FBIOPUT_VSCREENINFO) {
                // Pretend stuff happened successfully.
                return 0;
        } else if(request == FBIOGET_VSCREENINFO) {
                // Fake response from kernel.
                struct fb_var_screeninfo *info = a;
                info->xres = 2560;
                info->yres = 1600;
                info->xres_virtual = 2560;
                info->yres_virtual = 3200;
                info->xoffset = 0;
                info->yoffset = 0;
                info->bits_per_pixel = 32;
                info->grayscale = 0;
                info->red.length = 8;
                info->red.offset = 0;
                info->green.length = 8;
                info->green.offset = 8;
                info->blue.length = 8;
                info->blue.offset = 16;
                info->pixclock = 3851;
                info->hsync_len = 32;
                info->vsync_len = 6;
                info->vmode = 0; // No interlacing
                info->rotate = 0; // No interlacing
                return 0;
        }

        if(!ioctl_orig) {
                ioctl_orig = dlsym(RTLD_NEXT, "ioctl");
        }

        return ioctl_orig(fd, request, a, b, c, d, e);
}
excite pro /root % cat X.sh
#!/bin/sh

LD_PRELOAD=/root/xorg-ioctls.so Xorg -sharevts -noreset -retro -verbose -fbbpp 32 vt1

Touchscreen events are available at /dev/input/event1 and the final Xorg.conf becomes:

excite pro /root % cat /etc/X11/xorg.conf
Section "ServerLayout"
  Identifier "Layout0"
  Screen   "Screen0"
  InputDevice "Mouse0" "CorePointer"
  InputDevice "Keyboard0" "CoreKeyboard"
EndSection

Section "InputDevice"
  Identifier  "Keyboard0"
  Driver   "evdev"
  Option  "Device" "/dev/input/event1"
  Option  "Protocol" "usb"
EndSection

Section "InputDevice"
  Identifier "Mouse0"
  Driver  "evdev"
  Option  "Device" "/dev/input/event3"
  Option  "IgnoreRelativeAxes" "true"
  Option  "IgnoreAbsoluteAxes" "false"
  Option  "InvertX" "true"
  Option  "InvertY" "true"
  Option  "Mode" "Absolute"
EndSection

Section "Device"
  Identifier "Card0"
  Driver  "fbdev"
  Option  "fbdev" "/dev/fb0"
  Option  "debug" "true"
  # Option  "Rotate" "UD"
  VendorName "Unknown"
  BoardName "Unknown"
EndSection

Section "Screen"
  Identifier  "Screen0"
  Device  "Card0"
  Monitor "Monitor0"
  DefaultDepth    32
  SubSection      "Display"
    Depth               32
    Modes   "2560x1600"
  EndSubSection
EndSection

Section "Monitor"
  Identifier "Monitor0"
  Mode "2560x1600"
      # D: 64.000 MHz, H: 44.444 kHz, V: 54.003 Hz
      DotClock 259.67
      HTimings 2560 2608 2640 2720
      VTimings 1600 1603 1609 1646
      Flags    "+HSync" "+VSync" "-CSync"
  EndMode
EndSection

Section "ServerFlags"
  Option "AutoAddDevices" "false"
EndSection

Nota bene: There is also an open source tegra driver implementation but I didn't check it yet (because I don't need acceleration on this device at the moment).

Unfortunately, WiFi setup is driven via the (now gone) Android userland, so some minimal extra effort needs to be spent to get internet going again:

root@tostab12BA:/data/local/tmp # ifconfig wlan0 up
error: SIOCSIFFLAGS (Operation not permitted)
root@tostab12BA:/data/local/tmp # dmesg
...
<6>[11322.690969] SDIO Vendor ID:02d0 and SDIO Device ID: 4335
<4>[11322.700644] F1 signature OK, socitype:0x1 chip:0x4335 rev:0x1 pkg:0x2
<4>[11322.702630] DHD: dongle ram size is set to 786432(orig 786432) at 0x180000
<4>[11322.704716] _dhdsdio_download_firmware: dongle image file download failed
<4>[11322.705303] dhd_dev_reset: dhd_bus_devreset: -35
<4>[11322.705756] dhd_open : wl_android_wifi_on failed (-35)
...
<4>[11638.286479] dhd_bus_start: dhdsdio_probe_download failed. firmware = /system/etc/firmware/fw_bcmdhd.bin nvram = /system/etc/nvram_4335.txt
root@tostab12BA:/system/etc/firmware # mount -o remount,rw /system
root@tostab12BA:/system/etc/firmware # ln -s /vendor/firmware/bcm4335/fw_bcmdhd.bin fw_bcmdhd.bin
root@tostab12BA:/system/etc/firmware # insmod /system/lib/modules/bcmdhd.ko
root@tostab12BA:/system/etc/firmware # cd /data/misc/wifi
root@tostab12BA:/data/misc/wifi # wpa_supplicant -B -iwlan0 -Dwext -c wpa_supplicant.conf
root@tostab12BA:/data/misc/wifi # dhcpcd wlan0

Combining into

root@tostab12BA:/data/local/tmp # cat root.sh
#!/system/bin/sh

cd /data/local/tmp
./dirtycow start-su.sh /system/bin/debuggerd
./dirtycow start-su.sh /system/bin/netd

sleep 45

./dirtycow glomus.ko /system/lib/modules/gps_drv.ko
echo 'insmod /system/lib/modules/gps_drv.ko; exit' | ./su
./dirtycow gps_drv.ko /system/lib/modules/gps_drv.ko

echo 'insmod /system/lib/modules/bcmdhd.ko' | ./su
( echo 'cd /data/misc/wifi; wpa_supplicant -B -Dwext -iwlan0 -c wpa_supplicant.conf' | ./su ) &
( echo 'dhcpcd wlan0' | ./su ) &

ALSA works out-of-the-box. Integration into the multi-monitor setup was done for a test, but the touchscreen detects very wobbly lines for the stylus and this tablet will be a monitor at the office I think.