Save & load the SPKI disk cache using secure coding. #212
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Synopsis
NSSecureCoding encodes data about the original object that was serialized. During the de-serialization process, the secure coding APIs enforce that the created object is of the expected type. This is designed to prevent a substitution attacks in which a serialized file is modified in a way that allows the attacker to run arbitrary code with the privileges – and in the context – of the app.
Attack Details
This code was flagged by automated static security scanners at Yahoo. The vulnerability details are here: https://cwe.mitre.org/data/definitions/502.html
The scanner message:
Proposed Fix
We figure this is easily solved by switching to the NSSecureCoding API introduced in iOS 11. The persisted data is of type
NSMutableDictionary<NSData *, NSData *>
, which already supportsNSSecureCoding
(both the object and the generic types).Impact
Since the data is not currently persisted using a secure coding API, the de-serialization might fail. Specifically,
-loadSPKICacheFromFileSystem
may not succeed after the upgrade. This situation is identical to the "first launch" scenario. Upon initialization a new cache will be saved using the secure coding APIs and subsequent launches will operate as they currently do.