<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>Gareth Wright - providing Custom professional Website and Print Design</title> <atom:link href="http://garethwright.com/feed" rel="self" type="application/rss+xml" /><link>http://garethwright.com</link> <description></description> <lastBuildDate>Sat, 19 May 2012 17:34:07 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.2</generator> <xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /> <item><title>SD Tabletwear iPad 2 / iPad 3 LuxFolio Case [REVIEW]</title><link>http://garethwright.com/blog/sd-tabletwear-ipad-2-ipad-3-luxfolio-case-review?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sd-tabletwear-ipad-2-ipad-3-luxfolio-case-review</link> <comments>http://garethwright.com/blog/sd-tabletwear-ipad-2-ipad-3-luxfolio-case-review#comments</comments> <pubDate>Tue, 24 Apr 2012 22:28:08 +0000</pubDate> <dc:creator>Gareth Wright</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[Reviews]]></category> <category><![CDATA[CASE]]></category> <category><![CDATA[COVER]]></category> <category><![CDATA[ipad 2]]></category> <category><![CDATA[ipad 3]]></category> <category><![CDATA[Leather]]></category> <category><![CDATA[leather style]]></category> <category><![CDATA[new ipad]]></category> <category><![CDATA[smart cover]]></category> <category><![CDATA[waterproof]]></category><guid
isPermaLink="false">http://garethwright.com/?p=7670</guid> <description><![CDATA[The moment I received my new iPad I was in awe. This is the device I&#8217;ve dreamed about since seeing the handheld tablets on Start Trek:TNG when I was a kid. As beautiful as the naked iPad is, having upgraded from the iPad 1 I&#8217;m very aware of how easy it is to scrape, dent [...]]]></description> <content:encoded><![CDATA[<p>The moment I received my new iPad I was in awe. This is the device I&#8217;ve dreamed about since seeing the handheld tablets on Start Trek:TNG when I was a kid. As beautiful as the naked iPad is, having upgraded from the iPad 1 I&#8217;m very aware of how easy it is to scrape, dent or otherwise mame your precious device.</p><p>My iPad 1 stayed in its Apple supplied case until I sold it just before the new iPad came out, and it was well worth keeping in the case.</p><p>Instead of browsing around for <a
href="http://www.gearzap.com/ipad-3-accessories/cases.html"> iPad 3 cases</a>,the simplicity and functionality of my original Apple case doubling up as a stand led me to buy the Apple iPad Smart cover.</p><p><a
href="http://garethwright.com/wp-content/uploads/magnetic.jpg?84cd58"><img
class="size-thumbnail wp-image-7671 alignnone" style="margin: 5px;" title="ipad 3 case" src="http://garethwright.com/wp-content/uploads/magnetic-150x150.jpg?84cd58" alt="" width="150" height="150" /></a></p><p>Big mistake, the cover &#8220;attaches&#8221; magnetically and comes off just as easily and offers no protection for the back of the iPad.</p><p>I&#8217;ve been trying out the Tabletwear <a
href="http://www.gearzap.com/ipad-3-accessories/covers.html">Cover for iPad 3</a> from <a
href="http://www.gearzap.com/sd-tabletwear-ipad-2-luxfolio-case-black.html">GearZap.com</a></p><p>Like Apples Smart Covers the TabletWare case has magnets positioned in both corners of the cover which conveniently turns off the iPad screen and locks the device.</p><p>The case is a faux leather, and unlike other iPad covers can be stood at three viewing angles (see below).</p><p>This allows a degree of flexibility when viewing movies, using Facetime or to allow typing whilst on the web.</p><p><a
href="http://garethwright.com/wp-content/uploads/IMG_0943.jpg?84cd58"><img
class="alignleft size-thumbnail wp-image-7673" style="margin: 5px;" title="SD Tabletwear iPad 2 / iPad 3 LuxFolio Case [REVIEW]" src="http://garethwright.com/wp-content/uploads/IMG_0943-150x150.jpg?84cd58" alt="ipad 3 case" width="150" height="150" /></a><a
href="http://garethwright.com/wp-content/uploads/IMG_0944.jpg?84cd58"><img
class="alignleft size-thumbnail wp-image-7674" style="margin: 5px;" title="SD Tabletwear iPad 2 / iPad 3 LuxFolio Case [REVIEW]" src="http://garethwright.com/wp-content/uploads/IMG_0944-150x150.jpg?84cd58" alt="ipad 3 cover" width="150" height="150" /></a><a
href="http://garethwright.com/wp-content/uploads/IMG_0945.jpg?84cd58"><img
class="alignleft size-thumbnail wp-image-7675" style="margin: 5px;" title="SD Tabletwear iPad 2 / iPad 3 LuxFolio Case [REVIEW]" src="http://garethwright.com/wp-content/uploads/IMG_0945-150x150.jpg?84cd58" alt="new iPad cover" width="150" height="150" /></a>The case can also be folded flat so you can play games etc without having to remove the pad from the case, whilst the cutouts allow access to the volume buttons, audio and dock jack.</p><p>There&#8217;s also a hole in the back to allow you to take photos with the inbuilt camera.</p><p>That latter point is the only issue I&#8217;ve really had with the case.</p><p>Whilst the cutouts do allow access to the dock and volume rocker switch, they are recessed a fair bit which means the corner of the case is being lifted every time I wedge my fingers in there to alter the volume or toggle the mute.</p><p>Now I may have packed on a &#8220;bit&#8221; of beer weight but I don&#8217;t exactly have fat fingers, unfortunate then that the corner of the internal part of the case has started to warp slightly outwards.<a
href="http://garethwright.com/wp-content/uploads/IMG_0953.jpg?84cd58"><img
class="size-thumbnail wp-image-7679 alignleft" style="margin: 5px;" title="SD Tabletwear iPad 2 / iPad 3 LuxFolio Case [REVIEW]" src="http://garethwright.com/wp-content/uploads/IMG_0953-150x150.jpg?84cd58" alt="New iPad Covers" width="150" height="150" /></a></p><p>Despite this, I&#8217;m still really attached to the case. Leather or not, the material used for the cover allows a good grip and saved my device from an unfortunate Costa related incident.</p><p>Setup on it&#8217;s slightest angle the case allows for fairly comfortable typing, but I wouldn&#8217;t do any extended work in this position as it&#8217;s still a little steep if I rest my wrists.</p><p>In summary, a fantastic case. My iPad now goes in by bag or on the car seat with an assortment of other kit without worry of scratches, knocks spills or sliding off the seat the next time someone decides to cut me up!</p><p>Just missing a keyboard</p><p>Rating: 7/10</p><p>&nbsp;</p><p>&nbsp;</p> ]]></content:encoded> <wfw:commentRss>http://garethwright.com/blog/sd-tabletwear-ipad-2-ipad-3-luxfolio-case-review/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>1 and 1 iOS Apps sloppy coding allows domain theft and email hijacking</title><link>http://garethwright.com/blog/1-and-1-ios-apps-sloppy-coding-allows-domain-theft-and-email-hijacking?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=1-and-1-ios-apps-sloppy-coding-allows-domain-theft-and-email-hijacking</link> <comments>http://garethwright.com/blog/1-and-1-ios-apps-sloppy-coding-allows-domain-theft-and-email-hijacking#comments</comments> <pubDate>Sat, 14 Apr 2012 21:57:45 +0000</pubDate> <dc:creator>Gareth Wright</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[1and1]]></category> <category><![CDATA[1und1]]></category> <category><![CDATA[f-secure]]></category> <category><![CDATA[facebook]]></category> <category><![CDATA[linkedin]]></category> <category><![CDATA[one and one]]></category> <category><![CDATA[plist vulnerability]]></category><guid
isPermaLink="false">http://garethwright.com/?p=7640</guid> <description><![CDATA[In many ways this is much worse than the LinkedIn and Facebook Plist vulnerability exposed last week. Both social apps exposed plain text OAuth Tokens which enable a large amount of personal information to be snaffled from accounts, and in the case of Facebook, access any website or application you&#8217;ve authorised via Facebook. What makes [...]]]></description> <content:encoded><![CDATA[<p>In many ways this is much worse than the <a
title="LinkedIn also Vulnerable to Plist Theft" href="http://garethwright.com/blog/linkedin-also-vulnerable-plist-theft">LinkedIn</a> and <a
title="Facebook Mobile Security Hole Allows Identity Theft [Updated]" href="http://garethwright.com/blog/facebook-mobile-security-hole-allows-identity-theft">Facebook Plist vulnerability exposed</a> last week.</p><p>Both social apps exposed plain text OAuth Tokens which enable a large amount of personal information to be snaffled from accounts, and in the case of Facebook, access any website or application you&#8217;ve authorised via Facebook.</p><p>What makes 1 and 1&#8242;s plist snafu much worse, is that the application stores the password you use to manage your account and your account number in plain text.</p><p>In the image below my contract number and password are plainly visible (obfuscated here for obvious reasons)</p><p><a
href="http://garethwright.com/wp-content/uploads/IMG_0076.jpg?84cd58"><img
class="alignnone size-full wp-image-7647" title="1 and 1 Plist (Obfuscated)" src="http://garethwright.com/wp-content/uploads/IMG_0076.jpg?84cd58" alt="" width="320" height="430" /></a></p><p>The application in question is &#8220;1 and 1 Domain Ordering&#8221;. For those of you reading who use this application and use the same password in multiple places, take a break and go and<strong> change them all now</strong>.</p><p>Where taking advantage of copied plists required moving them to another device, this particular oversight requires no such thing.</p><p>Lifting the plain text details straight from my plist <a
href="http://blog.scoopz.com">Scoopz</a> was able to login to my account at 1and1.co.uk with no issues.</p><p><a
href="http://garethwright.com/wp-content/uploads/2012-04-14_18-41-40.png?84cd58"><img
class="alignnone  wp-image-7641" title="One and One Dashboard Hacked" src="http://garethwright.com/wp-content/uploads/2012-04-14_18-41-40-800x302.png?84cd58" alt="One and One Dashboard Hacked" width="551" height="208" /></a></p><p>Now luckily, I don&#8217;t have any hosting or servers with 1 and 1, but If I did the management of those would appear top left under domains and webspace.</p><p>From here you could easily cause complete havoc.</p><p>Like many others I have payment info linked to my account, ordering anything from a domain to a dedicated server is a few simple clicks away, and if like me you get a whole lot of email its easy to miss a charge.</p><p>At worst you have the same password on your email and well&#8230;it&#8217;s game over.</p><p>Even if that&#8217;s not the case, a quick visit to the domain control panel and you can find your MX records changed (they tell email servers where to send your email) and have that swiftly followed by full domain hijacks or even transfers.</p><p>I&#8217;ve made numerous attempts to contact 1and1 about the issue but thus far I&#8217;ve yet to receive anything back from them.</p><p>I&#8217;ve even tried to approach them through Mikko Hypponen Chief Research Officer at F-Secure, but still nothing back at time of publishing.</p><p><a
href="https://order.1and1.co.uk/SmartphoneApps?__lf=Static&amp;linkOrigin=&amp;linkId=ct.nav.all_domains_smartphoneapps">1and1 provide a number of smartphone applications</a>,  as I don&#8217;t have any of their other services I can&#8217;t test those applications properly.</p><p>That said it stands to reason that they are developed by the same people and thus suffer from the same issue.</p><p>I encourage users of this app to <a
href="http://itunes.apple.com/gb/app/1-1-domains/id468630810">leave a review on the app store</a> and ask 1and1 to make the required changes to sure up the security of your online property.</p><p>&nbsp;</p><p>&nbsp;</p> ]]></content:encoded> <wfw:commentRss>http://garethwright.com/blog/1-and-1-ios-apps-sloppy-coding-allows-domain-theft-and-email-hijacking/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Using iOS Keychain for Data Protection and Migration</title><link>http://garethwright.com/blog/using-ios-keychain-for-data-protection-and-migration?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=using-ios-keychain-for-data-protection-and-migration</link> <comments>http://garethwright.com/blog/using-ios-keychain-for-data-protection-and-migration#comments</comments> <pubDate>Fri, 13 Apr 2012 08:21:59 +0000</pubDate> <dc:creator>Gareth Wright</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[facebook]]></category> <category><![CDATA[identity theft]]></category> <category><![CDATA[ios]]></category> <category><![CDATA[keychain access]]></category> <category><![CDATA[linkedin]]></category> <category><![CDATA[plist vulnerability]]></category> <category><![CDATA[protecting data]]></category> <category><![CDATA[security]]></category> <category><![CDATA[using the keychain]]></category><guid
isPermaLink="false">http://garethwright.com/?p=7619</guid> <description><![CDATA[Given the number of requests I&#8217;m currently recieving re using the keychain following my post regarding the use of plain text credientials in plists I&#8217;ve decided to reprint an excellent series of articles from Use Your Loaf which helped me get to grips with Keychain access and permissions. Hope this helps out! Remember for maximum [...]]]></description> <content:encoded><![CDATA[<p>Given the number of requests I&#8217;m currently recieving re using the keychain following my post regarding the use of <a
title="Facebook Mobile Security Hole Allows Identity Theft [Updated]" href="http://garethwright.com/blog/facebook-mobile-security-hole-allows-identity-theft">plain text credientials in plists</a> I&#8217;ve decided to reprint an excellent series of articles from <a
href="http://useyourloaf.com/blog/2011/5/27/ios-keychain-migration-and-data-protection-part-1.html">Use Your Loaf</a> which helped me get to grips with Keychain access and permissions.</p><p>Hope this helps out!</p><p>Remember for maximum protection you want to prevent migration of keychain data for your app. Sure your customer will have to login again on another device, but that&#8217;s not exactly a hardship!</p><h3>Encrypted Backups</h3><p>When you connect an iOS device (iPhone, iPod touch, iPad) to a computer to sync with an iTunes library a backup of the data on the device is also made. The backup includes application settings and data but excludes things like the tmp and Caches folder (see this <a
href="http://support.apple.com/kb/HT1766">Apple support article</a> for the full list of what is included). The backup also includes the keychain so that account passwords, WiFi passwords or any other data you choose to save in the keychain is stored. iTunes allows you to specify that the backup should be encrypted in which case a password is required to restore the backup to a device.</p><p><a
href="http://garethwright.com/wp-content/uploads/2011-05-27-001.png?84cd58"><img
class="size-full wp-image-7620 alignnone" style="margin-top: 5px; margin-bottom: 5px;" title="Enrypting iOS Backup" src="http://garethwright.com/wp-content/uploads/2011-05-27-001.png?84cd58" alt="" width="347" height="199" /></a></p><p>&nbsp;</p><h3>Keychain Migration</h3><p>You may decide that it is not worth the effort of encrypting the backup data especially since it is questionable how secure the backup really is. However even if you are not worried about the security of the backup there is a really good reason why you might want to encrypt the backup.</p><p>An unencrypted backup can only be restored the original device that it was taken from. This means that if you buy a new device you will have to enter keychain data such as account settings and passwords manually. An encrypted backup can be restored to a different device avoiding a whole load of pain. The only requirement is that you remember the password as you will be asked for it when you attempt the restore.</p><p>This ability to migrate keychain data between devices was introduced in iOS 4 but I think has been overlooked somewhat both by users and application developers. In fact the keychain services allow the application developer a fine degree of control on how data is handled when it is backed up.</p><p>Data Protection</p><p>As well as providing a means to migrate keychain data iOS 4 also introduced a more sophisticated level of data protection for data stored on the device itself. The iPhone 3GS introduced hardware based encryption of data on the device but it seems that is what not too difficult to <a
href="http://www.schneier.com/blog/archives/2009/07/iphone_encrypti.html">circumvent</a>. Things have hopefully been improved with iOS 4:</p><ul><li>The user entered passcode is now used to protect the hardware encryption keys providing an additional layer of protection.</li><li>The application developer can specify when encrypted data should be available (e.g. only when the device is unlocked).</li><li>Keychain data can be set as migratable or non-migratable preventing it from being restored to a new device if required.</li><li>Separate encryption keys are used to encrypt the keychain data and the device filesystem</li></ul><p>To enable data protection you need to set a passcode for the device (Settings &gt; General &gt; Passcode) once you do that you should see a confirmation that data protection is enabled at the bottom of the Passcode Lock settings screen:</p><p><a
href="http://garethwright.com/wp-content/uploads/2011-05-27-002.png?84cd58"><img
class="alignnone size-full wp-image-7621" title="Enabling Simple Passcode on iOS" src="http://garethwright.com/wp-content/uploads/2011-05-27-002.png?84cd58" alt="Enabling Simple Passcode on iOS" width="450" height="323" /></a></p><p>&nbsp;</p><p>As it would happen there have been some reports that the iOS hardware encryption has been cracked though this looks like it involves a brute force attack on the user passcode. By default the passcode is a simple 4 digit pin code giving only 10,000 combinations which it is claimed can be broken in under 40 minutes on an iPhone 4. To defeat this attack you can set a stronger passcode by turing off the Simple Passcode option in the settings screen. You can then enter a longer and stronger alphanumeric passcode. You can also set the device to erase all data after 10 failed passcode attempts to be extra sure.</p><p><a
href="http://garethwright.com/wp-content/uploads/2011-05-27-003.png?84cd58"><img
class="alignnone size-full wp-image-7622" title="Enable Complex Passcode iOS" src="http://garethwright.com/wp-content/uploads/2011-05-27-003.png?84cd58" alt="" width="450" height="299" /></a></p><p>&nbsp;</p><h3>Data Protection Classes</h3><p>The keychain services provide API access to add, update, search and delete items from the keychain. Refer back to the Use Your Loaf article on <a
href="http://useyourloaf.com/blog/2010/3/29/simple-iphone-keychain-access.html">simple keychain access</a> for the full details and example code. What I want to cover here are the additional data protection classes that can be used to control the availability of the data stored in the keychain. Basically you can choose between three classes of availability for keychain data:</p><ul><li><strong>Unlocked:</strong> data can only be accessed when the device is unlocked (which of course may require the user to enter the passcode).</li><li><strong>After first unlock:</strong> data can be accessed when the device is locked provided it has been unlocked at least once since the device was started.</li><li><strong>Always:</strong> the data is accessible always even when the device is locked</li></ul><p>For backward compatibility the default is “always” though Apple recommends that you use the most protective class possible. This is generally “unlocked” unless you have an application that needs to access keychain data when running in the background (the user might lock the device whilst your app is running cutting off its access to the keychain). In the situation where you might need to access the keychain of a locked device you should use the “after first unlock” class.</p><p>If you are hanging onto data that you have retrieved from the keychain then you also need to ensure you purge this data when the user locks the device. Apple provides application delegate methods and notifications to make it easy for you to do this. Your application has about 10 seconds to clean up before the keychain service is locked. Attempting to access it after that point will generate an error until the device is unlocked again.</p><p>As well as being able to set the availability of the keychain data you can also control how it is handled when the keychain is migrated to a new device. Remember if the user has an encrypted backup they can restore the keychain contents to a different device. By default all data added to the keychain is set as migratable. If you want the data to only be available on the current device you must set it to be non-migratable.</p><p>Apple actually defines six data protection classes consisting of migratable and non-migratable versions of the three data availability classes. If you do nothing the keychain defaults to the most open option so data will be available always and migratable.</p><h3>Keychain Item Accessibility</h3><p>In this post I want to be able to experiment with the various keychain migration and data protection options. To make this easier I am using a simple wrapper class (UYLPasswordManager) to hide some of the complexity of the keychain services. I will dig into the implementation of that class in a later post &#8211; it is largely a reworking of some previous code that Use Your Loaf used in a much earlier post on <a
href="http://useyourloaf.com/blog/2010/3/29/simple-iphone-keychain-access.html">simple keychain access</a>. So to get started I should introduce the basic methods for storing and searching for items in the keychain:</p><h4>Accessing the shared instance</h4><p>A shared instance of the UYLPasswordManager class is used to allow some caching of the previous keychain access. This makes repeat searches fast. To access the shared instance use the class method sharedInstance:</p><pre>UYLPasswordManager *manager = [UYLPasswordManager sharedInstance];</pre><h4>Registering a Username and Password in the Keychain</h4><p>To store a username (identifier) and password (key) in the keychain use the instance method: registerKey:forIdentifier:</p><pre class="prettyprint [lang-c]">[registerKey:@"password" forIdentifier:@"username"];</pre><h4>Searching the Keychain</h4><p>To search the keychain for an existing username and password use the instance method validKey:forIdentifier:</p><pre class="prettyprint [lang-c]">
BOOL result = [manager validKey:@"password" forIdentifier:@"username"];
</pre><p>&nbsp;</p><p>&nbsp;</p><p>The result is YES if a matching username and password is found, otherwise NO is returned.</p><h3>The Example App</h3><p>With just those three simple methods we can create a simple example app to store and retrieve an item from the keychain. Once we have that working we can examine the effects of changing some of the data protection options. The simplest example app that I could come up with prompts the user for a username and password and then reports whether it is found in the keychain. The user interface is shown below:</p><p><a
href="http://garethwright.com/wp-content/uploads/2011-06-01-001.png?84cd58"><img
class="alignnone size-full wp-image-7623" title="The Example App" src="http://garethwright.com/wp-content/uploads/2011-06-01-001.png?84cd58" alt="The Example App" width="320" height="199" /></a></p><p>The view controller interface is very simple consisting of some text fields and labels. The view controller also implements the UITextFieldDelegate protocol. I will not show it here but the delegate of the password text field is set in Interface Builder so that we get informed when the user hits return in the password field. The interface definition is as follows:</p><pre class="prettyprint [lang-c]">@interface PasswordManagerViewController : UIViewController &lt;UITextFieldDelegate&gt; {
}
@property (nonatomic, retain) IBOutlet UILabel *pmLabel;
@property (nonatomic, retain) IBOutlet UITextField *username;
@end</pre><p>&nbsp;</p><p>In the view controller implementation we use the viewDidLoad method to store a hard-coded username and password in the keychain using the registerkey:forIdentifier: method:</p><pre class="prettyprint [lang-c]">- (void)viewDidLoad {
[[UYLPasswordManager sharedInstance] registerKey:@"secret" forIdentifier:@"manager"];
}</pre><p>The text field delegate method (textFieldShouldReturn:) is called when the user hits return so we perform a search of the keychain at that point and display the result:</p><pre class="prettyprint [lang-c]">- (BOOL)textFieldShouldReturn:(UITextField *)textField {
self.pmLabel.hidden = NO;
[textField resignFirstResponder];

NSString *identifier = self.username.text;</pre><p>NSString *key = textField.text;</pre><p>if (identifier) {</pre><p>UYLPasswordManager *manager = [UYLPasswordManager sharedInstance];</pre><p>if ([manager validKey:key forIdentifier:identifier]) {</pre><p>self.pmLabel.text = @"Success";</pre><p>} else {<br
/> self.pmLabel.text = @"Failed!";<br
/> }<br
/> }<br
/> return YES;<br
/> }</pre><h3>Migration and Data Protection Options</h3><p>So with the basics up and running we can start to experiment with the data protection options. Again to keep things easy the UYLPasswordManager has two properties to make it easy to specify migration and data accessibility of any items added to the keychain:</p><pre class="prettyprint [lang-c]">
@property (nonatomic,assign) BOOL migrate;

