충돌 로그 및 난독화: 집중 강좌

런타임 충돌을 디버깅하는 것은 힘든 과정이 될 수 있습니다. iOS 앱이 실제로 충돌하는 경우장치는 충돌 발생 시점에 실행 중인 프로세스의 메모리 주소와 오프셋에 대한 정보만 가지고 있습니다. 이 정보는 스택 추적으로 제공되며, 이는 충돌이 발생한 위치를 가리키는 최근 실행 순서대로 나열된 메서드 호출 목록입니다. 스택 추적은 다양한 수준의 세부 정보를 포함할 수 있으며, 개발자가 이러한 스택 추적을 최대한 활용할 수 있도록 지원하는 메커니즘이 마련되어 있습니다. 

하지만 보안 엔지니어들 사이에서 흔히 오해되는 것은, 강화된 애플리케이션이 일반적으로 사용되는 현장 디버깅 도구(예: Firebase Crashlytics)를 무력화시켜 앱 충돌을 파악하기 더욱 어렵게 만든다는 것입니다. 하지만 꼭 그럴 필요는 없습니다. 애플리케이션은 강력한 보안과 실행 가능하고 관련성 높은 충돌 로그를 모두 갖추고 있을 수 있습니다. 그렇다면 어떻게 이를 실현할 수 있을까요? 

개발자는 iOS 앱의 크래시 로그를 읽을 수 있도록 dSYM 파일을 활용할 수 있습니다. dSYM 파일은 디버깅을 위한 심볼 정보를 포함하며, 빌드 과정에서 Xcode에 의해 생성될 수 있습니다. 이 파일의 내용, 유용성, 그리고 그 방법을 살펴보겠습니다. Digital.ai Application Security 이 메커니즘과 통합된 제품을 사용하면 보안 애플리케이션을 디버깅하는 것이 가능해집니다. 

오픈 소스를 사용하여 예를 살펴보겠습니다. 작업 디스패처 iOS 앱.  

dSYM 번들에는 무엇이 포함되어 있나요? 

dSYM(디버그 SYMbols의 약자) 번들에는 iOS/tvOS/macOS 애플리케이션의 심볼과 소스 코드 줄 정보가 포함되어 있습니다. 이러한 정보는 사용 중인 빌드 구성에서 '디버그 정보 형식'을 "dSYM 파일 포함 DWARF"로 설정하면 Xcode에서 생성됩니다.

이제 궁금해하실지도 모릅니다. 왜 모든 심볼을 앱 내부가 아닌 별도의 파일에 저장해야 할까요? 주된 이유는 디버깅을 통한 이식성 때문입니다. 앱을 빌드하고 디버깅하는 데 사용된 객체 파일이 없어도 다른 컴퓨터에서 앱을 빌드하고 디버깅할 수 있습니다. dSYM을 사용하면 애플리케이션의 릴리스 버전도 디버깅할 수 있어 시간을 크게 절약할 수 있습니다.  

이제 dSYM이 무엇인지, 그리고 왜 중요한지 소개했으니, 방금 빌드한 .xcarchive를 열고 아래의 'Job Dispatcher.app.dSYM' 번들을 살펴보겠습니다.

Job Dispatcher는 기본 앱에 대해 하나의 번들만 제공하지만, 프로젝트에서 빌드 프로세스 중에 추가 라이브러리나 프레임워크를 빌드하면 더 많은 번들을 생성할 수 있습니다. 

그렇다면 dSYM 번들에는 실제로 무엇이 들어 있을까요? 번들을 마우스 오른쪽 버튼으로 클릭하고 '패키지 내용 보기'를 선택하면 다음과 같은 내용을 볼 수 있습니다.

T그 'Info.plist' 파일 퀴즈를 풀어보고, 이 포함되어 있습니다 metb에 대한 정보그 자체를 풀고 ~이 아니다. 굉장히 유용하다. B다른 'Dispatcher.yml' 파일과 '작업 파견자 마하-O 디버그 파일 포함하는 상징 이름과 위치 그리고 우리가 신경쓰는 것은 바로 이것입니다. 의하자 먼저 마음껏 열다 'Dispatcher.yml' 파일 (간결성을 위해 그림을 잘랐습니다):

여기서는 바이너리의 각 기호에 대한 속성 목록을 볼 수 있습니다. 예를 들어, 'size' 포인터의 크기와 상관 관계가 있습니다(이것들은 모두 64비트 심볼입니다), 'symName' 기호의 이름에 해당합니다.symBinAddr' 는 이진법 자체에 기호가 존재하는 위치이며,symSize' 함수 또는 데이터 객체의 크기입니다. 이 파일은 AArch64 아키텍처의 중요한 부분인 재배치 정보에 중점을 두지만, 여기서는 자세히 다루지 않겠습니다.  

이제 DWARF 폴더에 있는 'Job Dispatcher'라는 파일을 살펴보겠습니다. 이 바이너리 파일에는 빌드한 애플리케이션의 모든 심볼에 대한 자세한 디버그 정보가 포함되어 있습니다(보시다시피 DWARF 파일과 애플리케이션의 이름이 동일합니다). 'dwarfdump' 명령을 실행하면 이 파일 내의 정보를 읽을 수 있는 덤프 파일로 얻을 수 있습니다. 인증 상징:

