2012-04-01 3 views
8

변경 가능한 문자열을 초기화하고 다음과 같이 로깅합니다.iOS 응용 프로그램에서 문자열이 잠재적으로 안전하지 않은 이유는 무엇입니까?

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

이유 :

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

코드 작품과 실행은,하지만 난 (노란색) 이상한 경고는 무엇입니까?

+0

C의 인수 전달 규칙이 형식에 안전하지 않으므로 형식 버그가 발생합니다. –

답변

10

글쎄, 몇 가지 문제가 여기에있다.

첫 번째 질문은 당신이 새로운 NSMutableString을 할당하고 someTextFieldIbOutlet.text로 설정했을 때 두 번째 줄에 그냥 버리는 것입니다. 또한 변경할 수없는 문자열을 실제로 작동하지 않는 변경할 수있는 문자열로 캐스팅하고 있습니다. 대신, 다음과 같이 처음 두 행을 결합 :

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

NSLog에 첫 번째 인수는 당신이를 포맷하는 방법을 NSLog를 알려주는 "형식"문자열로되어 있기 때문에이 발생 점점 실제 오류 후기 주장에서 이어지는 데이터. 이것은 리터럴 문자열 (@"this is a literal string"과 같이 작성)이어야합니다. 따라서 프로그램을 변경하여 프로그램을 악용하는 데 사용할 수 없습니다. 대신

는이 사용 :이 경우

NSLog(@"%@", mStr); 

을, 형식 문자열은 "%@로 설정 NSString 객체를 생성합니다"를 의미 @"%@"입니다. %@은 다음 인수가 객체임을 의미하고 %@을 객체 설명 (이 경우 문자열 값)으로 바꿉니다.

+0

왜 잠재적으로 안전하지 않습니까? – Claudiu

6

%@과 같은 것으로 설정된 경우 NSLog은 개체 인수를로드하려고 시도하고 실패하고 오류가 발생할 가능성이 큽니다. 혼란을 야기 할 수있는 다른 형식 문자열이 있습니다.

그냥 어떤 마커 텍스트없이 문자열을 기록해야하는 경우

는 사용

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

전달중인 mStr은 서식 지정에 사용됩니다. 이 문자열이 신뢰할 수없는 출처에서 온 경우 공격자가 올바르게 작성된 입력을 제공하면 exploit your program에 사용할 수 있습니다.

당신은 당신의 코드를 수정해서는 안 : mStr에 저장되는 내용에 상관없이,

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

이 방법을, 프로그램을 악용하는 공격자에 의해 사용될 수 없습니다.

심각한 보안 문제입니다. CVE database의 현지 보관소에서 1999 년부터 2012 년 초 사이에 520 건의 형식 문자열 취약점을 계산했습니다.

+0

@lnafziger : 고마워. – sarnold

+0

+1, wikipedia url에 감사드립니다. –

관련 문제