Sunday 15 July 2012

OWASP iGoat

Kilka tygodni temu natknąłem się na interesujący materiał OWASP dla programistów iOS, a dotyczący dobrych praktyk związanych z bezpieczeństwem. Chodzi mianowicie o iGoat http://code.google.com/p/owasp-igoat/. Pomysł bardzo ciekawy, bo w sposób praktyczny przedstawia potencjalne problemy z bezpieczeństwem.
Niestety, bez dokładnego wyjaśnienia poszczególnych ćwiczeń można niepoprawnie interpretować rekomendowane rozwiązania opisane w rozwiązaniach.
Dwa pierwsze ćwiczenia związane są z przechowywaniem informacji na urządzeniu mobilnym. Moim zdaniem zabrakło informacji dotyczących różnic pomiędzy lokalną bazą sqlite a keychain. Należy pamiętać, że:
  1. Rekordy w keychain mogą być chronione kodem PIN/frazą przejściową – jednak programista nie ma bezpośredniego wpływu na to czy użytkownik ustawi je czy też nie; 
  2. Można użyć klasy bezpieczeństwa (w keychain), która spowoduje, że dane nie będą eksportowane poza urządzenie. W niektórych przypadkach podnosi to poziom bezpieczeństwa;
  3. Jeśli chcemy przechowywać na urządzeniu krytyczne dane - na przykład klucz współdzielony, którym autoryzujemy transakcje finansowe, to powinien być on zaszyfrowany a weryfikacja powinna zawsze odbywać się po stronie serwera a nie urządzenia mobilnego. A pisząc bardziej precyzyjne, powinniśmy dodatkowo stosować PBKDF2. 
Moim zdaniem ćwiczenie dotyczące SQLi ma niewielkie zastosowanie w praktyce. Kolejne ćwiczenie dotyczy między innymi weryfikacji poprawności certyfikatów SSL. Z tego typu błędem spotkaliśmy się kilka razy testując aplikacje mobilne. Pakiet zawiera jeszcze dwa dodatkowe ćwiczenia, które poruszają specyficznie aspekty aplikacji mobilnych.
Podsumowując, pomysł bardzo ciekawy i możliwe, że jedno-dwa ćwiczenia będą omówione na szkoleniach Prevenity.

Friday 27 January 2012

Wywołanie metody w iOS

Analizując pliki wykonywalne dla systemu iOS można zauważyć, że importowanych jest ograniczona liczba funkcji zewnętrznych a w kodzie wykonywalnym natomiast najwięcej jest odwołań do jednej funkcji objc_msgSend. Jest to związane z tym, że aplikacje dla iOS pisane są w języku Objective-C. Funkcja ta wykorzystywana jest do wysyłana wiadomości do obiektu. Poniżej fragment kodu w IDA Pro.


Funkcja ta przyjmuje, co najmniej dwa parametry: the Receiver – wskaźnik do instancji klasy, która otrzymuje wiadomość oraz theSelector wskazujący metodę, która obsłuży wiadomość. Funkcja może przyjąć też inne parametry, które są argumentami dla wywoływanej metody.

id objc_msgSend(id theReceiver, SEL theSelector, ...)

Z przedstawionego fragmentu wygenerowanego przez IDA Pro wyraźnie widać jaka metoda (kolor zielony) jest wywoływana za pomocą objc_msgSend oraz czy i jakie argumenty są do niej przekazywane (kolor niebieski).
Należy dodać, że IDA Pro rozpoznaje też zadeklarowane przez programistę metody dla klasy (rysunek poniżej).


Powyższe informacje, to pierwszy krok w celu zrozumienia działania aplikacji. Możemy odtworzyć metody klasy (znak +) i metody instancji dla klasy (znak -). Możemy też odtworzyć listę argumentów dla klasy (o tym w następnym artykule). W końcu możemy również odbudowywać kod źródłowy programu. Z przedstawionego na początku fragmentu kodu wynika, że fragment funkcji main jest następujący:

MojaKlasa * objekt_MojaKlasa = [[MojaKlasa alloc] init];
[objekt_MojaKlasa metodaInstancji:@”Input z main.m”];
[MojaKlasa metodaKlasy];