@property (nonatomic,assign) UYLPMAccessMode accessMode;
</pre><p>&nbsp;</p><p>The migrate property is a boolean which controls whether items added or updated to the keychain are migratable. As I explained in the <a
href="http://useyourloaf.com/blog/2011/5/27/ios-keychain-migration-and-data-protection-part-1.html">previous post</a> the keychain provides the option to specify whether an item can be migrated to a new device. If a user restores an encrypted backup to a new device the keychain items which are set to migratable will be restored to that device. This allows a user to migrate to a new device without having to manually enter password data. By default items are migratable.</p><p>The accessMode property is a little more complicated as it is an enumerated type taking thee possible values as follows:</p><ul><li><strong>UYLPMAccessibleWhenUnlocked</strong> - data can only be access when the device is unlocked.</li><li><strong>UYLPMAccessibleAfterFirstUnlock</strong> - data can be accessed when the device is locked provided it has been unlocked at least once since the device was started.</li><li><strong>UYLPMAccessibleAlways</strong> - data is accessible always even when the device is locked.</li></ul><p>The default is the most secure option, UYLPMAccessibleWhenUnlocked, which means that a keychain item cannot be retrieved when the device is locked. Note that these attributes apply to each item that is added to the keychain. When we dig into the implementation we will see that these two properties actually combine into a single attribute that is set on a keychain item (which can therefore have 6 possible values).</p><p>It is difficult to demonstrate the impact of setting the migrate option to NO since it requires a device restore. Also most of the time you probably want to leave keychain items set to be migratable. The only time you might want to change this is if you have keychain data that is only relevant to a specific device.</p><p>It is easier to play with the data protection option since the keychain services provide an application delegate method, applicationProtectedDataWillBecomeAvailable: and a notification, UIApplicationProtectedDataWillBecomeUnavailable, to allow us to detect when the device is about to be locked. Apple recommends that you use these to cleanup any user sensitive data when the device is being locked.</p><p>Since the UYLPasswordManager shared instance caches the previous keychain search it needs to have its data purged when the device is locked. A purge method makes that easy:</p><pre class="prettyprint [lang-c]">
[[UYLPasswordManager sharedInstance] purge];
</pre><p>&nbsp;</p><p>The application delegate method is useful if you can perform all of the data cleanup in the application delegate which is true in this simple application. In real life you may find it more useful to have individual view controllers listen for the notification so that they can perform their own cleanup.</p><h3>Detecting when the device will lock</h3><p>To illustrate the technique we can add an observer for the notification as follows:</p><pre class="prettyprint [lang-c]">[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(deviceWillLock)
name:UIApplicationProtectedDataWillBecomeUnavailable
object:nil];
</pre><p>The deviceWillLock is called when the user has decided to the lock the device at which point you have about 10 seconds before the keychain protected data becomes unavailable. To test this out I created a method as follows to purge the UYLPasswordManager cache and then check the keychain after 10 seconds:</p><pre class="prettyprint [lang-c]">- (void)deviceWillLock {
NSLog(@"device is about to be locked");
[[UYLPasswordManager sharedInstance] purge];
[self performSelector:@selector(checkKey) withObject:nil afterDelay:10];
}</pre><p>The checkKey method attempts to search the keychain and outputs the result:</p><pre class="prettyprint [lang-c]">- (void)checkKey {
NSLog(@"checkKey");
UYLPasswordManager *manager = [UYLPasswordManager sharedInstance];
if ([manager validKey:@"secret" forIdentifier:@"manager"]) {
NSLog(@"Password valid");
}
}</pre><p>If we try this with the app running on a real device (this will not work with the simulator) we get the following:</p><blockquote><p><strong>2011-06-01 21:59:01.515 PasswordManager[20599:707] device is about to be locked</strong></p><p><strong>2011-06-01 21:59:11.527 PasswordManager[20599:707] checkKey</strong></p><p><strong>2011-06-01 21:59:11.542 PasswordManager[20599:707] searchKeychain for identifier: manager - Interaction with the Security Server is not allowed</strong></p><p><strong><br
/> </strong></p></blockquote><p>The final message is logged by the UYLPasswordManager class and is the error returned by the keychain services when we tried to access our item with the device locked. To make the item accessible when locked we can set the accessMode before register the key as follows:</p><pre class="prettyprint [lang-c]">
UYLPasswordManager *manager = [UYLPasswordManager sharedInstance];
manager.accessMode = UYLPMAccessibleAlways;
[manager registerKey:@”secret” forIdentifier:@”manager”];
</pre><p>Now when we run the same test we are able to access the data with the device locked:</p><blockquote><p><strong>2011-06-01 22:04:43.897 PasswordManager[20631:707] device is about to be locked</strong></p><p><strong>2011-06-01 22:04:53.923 PasswordManager[20631:707] checkKey</strong></p><p><strong>2011-06-01 22:04:53.980 PasswordManager[20631:707] Password valid</strong></p></blockquote><h3>Handling the background</h3><p>There is a small issue with relying on the application delegate or notification to allow us to perform some cleanup when the device is locked. If our app is suspended in the background when the user locks the device we do not get a chance to react. So unless you need to access keychain data when you are running in the background it is a good idea to clean up as the app moves to the background. That is easy enough to do if we implement the correct application delegate:</p><pre class="prettyprint [lang-c]">- (void)applicationDidEnterBackground:(UIApplication *)application {
[[UYLPasswordManager sharedInstance] purge];
}</pre><p>To sum up if you are storing sensitive user data in the keychain you should think about setting the appropriate data protection class for that data. I have found that wrapping the keychain code into a separate class keeps my application code simple. I will cover the details of the UYLPasswordManager class in a future post but if you want a sneak peak you can find the full code for the Use Your Loaf's example app <a
href="http://useyourloaf.com/storage/code/examples/PasswordManager-20110601.zip">here</a>.</p><h3>The UYLPasswordManager class</h3><p>I have tried to keep the interface to the UYLPasswordManager class as simple as possible. Ideally I want the most common use cases to be baked into the class by default with a minimum of properties and methods to store and retrieve passwords to the keychain. The actual interface definition is show below and I will step through each of these methods to show the detailed implementation. For an example of how to use this class refer back to <a
href="http://useyourloaf.com/blog/2011/6/1/ios-and-keychain-migration-and-data-protection-part-2.html">part 2</a> of this series of posts.</p><pre class="prettyprint [lang-c]">
@interface UYLPasswordManager : NSObject;

