MASTG-TECH-0082: Obter Bibliotecas Compartilhadas
Para identificar e analisar efetivamente bibliotecas compartilhadas em um aplicativo iOS, é importante distinguir entre as bibliotecas empacotadas com o aplicativo e as bibliotecas do sistema fornecidas pelo iOS. Essa distinção ajuda a focar nos componentes exclusivos do aplicativo, reduzindo assim ruídos durante as avaliações de segurança.
- Bibliotecas do Sistema: Parte do iOS SDK, localizadas em diretórios como
/System/Library/Frameworksou/usr/lib. Essas bibliotecas são padrão para todos os aplicativos iOS e geralmente não requerem análise detalhada, a menos que haja um motivo específico. - Bibliotecas Empacotadas com o App: Incluídas no pacote do aplicativo, geralmente encontradas no diretório
Frameworks(YourApp.app/Frameworks). Elas incluem bibliotecas de primeira parte (personalizadas) e de terceiros que o desenvolvedor incorporou intencionalmente ao aplicativo. São o foco principal das avaliações de segurança. No entanto, observe que algumas bibliotecas do sistema também podem ser empacotadas com o aplicativo para garantir compatibilidade com versões específicas do iOS SDK, sendo necessário filtrá-las.
Note que não estamos considerando bibliotecas estáticas, que, diferentemente das bibliotecas dinâmicas carregadas em tempo de execução, tornam-se parte do binário do aplicativo, resultando em um único arquivo executável.
Estratégia: Use um dos métodos abaixo, ou uma combinação deles, para identificar bibliotecas compartilhadas e, em seguida, filtre as bibliotecas do sistema para focar naquelas empacotadas com o aplicativo.
Inspecionando o Binário do Aplicativo¶
Navegue até o diretório Frameworks dentro do pacote do aplicativo para encontrar as bibliotecas compartilhadas. Elas geralmente estão na forma de arquivos .framework ou .dylib.
ls -1 Frameworks
App.framework
Flutter.framework
libswiftCore.dylib
libswiftCoreAudio.dylib
...
otool¶
Você pode usar o comando otool -L para listar as bibliotecas compartilhadas.
otool -L MASTestApp
MASTestApp:
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 2503.1.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1345.120.2)
/System/Library/Frameworks/CryptoKit.framework/CryptoKit (compatibility version 1.0.0, current version 1.0.0)
...
radare2 para iOS¶
No radare2, você pode listar as bibliotecas vinculadas usando o comando il.
r2 MASTestApp
[0x100006e9c]> il
[Linked libraries]
/System/Library/Frameworks/Foundation.framework/Foundation
/usr/lib/libobjc.A.dylib
/usr/lib/libSystem.B.dylib
/System/Library/Frameworks/CryptoKit.framework/CryptoKit
...
Objection para iOS¶
Você pode usar o comando list_frameworks do Objection para listar todos os pacotes do aplicativo que representam Frameworks.
...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios bundles list_frameworks
Executable Bundle Version Path
-------------- ----------------------------------------- --------- -------------------------------------------
Bolts org.cocoapods.Bolts 1.9.0 ...8/DVIA-v2.app/Frameworks/Bolts.framework
RealmSwift org.cocoapods.RealmSwift 4.1.1 ...A-v2.app/Frameworks/RealmSwift.framework
...ystem/Library/Frameworks/IOKit.framework
...
O comando list_bundles lista todos os pacotes do aplicativo que não estão relacionados a frameworks. A saída contém o nome do executável, ID do pacote, versão da biblioteca e caminho para a biblioteca.
...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios bundles list_bundles
Executable Bundle Version Path
------------ ----------------------------------------- --------- -------------------------------------------
DVIA-v2 com.highaltitudehacks.DVIAswiftv2.develop 2 ...-1F0C-4DB1-8C39-04ACBFFEE7C8/DVIA-v2.app
CoreGlyphs com.apple.CoreGlyphs 1 ...m/Library/CoreServices/CoreGlyphs.bundle
Frida para iOS¶
A função Process.enumerateModules() no REPL do Frida permite enumerar os módulos carregados na memória durante a execução.
[iPhone::com.iOweApp]-> Process.enumerateModules()
[
{
"base": "0x10008c000",
"name": "iOweApp",
"path": "/private/var/containers/Bundle/Application/F390A491-3524-40EA-B3F8-6C1FA105A23A/iOweApp.app/iOweApp",
"size": 49152
},
{
"base": "0x1a1c82000",
"name": "Foundation",
"path": "/System/Library/Frameworks/Foundation.framework/Foundation",
"size": 2859008
},
{
"base": "0x1a16f4000",
"name": "libobjc.A.dylib",
"path": "/usr/lib/libobjc.A.dylib",
"size": 200704
},
...