Estoy tratando de encontrar qué política está realmente implementada en mi teléfono usando selinux. Uno pensaría que esto sería fácil. Después de todo, para la seguridad es bueno verificar que tu política coincida con las expectativas. Desafortunadamente, he encontrado que hacer esto es sorprendentemente difícil, porque A) Android parece usar una versión de política bifurcada 30, y B) la cadena de herramientas de política parece tener un proceso de compilación de baja calidad (muchas rutas codificadas, etc.).
Aquí hay dos cosas que he intentado que no han funcionado. Si intento usar las herramientas de setools tal como vienen empaquetadas para Fedora, o se pueden instalar desde AUR con Arch Linux), entonces obtengo lo siguiente (después de extraer /sepolicy
de la root de mi teléfono o de la imagen de fábrica):
$ sedispol sepolicy
Leyendo la política...
libsepol.policydb_read: la versión de la base de datos de políticas 30 no coincide con mi rango de versión 15-29
sedispol: se encontraron errores al analizar la configuración
$ sesearch --all sepolicy
ERROR: la versión de la base de datos de políticas 30 no coincide con mi rango de versión 15-29
ERROR: No se puede abrir la política sepolicy.
ERROR: Éxito
$
Ok, eso sugiere que tengo que compilar las bibliotecas de selinux para Android. El árbol de fuente de AOSP viene con versiones precompiladas de algunas herramientas pero estas dependen de bibliotecas compartidas antiguas que no tengo (como libpcre3). De todos modos, es bastante impactante si la única forma de verificar tu política de seguridad es confiar en alguna biblioteca compartida binaria que obtienes de Internet.
Así que esto es lo que hice para compilar las bibliotecas de selinux para Android. En Arch, tuve que instalar ustr-selinux
desde AUR, porque ustr usa inline
donde ahora se requiere usar static inline
. Ok, hasta aquí todo bien. Desafortunadamente, el proceso de compilación es bastante desagradable, pero logré compilar e instalar suficiente con lo siguiente:
git clone https://android.googlesource.com/platform/external/selinux \
android/external/selinux
export ANDROID_BUILD_TOP=$PWD/android
DESTDIR=$HOME/android_selinux
export LD_LIBRARY_PATH="$DESTDIR/lib:$DESTDIR/usr/lib"
cd android/external/selinux
sed -ie '/^LDLIBS.*(LIBDIR)/s/$/ ..\/lex.yy.o/' checkpolicy/test/Makefile
make install DESTDIR="$DESTDIR" \
PREFIJO='$(DESTDIR)/usr' \
CFLAGS='-I$(PREFIX)/include' \
-j20 -k
cp checkpolicy/test/dispol "$DESTDIR/usr/sbin/sedispol"
cp checkpolicy/test/dismod "$DESTDIR/usr/sbin/sedismod"
En este punto, sedispol
funciona como una política SElinux común (como una versión 29 policy.29
de Fedora), pero aún no me muestra qué está sucediendo con Android:
$ ~/android_selinux/usr/sbin/sedispol sepolicy
Leyendo la política...
libsepol.avtab_read_item: más de un especificador
libsepol.avtab_read: falló en la entrada 457 de 5582
/home/user/android_selinux/usr/sbin/dispol: se encontraron errores al analizar la configuración
$
También intenté compilar las herramientas vanilla setools3
contra las bibliotecas de Android. Nuevamente, no es tan fácil, pero lo logré funcionar con:
DESTDIR=$HOME/android_selinux
export LD_LIBRARY_PATH="$DESTDIR/lib:$DESTDIR/usr/lib"
git clone https://github.com/TresysTechnology/setools3.git
cd setools3
./configure --prefix=$DESTDIR/usr --with-sepol-devel=$DESTDIR/usr CPPFLAGS="-I$DESTDIR/usr/include -L$DESTDIR/usr/lib"
make -k -j20
Esto no se compila completamente, pero compila suficiente del árbol de fuente para que pueda ejecutar secmds/sesearch
. Esto funciona en un archivo policy.29
vanilla (puedo buscar -A
y -T
, pero --all
me da operación no admitida
). Sin embargo, falla por completo con un error similar al intentar examinar un archivo de la versión 30 de Android:
$ ./secmds/sesearch -A sepolicy
ERROR: más de un especificador
ERROR: falló en la entrada 457 de 5582
ERROR: No se puede abrir la política sepolicy.
ERROR: Éxito
$
En este punto, mi mente está un poco aturdida de que la herramienta en torno a algo tan crítico como la política de seguridad del sistema sea realmente tan difícil de compilar. Seguro que debo estar haciendo algo mal. ¿Alguien ha logrado examinar una política de seguridad de Android sin depender de bibliotecas compartidas binarias distribuidas externamente?
Debo agregar que también intenté las técnicas sugeridas para reconstruir todas las herramientas precompiladas (ndk/build/tools/download-toolchain-sources.sh
y ndk/build/tools/rebuild-all-prebuilt.sh
). Sin embargo, el script download-toolchain-sources.sh
está actualmente roto. Intenta comprobar directorios de versiones antiguas que ya no están en los repositorios, y de todos modos no parece descargar ninguna herramienta relacionada con selinux, a pesar de que prebuilts/python
contiene código relacionado con selinux. De nuevo, me sorprende lo anticuados que son estos sistemas de compilación, y creo que debe haber una forma más fácil. ¿Cómo puedo obtener herramientas que me permitan verificar mi política de selinux para Android?