@property (nonatomic,assign) BOOL migrate;

@property (nonatomic,assign) UYLPMAccessMode accessMode;

&nbsp;

+ (UYLPasswordManager *)sharedInstance;

+ (void)dropShared;

- (void)purge;

- (void)registerKey:(NSString *)key forIdentifier:(NSString *)identifier inGroup:(NSString *)group;

- (void)deleteKeyForIdentifier:(NSString *)identifier inGroup:(NSString *)group;

- (BOOL)validKey:(NSString *)key forIdentifier:(NSString *)identifier inGroup:(NSString *)group;

- (void)registerKey:(NSString *)key forIdentifier:(NSString *)identifier;

- (void)deleteKeyForIdentifier:(NSString *)identifier;

- (BOOL)validKey:(NSString *)key forIdentifier:(NSString *)identifier;

@end
</pre><p>The only prerequisites to using the class are that you link with the security framework (“Security.framework”) and include the class header file. It requires a minimum of iOS 4.0.</p><p>Creating the shared instance</p><p>I use a shared instance of the UYLPasswordManager to allow the results of a keychain operation to be cached. The shared instance is created the first time it is accessed with subsequent accesses returning a reference to the instance. This is not quite the same as a singleton instance as I take no steps to prevent other instances of UYLPasswordManager objects from being created by direct calls to alloc and init. However I find for iOS apps the simpler approach of a shared instance is sufficient. The code to create and drop the shared instance are shown below:</p><pre class="prettyprint [lang-c]">
static UYLPasswordManager *_sharedInstance = nil;

