iOS 의존성 관리 시스템 보안 취약점과 공급망 공격
초록
본 논문은 iOS 앱 개발에 널리 사용되는 CocoaPods, Carthage, SwiftPM을 대상으로 의존성 관리 파일이 앱에 노출되는 문제를 분석하고, 이를 이용한 의존성 혼동(Dependency Confusion) 및 도메인·GitHub 네임스페이스 탈취 공격 시나리오를 제시한다. 9,212개의 iOS 앱을 조사해 1.76%가 취약하며, 단일 라이브러리 탈취만으로도 수십 개 앱이 영향을 받을 수 있음을 입증한다. 또한, Cargo, Go modules, Maven, npm, pip과 비교해 공통적인 설계 결함과 방어 방안을 논의한다.
상세 분석
논문은 iOS 의존성 관리 시스템의 두 가지 핵심 특성을 ‘의존성 위치’와 ‘소유권 관리’로 정의하고, 각각이 공격 표면을 어떻게 형성하는지 상세히 설명한다. CocoaPods는 중앙 집중형 레포지터리를 사용하면서도 내부 레포지터리를 추가할 수 있는 구조를 가지고 있어, public 레포지터리와 private 레포지터리의 우선순위가 명시되지 않을 경우 공격자가 동일한 이름·버전의 패키지를 public 레포지터리에 등록하면 자동으로 해당 패키지가 설치된다. 특히 prepare_command와 같은 스크립트 실행 기능이 존재하므로, 악의적인 코드를 삽입하면 개발자 머신이나 CI/CD 서버에서 원격 코드 실행(RCE)이 가능하다.
iOS 앱은 실제 배포 파일 안에 Frameworks 디렉터리와 각 프레임워크 내부의 Info.plist을 통해 라이브러리 이름과 버전을 그대로 노출한다. 이는 기존 npm·pip에서 소스코드 레포지터리를 통해 이름을 추출하던 방식과 달리, 앱 자체만으로도 내부 의존성을 완전하게 역추적할 수 있게 만든다. 따라서 공격자는 앱을 리버스 엔지니어링함으로써 ‘GoogleAnalytics‑2.3.1’ 같은 정확한 식별자를 얻고, 이를 기반으로 CocoaPods에 동일 이름·버전의 패키지를 등록해 의존성 혼동 공격을 수행한다.
또한, GitHub 네임스페이스와 커스텀 도메인 탈취 시나리오도 제시한다. GitHub는 사용자 계정 이름을 변경하거나 삭제하면 기존 URL을 새로운 계정으로 리다이렉트하지만, 일정 조건(예: 5,000 다운로드 초과)에서는 네임스페이스 자체를 재사용할 수 있다. 공격자가 이 시점을 포착해 동일한 namespace/repo 조합을 차지하면, 기존 의존성을 그대로 가져오는 iOS 프로젝트는 자동으로 공격자가 제어하는 레포지터리에서 코드를 받아 실행한다. 커스텀 도메인의 경우, 도메인이 만료되어 재등록되면 해당 URL을 사용하던 의존성이 새로운 서버로 연결돼 악성 코드를 배포한다.
실험에서는 9,212개의 앱 중 162개(1.76%)가 이러한 정보 누출 및 탈취 위험에 노출돼 있음을 확인했으며, 특히 하나의 폐기된 도메인을 장악함으로써 63개의 앱이 동시에 영향을 받을 수 있음을 입증했다. 비교 대상인 Cargo, Go modules, Maven, npm, pip을 분석한 결과, 중앙 집중형 레포지터리와 URL 기반 소유권 모델이 공통적으로 취약점을 가지고 있으며, 특히 버전 우선순위와 네임스페이스 재사용 정책이 핵심 위험 요인으로 작용한다는 결론에 도달했다.
마지막으로 논문은 의존성 명시 시 명시적 source 지정, lockfile 기반 설치 강제, 레포지터리 소유권 검증 강화, 도메인 및 GitHub 네임스페이스 재사용 방지 정책 도입 등 실질적인 방어 전략을 제시한다. 이러한 방안은 iOS 생태계뿐 아니라 다른 언어·플랫폼에서도 적용 가능함을 강조한다.
댓글 및 학술 토론
Loading comments...
의견 남기기