1 page.title=Designing for Security 2 @jd:body 3 4 <div id="qv-wrapper"> 5 <div id="qv"> 6 <h2>In this document</h2> 7 <ol> 8 <li><a href="#Dalvik">Using Davlik Code</a></li> 9 <li><a href="#Native">Using Native Code</a></li> 10 <li><a href="#Data">Storing Data</a></li> 11 <li><a href="#IPC">Using IPC</a></li> 12 <li><a href="#Permissions">Using Permissions</a></li> 13 <li><a href="#Networking">Using Networking</a></li> 14 <li><a href="#DynamicCode">Dynamically Loading Code</a></li> 15 <li><a href="#Input">Performing Input Validation</a></li> 16 <li><a href="#UserData">Handling User Data</a></li> 17 <li><a href="#Crypto">Using Cryptography</a></li> 18 </ol> 19 <h2>See also</h2> 20 <ol> 21 <li><a href="http://source.android.com/tech/security/index.html">Android 22 Security Overview</a></li> 23 <li><a href="{@docRoot}guide/topics/security/security.html">Android Security 24 And Permissions</a></li> 25 </ol> 26 </div></div> 27 <p>Android was designed so that most developers will be able to build 28 applications using the default settings and not be confronted with difficult 29 decisions about security. Android also has a number of security features built 30 into the operating system that significantly reduce the frequency and impact of 31 application security issues.</p> 32 33 <p>Some of the security features that help developers build secure applications 34 include: 35 <ul> 36 <li>The Android Application Sandbox that isolates data and code execution on a 37 per-application basis.</li> 38 <li>Android application framework with robust implementations of common 39 security functionality such as cryptography, permissions, and secure IPC.</li> 40 <li>Technologies like ASLR, NX, ProPolice, safe_iop, OpenBSD dlmalloc, OpenBSD 41 calloc, and Linux mmap_min_addr to mitigate risks associated with common memory 42 management errors</li> 43 <li>An encrypted filesystem that can be enabled to protect data on lost or 44 stolen devices.</li> 45 </ul></p> 46 47 <p>Nevertheless, it is important for developers to be familiar with Android 48 security best practices to make sure they take advantage of these capabilities 49 and to reduce the likelihood of inadvertently introducing security issues that 50 can affect their applications.</p> 51 52 <p>This document is organized around common APIs and development techniques 53 that can have security implications for your application and its users. As 54 these best practices are constantly evolving, we recommend you check back 55 occasionally throughout your application development process.</p> 56 57 <a name="Dalvik"></a> 58 <h2>Using Dalvik Code</h2> 59 <p>Writing secure code that runs in virtual machines is a well-studied topic 60 and many of the issues are not specific to Android. Rather than attempting to 61 rehash these topics, wed recommend that you familiarize yourself with the 62 existing literature. Two of the more popular resources are: 63 <ul> 64 <li><a href="http://www.securingjava.com/toc.html"> 65 http://www.securingjava.com/toc.html</a></li> 66 <li><a 67 href="https://www.owasp.org/index.php/Java_Security_Resources"> 68 https://www.owasp.org/index.php/Java_Security_Resources</a></li> 69 </ul></p> 70 71 <p>This document is focused on the areas which are Android specific and/or 72 different from other environments. For developers experienced with VM 73 programming in other environments, there are two broad issues that may be 74 different about writing apps for Android: 75 <ul> 76 <li>Some virtual machines, such as the JVM or .net runtime, act as a security 77 boundary, isolating code from the underlying operating system capabilities. On 78 Android, the Dalvik VM is not a security boundary -- the application sandbox is 79 implemented at the OS level, so Dalvik can interoperate with native code in the 80 same application without any security constraints.</li> 81 <li>Given the limited storage on mobile devices, its common for developers 82 to want to build modular applications and use dynamic class loading. When 83 doing this consider both the source where you retrieve your application logic 84 and where you store it locally. Do not use dynamic class loading from sources 85 that are not verified, such as unsecured network sources or external storage, 86 since that code can be modified to include malicious behavior.</li> 87 </ul></p> 88 89 <a name="Native"></a> 90 <h2>Using Native Code</h2> 91 92 <p>In general, we encourage developers to use the Android SDK for most 93 application development, rather than using native code. Applications built 94 with native code are more complex, less portable, and more like to include 95 common memory corruption errors such as buffer overflows.</p> 96 97 <p>Android is built using the Linux kernel and being familiar with Linux 98 development security best practices is especially useful if you are going to 99 use native code. This document is too short to discuss all of those best 100 practices, but one of the most popular resources is Secure Programming for 101 Linux and Unix HOWTO, available at <a 102 href="http://www.dwheeler.com/secure-programs"> 103 http://www.dwheeler.com/secure-programs</a>.</p> 104 105 <p>An important difference between Android and most Linux environments is the 106 Application Sandbox. On Android, all applications run in the Application 107 Sandbox, including those written with native code. At the most basic level, a 108 good way to think about it for developers familiar with Linux is to know that 109 every application is given a unique UID with very limited permissions. This is 110 discussed in more detail in the <a 111 href="http://source.android.com/tech/security/index.html">Android Security 112 Overview</a> and you should be familiar with application permissions even if 113 you are using native code.</p> 114 115 <a name="Data"></a> 116 <h2>Storing Data</h2> 117 118 <h3>Using internal files</h3> 119 120 <p>By default, files created on <a 121 href="{@docRoot}guide/topics/data/data-storage.html#filesInternal">internal 122 storage</a> are only accessible to the application that created the file. This 123 protection is implemented by Android and is sufficient for most 124 applications.</p> 125 126 <p>Use of <a 127 href="{@docRoot}reference/android/content/Context.html#MODE_WORLD_WRITEABLE"> 128 world writable</a> or <a 129 href="{@docRoot}reference/android/content/Context.html#MODE_WORLD_READABLE 130 ">world readable</a> files for IPC is discouraged because it does not provide 131 the ability to limit data access to particular applications, nor does it 132 provide any control on data format. As an alternative, you might consider using 133 a ContentProvider which provides read and write permissions, and can make 134 dynamic permission grants on a case-by-case basis.</p> 135 136 <p>To provide additional protection for sensitive data, some applications 137 choose to encrypt local files using a key that is not accessible to the 138 application. (For example, a key can be placed in a <code><a 139 href={@docRoot}reference/java/security/KeyStore.html">KeyStore</a></code> and 140 protected with a user password that is not stored on the device). While this 141 does not protect data from a root compromise that can monitor the user 142 inputting the password, it can provide protection for a lost device without <a 143 href="http://source.android.com/tech/encryption/index.html">file system 144 encryption</a>.</p> 145 146 <h3>Using external storage</h3> 147 148 <p>Files created on <a 149 href="{@docRoot}guide/topics/data/data-storage.html#filesExternal">external 150 storage</a>, such as SD Cards, are globally readable and writable. Since 151 external storage can be removed by the user and also modified by any 152 application, applications should not store sensitive information using 153 external storage.</p> 154 155 <p>As with data from any untrusted source, applications should perform input 156 validation when handling data from external storage (see Input Validation 157 section). We strongly recommend that applications not store executables or 158 class files on external storage prior to dynamic loading. If an application 159 does retrieve executable files from external storage they should be signed and 160 cryptographically verified prior to dynamic loading.</p> 161 162 <h3>Using content providers</h3> 163 164 <p>ContentProviders provide a structured storage mechanism that can be limited 165 to your own application, or exported to allow access by other applications. By 166 default, a <code> 167 <a href="{@docRoot}reference/android/content/ContentProvider.html"> 168 ContentProvider</a></code> is 169 <a href="{@docRoot}guide/topics/manifest/provider-element.html#exported">exported 170 </a> for use by other applications. If you do not intend to provide other 171 applications with access to your<code> 172 <a href="{@docRoot}reference/android/content/ContentProvider.html"> 173 ContentProvider</a></code>, mark them as <code><a 174 href="{@docRoot}guide/topics/manifest/provider-element.html#exported"> 175 android:exported=false</a></code> in the application manifest.</p> 176 177 <p>When creating a <code> 178 <a href="{@docRoot}reference/android/content/ContentProvider.html">ContentProvider 179 </a></code> that will be exported for use by other applications, you can specify 180 a single 181 <a href="{@docRoot}guide/topics/manifest/provider-element.html#prmsn">permission 182 </a> for reading and writing, or distinct permissions for reading and writing 183 within the manifest. We recommend that you limit your permissions to those 184 required to accomplish the task at hand. Keep in mind that its usually 185 easier to add permissions later to expose new functionality than it is to take 186 them away and break existing users.</p> 187 188 <p>If you are using a <code> 189 <a href="{@docRoot}reference/android/content/ContentProvider.html"> 190 ContentProvider</a></code> for sharing data between applications built by the 191 same developer, it is preferable to use 192 <a href="{@docRoot}guide/topics/manifest/permission-element.html#plevel">signature 193 level permissions</a>. Signature permissions do not require user confirmation, 194 so they provide a better user experience and more controlled access to the 195 <code> 196 <a href="{@docRoot}reference/android/content/ContentProvider.html"> 197 ContentProvider</a></code>.</p> 198 199 <p>ContentProviders can also provide more granular access by declaring the <a 200 href="{@docRoot}guide/topics/manifest/provider-element.html#gprmsn"> 201 grantUriPermissions</a> element and using the <code><a 202 href="{@docRoot}reference/android/content/Intent.html#FLAG_GRANT_READ_URI_PERMIS 203 SION">FLAG_GRANT_READ_URI_PERMISSION</a></code> and <code><a 204 href="{@docRoot}reference/android/content/Intent.html#FLAG_GRANT_WRITE_URI_PERMI 205 SSION">FLAG_GRANT_WRITE_URI_PERMISSION</a></code> flags in the Intent object 206 that activates the component. The scope of these permissions can be further 207 limited by the <code><a 208 href="{@docRoot}guide/topics/manifest/grant-uri-permission-element.html"> 209 grant-uri-permission element</a></code>.</p> 210 211 <p>When accessing a <code> 212 <a href="{@docRoot}reference/android/content/ContentProvider.html"> 213 ContentProvider</a></code>, use parameterized query methods such as <code> 214 <a href="{@docRoot}reference/android/content/ContentProvider.html#query(android.net 215 .Uri,%20java.lang.String[],%20java.lang.String,%20java.lang.String[],%20java.lan 216 g.String)">query()</a></code>, <code><a 217 href="{@docRoot}reference/android/content/ContentProvider.html#update(android.ne 218 t.Uri,%20android.content.ContentValues,%20java.lang.String,%20java.lang.String[] 219 )">update()</a></code>, and <code><a 220 href="{@docRoot}reference/android/content/ContentProvider.html#delete(android.ne 221 t.Uri,%20java.lang.String,%20java.lang.String[])">delete()</a></code> to avoid 222 potential <a href="http://en.wikipedia.org/wiki/SQL_injection">SQL 223 Injection</a> from untrusted data. Note that using parameterized methods is not 224 sufficient if the <code>selection</code> is built by concatenating user data 225 prior to submitting it to the method.</p> 226 227 <p>Do not have a false sense of security about the write permission. Consider 228 that the write permission allows SQL statements which make it possible for some 229 data to be confirmed using creative <code>WHERE</code> clauses and parsing the 230 results. For example, an attacker might probe for presence of a specific phone 231 number in a call-log by modifying a row only if that phone number already 232 exists. If the content provider data has predictable structure, the write 233 permission may be equivalent to providing both reading and writing.</p> 234 235 <a name="IPC"></a> 236 <h2>Using Interprocess Communication (IPC)</h2> 237 238 <p>Some Android applications attempt to implement IPC using traditional Linux 239 techniques such as network sockets and shared files. We strongly encourage the 240 use of Android system functionality for IPC such as Intents, Binders, Services, 241 and Receivers. The Android IPC mechanisms allow you to verify the identity of 242 the application connecting to your IPC and set security policy for each IPC 243 mechanism.</p> 244 245 <p>Many of the security elements are shared across IPC mechanisms. <a 246 href="{@docRoot}reference/android/content/BroadcastReceiver.html"> 247 Broadcast Receivers</a>, <a 248 href="{@docRoot}reference/android/R.styleable.html#AndroidManifestActivity"> 249 Activities</a>, and <a 250 href="{@docRoot}reference/android/R.styleable.html#AndroidManifestService"> 251 Services</a> are all declared in the application manifest. If your IPC mechanism is 252 not intended for use by other applications, set the android:exported property 253 to false. This is useful for applications that consist of multiple processes 254 within the same UID, or if you decide late in development that you do not 255 actually want to expose functionality as IPC but you dont want to rewrite 256 the code.</p> 257 258 <p>If your IPC is intended to be accessible to other applications, you can 259 apply a security policy by using the <a 260 href="{@docRoot}reference/android/R.styleable.html#AndroidManifestPermission"> 261 Permission</a> tag. If IPC is between applications built by the same developer, 262 it is preferable to use <a 263 href="{@docRoot}guide/topics/manifest/permission-element.html#plevel">signature 264 level permissions</a>. Signature permissions do not require user confirmation, 265 so they provide a better user experience and more controlled access to the IPC 266 mechanism.</p> 267 268 <p>One area that can introduce confusion is the use of intent filters. Note 269 that Intent filters should not be considered a security feature -- components 270 can be invoked directly and may not have data that would conform to the intent 271 filter. You should perform input validation within your intent receiver to 272 confirm that it is properly formatted for the invoked receiver, service, or 273 activity.</p> 274 275 <h3>Using intents</h3> 276 277 <p>Intents are the preferred mechanism for asynchronous IPC in Android. 278 Depending on your application requirements, you might use <code><a 279 href="{@docRoot}reference/android/content/Context.html#sendBroadcast(android.con 280 tent.Intent)">sendBroadcast()</a></code>, <code><a 281 href="{@docRoot}reference/android/content/Context.html#sendOrderedBroadcast(andr 282 oid.content.Intent,%20java.lang.String)">sendOrderedBroadcast()</a></code>, or 283 direct an intent to a specific application component.</p> 284 285 <p>Note that ordered broadcasts can be consumed by a recipient, so they 286 may not be delivered to all applications. If you are sending an Intent where 287 delivery to a specific receiver is required, the intent must be delivered 288 directly to the receiver.</p> 289 290 <p>Senders of an intent can verify that the recipient has a permission 291 specifying a non-Null Permission upon sending. Only applications with that 292 Permission will receive the intent. If data within a broadcast intent may be 293 sensitive, you should consider applying a permission to make sure that 294 malicious applications cannot register to receive those messages without 295 appropriate permissions. In those circumstances, you may also consider 296 invoking the receiver directly, rather than raising a broadcast.</p> 297 298 <h3>Using binder and AIDL interfaces</h3> 299 300 <p><a href="{@docRoot}reference/android/os/Binder.html">Binders</a> are the 301 preferred mechanism for RPC-style IPC in Android. They provide a well-defined 302 interface that enables mutual authentication of the endpoints, if required.</p> 303 304 <p>We strongly encourage designing interfaces in a manner that does not require 305 interface specific permission checks. Binders are not declared within the 306 application manifest, and therefore you cannot apply declarative permissions 307 directly to a Binder. Binders generally inherit permissions declared in the 308 application manifest for the Service or Activity within which they are 309 implemented. If you are creating an interface that requires authentication 310 and/or access controls on a specific binder interface, those controls must be 311 explicitly added as code in the interface.</p> 312 313 <p>If providing an interface that does require access controls, use <code><a 314 href="{@docRoot}reference/android/content/Context.html#checkCallingPermission(ja 315 va.lang.String)">checkCallingPermission()</a></code> to verify whether the 316 caller of the Binder has a required permission. This is especially important 317 before accessing a Service on behalf of the caller, as the identify of your 318 application is passed to other interfaces. If invoking an interface provided 319 by a Service, the <code><a 320 href="{@docRoot}reference/android/content/Context.html#bindService(android.conte 321 nt.Intent,%20android.content.ServiceConnection,%20int)">bindService()</a></code> 322 invocation may fail if you do not have permission to access the given Service. 323 If calling an interface provided locally by your own application, it may be 324 useful to use the <code><a 325 href="{@docRoot}reference/android/os/Binder.html#clearCallingIdentity()"> 326 clearCallingIdentity()</a></code> to satisfy internal security checks.</p> 327 328 <h3>Using broadcast receivers</h3> 329 330 <p>Broadcast receivers are used to handle asynchronous requests initiated via 331 an intent.</p> 332 333 <p>By default, receivers are exported and can be invoked by any other 334 application. If your <code><a 335 href={@docRoot}reference/android/content/BroadcastReceiver.html"> 336 BroadcastReceivers</a></code> is intended for use by other applications, you 337 may want to apply security permissions to receivers using the <code><a 338 href="{@docRoot}reference/android/R.styleable.html#AndroidManifestReceiver"> 339 <receiver></a></code> element within the application manifest. This will 340 prevent applications without appropriate permissions from sending an intent to 341 the <code><a 342 href={@docRoot}reference/android/content/BroadcastReceiver.html"> 343 BroadcastReceivers</a></code>.</p> 344 345 <h3>Using Services</h3> 346 347 <p>Services are often used to supply functionality for other applications to 348 use. Each service class must have a corresponding <service> declaration in its 349 package's AndroidManifest.xml.</p> 350 351 <p>By default, Services are exported and can be invoked by any other 352 application. Services can be protected using the android:permission attribute 353 within the manifests <code><a 354 href="{@docRoot}reference/android/R.styleable.html#AndroidManifestService"> 355 <service></a></code> tag. By doing so, other applications will need to declare 356 a corresponding <code><a 357 href="{@docRoot}reference/android/R.styleable.html#AndroidManifestService_permis 358 sion"><uses-permission></a></code> element in their own manifest to be 359 able to start, stop, or bind to the service.</p> 360 361 <p>A Service can protect individual IPC calls into it with permissions, by 362 calling <code><a 363 href="{@docRoot}reference/android/content/Context.html#checkCallingPermission(ja 364 va.lang.String)">checkCallingPermission()</a></code>before executing 365 the implementation of that call. We generally recommend using the 366 declarative permissions in the manifest, since those are less prone to 367 oversight.</p> 368 369 <h3>Using Activities</h3> 370 371 <p>Activities are most often used for providing the core user-facing 372 functionality of an application. By default, Activities are exported and 373 invokable by other applications only if they have an intent filter or binder 374 declared. In general, we recommend that you specifically declare a Receiver or 375 Service to handle IPC, since this modular approach reduces the risk of exposing 376 functionality that is not intended for use by other applications.</p> 377 378 <p>If you do expose an Activity for purposes of IPC, the <code><a 379 href="{@docRoot}reference/android/R.styleable.html#AndroidManifestActivity_permi 380 ssion">android:permission</a></code> attribute in the <code><a 381 href="{@docRoot}reference/android/R.styleable.html#AndroidManifestActivity"> 382 <activity></a></code> declaration in the application manifest can be used to 383 restrict access to only those applications which have the stated 384 permissions.</p> 385 386 <a name="Permissions"></a> 387 <h2>Using Permissions</h2> 388 389 <h3>Requesting Permissions</h3> 390 391 <p>We recommend minimizing the number of permissions requested by an 392 application. Not having access to sensitive permissions reduces the risk of 393 inadvertently misusing those permissions, can improve user adoption, and makes 394 applications less attractive targets for attackers.</p> 395 396 <p>If it is possible to design your application in a way that does not require 397 a permission, that is preferable. For example, rather than requesting access 398 to device information to create an identifier, create a <a 399 href="{@docRoot}reference/java/util/UUID.html">GUID</a> for your application. 400 (This specific example is also discussed in Handling User Data) Or, rather than 401 using external storage, store data in your application directory.</p> 402 403 <p>If a permission is not required, do not request it. This sounds simple, but 404 there has been quite a bit of research into the frequency of over-requesting 405 permissions. If youre interested in the subject you might start with this 406 research paper published by U.C. Berkeley: <a 407 href="http://www.eecs.berkeley.edu/Pubs/TechRpts/2011/EECS-2011-48.pdf"> 408 http://www.eecs.berkeley.edu/Pubs/TechRpts/2011/EECS-2011-48.pdf</a></p> 409 410 <p>In addition to requesting permissions, your application can use <a 411 href="{@docRoot}guide/topics/manifest/permission-element.html">permissions</a> 412 to protect IPC that is security sensitive and will be exposed to other 413 applications -- such as a <code><a 414 href="{@docRoot}reference/android/content/ContentProvider.html"> 415 ContentProvider</a></code>. In general, we recommend using access controls 416 other than user confirmed permissions where possible since permissions can 417 be confusing for users. For example, consider using the <a 418 href="{@docRoot}guide/topics/manifest/permission-element.html#plevel">signature 419 protection level</a> on permissions for IPC communication between applications 420 provided by a single developer.</p> 421 422 <p>Do not cause permission re-delegation. This occurs when an app exposes data 423 over IPC that is only available because it has a specific permission, but does 424 not require that permission of any clients of its IPC interface. More 425 details on the potential impacts, and frequency of this type of problem is 426 provided in this research paper published at USENIX: <a 427 href="http://www.cs.berkeley.edu/~afelt/felt_usenixsec2011.pdf">http://www.cs.be 428 rkeley.edu/~afelt/felt_usenixsec2011.pdf</a></p> 429 430 <h3>Creating Permissions</h3> 431 432 <p>Generally, you should strive to create as few permissions as possible while 433 satisfying your security requirements. Creating a new permission is relatively 434 uncommon for most applications, since <a 435 href="{@docRoot}reference/android/Manifest.permission.html"> 436 system-defined permissions</a> cover many situations. Where appropriate, 437 perform access checks using existing permissions.</p> 438 439 <p>If you must create a new permission, consider whether you can accomplish 440 your task with a Signature permission. Signature permissions are transparent 441 to the user and only allow access by applications signed by the same developer 442 as application performing the permission check. If you create a Dangerous 443 permission, then the user needs to decide whether to install the application. 444 This can be confusing for other developers, as well as for users.</p> 445 446 <p>If you create a Dangerous permission, there are a number of complexities 447 that you need to consider. 448 <ul> 449 <li>The permission must have a string that concisely expresses to a user the 450 security decision they will be required to make.</li> 451 <li>The permission string must be localized to many different languages.</li> 452 <li>Uses may choose not to install an application because a permission is 453 confusing or perceived as risky.</li> 454 <li>Applications may request the permission when the creator of the permission 455 has not been installed.</li> 456 </ul></p> 457 458 <p>Each of these poses a significant non-technical challenge for an application 459 developer, which is why we discourage the use of Dangerous permission.</p> 460 461 <a name="Networking"></a> 462 <h2>Using Networking</h2> 463 464 <h3>Using IP Networking</h3> 465 466 <p>Networking on Android is not significantly different from Linux 467 environments. The key consideration is making sure that appropriate protocols 468 are used for sensitive data, such as <a 469 href="{@docRoot}reference/javax/net/ssl/HttpsURLConnection.html">HTTPS</a> for 470 web traffic. We prefer use of HTTPS over HTTP anywhere that HTTPS is 471 supported on the server, since mobile devices frequently connect on networks 472 that are not secured, such as public WiFi hotspots.</p> 473 474 <p>Authenticated, encrypted socket-level communication can be easily 475 implemented using the <code><a 476 href="{@docRoot}reference/javax/net/ssl/SSLSocket.html">SSLSocket</a></code> 477 class. Given the frequency with which Android devices connect to unsecured 478 wireless networks using WiFi, the use of secure networking is strongly 479 encouraged for all applications.</p> 480 481 <p>We have seen some applications use <a 482 href="http://en.wikipedia.org/wiki/Localhost">localhost</a> network ports for 483 handling sensitive IPC. We discourage this approach since these interfaces are 484 accessible by other applications on the device. Instead, use an Android IPC 485 mechanism where authentication is possible such as a Service and Binder. (Even 486 worse than using loopback is to bind to INADDR_ANY since then your application 487 may receive requests from anywhere. Weve seen that, too.)</p> 488 489 <p>Also, one common issue that warrants repeating is to make sure that you do 490 not trust data downloaded from HTTP or other insecure protocols. This includes 491 validation of input in <code><a 492 href="{@docRoot}reference/android/webkit/WebView.html">WebView</a></code> and 493 any responses to intents issued against HTTP.</p> 494 495 <h3>Using Telephony Networking</h3> 496 497 <p>SMS is the telephony protocol most frequently used by Android developers. 498 Developers should keep in mind that this protocol was primarily designed for 499 user-to-user communication and is not well-suited for some application 500 purposes. Due to the limitations of SMS, we strongly recommend the use of <a 501 href="http://code.google.com/android/c2dm/">C2DM</a> and IP networking for 502 sending data messages to devices.</p> 503 504 <p>Many developers do not realize that SMS is not encrypted or strongly 505 authenticated on the network or on the device. In particular, any SMS receiver 506 should expect that a malicious user may have sent the SMS to your application 507 -- do not rely on unauthenticated SMS data to perform sensitive commands. 508 Also, you should be aware that SMS may be subject to spoofing and/or 509 interception on the network. On the Android-powered device itself, SMS 510 messages are transmitted as Broadcast intents, so they may be read or captured 511 by other applications that have the READ_SMS permission.</p> 512 513 <a name="DynamicCode"></a> 514 <h2>Dynamically Loading Code</h2> 515 516 <p>We strongly discourage loading code from outside of the application APK. 517 Doing so significantly increases the likelihood of application compromise due 518 to code injection or code tampering. It also adds complexity around version 519 management and application testing. Finally, it can make it impossible to 520 verify the behavior of an application, so it may be prohibited in some 521 environments.</p> 522 523 <p>If your application does dynamically load code, the most important thing to 524 keep in mind about dynamically loaded code is that it runs with the same 525 security permissions as the application APK. The user made a decision to 526 install your application based on your identity, and they are expecting that 527 you provide any code run within the application, including code that is 528 dynamically loaded.</p> 529 530 <p>The major security risk associated with dynamically loading code is that the 531 code needs to come from a verifiable source. If the modules are included 532 directly within your APK, then they cannot be modified by other applications. 533 This is true whether the code is a native library or a class being loaded using 534 <a href="{@docRoot}reference/dalvik/system/DexClassLoader.html"> 535 <code>DexClassLoader</code></a>. We have seen many instances of applications 536 attempting to load code from insecure locations, such as downloaded from the 537 network over unencrypted protocols or from world writable locations such as 538 external storage. These locations could allow someone on the network to modify 539 the content in transit, or another application on a users device to modify the 540 content, respectively.</p> 541 542 543 <h3>Using WebView</h3> 544 545 <p>Since WebView consumes web content that can include HTML and JavaScript, 546 improper use can introduce common web security issues such as <a 547 href="http://en.wikipedia.org/wiki/Cross_site_scripting">cross-site-scripting</a 548 > (JavaScript injection). Android includes a number of mechanisms to reduce 549 the scope of these potential issues by limiting the capability of WebView to 550 the minimum functionality required by your application.</p> 551 552 <p>If your application does not directly use JavaScript within a <code><a 553 href="{@docRoot}reference/android/webkit/WebView.html">WebView</a></code>, do 554 not call 555 <a href="{@docRoot}reference/android/webkit/WebSettings.html#setJavaScriptEnabled(boolean) 556 <code>setJavaScriptEnabled()</code></a>. We have seen this method invoked 557 in sample code that might be repurposed in production application -- so 558 remove it if necessary. By default, <code><a 559 href="{@docRoot}reference/android/webkit/WebView.html">WebView</a></code> does 560 not execute JavaScript so cross-site-scripting is not possible.</p> 561 562 <p>Use <code><a 563 href="{@docRoot}reference/android/webkit/WebView.html#addJavascriptInterface(jav 564 a.lang.Object,%20java.lang.String)">addJavaScriptInterface()</a></code> with 565 particular care because it allows JavaScript to invoke operations that are 566 normally reserved for Android applications. Only expose <code><a 567 href="{@docRoot}reference/android/webkit/WebView.html#addJavascriptInterface(jav 568 a.lang.Object,%20java.lang.String)">addJavaScriptInterface()</a></code> to 569 sources from which all input is trustworthy. If untrusted input is allowed, 570 untrusted JavaScript may be able to invoke Android methods. In general, we 571 recommend only exposing <code><a 572 href="{@docRoot}reference/android/webkit/WebView.html#addJavascriptInterface(jav 573 a.lang.Object,%20java.lang.String)">addJavaScriptInterface()</a></code> to 574 JavaScript that is contained within your application APK.</p> 575 576 <p>Do not trust information downloaded over HTTP, use HTTPS instead. Even if 577 you are connecting only to a single website that you trust or control, HTTP is 578 subject to <a 579 href="http://en.wikipedia.org/wiki/Man-in-the-middle_attack">MiTM</a> attacks 580 and interception of data. Sensitive capabilities using <code><a 581 href="{@docRoot}reference/android/webkit/WebView.html#addJavascriptInterface(jav 582 a.lang.Object,%20java.lang.String)">addJavaScriptInterface()</a></code> should 583 not ever be exposed to unverified script downloaded over HTTP. Note that even 584 with the use of HTTPS, 585 <code><a 586 href="{@docRoot}reference/android/webkit/WebView.html#addJavascriptInterface(jav 587 a.lang.Object,%20java.lang.String)">addJavaScriptInterface()</a></code> 588 increases the attack surface of your application to include the server 589 infrastructure and all CAs trusted by the Android-powered device.</p> 590 591 <p>If your application accesses sensitive data with a <code><a 592 href="{@docRoot}reference/android/webkit/WebView.html">WebView</a></code>, you 593 may want to use the <code><a 594 href="{@docRoot}reference/android/webkit/WebView.html#clearCache(boolean)"> 595 clearCache()</a></code> method to delete any files stored locally. Server side 596 headers like no-cache can also be used to indicate that an application should 597 not cache particular content.</p> 598 599 <a name="Input"></a> 600 <h2>Performing Input Validation</h2> 601 602 <p>Insufficient input validation is one of the most common security problems 603 affecting applications, regardless of what platform they run on. Android does 604 have platform-level countermeasures that reduce the exposure of applications to 605 input validation issues, you should use those features where possible. Also 606 note that selection of type-safe languages tends to reduce the likelihood of 607 input validation issues. We strongly recommend building your applications with 608 the Android SDK.</p> 609 610 <p>If you are using native code, then any data read from files, received over 611 the network, or received from an IPC has the potential to introduce a security 612 issue. The most common problems are <a 613 href="http://en.wikipedia.org/wiki/Buffer_overflow">buffer overflows</a>, <a 614 href="http://en.wikipedia.org/wiki/Double_free#Use_after_free">use after 615 free</a>, and <a 616 href="http://en.wikipedia.org/wiki/Off-by-one_error">off-by-one errors</a>. 617 Android provides a number of technologies like ASLR and DEP that reduce the 618 exploitability of these errors, but they do not solve the underlying problem. 619 These can be prevented by careful handling of pointers and managing of 620 buffers.</p> 621 622 <p>Dynamic, string based languages such as JavaScript and SQL are also subject 623 to input validation problems due to escape characters and <a 624 href="http://en.wikipedia.org/wiki/Code_injection">script injection</a>.</p> 625 626 <p>If you are using data within queries that are submitted to SQL Database or a 627 Content Provider, SQL Injection may be an issue. The best defense is to use 628 parameterized queries, as is discussed in the ContentProviders section. 629 Limiting permissions to read-only or write-only can also reduce the potential 630 for harm related to SQL Injection.</p> 631 632 <p>If you are using <code><a 633 href="{@docRoot}reference/android/webkit/WebView.html">WebView</a></code>, then 634 you must consider the possibility of XSS. If your application does not 635 directly use JavaScript within a <code><a 636 href="{@docRoot}reference/android/webkit/WebView.html">WebView</a></code>, do 637 not call setJavaScriptEnabled() and XSS is no longer possible. If you must 638 enable JavaScript then the WebView section provides other security best 639 practices.</p> 640 641 <p>If you cannot use the security features above, we strongly recommend the use 642 of well-structured data formats and verifying that the data conforms to the 643 expected format. While blacklisting of characters or character-replacement can 644 be an effective strategy, these techniques are error-prone in practice and 645 should be avoided when possible.</p> 646 647 <a name="UserData"></a> 648 <h2>Handling User Data</h2> 649 650 <p>In general, the best approach is to minimize use of APIs that access 651 sensitive or personal user data. If you have access to data and can avoid 652 storing or transmitting the information, do not store or transmit the data. 653 Finally, consider if there is a way that your application logic can be 654 implemented using a hash or non-reversible form of the data. For example, your 655 application might use the hash of an an email address as a primary key, to 656 avoid transmitting or storing the email address. This reduces the chances of 657 inadvertently exposing data, and it also reduces the chance of attackers 658 attempting to exploit your application.</p> 659 660 <p>If your application accesses personal information such as passwords or 661 usernames, keep in mind that some jurisdictions may require you to provide a 662 privacy policy explaining your use and storage of that data. So following the 663 security best practice of minimizing access to user data may also simplify 664 compliance.</p> 665 666 <p>You should also consider whether your application might be inadvertently 667 exposing personal information to other parties such as third-party components 668 for advertising or third-party services used by your application. If you don't 669 know why a component or service requires a personal information, dont 670 provide it. In general, reducing the access to personal information by your 671 application will reduce the potential for problems in this area.</p> 672 673 <p>If access to sensitive data is required, evaluate whether that information 674 must be transmitted to a server, or whether the operation can be performed on 675 the client. Consider running any code using sensitive data on the client to 676 avoid transmitting user data.</p> 677 678 <p>Also, make sure that you do not inadvertently expose user data to other 679 application on the device through overly permissive IPC, world writable files, 680 or network sockets. This is a special case of permission redelegation, 681 discussed in the Requesting Permissions section.</p> 682 683 <p>If a GUID is required, create a large, unique number and store it. Do not 684 use phone identifiers such as the phone number or IMEI which may be associated 685 with personal information. This topic is discussed in more detail in the <a 686 href="http://android-developers.blogspot.com/2011/03/identifying-app-installatio 687 ns.html">Android Developer Blog</a>.</p> 688 689 <h3>Handling Credentials</h3> 690 691 <p>In general, we recommend minimizing the frequency of asking for user 692 credentials -- to make phishing attacks more conspicuous, and less likely to be 693 successful. Instead use an authorization token and refresh it.</p> 694 695 <p>Where possible, username and password should not be stored on the device. 696 Instead, perform initial authentication using the username and password 697 supplied by the user, and then use a short-lived, service-specific 698 authorization token.</p> 699 700 <p>Services that will be accessible to multiple applications should be accessed 701 using <code> 702 <a href="{@docRoot}reference/android/accounts/AccountManager.html"> 703 AccountManager</a></code>. If possible, use the <code><a 704 href="{@docRoot}reference/android/accounts/AccountManager.html"> 705 AccountManager</a></code> class to invoke a cloud-based service and do not store 706 passwords on the device.</p> 707 708 <p>After using <code><a 709 href="{@docRoot}reference/android/accounts/AccountManager.html"> 710 AccountManager</a></code> to retrieve an Account, check the <code><a 711 href="{@docRoot}reference/android/accounts/Account.html#CREATOR">CREATOR</a> 712 </code> before passing in any credentials, so that you do not inadvertently pass 713 credentials to the wrong application.</p> 714 715 <p>If credentials are to be used only by applications that you create, then you 716 can verify the application which accesses the <code><a 717 href="{@docRoot}reference/android/accounts/AccountManager.html"> 718 AccountManager</a></code> using <code><a href="<code><a 719 href="{@docRoot}h/reference/android/content/pm/PackageManager.html#checkSignatur 720 es(java.lang.String,%20java.lang.String)">checkSignature()</a></code>. 721 Alternatively, if only one application will use the credential, you might use a 722 <code><a 723 href={@docRoot}reference/java/security/KeyStore.html">KeyStore</a></code> for 724 storage.</p> 725 726 <a name="Crypto"></a> 727 <h2>Using Cryptography</h2> 728 729 <p>In addition to providing data isolation, supporting full-filesystem 730 encryption, and providing secure communications channels Android provides a 731 wide array of algorithms for protecting data using cryptography.</p> 732 733 <p>In general, try to use the highest level of pre-existing framework 734 implementation that can support your use case. If you need to securely 735 retrieve a file from a known location, a simple HTTPS URI may be adequate and 736 require no knowledge of cryptography on your part. If you need a secure 737 tunnel, consider using 738 <a href="{@docRoot}reference/javax/net/ssl/HttpsURLConnection.html"> 739 <code>HttpsURLConnection</code></a> or <code><a 740 href="{@docRoot}reference/javax/net/ssl/SSLSocket.html">SSLSocket</a></code>, 741 rather than writing your own protocol.</p> 742 743 <p>If you do find yourself needing to implement your own protocol, we strongly 744 recommend that you not implement your own cryptographic algorithms. Use 745 existing cryptographic algorithms such as those in the implementation of AES or 746 RSA provided in the <code><a 747 href="{@docRoot}reference/javax/crypto/Cipher.html">Cipher</a></code> class.</p> 748 749 <p>Use a secure random number generator ( 750 <a href="http://developer.android.com/reference/java/security/SecureRandom.html"> 751 <code>SecureRandom</code></a>) to initialize any cryptographic keys (<a 752 href="http://developer.android.com/reference/javax/crypto/KeyGenerator.html"> 753 <code>KeyGenerator</code></a>). Use of a key that is not generated with a secure random 754 number generator significantly weakens the strength of the algorithm, and may 755 allow offline attacks.</p> 756 757 <p>If you need to store a key for repeated use, use a mechanism like <code><a 758 href={@docRoot}reference/java/security/KeyStore.html">KeyStore</a></code> that 759 provides a mechanism for long term storage and retrieval of cryptographic 760 keys.</p> 761 762 <h2>Conclusion</h2> 763 764 <p>Android provides developers with the ability to design applications with a 765 broad range of security requirements. These best practices will help you make 766 sure that your application takes advantage of the security benefits provided by 767 the platform.</p> 768 769 <p>You can receive more information on these topics and discuss security best 770 practices with other developers in the <a 771 href="http://groups.google.com/group/android-security-discuss">Android Security 772 Discuss</a> Google Group</p> 773