+ (UYLPasswordManager *)sharedInstance {

if (_sharedInstance == nil) {
 _sharedInstance = [[self alloc] init];
}
return _sharedInstance;
}
+ (void)dropShared {

if (_sharedInstance) {
[_sharedInstance release];
_sharedInstance = nil;
}
}</pre><p>Hopefully this is fairly self explanatory, the sharedInstance method checks to see if we already have an object allocated in which case it is returned otherwise we allocate and init a new object. The dropShared method provides a way to release the shared instance though in practise this should not be necessary since the idea of the shared instance is that once created it lives for the life of the application.</p><h3>Properties</h3><p>Before looking at the class initialiser we will do a quick tour of the public and private properties of the class along with their accessor methods. There are two public properties that the user of the class can use to control whether a keychain item is migratable and which data protection class it will use (always available, available after first unlock or only available when the device is unlocked). There is nothing special about these two properties which are declared in the public interface we saw earlier. The getter/setter methods are synthesized in the class implementation. The only piece I did not show is the definition of the enumerated type UYPMAccessMode which is used for the accessMode property. This is defined in the interface file as follows:</p><pre class="prettyprint [lang-c]">
typedef enum _UYLPMAccessMode {

UYLPMAccessibleWhenUnlocked = 0,

UYLPMAccessibleAfterFirstUnlock = 1,

UYLPMAccessibleAlways = 2

} UYLPMAccessMode;
</pre><p>The class has three other properties which are defined as part of the private interface inside the class implementation file as follows:</p><pre class="prettyprint [lang-c]">
@property (nonatomic,retain) NSString *keychainValue;

@property (nonatomic,copy) NSString *keychainAccessGroup;

