swift-security-pro — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited swift-security-pro (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Protect user data and credentials. Default to the most secure option.
Trigger: /swift-security-pro.
UserDefaults or plist.❌ UserDefaults — plaintext, backed up, readable
UserDefaults.standard.set(token, forKey: "authToken")✅ Keychain
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: "authToken",
kSecValueData as String: Data(token.utf8),
kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]
SecItemDelete(query as CFDictionary)
SecItemAdd(query as CFDictionary, nil)Use ...ThisDeviceOnly accessibility so secrets don't migrate via backup.
❌
let apiKey = "sk_live_abc123" // shipped in the binary, easily extracted✅
.gitignore.NSAllowsArbitraryLoads.URLSessionDelegate urlSession(_:didReceive:completionHandler:).
❌ Info.plist
<key>NSAppTransportSecurity</key><dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>✅ Leave ATS on; scope rare exceptions to a specific domain only.
Mark sensitive files so they're encrypted at rest while locked:
try data.write(to: url, options: .completeFileProtection)import LocalAuthentication
let ctx = LAContext()
var error: NSError?
if ctx.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
let ok = try await ctx.evaluatePolicy(
.deviceOwnerAuthenticationWithBiometrics,
localizedReason: "Unlock your vault")
}Biometrics gate access; the actual secret still lives in the Keychain (optionally with SecAccessControl requiring biometry). Always provide a passcode fallback.
UserDefaults or a plist.NSAllowsArbitraryLoads / disabled ATS....ThisDeviceOnly for non-syncable secrets.Per issue: file:line, the exposure, before/after fix. Lead with credential leaks and plaintext storage.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.