macOS上pkg安装包的知识点补充


=Start=

缘由:

之前在学习macOS上pkg安装包制作的时候整理了一篇文章《macOS上pkg安装包的制作》,简单说了一下如何使用 Packages 应用生成pkg安装包,这里简单记录一下后来碰到的一些知识点,方便有需要的时候参考。

正文:

参考解答:
  1. 签名报错(Error 65)

用 Packages 生成的pkg安装包在本地通过命令 installer 执行安装的时候是没有问题的,但是如果你想通过MDM进行自动批量下发安装的话,需要对生成的pkg安装包做签名(xcrun stapler staple xxx.pkg),但是经过多次测试发现,如果是在Payload里直接放其它的pkg安装包或是可执行文件,然后通过 preInstall 或者 postInstall 脚本来执行/启动的话,这样生成的安装包在签名的时候会报错,如果改成在 preInstall/postInstall 通过HTTPS下载再执行/启动的话就没问题,但具体的原因还不清楚,可能是苹果出于安全考虑做的一点限制?这里先记录一下,先把问题解决,具体原因以后有机会再研究。不过这里需要补充的就是,对于要下载的文件,最好提前放在CDN上,以加速下载,否则安装速度过慢可能导致失败和吐槽。

  1. pkg的文件结构
$ file pkg001.pkg
pkg001.pkg: xar archive compressed TOC: 1395, SHA-1 checksum, contains zlib compressed data zlib compressed data

$ tar tvf pkg001.pkg
drwxr-xr-x  3 root   wheel       0  9 19 17:51 Resources
drwxr-xr-x  2 root   wheel       0  9 19 17:51 Resources/en.lproj
-rw-r--r--  1 root   wheel      70  9 19 17:51 Resources/en.lproj/Localizable.strings
-rw-r--r--  1 root   wheel     940  9 19 17:51 Distribution
drwxr-xr-x  2 root   wheel       0  9 19 17:51 pkg001.pkg
-rw-r--r--  1 root   wheel   35077  9 19 17:51 pkg001.pkg/Bom
-rw-r--r--  1 root   wheel      80  9 19 17:51 pkg001.pkg/Payload
-rw-r--r--  1 root   wheel    1098  9 19 17:51 pkg001.pkg/Scripts
-rw-r--r--  1 root   wheel     370  9 19 17:51 pkg001.pkg/PackageInfo

$ file pkg001.pkg/Scripts
pkg001.pkg/Scripts: gzip compressed data, from Unix, original size modulo 2^32 3072
$
$ file pkg001.pkg/Payload
pkg001.pkg/Payload: gzip compressed data, from Unix, original size modulo 2^32 512

$ cat pkg001.pkg/PackageInfo
<pkg-info format-version="2" identifier="com.company.pkg.pkg001" version="1.0" relocatable="false" overwrite-permissions="false" followSymLinks="false" install-location="/Library/Application Support" auth="root">
<payload installKBytes="0" numberOfFiles="1"/>
<scripts>
    <preinstall file="./preinstall"/>
    <postinstall file="./postinstall"/>
</scripts>
</pkg-info>

# 简单来说一个 pkg 文件其实就是一个压缩包,里面包含 2个目录(Resources,pkg001.pkg) 和 1个文件(Distribution),我比较关注的是 pkg001.pkg/Scripts 这个文件(是个gzip格式的压缩文件),因为里面包含的是 preInstall/postInstall 的脚本内容
# pkg001.pkg/PackageInfo 这个文件是一个文本文件,描述了当前这个pkg文件的组成和结构信息。

# 解压 pkg001.pkg/Scripts 文件之后就可以拿到 preinstall/postinstall 的文件了,可以看到这个pkg在安装前后都做了什么操作
$ tar tvf pkg001.pkg/Scripts
drwxr-xr-x  4 0      0           0  9 19 17:51 .
-rwxr-xr-x  1 0      0         909  9 19 17:48 ./postinstall
-rwxr-xr-x  1 0      0        1599  9 19 17:48 ./preinstall
  1. macOS上的恶意pkg安装包

当你遇到了来源不明的pkg安装包时,不要随意去下载安装,因为这很可能是黑客的一个“钓鱼”行为,当前的pkg安装基本都需要输入电脑密码,这种情况下恶意pkg在 preinstall/postinstall 里用 sudo 做一些事情就直接后台静默操作了,很容易导致你的信息泄漏、电脑被控。你可以先用上面的方法试着看看pkg的 Scripts 内容有没有可疑的点,同时将文件丢到 VirusTotal 等在线扫描引擎上去扫描看看。

参考链接:

macOS上pkg安装包的制作
https://ixyzero.com/blog/archives/5257.html

=END=


《“macOS上pkg安装包的知识点补充”》 有 1 条评论

  1. AppleScript 介绍
    https://mp.weixin.qq.com/s/gz3opFc9rv3wwAY71ZCBbw
    `
    启动台 – 其他 – 脚本编辑器

    ==
    脚本编辑器(Script Editor.app)可以将写好的AppleScript脚本导出为 .app 格式的应用程序,在macOS上可以直接执行。
    ==
    Shell 调用 AppleScript 可以用 osascript -e

    osascript – execute OSA scripts (AppleScript, JavaScript, etc.)
    > -e statement
    > Enter one line of a script. If -e is given, osascript will not look for a filename in the argument list. Multiple -e options may be given to build up a multi-line script. Because most scripts use characters that are special to many shell programs (for example, AppleScript uses single and double quote marks, “(”, “)”, and “*”), the statement will have to be correctly quoted and escaped to get it past the shell intact.
    `

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注