Detección de bibliotecas de terceros en aplicaciones de Android con alta precisión y retiro.
Yuan Zhang, Jiarun Dai, Xiaohan Zhang, Sirong Huang, Zhemin Yang, Min Yang, Hao Chen.
En Actas de la Conferencia Internacional IEEE sobre análisis de software, evolución y reingeniería, SANER'18, Campobasso, Italia, 20-23 de marzo de 2018. [PDF]
Las bibliotecas de terceros se usan ampliamente en aplicaciones de Android para aliviar el desarrollo y mejorar las funcionalidades. Sin embargo, las bibliotecas incorporadas también traen nuevos problemas de seguridad y privacidad a la aplicación del host, y difuminan la contabilidad entre el código de aplicación y el código de la biblioteca. Bajo esta situación, un detector de biblioteca preciso y confiable es altamente deseable. De hecho, los desarrolladores pueden personalizar el código de la biblioteca durante la integración y el código de la biblioteca muerta puede ser eliminado por los obfuscadores del código durante el proceso de compilación de la aplicación. Sin embargo, la investigación existente sobre la detección de la biblioteca no ha manejado con gracia estos problemas, así que enfrenta limitaciones severas en la práctica.
En este documento, proponemos Libpecker, un detector de biblioteca de biblioteca resistente a la ofuscación, altamente preciso y confiable para aplicaciones de Android. Libpecker adopta una coincidencia de firma para dar una puntuación de similitud entre una biblioteca determinada y una aplicación. Al utilizar completamente las dependencias de clase internas dentro de una biblioteca, Libpecker genera una firma estricta para cada clase. Para tolerar la personalización y eliminación del código de la biblioteca tanto como sea posible, Libpecker introduce el umbral de similitud de clase adaptativa y la puntuación de similitud de clase ponderada al calcular la similitud de la biblioteca. Para evaluar cuantitativamente la precisión y el retiro de libpecker, realizamos el primer experimento de este tipo (según nuestro conocimiento) con una gran cantidad de bibliotecas y aplicaciones. Los resultados muestran que Libpecker supera significativamente las herramientas de vanguardia tanto en recuperación como en precisión (91% y 98.1% respectivamente).
Consideramos el problema de la detección de la biblioteca en un escenario más realista para que los desarrolladores de aplicaciones incorporen bibliotecas de terceros, es decir, la personalización del código y la eliminación de código pueden ocurrir tanto a nivel de clase como a nivel de clase de clase. En una aplicación, no existe un límite claro entre el código de la aplicación y el código de la biblioteca, lo que hace que la detección de la biblioteca sea bastante desafiante. Nuestro enfoque utiliza la coincidencia de similitud a nivel de clase para probar si las funcionalidades principales de una biblioteca aún están presentes en una aplicación. Se necesita una copia exacta de una biblioteca dada y una aplicación como entradas, y calcula una puntuación de similitud (que varía de 0 a 1) entre la biblioteca y la aplicación. Si el puntaje de similitud excede un umbral, Libpecker informa que la biblioteca está presente en la aplicación.
Como se muestra en la siguiente figura, nuestro enfoque consta de dos partes principales: a) generación de firma para todas las clases de biblioteca y clases de aplicaciones; b) Proceso de coincidencia de la biblioteca para dar una puntuación de similitud entre una biblioteca determinada y una aplicación dada basada en las firmas de clase. Se pueden encontrar más detalles en nuestro artículo.