@property (nonatomic,copy) NSString *keychainIdentifier;
</pre><p>The keychain value property is used to store the value of the item that is retrieved from a search of the keychain. The other two properties are used to copy the keychain access group and identifier that are parsed as arguments by the caller in many of the class instance methods as we will see shortly.The getter/setter methods of all of these methods are synthesized by the compiler with the exception of the setter for the last two where we specify our own implementation. Here is the setter for the keychainIdentifier property (the keychainAccessGroup setter is very similar so I will omit it):</p><pre class="prettyprint [lang-c]">
- (void)setKeychainIdentifier:(NSString *)newValue {

 if (!_keychainIdentifier &amp;&amp; !newValue)  {
 return;
}

 [_keychainIdentifier release];
_keychainIdentifier = nil;
self.keychainValue = nil;

if (newValue) {
 _keychainIdentifier = [newValue copy];
}
}</pre><p>This is pretty much the same as a standard setter with the exception that when a new identifier is set we clear (and release) the previously cached keychainValue instance variable to force a new search of the keychain.</p><h3>The Initialiser</h3><p>The initialiser for a new instance of the class is not very exciting, after taking care of the standard stuff of calling the initialiser of its superclass it sets some defaults for the keychain attributes as follows:</p><pre class="prettyprint [lang-c]">
- (id)init {
self = [super init];
  if (self) {
      _migrate = YES;
    _accessMode = UYLPMAccessibleWhenUnlocked;
}
 return self;
}</pre><p>So by default all items added or updated to the keychain will be set to be migratable and will use the most protected data class which ensures they can only be accessed when the device is unlocked. Most of the time these defaults should be correct so it keeps things nice and simple for the user of the class.</p><h3>The Public Methods</h3><p>The public instance methods are fairly simple as the hard work of interacting with the keychain services is performed by a number of private helper methods. The methods to register, search for and delete a key are all available in two forms the only difference being that one set of methods omits the access group argument. I have previously discussed keychain group access to share keys between applications but since my guess is that most of the time it will not be used I opted to create a set of convenience methods without a group argument. Since these methods just call the fuller method with the group argument set to nil I will not show them here.</p><p>To get started we will take a look at the implementation of the method to register a new key with the keychain service. To store an item in the keychain you need to supply an identifier, most commonly a username or some other means of identifying the key, and the actual key which is the password or thing that you want to keep secret. The implementation is as follows:</p><pre class="prettyprint [lang-c]">
- (void)registerKey:(NSString *)key forIdentifier:(NSString *)identifier inGroup:(NSString *)group {

 self.keychainAccessGroup = group;
   self.keychainIdentifier = identifier;
   [self searchKeychain];

  if (self.keychainValue == nil) {

     [self createKeychainValue:key];

   } else {

      [self updateKeychainValue:key];
  }

   [self searchKeychain];
&nbsp;

}</pre><p>This method starts by copying the access group and identifier into our instance variables for future reference. It then calls a helper method which we will see shortly to search the keychain to determine if we already have an entry for the specified identifier. Depending on the results of the search we then either call a method to create a new entry to store the key or update the existing entry. Finally we perform a keychain search to ensure our cached keychain value is valid.</p><p>The method to search the keychain accepts the usual arguments of an identifier and key and optionally an access group and returns a boolean to indicate if the search was a success or not.</p><pre class="prettyprint [lang-c]">
- (BOOL)validKey:(NSString *)key forIdentifier:(NSString *)identifier inGroup:(NSString *)group {

   BOOL result = NO;

   if (identifier) {
        self.keychainAccessGroup = group;
     self.keychainIdentifier = identifier;
       [self searchKeychain];

      if (self.keychainValue != nil) {
            if (key != nil) {</pre><p> if ([self.keychainValue isEqual:key]) {<br
/> result = YES;<br
/> }</p><p> } else {<br
/> result = YES;     }     }   }  return result;<br
/> } </pre><p>As before the access group and identifier arguments are copied into our instance variables and then the method to search the keychain is called which will result in the keychainValue being set if the identifier was found. If we do not get a keychainValue back we return NO to the caller.</p><p>In some cases I am using the keychain to register that the user has completed an action, for example that they have registered a product. In that situation I do not really have a password key to store but it is useful to register an identifier in the keychain with some arbitrary key (the application name for example). Since in those situations I really only want to check to see if the identifier exists in the keychain I allow the key argument to validKey:forIdentifier:inGroup to be nil and do not bother to check that the key value actually matches.</p><p>The method to delete a key is shown below and simply calls the deleteKeychainValue private method after storing the arguments as usual:</p><pre class="prettyprint [lang-c]">
- (void)deleteKeyForIdentifier:(NSString *)identifier inGroup:(NSString *)group {

     self.keychainAccessGroup = group;
  self.keychainIdentifier = identifier;
  [self deleteKeychainValue];
}</pre><p>The final public method is the purge method which is used to empty the cached keychainValue instance variable in situations where the device is about to be locked or the application is moving to the background. Refer to post 2 in this series for a more detailed discussion for how and why you may want to do this.</p><pre class="prettyprint [lang-c]">
- (void)purge {
 self.keychainAccessGroup = nil;
self.keychainIdentifier = nil;
 self.keychainValue = nil;
}</pre><h3>Private Methods</h3><p>The heavy lifting of  interacting with the keychain services is performed by a number of private methods. These methods are similar to ones discussed in <a
href="http://useyourloaf.com/blog/2010/3/29/simple-iphone-keychain-access.html">earlier posts</a> on the keychain so I will keep some of the explanations brief. If you are wondering about the various keychain classes and attributes refer back to that post for the full details. All of the interactions with the keychain API take a dictionary of attributes that indicates the class of item you want to store. We will be storing a generic password in the keychain so we need to initialise a dictionary as follows:</p><pre class="prettyprint [lang-c]">
- (NSMutableDictionary *)newSearchDictionary {

NSMutableDictionary *searchDictionary = nil;

if (self.keychainIdentifier) {
 NSData *encodedIdentifier = [self.keychainIdentifier dataUsingEncoding:NSUTF8StringEncoding];
  searchDictionary = [[NSMutableDictionary alloc] init];
   [searchDictionary setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
  [searchDictionary setObject:encodedIdentifier forKey:(id)kSecAttrGeneric];
   [searchDictionary setObject:encodedIdentifier forKey:(id)kSecAttrAccount];
  [searchDictionary setObject:kKeychainService forKey:(id)kSecAttrService];
 if (self.keychainAccessGroup) {
   [searchDictionary setObject:self.keychainAccessGroup forKey:(id)kSecAttrAccessGroup];
  }
}

return searchDictionary;

}
</pre><p>The keychainIdentifier instance variable is encoded and used as the keychain account name. Note the use of a keychain service (kSecAttrService) and account name (kSecAttrAccount) attribute are required to uniquely identify a generic password item in the keychain (see this <a
href="http://useyourloaf.com/blog/2010/4/28/keychain-duplicate-item-when-adding-password.html">post on duplicate items</a> for the details).</p><p>The methods to create, update and delete a keychain entry are then just variations of the same basic theme. First here is the method to search the keychain for the identifier stored in the private instance variable keychainIdentifier:</p><pre class="prettyprint [lang-c]">
- (void)searchKeychain {

if (self.keychainValue == nil) {
NSMutableDictionary *searchDictionary = [self newSearchDictionary];
[searchDictionary setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
 [searchDictionary setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
NSData *result = nil;
 OSStatus status = SecItemCopyMatching((CFDictionaryRef)searchDictionary, (CFTypeRef *)&amp;result);
[searchDictionary release];
 if (result) {
self.keychainValue = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
[result release];
 }
 }
}</pre><p>The search method uses the Keychain function SecItemCopyMatching to perform the search with the attributes kSecMatchLimit and kSecReturnData to indicate we only want the first entry returned. If we find a value it is decoded and stored in the keychainValue instance variable.</p><p>The method to create keychain item uses the SecItemAdd function. The update method is very similar so I will omit it here for brevity but it makes use of the SecItemUpdate fucntion.</p><pre class="prettyprint [lang-c]">
- (BOOL)createKeychainValue:(NSString *)password {

NSMutableDictionary *dictionary = [self newSearchDictionary];
NSData *passwordData = [password dataUsingEncoding:NSUTF8StringEncoding];
[dictionary setObject:passwordData forKey:(id)kSecValueData];
[dictionary setObject:(id)[self attributeAccess] forKey:(id)kSecAttrAccessible];
 OSStatus status = SecItemAdd((CFDictionaryRef)dictionary, NULL);
 [dictionary release];

if (status == errSecSuccess) {
return YES;
 }
 return NO;
}
</pre><p>The interesting thing to note here is the kSecAttrAccessible attribute which is used to set the data protection class of the keychain item. The Keychain Service data protection class is determined from a combination of the two public properties (migrate and accessMode) of the UYLPasswordManager class. The data protection class is calculated by the method attributeAccess as follows:</p><pre class="prettyprint [lang-c]">
- (CFTypeRef)attributeAccess {

switch (self.accessMode) {
case UYLPMAccessibleWhenUnlocked:
return self.migrate ? kSecAttrAccessibleWhenUnlocked :
                          kSecAttrAccessibleWhenUnlockedThisDeviceOnly;
break;
 case UYLPMAccessibleAfterFirstUnlock:
return self.migrate ? kSecAttrAccessibleAfterFirstUnlock :
                          kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly;
break;
case UYLPMAccessibleAlways:
return self.migrate ? kSecAttrAccessibleAlways :
                          kSecAttrAccessibleAlwaysThisDeviceOnly;
break;
default:
return self.migrate ? kSecAttrAccessibleWhenUnlocked :
                          kSecAttrAccessibleWhenUnlockedThisDeviceOnly;
   break;
  }
}</pre><p>So using the default settings of an item that is migratable and which can be accessed only when the device is unlocked we end up with a data protection class of kSecAttrAccessibleWhenUnlocked.</p><p>Finally the method to delete a keychain item which uses SecItemDelete:</p><pre class="prettyprint [lang-c]">
- (void)deleteKeychainValue {

  NSMutableDictionary *searchDictionary = [self newSearchDictionary];
 if (searchDictionary) {
   OSStatus status = SecItemDelete((CFDictionaryRef)searchDictionary);
   [searchDictionary release];
  }
  self.keychainValue = nil;
}</pre><h3>Wrapping Up</h3><p>Use Your Loaf's intention was to take all of the tricky keychain code and wrap it with an easy to understand and hopefully easy to use class, and they did an outstanding job!</p><p>If you want to see the code and try it yourself you can download it from <a
href="http://useyourloaf.com/storage/code/examples/PasswordManager-20110601.zip">here</a>.</p> ]]></content:encoded> <wfw:commentRss>http://garethwright.com/blog/using-ios-keychain-for-data-protection-and-migration/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>AgileBits 1Password Updated OAuth Tokens Moved to Keychain</title><link>http://garethwright.com/blog/agilebits-1password-updated-oauth-tokens-moved-to-keychain?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=agilebits-1password-updated-oauth-tokens-moved-to-keychain</link> <comments>http://garethwright.com/blog/agilebits-1password-updated-oauth-tokens-moved-to-keychain#comments</comments> <pubDate>Tue, 10 Apr 2012 22:13:22 +0000</pubDate> <dc:creator>Gareth Wright</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[1password]]></category> <category><![CDATA[agilebits]]></category> <category><![CDATA[credential theft]]></category> <category><![CDATA[dropbox]]></category> <category><![CDATA[exploit]]></category> <category><![CDATA[facebook]]></category> <category><![CDATA[linkedin]]></category> <category><![CDATA[plist]]></category> <category><![CDATA[vulnerability]]></category><guid
isPermaLink="false">http://garethwright.com/?p=7608</guid> <description><![CDATA[1Password, a cross platform passwords management solution  by Agile Bits snatched the crown for the first app developers to publicly test their own iOS app, own up to having, and subsequently fix the plist vulnerability discussed on my April 3rd Post Re Facebook Credential Theft Not only is their blog post oozing with professionalism and [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://garethwright.com/wp-content/uploads/1PPro_icon.png?84cd58"><img
class="alignleft size-full wp-image-7610" style="margin: 5px;" title="1PPro_icon" src="http://garethwright.com/wp-content/uploads/1PPro_icon.png?84cd58" alt="" width="150" height="150" /></a><a
href="http://itunes.apple.com/us/app/1password-for-iphone/id285897618?mt=8">1Password</a>, a cross platform passwords management solution  by Agile Bits snatched the crown for the first app developers to publicly test their own iOS app, own up to having, and subsequently fix the plist vulnerability discussed on my<a
title="Facebook Mobile Security Hole Allows Identity Theft [Updated]" href="http://garethwright.com/blog/facebook-mobile-security-hole-allows-identity-theft"> April 3rd Post Re Facebook Credential Theft</a></p><p>Not only is their blog post oozing with professionalism and good practice, but Jeff (the author of the post) goes onto explain exactly why the plain text OAuth details were an issue and what steps were taken to improve security.</p><p>App developers wondering how to approach securing their own apps, this is how it&#8217;s done.</p><p>As Jeff explains, &#8220;[...]we put the OAuth information into the iOS keychain using the “ThisDeviceOnly” data protection class that will not allow the OAuth token to be copied from the device unencrypted. There is a bit of terminological muddle in that “ThisDeviceOnly” and “ProtectionComplete” mean the same thing except that the former is used with keychain items and the latter used with files. I prefer the term “non-migratable” to cover both.</p><p>The application property lists files, plists, contain app preference settings, and this plists do not have the non-migratable restriction on them; they are fully accessible once the device has been unlocked. Note that data with the non-migratable restriction  cannot be restored from an iTunes or iCloud backup to a different device. So if you replace your iPhone or iPad, you will need to re-enter your Dropbox credentials to reestablish automatic syncing.&#8221;</p><p>Source: <a
href="http://blog.agilebits.com/2012/04/06/oauth-dropbox-and-your-1password-data/">http://blog.agilebits.com/2012/04/06/oauth-dropbox-and-your-1password-data/</a></p> ]]></content:encoded> <wfw:commentRss>http://garethwright.com/blog/agilebits-1password-updated-oauth-tokens-moved-to-keychain/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>LinkedIn also Vulnerable to Plist Theft</title><link>http://garethwright.com/blog/linkedin-also-vulnerable-plist-theft?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=linkedin-also-vulnerable-plist-theft</link> <comments>http://garethwright.com/blog/linkedin-also-vulnerable-plist-theft#comments</comments> <pubDate>Sat, 07 Apr 2012 20:15:51 +0000</pubDate> <dc:creator>Gareth Wright</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[facebook security]]></category> <category><![CDATA[linkedin]]></category> <category><![CDATA[plist]]></category> <category><![CDATA[plist vulnerability]]></category> <category><![CDATA[vulnerability]]></category><guid
isPermaLink="false">http://garethwright.com/?p=7599</guid> <description><![CDATA[[UPDATED] LinkedIn update on 26-4-2012 appears to resolve this vulnerability, though no statement or reference to the vulnerability has been made by LinkedIn. Still, they have fixed it, which is a heck of a lot more than Facebook has done! Further testing on popular social apps has revealed that LinkedIn also suffers from the plist [...]]]></description> <content:encoded><![CDATA[<p>[UPDATED] LinkedIn update on 26-4-2012 appears to resolve this vulnerability, though no statement or reference to the vulnerability has been made by LinkedIn.</p><p>Still, they have fixed it, which is a heck of a lot more than Facebook has done!</p><p>Further testing on popular social apps has revealed that LinkedIn also suffers from the plist credentials <a
title="Facebook Mobile Security Hole Allows Identity Theft [Updated]" href="http://garethwright.com/blog/facebook-mobile-security-hole-allows-identity-theft">vulnerability</a>.</p><p>What makes this more confusing is that the LinkedIn plist contains the deviceID, so why does an unmodified copy of the plist allow <a
href="http://twitter.com/scoopz">@scoopz</a> to login to my LinkedIn account?</p><p>It really isn&#8217;t difficult to store credentials in the keychain or salt auth keys with the device mac address to prevent this. As users become more aware of tools like IExplore hopefully developers will pay more attention to where they store sensitive information.</p><p><a
href="http://blog.scoopz.com/2012/04/07/linkedin-ios-app-also-vulnerable-to-plist-identity-theft/">See the full details on scoopz blog </a></p> ]]></content:encoded> <wfw:commentRss>http://garethwright.com/blog/linkedin-also-vulnerable-plist-theft/feed</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Kolay® The New iPad 3 HD Clear Gel Back Cover Tough TPU Case &amp; Screen Protector for Apple iPad 3 3rd Generation (Works with Smart Cover)</title><link>http://garethwright.com/gadgets/kolay-the-new-ipad-3-hd-clear-gel-back-cover-tough-tpu-case-screen-protector-for-apple-ipad-3-3rd-generation-works-with-smart-cover?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kolay-the-new-ipad-3-hd-clear-gel-back-cover-tough-tpu-case-screen-protector-for-apple-ipad-3-3rd-generation-works-with-smart-cover</link> <comments>http://garethwright.com/gadgets/kolay-the-new-ipad-3-hd-clear-gel-back-cover-tough-tpu-case-screen-protector-for-apple-ipad-3-3rd-generation-works-with-smart-cover#comments</comments> <pubDate>Wed, 04 Apr 2012 22:15:29 +0000</pubDate> <dc:creator>Gareth Wright</dc:creator> <category><![CDATA[Gadgets]]></category> <category><![CDATA[apple]]></category> <category><![CDATA[BACK]]></category> <category><![CDATA[CASE]]></category> <category><![CDATA[Clear]]></category> <category><![CDATA[COVER]]></category> <category><![CDATA[Generation]]></category> <category><![CDATA[iPad]]></category> <category><![CDATA[Kolay®]]></category> <category><![CDATA[Protector]]></category> <category><![CDATA[Screen]]></category> <category><![CDATA[SMART]]></category> <category><![CDATA[Tough]]></category> <category><![CDATA[Works]]></category><guid
isPermaLink="false">http://garethwright.com/gadgets/kolay-the-new-ipad-3-hd-clear-gel-back-cover-tough-tpu-case-screen-protector-for-apple-ipad-3-3rd-generation-works-with-smart-cover</guid> <description><![CDATA[]]></description> <content:encoded><![CDATA[<h3><a
href="http://garethwright.com/go/Kolay_The_New_iPad_3_HD_Clear_Gel_Back_Cover_Tough_TPU_Case_Screen_Protector_for_Apple_iPad_3_3rd_Generation_Works_with_Smart_Cover_/7516/1" rel="nofollow">Kolay® The New iPad 3 HD Clear Gel Back Cover Tough TPU Case & Screen Protector for Apple iPad 3 3rd Generation (Works with Smart Cover)</a></h3> <a
href="http://garethwright.com/go/link/7516/2" rel="nofollow"><img
style="float:left;margin: 0 20px 10px 0;" src="http://ecx.images-amazon.com/images/I/41MVV2E7iTL._SL160_.jpg" /></a><ul><li>Screen Protector with every case - Case also works with Smart Cover</li></ul> Kolay® The New iPad 3 HD Clear Gel Back Cover Tough TPU Case & Screen Protector for Apple iPad 3 3rd Generation (Works with Smart Cover) <img
id="sLogo" src="/logo.png?84cd58"/><p><div
style="float:right;"><a
href="http://garethwright.com/go/link/7516/3" rel="nofollow"><img
src="http://garethwright.com/wp-content/plugins/WPRobot3/images/buynow-big.gif?84cd58" /></a></div><strong>Price: £3.95</strong></p><p><img
src="/logo.png?84cd58"></p> ]]></content:encoded> <wfw:commentRss>http://garethwright.com/gadgets/kolay-the-new-ipad-3-hd-clear-gel-back-cover-tough-tpu-case-screen-protector-for-apple-ipad-3-3rd-generation-works-with-smart-cover/feed</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>Facebook Plist Mobile Security Hole Allows Identity Theft [Updated]</title><link>http://garethwright.com/blog/facebook-mobile-security-hole-allows-identity-theft?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=facebook-mobile-security-hole-allows-identity-theft</link> <comments>http://garethwright.com/blog/facebook-mobile-security-hole-allows-identity-theft#comments</comments> <pubDate>Tue, 03 Apr 2012 14:49:43 +0000</pubDate> <dc:creator>Gareth Wright</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[dropbox]]></category> <category><![CDATA[facebook]]></category> <category><![CDATA[idenity theft]]></category> <category><![CDATA[identity theft]]></category> <category><![CDATA[linkedin]]></category> <category><![CDATA[mobile applications]]></category> <category><![CDATA[security hole]]></category> <category><![CDATA[the next web]]></category> <category><![CDATA[the register]]></category><guid
isPermaLink="false">http://garethwright.com/?p=7507</guid> <description><![CDATA[I’ve made posts about various iOS games and the fact that developers, rather than encode add to keychain or save values in the binaries, choose to save those values in plain text plists. The majority of traffic to this site is to the pages relating to using these oversights for cheating in iOS games, but [...]]]></description> <content:encoded><![CDATA[<p>I’ve made posts about various iOS games and the fact that developers, rather than encode add to keychain or save values in the binaries, choose to save those values in plain text plists.<br
/> The majority of traffic to this site is to the pages relating to using these oversights for cheating in iOS games, but high scores should be the least of their worries.<br
/> Whilst poking around in a few applications directories using the free tool iexplorer (previously iphone explorer), I stumbled into a plain text (plist) <strong>Facebook</strong> access token in the popular Draw Something by OMG POP.<br
/> That in itself isn’t strange but as Draw Something requests offline access to your account I copied the hash and tested a few FQL queries.<br
/> Sure enough I could pull back pretty much any information from my <strong>Facebook</strong> account.<br
/> As of the 1st of May 2012 these tokens run out after 60 days but aside from that a simple .net tool could easily snaffle this info and grab a fair whack of confirmed email addresses and marketing info.<br
/> Not good, but then I had to wonder what the <strong>Facebook</strong> app stored.<br
/> Popping into the Facebook application directory I quickly discovered a whole bunch of cached images and the com.Facebook.plist<br
/> What was contained within was shocking.</p><p>Not an access token but full oAuth key and secret in <strong>plain text</strong>. Surely though, these are encrypted or salted with the device ID&#8230;unfortunetly not.<br
/> Worryingly the expiry in the plist is set to 1 Jan 4001!</p><p>Quick export and call to my good friend and local blogger <a
href="http://blog.scoopz.com">Scoopz</a> and I sent over my plist for him to try out.<br
/> After backing up his own <em>plist</em> and logging out of Facebook he copied mine over to his device and opened the Facebook app…<br
/> My jaw dropped as over the next few minutes I watched posts appear on my wall, private messages sent, webpages liked and applications added.<br
/> Scoopz then opened Draw Something on his <em>iPad</em> which logged him straight into my account where he sent some pictures back to my friends.<br
/> Even after restoring his own plist he still gets notifications for my games.<br
/> Having installed my Plist on 4 different devices with <strong>no warning</strong> I contacted Facebook.</p><p>In an email response dated 29 March 2012 20:41:11 GMT+01:00 a representative of the Facebook security team confirmed that the issue had already been reported and:</p><p>&#8220;We are working to fix it.</p><p>Thanks for contacting Facebook,</p><p>Emrakul<br
/> Security<br
/> Facebook&#8221;<br
/> After contacting Facebook I took the liberty of knocking together a few proof of concepts.<a
href="http://garethwright.com/wp-content/uploads/Multiple-accounts-drawsome-copy.jpg?84cd58"><img
class="alignleft size-thumbnail wp-image-7523" style="margin: 5px;" title="Multiple-accounts-drawsome copy" src="http://garethwright.com/wp-content/uploads/Multiple-accounts-drawsome-copy-150x150.jpg?84cd58" alt="" width="150" height="150" /></a><br
/> 1) A hidden application (malware) which runs on shared PC’s Any device plugged in to charge has the Plist copied<br
/> 2) A recompile of an open source iphone explorer like program with the added code<br
/> 3) A saved game editing tool with the added code<br
/> 4) A credit card sized hardware solution that takes all of two seconds to copy the plist should you have physical access to an iDevice<br
/> 5) A modified speaker dock<br
/> Over the course of a week over 1000 vulnerable plists were located and counted, though I hasten to add at no point was any data copied. <strong>(To clarify a 1000+ plists with open information re: facebook tokens or auth keys inc. 3rd party apps)</strong><br
/> Facebook are aware and &#8220;working on&#8221; closing the hole, (why the haven&#8217;t used the<a
title="Using iOS Keychain for Data Protection and Migration" href="http://garethwright.com/blog/using-ios-keychain-for-data-protection-and-migration"> keychain</a> is anyones guess) but unless app developers follow suit and start encrypting the 60 day access token Facebook supplies, it’s only a matter of time before someone starts using the info for ill purpose…if they aren’t already.<br
/> Until Facebook plug the hole, I’ll be thinking twice about plugging my devices into a shared PC, public music docks or “charging stations”.</p><p><strong>UPDATE</strong></p><p>I&#8217;ve been told this also works on Android devices, though I&#8217;ve not had the opportunity to put that to the test yet.</p><p>Though given the programming oversight in the iOS app, it stands to reason the issue will translate to other platforms.</p><p><strong>I feel I should reiterate, Facebook are playing this down and that&#8217;s fine, but saying it only effects stolen and jailbroken phones is not. </strong></p><p><strong> The biggest risk is from malware and viruses designed to slurp data from devices plugged into PC&#8217;s, so despite what any other articles say; jailbroken or not you ARE vulnerable!</strong></p><p><strong>When tested this worked on locked <del>passcoded</del> unmodified iOS Devices (Passcoded devices exploitable if plugged into a computer a user has previously synced to OR if device is unlocked whilst still connected to a shared computer)</strong></p><p>According to some articles Facebook say this isn&#8217;t really fixable, but they could at least add 2nd-tier authentication or at a minimum warn a user when another device has been used to access their account.</p><p>They do that for the web, why not mobile devices&#8230;.</p><p><strong>UPDATE:</strong><a
href="http://blog.scoopz.com/2012/04/07/linkedin-ios-app-also-vulnerable-to-plist-identity-theft/">LinkedIn is also vulnerable</a></p> ]]></content:encoded> <wfw:commentRss>http://garethwright.com/blog/facebook-mobile-security-hole-allows-identity-theft/feed</wfw:commentRss> <slash:comments>13</slash:comments> </item> <item><title>Tamron SP AF 10-24mm F/3.5-4.5 Di II LD Aspherical Lens for Canon</title><link>http://garethwright.com/photography/tamron-sp-af-10-24mm-f3-5-4-5-di-ii-ld-aspherical-lens-for-canon?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tamron-sp-af-10-24mm-f3-5-4-5-di-ii-ld-aspherical-lens-for-canon</link> <comments>http://garethwright.com/photography/tamron-sp-af-10-24mm-f3-5-4-5-di-ii-ld-aspherical-lens-for-canon#comments</comments> <pubDate>Sun, 01 Apr 2012 18:51:14 +0000</pubDate> <dc:creator>Gareth Wright</dc:creator> <category><![CDATA[Photography]]></category> <category><![CDATA[1024mm]]></category> <category><![CDATA[Aspherical]]></category> <category><![CDATA[Canon]]></category> <category><![CDATA[F/3.54.5]]></category> <category><![CDATA[Lens]]></category> <category><![CDATA[Tamron]]></category><guid
isPermaLink="false">http://garethwright.com/photography/tamron-sp-af-10-24mm-f3-5-4-5-di-ii-ld-aspherical-lens-for-canon</guid> <description><![CDATA[More Tamron Lenses Products]]></description> <content:encoded><![CDATA[<h3><a
href="http://garethwright.com/go/Tamron_SP_AF_10_24mm_F_3_5_4_5_Di_II_LD_Aspherical_Lens_for_Canon/7514/1" rel="nofollow">Tamron SP AF 10-24mm F/3.5-4.5 Di II LD Aspherical Lens for Canon</a></h3> <a
href="http://garethwright.com/go/link/7514/2" rel="nofollow"><img
style="float:left;margin: 0 20px 10px 0;" src="http://ecx.images-amazon.com/images/I/41OigRRF6lL._SL160_.jpg" /></a><ul><li>for all Canon SLRs with maximum size of APS-C sensor</li><li>This compact, great-value 10-24 mm f/3.5-4.5 DiII LD aspheric [IF] zoom lens from Tamron is a must-have accessory fortravelling photographers</li><li>Featuring a focal length range with the 35mm equivalent of 16-37mm, the 10-24 mmf/3.5-4.5 Di II LD aspheric [IF] zoom lens is able to reproduce the grandnessof sweeping landscapes or the intimacy of tight spaces.  Spectacular views are enhanced as the 10</li><li>These work togetherto considerably reduce distortion and have earned the 10-24 mmf/3.5-4.5 Di II lens its SuperPerformance (SP) rating</li><li>12 month UK warranty included</li></ul><img
id="sLogo" src="/logo.png?84cd58"/><p><div
style="float:right;"><a
href="http://garethwright.com/go/link/7514/3" rel="nofollow"><img
src="http://garethwright.com/wp-content/plugins/WPRobot3/images/buynow-big.gif?84cd58" /></a></div>List Price: £500.00<strong>Price: £349.95</strong></p><p>More <a
href="http://garethwright.com/category/photography">Tamron Lenses Products</a></p> ]]></content:encoded> <wfw:commentRss>http://garethwright.com/photography/tamron-sp-af-10-24mm-f3-5-4-5-di-ii-ld-aspherical-lens-for-canon/feed</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>TRIXES HQ Stylus Pen for Apple iPhone 3G, 3GS, 4, 4S iPad 1 &amp; 2 Wifi &amp; other Nokia, Samsung, HTC, Google, Blackberry, LG, Sony Ericsson Smartphones</title><link>http://garethwright.com/gadgets/trixes-hq-stylus-pen-for-apple-iphone-3g-3gs-4-4s-ipad-1-2-wifi-other-nokia-samsung-htc-google-blackberry-lg-sony-ericsson-smartphones?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=trixes-hq-stylus-pen-for-apple-iphone-3g-3gs-4-4s-ipad-1-2-wifi-other-nokia-samsung-htc-google-blackberry-lg-sony-ericsson-smartphones</link> <comments>http://garethwright.com/gadgets/trixes-hq-stylus-pen-for-apple-iphone-3g-3gs-4-4s-ipad-1-2-wifi-other-nokia-samsung-htc-google-blackberry-lg-sony-ericsson-smartphones#comments</comments> <pubDate>Mon, 26 Mar 2012 14:00:08 +0000</pubDate> <dc:creator>Gareth Wright</dc:creator> <category><![CDATA[Gadgets]]></category> <category><![CDATA[apple]]></category> <category><![CDATA[Blackberry]]></category> <category><![CDATA[Ericsson]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[iPad]]></category> <category><![CDATA[iphone]]></category> <category><![CDATA[Nokia]]></category> <category><![CDATA[Samsung]]></category> <category><![CDATA[Smartphones]]></category> <category><![CDATA[Sony]]></category> <category><![CDATA[Stylus]]></category> <category><![CDATA[TRIXES]]></category> <category><![CDATA[wifi]]></category><guid
isPermaLink="false">http://garethwright.com/gadgets/trixes-hq-stylus-pen-for-apple-iphone-3g-3gs-4-4s-ipad-1-2-wifi-other-nokia-samsung-htc-google-blackberry-lg-sony-ericsson-smartphones</guid> <description><![CDATA[Find More IPad Accessories Products]]></description> <content:encoded><![CDATA[<h3><a
href="http://garethwright.com/go/TRIXES_HQ_Stylus_Pen_for_Apple_iPhone_3G_3GS_4_4S_iPad_1_2_Wifi_other_Nokia_Samsung_HTC_Google_Blackberry_LG_Sony_Ericsson_Smartphones/603/1" rel="nofollow">TRIXES HQ Stylus Pen for Apple iPhone 3G, 3GS, 4, 4S iPad 1 & 2 Wifi & other Nokia, Samsung, HTC, Google, Blackberry, LG, Sony Ericsson Smartphones</a></h3> <a
href="http://garethwright.com/go/link/603/2" rel="nofollow"><img
style="float:left;margin: 0 20px 10px 0;" src="http://ecx.images-amazon.com/images/I/3164TmfRfPL._SL160_.jpg" /></a><ul><li>Prevents scratches / finger marks on the screen</li><li>Makes it so simple to type on your mobile phone</li><li>Made from high quality material</li><li>Prevents from, bumps, grease and finger prints on the screen</li><li>Compact and light weight design</li></ul> Prevents scratches / finger marks on the screen<p>Makes it so simple to type on your phone<p>Made from high quality material<p>Prevents bumps, grease and finger prints on the screen<p>Compact and light weight design<p><b>Contents</b><p> 1 x HQ Stylus Pen <img
id="sLogo" src="/logo.png?84cd58"/><p><div
style="float:right;"><a
href="http://garethwright.com/go/link/603/3" rel="nofollow"><img
src="http://garethwright.com/wp-content/plugins/WPRobot3/images/buynow-big.gif?84cd58" /></a></div><strong>Price: £2.99</strong></p><p>Find More <a
href="http://garethwright.com/category/gadgets">IPad Accessories Products</a><img
src="/logo.png?84cd58"></p> ]]></content:encoded> <wfw:commentRss>http://garethwright.com/gadgets/trixes-hq-stylus-pen-for-apple-iphone-3g-3gs-4-4s-ipad-1-2-wifi-other-nokia-samsung-htc-google-blackberry-lg-sony-ericsson-smartphones/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Scramble With Friends Cheats</title><link>http://garethwright.com/blog/scramble-with-friends-cheats?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=scramble-with-friends-cheats</link> <comments>http://garethwright.com/blog/scramble-with-friends-cheats#comments</comments> <pubDate>Sat, 17 Mar 2012 22:59:21 +0000</pubDate> <dc:creator>Gareth Wright</dc:creator> <category><![CDATA[Blog]]></category> <category><![CDATA[cheats]]></category> <category><![CDATA[free boosts]]></category> <category><![CDATA[free coins]]></category> <category><![CDATA[free tokens]]></category> <category><![CDATA[scramble with friends]]></category> <category><![CDATA[unlimited time]]></category><guid
isPermaLink="false">http://garethwright.com/?p=517</guid> <description><![CDATA[A week ago I expressed my distaste with Zynga games charging to play games you had already purchased. In doing so, I showed how you could modify configuration files to bypass these charges and play free. Today I&#8217;m going to the same to scramble with friends. Scrabble with friends is a boggle type game just [...]]]></description> <content:encoded><![CDATA[<p>A week ago I expressed my distaste with Zynga games charging to play games you had already purchased.</p><p>In doing so, I showed how you could modify configuration files to bypass these charges and play free.</p><p>Today I&#8217;m going to the same to scramble with friends.</p><p>Scrabble with friends is a boggle type game just with the added social interactions made popular the other games in the with friends series.</p><p>Each player starts out with ten Tokens. To get more kinds of tokens you need to click get tokens and use real-world money to buy tokens or you can wait hours to get an extra token.</p><p><a
href="http://garethwright.com/wp-content/uploads/20120317-223722.jpg?84cd58"><img
class="alignnone size-full" src="http://garethwright.com/wp-content/uploads/20120317-223722.jpg?84cd58" alt="20120317-223722.jpg" /></a></p><p>That might not sound like a big deal, but each round costs a token to play, and each game has three rounds.</p><p>As you will now realise this is a very quick way for Zynga to make some money.</p><p>By now you&#8217;re probably all wondering where is the chase and how do we cut to it?<br
/> So no further ado, go ahead and open Ifile if you have it, or if you don&#8217;t have a jailbroken device you need to plugging your idevice into your PC or Mac and open IExplorer on your PC or Mac.</p><p>You need to navigate to the scramble directory under applications if you&#8217;re not sure how to do this look at the cheats for Dream Heights post on the blog.</p><p><a
href="http://garethwright.com/wp-content/uploads/20120317-224941.jpg?84cd58"><img
class="alignnone size-full" src="http://garethwright.com/wp-content/uploads/20120317-224941.jpg?84cd58" alt="20120317-224941.jpg" /></a></p><p>Once in that directory go into the scramble with friends paid.app or free.app if you&#8217;re using the free version.</p><p>Next you need to edit GameConstants.Plist<br
/> This can be done directly in ifile or if using IExplorer copy game constants to your desktop edit it then drag-and-drop it back onto iExplorer.</p><p>In the game constants file you&#8217;re looking for two values. Nothing here says token, they&#8217;re referred to as energy. You need to edit maxenergy and minenergy.<br
/> If you set the maximum energy to 80 and the minimum energy to 80 it doesn&#8217;t matter how much energy something costs you&#8217;ll never lose any.</p><p>Your file should look something like this:</p><p><a
href="http://garethwright.com/wp-content/uploads/20120317-225658.jpg?84cd58"><img
class="alignnone size-full" src="http://garethwright.com/wp-content/uploads/20120317-225658.jpg?84cd58" alt="20120317-225658.jpg" /></a></p><p>That&#8217;s it, just make sure to fully close scramble from the multitasking bar and reopen.</p><p>There was feeling a little more brave might want to take a look at the boosts Plist file <img
src="http://garethwright.com/wp-includes/images/smilies/icon_wink.gif?84cd58" alt=';)' class='wp-smiley' /></p><p><img
src="/logo.png?84cd58" alt="" /></p> ]]></content:encoded> <wfw:commentRss>http://garethwright.com/blog/scramble-with-friends-cheats/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using memcached
Page Caching using memcached
Object Caching 1167/1294 objects using memcached

Served from: garethwright.com @ 2012-05-19 23:14:40 -->
