- 应用安全
【免费下载链接】TrollStore
Jailed iOS app that can install IPAs permanently with arbitary entitlements and root helpers because it trolls Apple
TrollStore 是一个可永久安装 IPA、并附带任意 entitlements 与 root helper 的 Jailed iOS 应用。在其构建流程中,生成 pwned(被植入持久化工具链)的 TrollHelperOTA arm64 IPA 时,需要一个与你所选 "victim"(受害者)应用相同 Team ID 的开发者证书。本文以仓库中 Victim/README.md 为线索,完整讲解这一证书的用途、./make_cert.sh <TEAM_ID>的用法,并结合 Victim/make_cert.sh 逐行剖析其底层证书链构建逻辑,说明产物victim.p12如何被 Makefile 的 IPA 组装流程与 fastPathSign 的 CoreTrust 绕过机制所消费。
一、为什么需要 "Victim 证书":同 Team ID 是整套流程的前提
Victim/README.md 开宗明义:
In order to compile a pwned TrollHelperOTA arm64 IPA, you need to provide a dev cert with the same team ID as your victim app in this directory.
也就是说,如果你希望以某个已在 App Store 上架的 App(即 "victim app")作为载体来构建 TrollHelper 安装包,那么本目录(Victim/)中必须预先放置一份与该 victim app 具有相同 Team ID的开发者证书。
这一要求的深层原因可以在 Exploits/fastPathSign/src/coretrust_bug.c 的绕过逻辑中找到:当 fastPathSign 将 App Store 签名结构移植到目标二进制时,会从 App Store CodeDirectory 中提取 Team ID,并强制要求真实 CodeDirectory 与它保持一致:
// For the bypass to work, both code directories need to have the same team ID char *appStoreTeamID = csd_code_directory_copy_team_id(appStoreCodeDirectoryBlob, NULL); ... if (csd_code_directory_set_team_id(realCodeDirBlob, appStoreTeamID) != 0) {可见Team ID 匹配是整个 CoreTrust 校验绕过的硬性前提。因此make_cert.sh的第一个(也是唯一一个)参数就是<TEAM_ID>,它会被写进整条证书链每个证书的OU字段。
二、使用方式与产物
在仓库根目录下,将<TEAM_ID>替换为你 victim app 的真实 Team ID 后执行:
./make_cert.sh <TEAM_ID>脚本运行完毕后,Victim/目录下会得到唯一的最终产物:
| 产物 | 说明 |
|---|---|
Victim/victim.p12 | 带完整证书链的 PKCS#12 格式开发者证书(友好名 "TrollStore iPhone OS Application Signing"),密码为空 |
仓库中已存在一份Victim/victim.p12,即此前用该脚本生成的示例产物。除victim.p12外的所有中间文件(各 PEM 证书、私钥、CSR、序列号文件)都会在脚本末尾被清理,保证目录干净、只保留最终需要的签名材料。
运行前提
- 需要可用的
openssl命令行工具。脚本在make_cert.sh开头导入了 Homebrew 的 OpenSSL 3 路径:export PATH="/opt/homebrew/Cellar/openssl@3/3.0.5/bin:$PATH"这意味着脚本默认面向 macOS + Homebrew 环境,若你的 OpenSSL 不在该路径,请自行调整
PATH。 - 脚本使用
set -e,任何一步失败都会立即中止,避免产出不完整的证书链。 - 注意脚本以
rm清理中间文件,如需保留中间证书用于调试,可自行注释末尾的清理段落(仓库当前以最终产物为准)。
三、脚本逐行拆解:三条证书链的构建
Victim/make_cert.sh 实际构建了一个三级证书链:Root CA → CodeSigning CA(代码签名二级 CA)→ Leaf 开发证书,再打包为victim.p12。$1(Team ID)会贯穿全部三级证书的OU字段。
1. 自签 Root CA(TrollStore iPhone Root CA)
openssl req -newkey rsa:2048 -nodes -keyout root_key.pem -x509 -days 3650 -out root_certificate.pem \ -subj "/C=CA/O=TrollStore/OU=$1/CN=TrollStore iPhone Root CA" \ -addext "1.2.840.113635.100.6.2.18=DER:0500" \ -addext "basicConstraints=critical, CA:true" -addext "keyUsage=critical, digitalSignature, keyCertSign, cRLSign"- 生成 2048 位 RSA 密钥(
-nodes表示私钥不加密),自签-x509,有效期3650 天(10 年)。 - Subject 中
OU=$1写入 Team ID,CN为 "TrollStore iPhone Root CA"。 - 关键点:附加了 Apple 专有的证书扩展 OID
1.2.840.113635.100.6.2.18,值为 DER 编码的0500。1.2.840.113635是 Apple 的企业 OID 前缀,该扩展用于标记"可签发 Apple 相关签名证书"的 CA;0500是 DER 编码的空 NULL 值,表示该扩展只作标记、不含额外数据。 - 同时声明
CA:true与keyCertSign等 CA 基本约束。
2. 二级 CodeSigning CA(TrollStore iPhone Certification Authority)
openssl req -newkey rsa:2048 -nodes -keyout codeca_key.pem -out codeca_certificate.csr \ -subj "/C=CA/O=TrollStore/OU=$1/CN=TrollStore iPhone Certification Authority" \ -addext "1.2.840.113635.100.6.2.18=DER:0500" \ -addext "basicConstraints=critical, CA:true" -addext "keyUsage=critical, keyCertSign, cRLSign" openssl x509 -req -CAkey root_key.pem -CA root_certificate.pem -days 3650 \ -in codeca_certificate.csr -out codeca_certificate.pem -CAcreateserial -copy_extensions copyall- 先生成 CSR,再由 Root CA 签发,同样 3650 天。
-copy_extensions copyall会把 CSR 中的扩展(包括 Apple 专有 OID 扩展)复制进签发的证书中。- 该 CA 同样带
CA:true,但 keyUsage 只保留keyCertSign, cRLSign(无digitalSignature),职责更收敛——它只负责给叶子证书签发。
3. 叶子开发证书(TrollStore iPhone OS Application Signing)
openssl req -newkey rsa:2048 -nodes -keyout dev_key.pem -out dev_certificate.csr \ -subj "/C=CA/O=TrollStore/OU=$1/CN=TrollStore iPhone OS Application Signing" \ -addext "basicConstraints=critical, CA:false" \ -addext "keyUsage = critical, digitalSignature" -addext "extendedKeyUsage = codeSigning" \ -addext "1.2.840.113635.100.6.1.3=DER:0500" openssl x509 -req -CAkey codeca_key.pem -CA codeca_certificate.pem -days 3650 \ -in dev_certificate.csr -out dev_certificate.pem -CAcreateserial -copy_extensions copyall- 叶子证书
CA:false,keyUsage 仅digitalSignature,并声明extendedKeyUsage = codeSigning(OID1.3.6.1.5.5.7.3.3),表明它是一张标准的代码签名证书。 - 额外附加 Apple 专有 OID
1.2.840.113635.100.6.1.3(值同样为 DER0500),这是 Apple 用于标记"应用签名(Application Signing)"用途的扩展。 - 签发后同样拷贝全部扩展。
4. 组装证书链并导出 victim.p12
cat codeca_certificate.pem root_certificate.pem >certificate_chain.pem /usr/bin/openssl pkcs12 -export -in dev_certificate.pem -inkey dev_key.pem -certfile certificate_chain.pem \ -keypbe NONE -certpbe NONE -passout pass: \ -out victim.p12 -name "TrollStore iPhone OS Application Signing"- 将二级 CA 与 Root CA 拼接为证书链文件,随叶子证书与私钥一起导出 PKCS#12。
- 注意这里特意调用
/usr/bin/openssl(macOS 系统自带版本)而非前面 PATH 中的 Homebrew OpenSSL,因为 macOS 系统 OpenSSL 的pkcs12实现支持-keypbe NONE -certpbe NONE参数,可导出无密码保护的 p12——这正是后续ldid免密加载证书的前提。 -name指定友好名 "TrollStore iPhone OS Application Signing",与叶子证书 CN 一致。
5. 清理中间文件
脚本末尾依次删除certificate_chain.pem、各级 CSR/PEM/私钥等全部中间产物,只留下victim.p12。
四、证书参数速查表
| 证书 | CN | OU(Team ID) | keyUsage | 其他关键扩展 |
|---|---|---|---|---|
| Root CA | TrollStore iPhone Root CA | $1 | digitalSignature, keyCertSign, cRLSign | CA:true;Apple OID 1.2.840.113635.100.6.2.18=DER:0500 |
| CodeSigning CA | TrollStore iPhone Certification Authority | $1 | keyCertSign, cRLSign | CA:true;Apple OID 1.2.840.113635.100.6.2.18=DER:0500 |
| Leaf(开发证书) | TrollStore iPhone OS Application Signing | $1 | digitalSignature | CA:false;EKU=codeSigning;Apple OID 1.2.840.113635.100.6.1.3=DER:0500 |
三个证书有效期均为 3650 天(10 年),密钥统一为 2048 位 RSA。
五、victim.p12 在构建流程中的消费点
victim.p12并非孤立产物,它被仓库顶层 Makefile 的 IPA 组装流程直接引用:
build_installer15(iOS 15 系列安装器)
build_installer15: @unzip ./Victim/InstallerVictim.ipa -d ./_build/tmp15 @cp ./_build/PersistenceHelper_Embedded_Legacy_arm64 ./_build/TrollStorePersistenceHelperToInject @pwnify set-cpusubtype ./_build/TrollStorePersistenceHelperToInject 1 @ldid -s -K./Victim/victim.p12 ./_build/TrollStorePersistenceHelperToInject ... @pwnify pwn ./_build/tmp15/Payload/$$APP_NAME/$$BINARY_NAME ./_build/TrollStorePersistenceHelperToInject流程要点:
- 解包
InstallerVictim.ipa(即 victim app 的 IPA); - 取出编译好的
PersistenceHelper_Embedded_Legacy_arm64,先用pwnify set-cpusubtype调整 CPU subtype,再执行ldid -s -K./Victim/victim.p12用我们生成的victim.p12对它重新签名——这正是victim.p12的核心用途; - 通过
pwnify pwn将已签名的 PersistenceHelper 植入 victim App 的主二进制,重新打包为TrollHelper_iOS15.ipa。
build_installer64e(arm64e 版本安装器)
build_installer64e: @unzip ./Victim/InstallerVictim.ipa -d ./_build/tmp64e ... @pwnify pwn64e ./_build/tmp64e/Payload/$$APP_NAME/$$BINARY_NAME ./_build/PersistenceHelper_Embedded_Legacy_arm64e逻辑与 iOS 15 版一致,差异仅在于使用 arm64e 变体与pwnify pwn64e,同样以./Victim/InstallerVictim.ipa为 victim 载体,并依赖此前用victim.p12签名的持久化辅助程序。
注意:以上两个 target 依赖
./Victim/InstallerVictim.ipa这一文件——它是本机侧的 victim app IPA,由使用者自行准备,未随仓库分发(仓库只包含Victim/victim.p12与证书生成脚本)。因此完整构建前,需要先把自己选定的 victim app IPA 放入Victim/目录并命名为InstallerVictim.ipa。
六、Team ID 匹配与 CoreTrust 绕过的关系
回到 Exploits/fastPathSign/src/coretrust_bug.c 的apply_coretrust_bypass函数,可以完整串起 "victim 证书" 的意义:
- 函数把二进制原有的真实 SHA-256 CodeDirectory 降级为
CSSLOT_ALTERNATE_CODEDIRECTORIES,并把从 Exploits/fastPathSign/src/Templates/AppStoreCodeDirectory.h 模板取出的App Store CodeDirectory(SHA-1)插入为主 CodeDirectory(Exploits/fastPathSign/src/coretrust_bug.c 中的注释说明了修改后的槽位顺序); - 随后提取 App Store CodeDirectory 中的 Team ID,并用
csd_code_directory_set_team_id将真实 CodeDirectory 的 Team ID 改为一致,同时把 flags 清零(去除 adhoc 等标志位); - 通过 Exploits/fastPathSign/src/Templates/CADetails.h 中内嵌的 CA 证书/私钥,基于 CDHash 生成新的 CMS 签名槽,完成"看起来由 Apple 签发"的签名。
而victim.p12中的 Team ID(OU=$1)必须与 victim app 的 Team ID 完全一致,才能保证第 2 步的匹配关系成立、使整条链路在设备侧通过校验。这就是 Victim/README.md 所强调的 "same team ID as your victim app" 的完整技术背景。
七、常见问题与注意事项
- Team ID 从哪来:Team ID 是 victim app 开发者账号的 10 位字符团队标识,可从 Apple Developer 后台或已签名 IPA 的 entitlements/证书信息中查看。
./make_cert.sh <TEAM_ID>只把它写进证书OU字段,脚本本身不校验其真实性。 - p12 密码为空:
-passout pass:配合-keypbe NONE -certpbe NONE使victim.p12无密码,这是为了ldid -K能直接加载;如需安全存储,可自行调整导出参数(需同步修改 Makefile 的签名调用方式)。 - 证书有效期:各级证书均为 3650 天(10 年),长期有效,无需频繁重建;重建时直接重新运行
./make_cert.sh覆盖victim.p12即可。 - 环境依赖:脚本面向 macOS + Homebrew OpenSSL 环境,且
pkcs12导出刻意使用系统/usr/bin/openssl。在 Linux 上运行时需确保 openssl 命令与参数兼容。 - 只读仓库说明:本文涉及的
Victim/目录是构建材料目录,仓库中只包含make_cert.sh与已生成的victim.p12;实际构建时需自行放置InstallerVictim.ipa并执行脚本,无需修改仓库源码。
八、总结
从 Victim/README.md 的 3 行说明出发,可以看到 TrollStore 的完整构建链条中,"victim 证书"并非可有可无的装饰,而是连接victim app 选择 → Team ID 注入 → ldid 签名 → PersistenceHelper 植入 → CoreTrust 绕过校验整条流水线的关键一环。Victim/make_cert.sh 用三条 openssl 命令构建出 Apple 风格的三级代码签名证书链并产出无密码victim.p12,配合 Makefile 的build_installer15/build_installer64e与 Exploits/fastPathSign 的 Team ID 对齐逻辑,即可产出可在目标设备上运行的 TrollHelper OTA 安装包。理解这一前置步骤,是自行复现与定制 TrollStore 构建流程的必修课。
- 应用安全
【免费下载链接】TrollStore
Jailed iOS app that can install IPAs permanently with arbitary entitlements and root helpers because it trolls Apple
相关推荐
Bark 推送证书(APNs Auth Key)使用指南:Key ID、Team ID 与 .p8 证书获取详解
Bark 推送证书(APNs Auth Key)使用指南:Key ID、Team ID 与 .p8 证书获取详解 导读 本文基于 Bark 官方文档中的「推送证
开发工具移动开发nds-bootstrap终极指南:在3DS/DSi上原生运行NDS游戏的完整教程
nds bootstrap终极指南:在3DS/DSi上原生运行NDS游戏的完整教程 你是否想在3DS或DSi设备上重温经典的任天堂DS游戏?nds bootst
嵌入式固件Real-Debrid Client Proxy 上手指南:三步接好 Sonarr 自动下载
Real Debrid Client Proxy 上手指南:三步接好 Sonarr 自动下载 还在 Debrid 网站上手动复制链接、再贴进下载工具里?Real
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考