夜雨聆风学习资料网

ARTICLE · 1143533

【签名系统源码】为什么 iPhone 装个 App 还要过签名这一关

【签名系统源码】为什么 iPhone 装个 App 还要过签名这一关

SOURCE REVIEW · 代码审计

“

iPhone 不认的从来不是包,是签名

本文看点

Q1

权限

Q2

后台

Q3

证书

01

MECHANISM · WHY SIGNING

一个核心问题:包没问题,为什么手机不认

手里捏着一个几十兆的 ipa 包,双击之后手机上却弹一句「无法验证应用」。文件没问题,工具也在正常出包,屏幕就是不认。第一次碰 iOS 分发的人几乎都会撞一次。

问题不在包,在签名。苹果的规矩是:任何要装进设备的程序,都必须带一张由苹果签发的「身份证」——证书,附一张写明「这张卡能进哪几栋楼、允许几个人持有、有效期到哪天」的通行证——描述文件。少一样,设备直接拦下。

所以才有签名站这门生意:把签名这层动作包成一个网站,传 ipa 上去,签完给个链接。站内这套源码干的就是这件事,CentOS 7.6 + PHP 7.4,配 redis 与 SG15 两个扩展,跑在 ThinkPHP 这套目录结构上。

把一个「签名网站」拆开看,一共四个问题:它要系统给什么权限、谁能进后台、那台服务器替谁保管签名资格、证书到期那天会发生什么。逐个看下去会发现,真正的风险不在代码写得糙,而在它被授权去做一件权限极大的事。

02

AUDIT · PERMISSIONS

第一个问题:它要系统交出什么

源码把环境要求写得非常具体:系统要 CentOS 7.6 及以上,PHP 7.4,装 redis 和 SG15 两个扩展;PHP 配置那栏要求把最大脚本运行时间和最大输入时间都改成 86400 秒,脚本内存限制 1000M,允许上传的文件最大 1000M。

86400 秒就是整整一天,1000M 内存配 1000M 上传限制。这三个数字不是随手填的:ipa 普遍几十到几百兆,签名要解包、重签、再压回去,中间还得调起系统上的签名命令行工具。跑不完就超时,峰值内存不够就被打断。

真正该盯的是这一条:源码明确要求删掉 PHP 的五个禁用函数——shell_exec、exec、popen、proc_open、putenv,改完记得重启 PHP。

这五个是命令执行类函数,删掉意味着 PHP 层可以直接调起系统上的可执行程序。签名本身就得靠外部命令完成,codesign 那一套跑在命令行里,所以这是功能刚需,不是留后门。

但把话说完整:这一步同时把 shell 权限交到了 Web 应用层。功能上必需,风险上是一道敞开的门——任何一处注入或鉴权疏漏,都可能顺着这条通道落到系统命令上。这是一笔必须自己认下来的取舍。

怎么判断必要性:先确认你的签名方案是不是纯命令行完成。如果是,这五个函数删不掉;如果内部另有一套 PHP 实现,那删函数就得多问一句为什么。

03

AUDIT · BACKDOOR

第二个问题:谁握着后台那道门

安装说明里直接给了后台地址:域名后面拼 /zxqm.php,账号 admin,密码 123456。数据库连接写在 application 目录下的 database.php 里,运行目录指到 public,伪静态抄 ThinkPHP 那段标准 rewrite。

这就是接手这套系统的第一道门。后台入口不是常见的 admin 目录,默认口令是六个字符的弱口令,而这套系统部署完就能对外提供签名服务——一个知道地址的人,输错三次就进去了。

这类后台的共同弱点不是功能,而是没人记得改默认口令。宝塔里改完文件、浏览器敲一下地址就完事,部署流程到这儿就断了。

数据库配置文件的位置值得单独说。application/database.php 里躺着数据库地址、账号和密码,而这个目录的运行目录设成 public 恰恰是对的——Web 根目录之外的文件不该被直接访问,这处说明作者知道边界在哪儿。

取舍说清楚:这套系统把「能不能签」做全了,把「谁能签、签给谁」留给部署者。前半段省事,后半段得自己盯。

04

