Projects/OWASP Mobile Security Project - Top Ten Mobile Controls

Top 10 mobile controls and design principles
1. Identify and protect sensitive data on the mobile device

Risks: Unsafe sensitive data storage, attacks on decommissioned phones unintentional disclosure: Mobile devices (being mobile) have a higher risk of getting lost, stolen. And it is trivial to Jailbreak or root the device once someone has physical possession of the device. Adequate protection be built to minimize the loss of sensitive data on device.


 * In the design phase analyze what data is sensitive and needs to be protected and apply appropriate controls (user personal/privacy data, password credentials etc.).
 * Store sensitive data on the server instead of client-end device, if possible.
 * Leverage the encryption and key-store mechanism provided by the mobile OS/hardware to secure sensitive data. In case no good key management is available on the client-end, storing keys on the server side could be considered.
 * Do not store/cache sensitive data on the removable media
 * Use only protected temp/cache directories (Do not store temp/cached data in a world readable directory)
 * Automatically delete data from device which is no longer required
 * Be aware of caches and temporary storage as a possible leakage channel
 * Managed devices should leverage remote wipe and kill switch to remove sensitive information from the device
 * Schedule deletion according to time, rather than on a push-pop basis.
 * Use secure deletion procedures.
 * Be careful when sharing cache data with other applications (check for covert channels leaking sensitive data)
 * Consider the security of the whole data lifecycle in writing your application (collection over the wire, temporary storage, caching, backup, deletion etc...)
 * Where possible classify data storage according to sensitivity and apply controls accordingly (e.g. passwords, contact data, location vs error logs).
 * Apply the principle of minimal disclosure - only collect and disclose data which is required for the application (how to know what this is?)
 * Use non-persistent identifiers which are not shared with other apps wherever possible - e.g. do not use the device ID number as an identifier unless there is a good reason to do so.
 * Apply techniques for the detection of covert channels - e.g. covert flow trees to discover information which may flow through shared resources such as file systems, resource use etc...
 * Carefully control what data which is stored in public stores such as address book, media gallery etc... including metadata.
 * Consider using SIM card as default storage for small but sensitive data such as keys. //To be researched more
 * For cryptographic keys, implement key management best practice including exploiting SIM card capabilities where possible //hook to best practice.

2. Handle password credentials securely on the device

Risks: Spyware, Surveillance, Financial malware, UI impersonation User's password credentials if stolen not only provides unauthorized access to the mobile backend service but potentially many other services/accounts used by the user. Since a majority of the users reuse their passwords (http://www.pcworld.com/article/188763/too_many_people_reuse_logins_study_finds.html )


 * Instead of passwords consider using longer term authorization tokens that can be securely stored on the device . Encrypt the tokens while stored on the device and in transit. Tokens can be issued by the backend service after verifying the user credentials initially. And the tokens could be time bound to the specific service, minimizing the damage in loss scenarios. Consider using the latest versions of the authorization standards (such as OAuth 2.0).
 * In case passwords need to stored on the device leverage the encryption and key-store mechanism provided by the mobile OS/hardware to securely store password credentials
 * Provide mechanisms to the mobile user to change/remove passwords on the device (renew tokens)
 * Password credentials should be marked to avoid being copied to backups
 * Ensure passwords and keys are not visible in cache or logs
 * We recommend that one-time codes (OTP) should not be forwarded via SMS (Zitmo)... //or can we make a better rec on this?

3. Ensure sensitive data is protected in transit

Risks: Network spoofing attacks, Surveillance Majority of the smartphones are capable of using multiple transport carriers including Wifi, provider network(3G, GSM,..), bluetooth. Sensitive data passing through insecure channels could be intercepted.


 * Protecting Data in transit (assume the worst case, user sitting in a public unprotected wifi )
 * Applications should ensure that a secure channel (such as SSL/TLS) is established end-end when sending sensitive information on wire/air. (Do not assume transport encryption)
 * To reduce the risk of man-in-middle (like SSL proxy), secure connection should only be established after verifying the credentials of remote end-point (server). This can be achieved by ensuring that SSL is only established with the end points having the trusted certificates in key chain. //This carries a high usability cost as advice...
 * Do not disable or ignore the SSL chain validation.
 * SMS, MMS or notifications should not be used to send sensitive data to mobile end points // What about banking OTP's?
 * Consider use of GSM encryption-on flags to verify that GSM encryption is on.
 * Provide appropriate trust cues for linking to unknown third party applications.
 * Do not train users to follow untrusted paths (e.g. accept invalid certificates).
 * Provide a reporting channel for phishing from apps (e.g. if you are a browser plugin developer).

Reference: Google vulnerability of Client Login account credentials on unprotected wifi

4. Keep the back-end API and mobile platform secure

