Подтвердить что ты не робот

Обнаружение подделки UDID на iPhone во время выполнения

Jailbroken iPhones начинают нервничать, поскольку он испортит некоторые фундаментальные API-интерфейсы на iOS, используя MobileSubstrate.

http://www.iphonedevwiki.net/index.php/MobileSubstrate

Я считаю, что многие приложения используют UDID как средство аутентификации устройства и/или пользователя, поскольку он полуавтоматичен и удобен, но вы должны знать об этой проблеме: UIDevice не является таким же защищенным от несанкционированного доступа, как и должно быть. Там есть приложение под названием UDID Faker, которое легко позволяет обмануть кого-то другого UDID во время выполнения.

http://www.iphone-network.net/how-to-fake-udid-on-ios-4/

Вот его исходный код:

//
//  UDIDFaker.m
//  UDIDFaker
//

#include "substrate.h"

#define ALog(...) NSLog(@"*** udidfaker: %@", [NSString stringWithFormat:__VA_ARGS__]);
#define kConfigPath @"/var/mobile/Library/Preferences/com.Reilly.UDIDFaker.plist"

@protocol Hook
- (NSString *)orig_uniqueIdentifier;
@end

NSString *fakeUDID = nil;

static NSString *$UIDevice$uniqueIdentifier(UIDevice<Hook> *self, SEL sel) {  

    if(fakeUDID != nil) {
                 ALog(@"fakeUDID %@", fakeUDID);
        /* if it a set value, make sure it sane, and return it; else return the default one */
                return ([fakeUDID length] == 40) ? fakeUDID : [self orig_uniqueIdentifier];

    }
    /* ... if it doesn't then return the original UDID */
    else {
        return [self orig_uniqueIdentifier];
    }
}

__attribute__((constructor)) static void udidfakerInitialize() {  

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        NSString *appsBundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
        ALog(@"Loading UDID Faker into %@", appsBundleIdentifier);


        NSDictionary *config = [NSDictionary dictionaryWithContentsOfFile: kConfigPath];
        fakeUDID = [config objectForKey: appsBundleIdentifier];
        [fakeUDID retain];

        if(fakeUDID != nil) {

                ALog(@"Hooking UDID Faker into %@", appsBundleIdentifier);
                MSHookMessage(objc_getClass("UIDevice"), @selector(uniqueIdentifier), (IMP)&$UIDevice$uniqueIdentifier, "orig_");
        }

    [pool release];
}

Как вы можете видеть, метод uniqueIdentifier в классе UIDevice теперь возвращает fakeUDID в любых приложениях.

Похоже, что Skype и некоторые другие приложения обнаруживают этот вид заражения, но я не знаю, как это сделать.

То, что я хотел сделать, - это: когда зараженный UIDevice обнаружен при запуске, оповещении и выходе (0).

Идеи?

4b9b3361

Ответ 1

Не существует действительно надежного способа проверить, действительно ли UDID. UDID получен через liblockdown, который связывается с блокировкой по защищенному каналу для получения UDID:

+-----------+
| your code |
+-----------+
      |
+----------+       +-------------+       +-----------+
| UIDevice |<----->| liblockdown |<=====>| lockdownd |   (trusted data)
+----------+       +-------------+       +-----------+
         untrusted user                   trusted user

Когда устройство заблокировано, все 4 компонента могут быть заменены.


Одним из способов обнаружения присутствия UDID Faker является проверка наличия уникальных уникальных идентификаторов (файлов, функций и т.д.). Это очень специфическая и хрупкая контратака, так как когда обнаружен метод обнаружения, спутник может просто изменить идентификацию, чтобы скрыть свое существование.

Например, UDID Faker полагается на файл plist /var/mobile/Library/Preferences/com.Reilly.UDIDFaker.plist. Поэтому вы можете проверить, существует ли этот файл:

NSString* fakerPrefPath = @"/var/mobile/Library/Preferences/com.Reilly.UDIDFaker.plist";
if ([[NSFileManager defaultManager] fileExistsAtPath:fakerPrefPath])) {
   // UDID faker exists, tell user the uninstall etc.
}

он также определяет метод -[UIDevice orig_uniqueIdentifier], который можно использовать для обхода фейкера:

UIDevice* device = [UIDevice currentDevice];
if ([device respondsToSelector:@selector(orig_uniqueIdentifier)])
   return [device orig_uniqueIdentifier];
else
   return device.uniqueIdentifier;

Конечно, спупер может просто переименовать эти вещи.


Более надежный метод заключается в том, как работает подвижный субстрат. Инъекционный код должен быть расположен в dylib/bundle, который загружается в область памяти другой из UIKit. Поэтому вам просто нужно проверить, находится ли указатель функции метода -uniqueIdentifier в допустимом диапазоне.

// get range of code defined in UIKit 
uint32_t count = _dyld_image_count();
void* uikit_loc = 0;
for (uint32_t i = 0; i < count; ++ i) {
   if (!strcmp(_dyld_get_image_name(i), "/System/Library/Frameworks/UIKit.framework/UIKit")) {
     uikit_loc = _dyld_get_image_header(i);
     break;
   }
}

....

IMP funcptr = [UIDevice instanceMethodForSelector:@selector(uniqueIdentifier)];
if (funcptr < uikit_loc) {
   // tainted function
}

В любом случае UDID Faker - это очень высокий уровень взлома (т.е. его можно легко избежать). Он захватывает связь между UIDevice и liblockdown, предоставляя поддельный идентификатор.

+-----------+
| your code |
+-----------+
      |
+----------+       +-------------+       +-----------+
| UIDevice |<--.   | liblockdown |<=====>| lockdownd |   (trusted data)
+----------+   |   +-------------+       +-----------+
               |   +------------+
               ‘-->| UDID Faker |
                   +------------+

Таким образом, вы можете переместить код с запросом UDID ниже уровня liblockdown. Это можно использовать для приложений для платформ Jailbroken, но это невозможно для приложений AppStore, потому что liblockdown - это частный API. Кроме того, spoofer может захватить liblockdown (это очень легко, я надеюсь, что никто этого не делает), или даже заменить lockdownd сам.

                   +-----------+
                   | your code |
                   +-----------+
                         |
+----------+       +-------------+       +-----------+
| UIDevice |<--.   | liblockdown |<=====>| lockdownd |   (trusted data)
+----------+   |   +-------------+       +-----------+
               |   +------------+
               ‘-->| UDID Faker |
                   +------------+

(Я не буду показывать, как использовать liblockdown здесь. Вы должны быть в состоянии найти достаточную информацию с сайта, с которым вы связались.)

Ответ 2

Ключ обнаруживает JB-устройство и не работает на нем.