Обмен учетными данными между ios 8 приложениями и вебом,...

70

Upload: yandex

Post on 15-Jan-2015

436 views

Category:

Technology


3 download

DESCRIPTION

Речь пойдёт о том, как реализовать обмен учётными данными пользователя между iOS-приложениями и вебом с учётом особенностей iOS 8.

TRANSCRIPT

Page 1: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский
Page 2: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Kanstantsin Charnukha, Yury Vasileuski

Sharing credentials between native apps and Safari

Mobile Camp, 2 August, 2014

iOS authorization development team

Page 3: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Content

Credentials

Sharing credentials and iOS 7

Sharing credentials and iOS 8

Page 4: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский
Page 5: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

5

Credentials

Page 6: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

6

Credentials lifecycle

Page 7: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

7

UI and memory

• Secure text entry

• Dump memory with GDB and Jailbreak

Page 8: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

8

Network

• HTTPS

• Man in The Middle (MiTM)

Page 9: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

9

MiTM

• HTTPS is vulnerable to MiTM

• Credentials may leak

Page 10: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

10

SSL Pinning

• Protection against MiTM

• Connection only to known server

Page 11: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

11

Storing and sharing credentials

Page 12: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

12

Storing credentials on disk

• NSUserDefaults – Backup

– Jailbreak

– No ability to share between apps

• NSFileManager – NSFileProtectionComplete

– No passcode

– Brute force

– Jailbreak

– No ability to share between apps

• Keychain – Jailbreak

– Sharing between apps of the vendor

Page 13: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

13

Keychain

• Keychain is sqlite DB

• /private/var/Keychains/keychain-2.db

• Hardware specific key encryption

• Key is unique per device

Page 15: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский
Page 16: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Keychain allows to share credentials

Access group

Page 17: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Sharing with keychain

• Same access group in entitlements

• $(AppIdentifierPrefix) is the first part of group ID

• $(AppIdentifierPrefix) may be retrieved

programmatically by getting or adding any item in

keychain

Page 18: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Options to store credentials

• No credentials storage

• Store authorization token

• Store passwords in keychain

• Store x-token in keychain

Page 19: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

No credentials storage

• User enters credentials each launch

• Secure

• No credentials storage

Page 20: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Store authorization token

• Credentials on token expiration

• High security level

Page 21: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Store passwords in keychain

• User enters credentials only once

• Common approach

• Low security level

Page 22: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Store x-token in keychain

• User enters credentials only once

• High security level

Page 23: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Store x-token in keychain

• Can be used by other apps

Page 24: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

X-Token and credentials sharing

• Password is exchanged with x-token.

• Each app saves x-token to keychain.

• Secure. Password is not stored on device.

• Sharing between apps.

• Each app can exchange it for token with special

permissions.

Page 25: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Credentials and Safari

?

Page 26: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Safari credentials in iOS 7

Page 27: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Safari credentials in iOS 7

• Saves

passwords

• No access to

keychain data

• No access to

cookies

Page 28: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

28

Safari credentials in iOS 7

Page 29: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский
Page 30: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

WWDC 2014 topics of interest

• Shared web credentials API in Safari session 506: Your App, Your Website, and Safari

• Support of actions by Safari session 217: Creating Extensions for iOS and OS X, Part Two

Page 31: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

31

Safari credentials in iOS 8

Page 32: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

32

Sharing credentials with Safari, iOS 8

Shared web credentials API:

• Direct export to app

• Direct import from app

Actions support:

• Indirect import to Safari

• Indirect export from Safari

• Support of specific credentials

Page 33: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Safari and native app

Safari Native app

Page 34: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

34

Safari shared web

credentials

Page 35: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Shared shared web credentials API

void SecAddSharedWebCredential(

CFStringRef fqdn,

CFStringRef account,

CFStringRef password,

void (^completionHandler)(

CFErrorRef error));

void SecRequestSharedWebCredential(

CFStringRef fqdn,

CFStringRef account,

void (^completionHandler)(

CFArrayRef credentials,

CFErrorRef error));

Page 36: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Shared web credentials API

void SecAddSharedWebCredential(

CFStringRef fqdn,

CFStringRef account,

CFStringRef password,

void (^completionHandler)(

CFErrorRef error));