Libpecker acepta dos entradas: una aplicación Android (archivo .apk) y una biblioteca (archivo .dex). Libpecker devuelve una similitud para representar cuánto código de la biblioteca se puede encontrar en la aplicación.
java -jar LibPecker.jar <apk_path> <lib_path>
Para transformar los archivos de la biblioteca (como el archivo .jar/.aar), puede usar el comando DX en el directorio bin .
##### Linux
./bin/dx --dex --output=<lib_dex> <lib_jar_path>
##### Windows
./bin/dx.sh --dex --output=<lib_dex> <lib_jar_path>
También proporcionamos algunos casos de prueba en el directorio de prueba . Para probar estos casos, puede ejecutar este comando.
java -cp LibPecker.jar -Xmx4G cn.fudan.libpecker.main.TestDriver
La salida esperada es como la siguiente.
=== pass test: test/apk/3f217d600168e62b062b4c424ef4224d.apk test/lib/7f799553d1957873a92a2cf96b85ef2625195788ebbf6d7ae83ff3263c114c53.dex
similarity: 0.5920433145009416
=== pass test: test/apk/3f217d600168e62b062b4c424ef4224d.apk test/lib/9798a656af89d4f6e6c0d7ad60e4863347d89503a795381e51f6e463dc32fd6d.dex
similarity: 0.14186450492182975
=== pass test: test/apk/3f217d600168e62b062b4c424ef4224d.apk test/lib/a4564e66bacf765a2cd403d274c49380dc067c4ca2449e68fa6201da2ea783d9.dex
similarity: 0.35957322333349556
=== pass test: test/apk/3f217d600168e62b062b4c424ef4224d.apk test/lib/5277a56f0c4f8a18a35a2d7e020b0546436eb81c4b5c4e492dc3cfa36436e0b4.dex
similarity: 0.5954615408654523
=== pass test: test/apk/482c5db677fbf14040c93ddeb3714526.apk test/lib/163f8315a054e25db69d7b2b8aa6097804d1d4d30003dda4ff07be21678b9587.dex
similarity: 0.33905778602924114
=== pass test: test/apk/482c5db677fbf14040c93ddeb3714526.apk test/lib/af5b684ea74defaea3a8cdc5e67bebd9ed527673c6d00b691365e7c23319da67.dex
similarity: 0.0626696274364668
=== pass test: test/apk/482c5db677fbf14040c93ddeb3714526.apk test/lib/a873ffc1d69a6d38fff2bc9b17250963f09ee934aa8f86d2abb0ba80a4d4a38f.dex
similarity: 0.5981256669903423
=== pass test: test/apk/d11006c50e299a18539c6411285660a4.apk test/lib/e466ea56ddb39d05c43912dbafcd42ae5e178e80f5ebd1e7c0c3682e040ef4a6.dex
similarity: 0.9995280792826807
=== pass test: test/apk/d11006c50e299a18539c6411285660a4.apk test/lib/1ddc4f3804cdf219ae7feaf4647a5e1d79bfc1863208fac98cba54bf4b282994.dex
similarity: 1.0
=== pass test: test/apk/bb1ae8661d82b36fa26f9fe9801943c7.apk test/lib/bdabe04fa6179d13e590f6173acbc94d9ffdbc4b4a9310a989e30820c27b94e8.dex
similarity: 1.0
=== pass test: test/apk/bb1ae8661d82b36fa26f9fe9801943c7.apk test/lib/b46bf10c7a9e4dfa24c88f87d34a9dfb5248f7718f392e1518099f8d9f69cca5.dex
similarity: 0.9490735206216379
=== pass test: test/apk/b75eef27fd4b3f5c65a8a1c7eb677d05.apk test/lib/b42266a9b224e604911716c43bf2516cce03ad551d7db213747297efd866182c.dex
similarity: 1.0
=== pass test: test/apk/b75eef27fd4b3f5c65a8a1c7eb677d05.apk test/lib/967af7be58c4efde245efea26e544d4dabb351f09f396f41b40c78d32c2723a0.dex
similarity: 0.9999999999999998
=== pass test: test/apk/b75eef27fd4b3f5c65a8a1c7eb677d05.apk test/lib/cf0d095b6db6ecedd56654228db442f152c1445d07d9cca14c6a147b2c730f5a.dex
similarity: 0.9672300793377027
=== pass test: test/apk/b75eef27fd4b3f5c65a8a1c7eb677d05.apk test/lib/bc626e62b8783e095b3fd857423ef7713de12b2a9e89fa3280e45f5a9fdd7de7.dex
similarity: 0.9708244371118012
=== pass test: test/apk/b75eef27fd4b3f5c65a8a1c7eb677d05.apk test/lib/e466ea56ddb39d05c43912dbafcd42ae5e178e80f5ebd1e7c0c3682e040ef4a6.dex
similarity: 1.0
=== pass test: test/apk/6f35b5e01899df4cc91a31f2773b7217.apk test/lib/cf819dbfef851e6f21def64d3f4b4cc5d7425104b4830ec765dc5157c4453831.dex
similarity: 1.0
=== pass test: test/apk/6f35b5e01899df4cc91a31f2773b7217.apk test/lib/7cc2314e50de4dc66de7c108ab9c429f3122c6056855fac016fe2a00a9e4ee08.dex
similarity: 0.9999999999999993
=== pass test: test/apk/b75eef27fd4b3f5c65a8a1c7eb677d05.apk test/lib/44555093604035841f936e76428e8bc2087737d58387d2718c3878481332220b.dex
similarity: 1.0
=== pass test: test/apk/b75eef27fd4b3f5c65a8a1c7eb677d05.apk test/lib/798f6bed0fca807e9b47e2f3a0a2f99e4a0618e6cf0639b3444eb72f8a4933cf.dex
similarity: 0.9999999999999997
Para configurar el entorno de desarrollo, puede abrir directamente libpecker.iml en la idea de IntelliJ . Tenga en cuenta que se necesita JDK 1.7. Si tiene más preguntas, comuníquese con Yuanxzhang [at] fudan.edu.cn .
@inproceedings{libpecker-saner-2018,
author={Y. Zhang and J. Dai and X. Zhang and S. Huang and Z. Yang and M. Yang and H. Chen},
booktitle={2018 IEEE 25th International Conference on Software Analysis, Evolution and Reengineering (SANER)},
title={Detecting third-party libraries in Android applications with high precision and recall},
year={2018},
volume={},
number={},
pages={141-152},
keywords={Library Detection, Code Similarity, Obfuscation Resilienc},
doi={10.1109/SANER.2018.8330204},
ISSN={},
month={March},
}