AUDIT · PROFILE

第三个问题:那张通行证 7 天就到期

源码目录里有个文件叫 udid.mobileconfig,放在 public 下面。这个扩展名很多人没见过:mobileconfig 就是描述文件的本体,签名站靠它把一张描述文件推到设备上,装好之后 iOS 才认这个 app。整个链路上还有一步是收集 UDID——设备唯一标识,不登记就没法写进通行证。

苹果在设备启动 app 时会做一轮完整校验:证书、描述文件、Bundle ID 三者必须完全匹配,且签名用的私钥要和当初申请证书时那把一致。任何一项对不上,系统直接拦。

这套机制解释了那个最常见的抱怨:免费账号签的包,装上没几天就打不开——通行证到期了。

免费 Apple ID

描述文件 7 天有效,够自己折腾,不适合人多场景。

付费开发者账号

年费 99 美元,描述文件一年有效,设备额度每年 100 台。

企业开发者账号

年费 299 美元,不限设备台数,授权范围是本企业员工内部使用。

TestFlight

苹果官方公测通道,最多一万名测试者,每个构建 90 天。

顺带一个细节:描述文件过期后别急着删。图标变灰、点不开的时候,app 里的数据其实还完整躺在沙盒里,用同一个 Bundle ID 重新签一遍覆盖装回去就能救回来。手一快点删除,聊天记录、存档全没。

UDID 这一头也值得多说一句。它是设备唯一标识,收集它需要有告知,也得说明留存期限——签完就丢,和攒一份设备名单存在库里,是两件性质完全不同的事。

05

AUDIT · RISK & VERDICT

第四个问题:吊销那天谁都跑不掉

这一条是整套系统里最贵的风险,也最容易忘。企业证书的授权范围写得很清楚:分发对象是本企业员工内部使用。拿它去做公开分发,属于违反协议。

后果不是「这个 app 没了」,是证书被吊销,所有用它签过的 app、在所有装过的设备上一起打不开。iOS 的校验是集中式的,证书一失效,同一信任链下的应用同时失效。圈子里每年都能撞见几轮这种集体失效。所以对这套系统的判断是:拿它做企业内部应用分发,或者做自己设备的调试包,正路;做公开分发,赌的是苹果什么时候来查。

审计路径照这个顺序走一遍:

1

看它要什么权限——五个被删的禁用函数,是不是签名刚需。

2

看谁进后台——默认口令改没改,入口有没有第二层校验。

3

看证书私钥放哪儿——存在你自己机器上,还是在第三方手里。

4

看 UDID 的去向——收集了存不存、存多久、有没有告知。

5

看上传包怎么落地——1000M 上传对应的目录有没有执行权限。

上线前必看

这三行是最容易全过的一关。默认口令 123456、后台路径 zxqm.php、PHP 侧开着 shell_exec——三个洞挨在一起,任何一个被人踩到,另外两个就成了放大器。上线前先把这三处挨个堵上。

END

适合谁,结论先行:要给自己公司内部发应用,或者给固定几个人装测试包,这套系统能跑起来,文档写得细,装完当天就能用。

不适合的有两类。一是打算拿它做公开分发的——风险不在技术,在协议;二是没有固定服务器、也不打算自己保管签名资格的人——它要证书、要私钥、要有人盯着续期,全托管出去反而更贵。

部署不复杂:CentOS 7.6、PHP 7.4、Nginx 伪静态、MySQL 建库,PHP 那边改好时间和内存上限、传 1000M、删五个禁用函数、重启,剩下的按文档走。具体 MySQL 版本源码里没写,我也没查到,装之前先备一句问。到手第一件事还是那件老事:审后门。这套系统权限格外大,重点看三处——后台上传与签名接口的鉴权、命令拼接有没有转义、application 目录有没有被误设成可访问。

最后补一句:用同一个 Bundle ID 重新签一遍能救数据,但这条只对你自己签过的包成立。拿别人的应用、别人的证书去试,落下来的责任不会停在测试环境里。

资源来源:源码库 bbbb.bid/36323.html关注星标公众号不定期分享各种源码「回复消息」查看原始资源

相关学习资料