Risks: Attacks on back-ends through mobile device, loss of data via cloud storage. Majority of the mobile applications interact with the backend APIs using REST/Web Services or other proprietary protocols. Insecure implementation of backend APIs or services, and not keeping the back-end platform hardened/patched will allow bad guys to directly attack/compromise the back-ends.


 * Web Services/ SOAP/ REST, security best practices (placeholder)
 * Input validation
 * Do not use a generic shared secret for integration to backend (like embedded password in code)
 * Use authentication that ties back to the end user identity (rather than the device identity)
 * Ensure authorization controls are done correctly in the backend APIs.
 * Ensure that the backend platform is running on a hardened configuration with latest security patches
 * Employ rate limiting and throttling, test for DDoS vulnerabilities

5. Implement user authentication/authorization and session management correctly

Risks: Majority of the mobile applications interact with the backend APIs using REST/Web Services or other proprietary protocols. It is important to ensure that the session management is done correctly after the initial authentication.


 * User authentication must be based on user's credentials.
 * Use unpredictable session identifier with high entropy
 * Do not use device id (UDID or IMEI) as the only session identifier. Device Id is easy to spoof and potentially leaks private information when linked to other data. (Device Id could in some cases be used as an additional check that the request is originating from the known device) // Giles:I would NOT make the last recommendation because Device ID can be used for cross-site tracking since it is shared between apps.
 * Session tokens can be cached using the operating system features to encrypt while in storage on device (e.g. Keychains).
 * Device cert can be used for stronger device identity
 * Implement best practices for dormancy (3GPP), caching etc... to minimise signalling load on base stations.
 * Warn user and obtain consent for any cost implications for app behaviour.

Reference: Google's ClientLogin implementation

6. Ensure strong vulnerability and patch management in place


 * All the back-end APIs (WebServices/REST) for mobile apps must be tested for vulnerabilities periodically.
 * Developers should use static code analyzer tools and fuzzing tools for testing and finding security flaws.
 * Applications must be designed and provisioned to allow updates for security patches, taking into account the requirements for approval by app-stores.
 * Application team is responsible for tracking all third party frameworks/APIs used in the mobile application for security patches. A corresponding security update must be done for the mobile application using these third party APIs/frameworks.

7. Employ the secure coding/development practices

//Risk? Isn't this circular? I don't understand the principle here.

//(Add least privilege) //What sort of information should be recorded in the logs.
 * Input Validation and Output Encoding
 * Vet the security/authenticity of any third party code/libraries used in your mobile application ( reliable source, supported, no backend Trojans, licensing)
 * Avoid opening application specific server sockets (listener ports) on the client device. Use the communication mechanisms provided by the OS.
 * Code signing for some mobile platforms implies inherent trust between applications (with same code signatures), installed on the same mobile device. Plan code signing mechanisms properly. //Needs elaboration.
 * Leverage static and binary code analyzers to find security flaws.
 * Use safe string function, avoid buffer and Integer overflow //Is this mobile specific?
 * Context aware security: may be able to decrease/increase access based on the context (e.g. location, network)
 * For applications using JNI (Android) using a third party validation to ensure no vulnerabilities.
 * Remove all test code before releasing the application
 * Ensure logging is done appropriately in the released application. No excessive logging, no sensitive user information in log files
 * Follow security best practice for implementation of runtime interpreters (be careful when implementing anything which turns user input into executable code). //Hook...

8. Perform data integration with third party backend applications correctly Risks: Unintended disclosure
 * User informed if any personal data is collected or sent //This needs to be detailed - how to inform - one-time, on install, depending on the type of data etc...?
 * No sensitive or user personal data is sent or shared with a third party/social site without prior approval and knowledge of the user. // ditto
 * Validate all data received from the non-trusted third party before processing in the application. //What should be validated. Is this mobile-speciifc?
 * Do not send data which is not required for the functioning of the application unless you have obtained the explicit consent of the user.

9. Run the mobile client using minimal permission Risks: Data leakage, Surveillance, Spyware, Diallerware


 * Run with the minimum privilege required for the application on the operating system.
 * Don't authorize code/app to execute with root privilege
 * Always perform testing as a standard user (rather than a privileged user)
 * Least privilege. Be aware of privileges granted by default by API's and disable them.

10. Enforce higher security posture on the device for sensitive apps


 * If a sensitive application needs to be provisioned on a device, application can employ enforcement of the certain security posture on the device (such as PIN, remote management/wipe) // I don't follow this point.
 * Enterprise applications can employ this principle of doing a security posture check before deployment of sensitive enterprise applications

Candidates (to be merged if needed)
11. No secrets in code/binary

Risk: Mobile application binaries can be easily reverse engineered.


 * Do not store any passwords or secrets in the application binary

12. Protect your application from other malicious applications on the device

Risk: User's are prone to install applications that look cool (may be malicious) and can transmit data about user (or stored data) for malicious purpose.


 * (?? What guidelines could be provided to developers)
 * User education on using due diligence while installing third party applications on mobile devices

//What about runtime interpreters - some guidelines on these?

Original list (kept for review)

 * 1) Protect data at rest
 * 2) Protect data in transport
 * 3) Multi-factor authentication
 * 4) Session management
 * 5) Least privilege access control
 * 6) Untrusted data validation
 * 7) Output encoding
 * 8) Enterprise device management
 * 9) Keep business logic on the server
 * 10) Platform security