주목할 만한 속성 몇 가지는 다음과 같습니다. DW_AT_decl_file DW_AT_decl_line, 이는 우리에게 다음을 알려줍니다. 인증 함수는 13번째 줄의 'LoginFunc.m' 파일에 정의되었습니다. 또 다른 속성은 다음과 같습니다. DW_AT_유형, 이는 함수의 타입(이 경우 bool)을 알려줍니다. 각 심볼은 DWARF 파일에 이와 같은 섹션을 가지고 있으며, 해당 심볼이 무엇인지, 어디에서 정의되었는지 등을 설명하는 정보가 포함되어 있습니다. 

dSYM 번들의 내용은 분석하기가 꽤 어려울 수 있지만, 실제로 활용하기 위해 모든 사람이 알아야 할 필요는 없습니다. 이제 실시간으로 충돌을 디버깅할 때 dSYM이 실제로 어떤 역할을 하는지 살펴보겠습니다. 

dSYM의 실제 활용 

Job Dispatcher에서 강제로 충돌을 발생시켜 dSYM의 기능을 확인해 보겠습니다. 14번째 줄과 15번째 줄에서 널 포인터에 값을 할당하면 됩니다. 인증 기능:

인셀덤 공식 판매점인 우리는 다음과 같이 응용 프로그램을 실행합니다밖으로 a연관된 디심(dSYM), 앱이 충돌합니다, 다음과 같은 스택 추적을 얻습니다.

현재, 그건 확실히 애플리케이션을 디버깅하는 것이 가능합니다 이 정보를 사용하여. 각각의 스택 프레임에는 충돌 주소에 대한 정보가 있습니다. 그리고 오프셋 인사말 (오히려 도움이 되지 않는다) 충돌이 발생한 심볼 이름입니다. 그러나, u이 스택 추적을 이해하려면s 이진법의 심층 분석 그 자체와 제공 거의 없다 통찰력 으로 소스 코드의 어느 부분이 문제를 일으키고 있나요?. 이 결과를 충돌 로그와 비교하세요. 디심(dSYM) 정보 가능:

각 스택 프레임에는 앱이 충돌한 주소가 여전히 포함되어 있지만 심볼 정보는 훨씬 더 완벽합니다. 충돌이 발생한 것을 다음에서 확인할 수 있습니다. _인증하다 'LoginFunc.m'의 15번째 줄에 있는 함수(소스 코드에서 충돌을 유발한 바로 그 위치)입니다. 이 읽기 가능한 스택 추적을 재생성하는 것은 모든 충돌 보고 도구(Firebase Crashlytics, BugSnag, Instabug 등)의 목표이며, 이러한 도구에서 이를 위해 dSYM 번들을 업로드해야 하는 이유입니다. 

이 모든 것과 앱 보안은 어떤 관련이 있을까요? 

지금까지 dSYM에 대해 논의한 모든 내용은 Xcode로 만든 애플리케이션이 전혀 수정되지 않았다는 사실에 기반했습니다. 앱 스토어에 제출하기 전에 악의적인 공격자로부터 앱을 보호하려면 어떻게 해야 할까요? 

보호 과정에서 바이너리가 뒤섞여 새로 난독화된 심볼 위치가 dSYM 번들에서 찾은 정보와 더 이상 일치하지 않게 됩니다. 보호되지 않은 애플리케이션의 dSYM 번들을 사용하여 보호된 앱에서 발생한 충돌을 심볼화하려고 하면 결과가 제대로 표시되지 않습니다. 이 문제를 해결할 수 있는 방법이 있을까요? 

시공 후 보호 vs. 시공 중 보호 

모바일 앱 보호: ARM 이 제품은 아무런 구성 없이 사용할 수 있는 빌드 후 보호 솔루션입니다. 이를 통해 위협 행위자로부터 애플리케이션을 더 쉽게 보호할 수 있으며, 개발자는 보호된 앱을 한 번만 빌드하면 되므로 테스트 시 더 나은 피드백 루프를 확보할 수 있습니다. 하지만 앞서 언급했듯이, 이 솔루션에는 기존 dSYM 번들이 보호된 애플리케이션과 호환되지 않는다는 단점이 있습니다. 개발자는 코드 변경 사항을 반영하고 잠재적 충돌을 심볼화하기 위해 보호 후 dSYM 파일을 다시 작성해야 합니다. 

반면, Xcode에서 생성되는 dSYM 파일을 다시 작성하지 않고도 애플리케이션을 보호할 수 있습니다. Apple Native용 App Protection 제품은 내장형 보호 솔루션이기 때문에 이러한 기능을 제공합니다. 앱은 원본 소스 코드와 함께 다양한 보안 기능이 활성화된 상태로 컴파일 및 연결됩니다. 생성된 dSYM 파일은 빌드에 지정된 모든 내용을 반영하도록 구조화되어 있으므로, 보호된 앱의 심볼화가 가능합니다. 단점은 빌드 타임 보호 기능은 개발자에게 더 많은 구성이 필요하며, 애플리케이션이 커지고 복잡해질수록 더욱 까다로워질 수 있다는 것입니다. 

물건 정리 

이 글을 통해 dSYM 번들의 중요성, 번들의 구성 요소, 사용 방법, 보안에 중점을 둔 엔지니어가 iOS 애플리케이션 디버깅을 쉽게 해주는 도구를 활용하기 위해 어떠한 희생도 치르지 않아도 되도록 보장하는 솔루션에 대한 통찰력을 얻었기를 바랍니다. 

당신은 또한 좋아할 거라