13 votos

Examine android (v30) política de selinux

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?

2voto

pizdelect Puntos 11

Primero debes compilar una versión anterior de libsepol desde el código AOSP (como la correspondiente a la versión 6.0), luego enlaza sepolicy-inject, dispol, etc contra ella. Esta receta funcionó para mí en debian jessie:

cd /hacia/el/dir/de/aosp 
[repo init, etc]
repo sync external/selinux
cd external/selinux
git checkout android-6.0.0_r1^
cd libsepol
make
libsepol=`pwd`
cd /hacia/el/dir/de/origen/de/selinux-inject
make LIBDIR=$libsepol

a diferencia de sepolicy-inject enlazado con libsepol del sistema, este funciona bien con /sepolicy de la imagen 6.0 incluida en el SDK de Android:

$ sepolicy-inject -Z shell -P /tmp/sepolicy -o /tmp/sepolicy 
libsepol.policydb_read: la versión de la política 30 no coincide con mi rango de versiones 15-29
se encontraron errores mientras se analizaba la configuración
No se pudo cargar la política
$ ./sepolicy-inject -Z shell -P /tmp/sepolicy -o /tmp/sepolicy 
libsepol.policydb_index_others: seguridad: 1 usuarios, 2 roles, 525 tipos, 0 bools
libsepol.policydb_index_others: seguridad: 1 sens, 1024 cats
libsepol.policydb_index_others: seguridad: 87 clases, 4767 reglas, 0 reglas cond

Para las herramientas incluidas en la distribución selinux, el truco consiste en compilarlas con el mismo DESTDIR:

cd libsepol
make DESTDIR=/algún/dir instalar
cd ../checkpolicy
make DESTDIR=/algún/dir
# aquí tienes un 'dispol' funcional en el subdirectorio 'test'

0 votos

Gracias. Esto me dio una versión de sedispol que parece funcionar, pero aún no puedo compilar sesearch. Sesearch se detiene buscando el archivo de inclusión (desde otro archivo policy.h). ¿Sabes en qué módulo se encuentra apol?

0 votos

@user3188445: El archivo apol/policy.h es proporcionado por el paquete libapol-dev (al menos en sistemas Ubuntu). Por favor consulta mi respuesta para obtener información más detallada.

1voto

Oliver Puntos 21

Deberías intentar aplicar este parche a las fuentes de libsepol, y luego reconstruir todo incrementalmente. Funcionó para mí en el mismo problema

Puedes intentar usar el clon de libsepol con el parche aplicado de este repositorio https://metizik@bitbucket.org/metizik/selinux_tools.git Lo uso para construir dispol en Windows, y me funciona bien (aunque cabe destacar que estoy usando cygwin para esto)

1voto

Oleksandr Puntos 101

Para las personas que enfrentan el problema con:

policydb versión 30 no coincide con mi rango de versión 15-29

mientras trabajan con código AOSP.

Suponiendo que su código AOSP está verificado en el directorio ~/android/source:

cd ~/android/source
source build/envsetup.sh
export ANDROID_BUILD_TOP=$(pwd)

Y ahora están libres de usar la utilidad audit2allow incluida:

./external/selinux/prebuilts/bin/audit2allow

P.D. También me gustaría abordar el comentario Examinar la política de SELinux de Android (v30)

Sesearch muere buscando el archivo de inclusión (desde otro archivo policy.h). ¿Sabes qué módulo contiene apol?

Compilar el kit de herramientas de SELinux desde las fuentes https://github.com/SELinuxProject/selinux no es muy trivial (a menos que estés usando Fedora). En Ubuntu, necesitas instalar (asumiendo que ya has instalado herramientas de desarrollo básicas como bison y un compilador de C) libglib2.0-dev, libcap-ng-dev, xmlto, libsemanage1-dev, libustr-dev, libaudit-dev, libsepol1-dev

Pero al final todavía he fallado en compilarlo debido a https://bugs.launchpad.net/ubuntu/+source/glib2.0/+bug/793155 y no tengo idea de cómo resolverlo

1 votos

También me encontré con este error glibconfig.h al que estás haciendo referencia al final de tu publicación, fue generado por el Makefile de restorecond porque se encontraban rutas incorrectas codificadas en él. Debes modificarlo para que pueda resolver dinámicamente las rutas utilizando pkg-config. Consulta mi respuesta para más detalles.

0voto

ryan Puntos 11

Audit2allow, audit2why y sesearch están todos rotos con la actualización de la política AOSP al v.30.

Tienes que aplicar los parches a continuación y reconstruir tu árbol Android para actualizar la base de datos de políticas. Estos parches ya se han fusionado en la rama principal y están disponibles a partir de Android N.

https://android-review.googlesource.com/187140 https://android-review.googlesource.com/187111

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X