void SecRequestSharedWebCredential(

CFStringRef fqdn,

CFStringRef account,

void (^completionHandler)(

CFArrayRef credentials,

CFErrorRef error));

Page 37: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Account and password

• Raw credentials

• Easy to use and understand

• Easy to import from Safari to any app

• Difficult to export from “token-based” app to Safari

Page 38: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Shared web credentials API

void SecAddSharedWebCredential(

CFStringRef fqdn,

CFStringRef account,

CFStringRef password,

void (^completionHandler)(

CFErrorRef error));

void SecRequestSharedWebCredential(

CFStringRef fqdn,

CFStringRef account,

void (^completionHandler)(

CFArrayRef credentials,

CFErrorRef error));

Page 39: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

fqdn or Fully qualified domain name

@function SecRequestSharedWebCredential

@param fqdn (Optional) Fully qualified domain name

of the website for which passwords are being

requested. If NULL is passed in this argument, the

domain name(s) listed in the calling application's

'com.apple.developer.associated-domains'

entitlement are searched implicitly.

Page 40: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Associated domains

Domains are listed at Safari AutoFill Settings.

Page 41: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

41

Safari and native app

Safari Native app

Page 42: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

42

Associating app and web site

app #5

yandex.ru

gmail.com

facebook.com

twitter.com

app #4

facebook.com

Page 43: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

43

Associating app and web site

app #5

yandex.ru

gmail.com

facebook.com

twitter.com

app #4

facebook.com

Page 44: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

44

Associating app and web site

app #5

yandex.ru

gmail.com

facebook.com

twitter.com

yandex.ru

app #1

app #2

facebook.com app #4

facebook.com

https://domain/apple-app-site-association

gmail.com

twitter.com

app #3

app #4

Page 45: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

45

Associating app and web site

app #5

yandex.ru

gmail.com

facebook.com

twitter.com

yandex.ru

app #1

app #2

facebook.com

app #3 app #4

facebook.com

gmail.com

twitter.com

app #4

Page 46: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

46

Associating app and web site

app #5

yandex.ru

gmail.com

facebook.com

twitter.com

yandex.ru

app #1

app #2

facebook.com

app #3 app #4

facebook.com

gmail.com

twitter.com

app #4

Page 47: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Test server setup with node.js

// missing node.js common setup

app.all('/apple-app-site-association', function(req, res,

next) {

res.setHeader('Content-Type', 'application/pkcs7-mime');

next();

});

var PORT = 8000;

var HOST = ’test.host.on.private.network.net';

var sshKey = fs.readFileSync('./certs/key.pem');

var sshCert = fs.readFileSync('./certs/cert.pem')

var https_options = {key: sshKey, cert: sshCert};

https.createServer(https_options, app).listen(PORT, HOST);

Page 48: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Test server setup with node.js

// missing node.js common setup

app.all('/apple-app-site-association', function(req, res,

next) {

res.setHeader('Content-Type', 'application/pkcs7-mime');

next();

});

var PORT = 8000;

var HOST = ’test.host.on.private.network.net';

var sshKey = fs.readFileSync('./certs/key.pem');

var sshCert = fs.readFileSync('./certs/cert.pem')

var https_options = {key: sshKey, cert: sshCert};

https.createServer(https_options, app).listen(PORT, HOST);

Page 49: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

49

Notes on server setup

• Certificate is verified by iOS itself

• Not available on simulator

• No way to use self-signed certificate

• Self-installed certificates impacts Safari, but not

verification process

• Provide certificate signed by iOS trusted CA

• Use static domains, no local IPs.

• Apply to multiple domains

Page 50: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

50

• Multiple app prefixes (AppStore, AdHoc, Debug)

• Multiple bundles (AppStore, inhouse)

• Different certificates for every domain

// apps.json content

