2012-04-01 9 views
8

Inicjuję ciąg zmienny, a następnie loguję go w następujący sposób.Dlaczego mój ciąg jest potencjalnie niezabezpieczony w mojej aplikacji na iOS?

NSMutableString* mStr = [[NSMutableString alloc] init]; 
mStr = (NSMutableString*) someTextFieldIbOutlet.text; 
NSLog((NSString *) mStr); 

Prace kod i działa, ale jestem coraz dziwne ostrzeżenia (w kolorze żółtym):

Format string is not a string literal (potentially insecure). 

Dlaczego?

+0

Błędy formatowe powstają, ponieważ konwencje przekazywania argumentów C nie są bezpieczne dla typu. –

Odpowiedz

10

Cóż, istnieje kilka problemów tutaj.

Pierwszy (a nie ten, o który pytałeś) polega na tym, że przydzielasz nowy NSMutableString, a następnie po prostu wyrzucasz go w drugim wierszu, gdy ustawisz go na someTextFieldIbOutlet.text. Przerzucasz też niezmienny łańcuch na zmienny, który nie zadziała. Zamiast łączyć dwie pierwsze linie tak:

NSMutableString* mStr = [NSMutableString stringWithString:someTextFieldIbOutlet.text]; 

Rzeczywisty błąd, że są coraz to spowodowane tym, że pierwszy argument do NSLog ma być „format” string który mówi NSLog jak chcesz sformatować dane następujące w późniejszych argumentach. Powinien to być ciąg literalny (utworzony tak, jak @"this is a literal string"), aby nie można było wykorzystać go do wykorzystania programu, wprowadzając w nim zmiany.

Zamiast korzystać z tego:

NSLog(@"%@", mStr); 

W tym przypadku, łańcuch format jest @"%@" co oznacza "Utwórz NSString obiekt ustawiony %@". %@ oznacza, że ​​następnym argumentem jest obiekt, a zastąpienie %@ opisem obiektu (w tym przypadku jest to wartość ciągu).

+0

dlaczego jest potencjalnie niepewny? – Claudiu

6

Jeśli mStr ustawiono na coś takiego jak %@, NSLog spróbuje załadować argument obiektu, ulegnie awarii i prawdopodobnie ulegnie awarii. Istnieją inne ciągi formatów, które mogą powodować spustoszenie.

Jeśli trzeba po prostu zalogować ciąg bez znacznika tekstu, należy:

NSLog(@"%@", mStr); 
6

Przesyłany mStr służy do formatowania. Jeśli ten ciąg pochodzi z niezaufanego źródła, może być użyty do exploit your program, jeśli atakujący dostarczy poprawne dane wejściowe.

Należy zmodyfikować kod do:

NSLog(@"%@", (NSString *) mStr); 

ten sposób, bez względu na to, jakie treści są przechowywane w mStr, nie mogą być wykorzystane przez atakującego wykorzystać swój program.

Jest to poważny problem z bezpieczeństwem; z mojego lokalnego archiwum CVE database zliczono 520 wystąpień luk w łańcuchach formatu między 1999 r. a początkiem 2012 r.

+0

@lnafziger: dzięki za poprawkę. – sarnold

+0

+1, dzięki za adres wikipedia. –

Powiązane problemy