Usé APKTool para encontrar los siguientes detalles:
- No es un Marco de trabajo ni una Biblioteca compartida,
- No se respalda,
- Parece usar algunos permisos personalizados (
INTENT_FILTER_VERIFICATION_AGENT
, BIND_INTENT_FILTER_VERIFIER
, INTENT_FILTER_NEEDS_VERIFICATION
)
- Tiene un Receptor de emisión, por lo que presumiblemente esto de la VERIFICACIÓN NECESARIA está sucediendo a nivel del sistema operativo,
- Es un Servicio.
Intenté leer el código invertido, pero no tengo experiencia con Smali y por lo tanto no hice mucho progreso significativo. Luego, utilicé AndroGuard para hacer un gráfico de llamadas:
androcg.py --output intent-filter.gml --no-isolated Intent\ Filter\ Verification\ Service_com.android.statementservice.apk
... luego convertí esto en una imagen:
import networkx as nx
import matplotlib.pyplot as plt
ifv = nx.read_gml('intent-filter.gml')
# filtrar algo de cosas del sistema, creo
ifv = ifv.subgraph([a for a in ifv.nodes() if not 'Landroid' in a])
# filtrar algo de cosas de utilidad de Java, creo
ifv = ifv.subgraph([a for a in ifv.nodes() if not 'Ljava/lang' in a])
isolates = nx.isolates(ifv)
nonisolates = list(set(ifv.nodes()) - set(isolates))
ifv = ifv.subgraph(nonisolates)
relabeler = {key: key.split()[0].split('/')[-1] for key in ifv.nodes()}
ifvn = nx.relabel_nodes(ifv, relabeler)
ifvn.remove_edges_from(nx.selfloop_edges(ifvn))
nx.draw(ifvn, with_labels=True)
fig = plt.gcf()
fig.set_size_inches(18, 10)
fig.savefig('intent-filter.jpg',dpi=200)
Obtengo esto:
Mi sospecha por el nombre del servicio es que efectivamente toma un Intent
y determina si ese Intent
satisface el (gramática? de ...) Filtro de Intenciones de cada componente exportable públicamente declarado en cada Manifest.xml
de todas las aplicaciones en el dispositivo. Este gráfico de llamadas parece apoyar mi hipótesis. En particular, URL
está en el centro con toneladas de aristas salientes, los nodos en el anillo intermedio parecen ser verificación o filtrado de algún tipo (interpretando un mensaje extendido nano, mirando una respuesta de red, extrayendo los datos del Intent
, obteniendo un puerto web, verificando si un protocolo es válido o inválido ...), y finalmente los elementos más externos que solo tienen aristas entrantes parecen estar ejecutando el Intent
al pasarlo a un destino (por ejemplo, HttpURLConnection ->
, NetworkResponse
, AndroidAppAsset
, ...), o descartándolo como inválida (InvalidProtocolBufferNanoException
, ResistanceFollowRedirects
, OutOfSpaceException
, ...).
Soy solo un investigador aficionado y no puedo afirmar realmente saber qué significa todo esto, pero esta es mi opinión. Creo que el Servicio forma la conexión entre un Intent
invocado y todos los IntentFilter
s en las aplicaciones en el dispositivo. Creo que decide qué va a qué aplicación, si algo tiene datos inválidos como en un escenario de falsificación nula, y si algo debería ir a la web. Creo que también detiene algún tipo de ataque de redirección infinita. Sospecho que esto es un esfuerzo por parte del equipo de desarrollo de Android para defenderse contra ataques de comunicación entre componentes (ICC) y vulnerabilidades de enlace de aplicaciones / URI. ¡Espero que esto ayude!