{"webcredentials":{"apps":["APPSTORE_PREFIX.ru.yandex.app1

", "APPSTORE_PREFIX.ru.yandex.app2"]}}

cat apps.json | openssl smime -sign –inkey certs/key.pem –

signer certs/cert.pem -noattr -nodetach -outform DER > apple-

app-site-association

apple-app-site-association

Page 51: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

User control and credential access

Page 52: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

52

Usage drawbacks

1. User-side security but poor user experience

2. User asked on every single credential access

3. No method to check account existence

4. Difficult to sync account addition and removal

Page 53: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

53

Actions and Safari

Page 54: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

54

Actions

Action is an extension point that helps users to

manipulate or view content within the context of

another app, e.g. transforming DOM within Safari.

Page 55: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

55

Empty login page within Safari

Page 56: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

56

Safari actions bar

Page 57: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

57

Custom actions within Safari

Page 58: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

58

• UIActivityViewController

• NSURL

NSString *stringURL = @"https://yandex.ru";

NSURL *pageURL = [NSURL URLWithString:stringURL];

UIActivityViewController *activityVC = [[UIActivityViewController

alloc]

initWithActivityItems:@[pageURL, stringURL]

applicationActivities:nil];

[mainVC presentViewController:activityVC

animated:YES

completion:nil];

Displaying activities within Safari

Page 59: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

59

NSExtension setup to handle Safari

• NSExtensionActivationRule

• NSExtensionActivationSupportsWebURLWithMaxCount

Page 60: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Native app keychain credentials

Page 61: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

61

Completed login page

Page 62: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

62

NSExtension setup to access DOM

• NSExtensionAttributes

• NSExtensionJavaScriptPreprocessingFile

Page 63: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

63

• ExtensionPreprocessingJS

// PasswordHandler.js

var PasswordHandler = function() {};

PasswordHandler.prototype = {

run: function(arguments) {

...

},

finalize: function(arguments) {

...

}

};

var ExtensionPreprocessingJS = new PasswordHandler

JavaScript preprocessing file

Page 64: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

64

run: function(arguments) {

var loginInput = document.getElementsByName("login")[0]

var loginInputText = loginInput.value

var passwdInput = document.getElementsByName("passwd")[0]

var passwdInputText = passwdInput.value

arguments.completionFunction({

”login" : loginInputText, ”passwd" : passwdInputText})

}

finalize: function(arguments) {

var loginInput = document.getElementsByName("login")[0]

var loginInputText = arguments["login"]

loginInput.value = loginInputText;

var passwdInput = document.getElementsByName("passwd")[0]

var passwdInputText = arguments["passwd"]

passwdInput.value = passwdInputText

}

Getting values from DOM

Page 65: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

65

run: function(arguments) {

var loginInput = document.getElementsByName("login")[0]

var loginInputText = loginInput.value

var passwdInput = document.getElementsByName("passwd")[0]

var passwdInputText = passwdInput.value

arguments.completionFunction({

”login" : loginInputText, ”passwd" : passwdInputText})

}

finalize: function(arguments) {

var loginInput = document.getElementsByName("login")[0]

var loginInputText = arguments["login"]

loginInput.value = loginInputText;

var passwdInput = document.getElementsByName("passwd")[0]

var passwdInputText = arguments["passwd"]

passwdInput.value = passwdInputText

}

Getting values from DOM

Page 66: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

66

• NSExtensionJavaScriptFinalizeArgumentKey

• kUTTypePropertyList

NSDictionary *js =

@{NSExtensionJavaScriptFinalizeArgumentKey:

@{@"login" : self.login, @"passwd": self.passwd}};

NSItemProvider *pItem = [[NSItemProvider alloc]

initWithItem:js

typeIdentifier:(NSString *)kUTTypePropertyList];

NSExtensionItem *eItem = [[NSExtensionItem alloc] init];

eItem.attachments = @[providerItem];

[self.extensionContext

completeRequestReturningItems:@[eItem]

completionHandler:nil];

Setting values to DOM

Page 67: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Differences

Pros:

• No server setup by default

• Custom credentials support

• Any browser and web view support

Cons:

• Not available on device by default

• More difficult to implement on client side

• No server side control by default

• Security is developer responsibility

Page 68: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Summary

• Credentials

• Sharing credentials and iOS 7

• Sharing credentials and iOS 8

Page 69: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский

Kanstantsin Charnukha,

[email protected]

iOS authorization

development team

Thanks

Yury Vasileuski,

[email protected]

Page 70: Обмен учетными данными между iOS 8 приложениями и вебом, Константин Чернухо, Юрий Василевский