- 필수 기능
- 시작하기
- Glossary
- 표준 속성
- Guides
- Agent
- 통합
- 개방형텔레메트리
- 개발자
- Administrator's Guide
- API
- Datadog Mobile App
- CoScreen
- Cloudcraft
- 앱 내
- 서비스 관리
- 인프라스트럭처
- 애플리케이션 성능
- APM
- Continuous Profiler
- 스팬 시각화
- 데이터 스트림 모니터링
- 데이터 작업 모니터링
- 디지털 경험
- 소프트웨어 제공
- 보안
- AI Observability
- 로그 관리
- 관리
",t};e.buildCustomizationMenuUi=t;function n(e){let t='
",t}function s(e){let n=e.filter.currentValue||e.filter.defaultValue,t='${e.filter.label}
`,e.filter.options.forEach(s=>{let o=s.id===n;t+=``}),t+="${e.filter.label}
`,t+=`ID: swift-security/exportable-keychain
Language: Unknown
Severity: Notice
Category: Security
This rule aims to prevent the export of sensitive data by ensuring secure keychain accessibility settings in Swift applications. Exporting sensitive data with improper keychain access attributes, such as kSecAttrAccessibleAlways
or kSecAttrAccessibleAfterFirstUnlock
, increases the risk of unauthorized access, especially if the device is compromised or stolen.
To comply with this rule, always set the kSecAttrAccessible
attribute to a secure value that limits data accessibility to the device only and requires user authentication or passcode protection. For example, use query[kSecAttrAccessible as String] = kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
instead of less secure options. This practice minimizes the risk of sensitive data leakage from your app’s keychain storage.
class keychainController: keychainViewController {
func foo(_ data: Data, forKey key: String) {
let query: [NSString: Any] = [
kSecClass: secClass,
kSecAttrAccount: key,
kSecAttrAccessGroup: accessGroup
]
let attributes: [NSString: Any] = [
kSecValueData: data,
kSecAttrAccessible: kSecAttrAccessibleAfterFirstUnlock
]
}
}
class keychainController: keychainViewController {
func foo() {
let keychainItemQuery = [
kSecValueData: "test123".data(using: .utf8)!,
kSecClass: kSecClassGenericPassword,
kSecAttrAccessible: kSecAttrAccessibleAfterFirstUnlock
] as CFDictionary
SecItemAdd(keychainItemQuery, nil)
}
}
class keychainController: keychainViewController {
func foo() {
var query: [String: Any] = [kSecClass as String: kSecClassInternetPassword,
kSecAttrAccount as String: account,
kSecAttrServer as String: server,
kSecValueData as String: password,
kSecAttrAccessible as String: kSecAttrAccessibleAlways]
SecItemAdd(query,r)
}
}
class keychainController: keychainViewController {
func foo() {
var query = [String : AnyObject]()
query[kSecAttrAccessible as String] = kSecAttrAccessibleAlways
SecItemAdd(query as CFDictionary, nil)
}
}
class keychainController: keychainViewController {
func foo() {
var query = [String : AnyObject]()
query[kSecAttrAccessible as String] = kSecAttrAccessibleAlways
SecItemAdd(query as CFDictionary, nil)
}
}
class keychainController: keychainViewController {
func foo() {
var query = [String : AnyObject]()
query[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock
SecItemAdd(query as CFDictionary, nil)
}
}
class keychainController: keychainViewController {
func foo(_ data: Data, forKey key: String) {
let query: [NSString: Any] = [
kSecClass: secClass,
kSecAttrAccount: key,
kSecAttrAccessGroup: accessGroup
]
let attributes: [NSString: Any] = [
kSecValueData: data,
kSecAttrAccessible: kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
]
}
}
class keychainController: keychainViewController {
func foo() {
var query = [String : AnyObject]()
query[kSecAttrAccessible as String] = kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
SecItemAdd(query as CFDictionary, nil)
}
}