블로그

보안 코딩 기법: Zip 라이브러리의 기본 동작은 원격 코드 실행으로 이어질 수 있습니다.

November 13, 2017
피터 드 크레머
터널 같은 소용돌이 모양으로 쌓여 있는 다양한 펼친 책들을 위에서 내려다본 모습입니다.

이번 주에는 Zip 라이브러리의 기본 동작에 대해 이야기해 보겠습니다. 애플리케이션 개발자라면 이전에 사용해 본 적이 있을 가능성이 매우 높습니다. 인터넷에서 다운로드하는 대부분의 리소스는 zip 형식인데, 이는 압축된 데이터가 더 작아 다운로드 속도가 빠르고 대역폭을 덜 소모하기 때문에 합리적입니다.

더 구체적인 예를 들자면 게임용 텍스처, 키보드 자동 완성을 위한 언어 팩 등이 있습니다. 많은 리소스가 애플리케이션에 자동으로 포함되지 않고 나중에 다운로드됩니다.

하지만 이 기능을 사용할 때는 주의해야 합니다. zip 아카이브의 파일 이름에는 경로 탐색(path traversal) 정보가 포함될 수 있기 때문입니다. 압축을 풀면 의도한 디렉터리 외부의 파일이 생성될 수 있으며, 이는 종종 기존 파일을 덮어쓰려는 목적으로 악용됩니다.

Zip Archives

다음 두 파일이 포함된 zip 아카이브가 있다고 가정해 보겠습니다.

file1
  ../file2

이 아카이브의 압축을 풀면 file1은 예상대로 압축 해제 디렉터리에 생성됩니다. 하지만 file2는 zip 라이브러리에 요청한 경로보다 한 단계 상위 디렉터리에 기록됩니다.

따라서 주의가 필요합니다. zip 라이브러리가 이 경우를 제대로 처리하지 않으면 공격자가 시스템에 임의의 파일을 쓸 수 있게 됩니다. 항상 라이브러리의 보안성을 확인하십시오. 이 규칙은 모든 라이브러리에 적용되지만, 특히 zip 라이브러리의 이러한 파일 유형에 대한 기본 동작을 확인해야 합니다.

Android에서 이 경우를 제대로 처리하지 않았을 때 발생하는 결과를 살펴보겠습니다. Android에서는 Java Zip 라이브러리(java.util.zip)를 사용하는데, 이 라이브러리는 기본적으로 위에서 설명한 경로 탐색을 허용합니다.

Android의 Dalvik 실행 파일 형식(.dex)은 단일 파일이 가질 수 있는 클래스 수에 제한이 있습니다. 더 많은 클래스가 필요한 앱은 API 레벨 21(Android 5.0 Lollipop)부터 추가된 MultiDex 지원 라이브러리를 사용할 수 있습니다. 이 라이브러리는 보조 .dex 파일을 애플리케이션의 데이터 디렉터리에 저장하는데, 이 디렉터리는 앱 사용자가 쓸 수 있으며 .dex 파일이 필요할 때 이 코드가 로드되고 실행됩니다.

즉, 공격자가 악성 zip 아카이브를 사용하여 .dex 파일을 덮어쓰는 방식으로 수정할 수 있으며, 더 심각한 것은 이 파일이 로드되고 실행되어 원격 코드 실행 취약점으로 이어질 수 있다는 점입니다. 이는 단순한 이론적 예시가 아니라 앱 스토어에서 1억 회 이상 다운로드된 'My Talking Tom' 앱에서 입증된 바 있습니다. 다음은 Black Hat에서 발표된 해당 익스플로잇 영상입니다.

Talking Tom

항상 zip 라이브러리의 동작을 확인하여 보안 취약점을 인지하십시오. zip 라이브러리에서 경로 탐색을 비활성화할 수 없다면, 압축을 풀기 전에 각 항목의 이름을 검증해야 합니다. 이름은 정규화(canonicalized)되어야 하며, 결과 경로는 아카이브를 추출하려는 디렉터리 내에 있어야 합니다. 또한 zip 폭탄을 방지하기 위해 추출된 아카이브의 총 크기도 확인해야 하지만, 이는 다음 주에 다루도록 하겠습니다.

경로 탐색 챌린지를 플레이하거나 보안 코딩 기술을 테스트하고 싶다면 저희 플랫폼을 확인해 보세요.

다음 시간에 뵙겠습니다. 안전한 코딩을 잊지 마세요!

- 이름 앞에 임의 개수의 "../"가 붙은 파일을 zip에 삽입할 수 있습니다.
- zip 라이브러리가 이 경우를 제대로 처리하지 않으면 의도한 추출 디렉터리 외부로 파일을 쓸 수 있습니다.
- zip 파일이 신뢰할 수 없는 경우, 이는 공격자에게 임의 쓰기 취약점을 제공합니다.

https://www.blackhat.com/docs/ldn-15/materials/london-15-Welton-Abusing-Android-Apps-And-Gaining-Remote-Code-Execution.pdf

태그라인

배포 전 AI 기반 개발 거버넌스 확보

AI 기반 위험을 측정하고, 커밋 시점에 보안 코딩 정책을 적용하며, SDLC 전반에 걸쳐 안전한 소프트웨어 제공 속도를 높이세요.

데모 예약하기
리소스 라이브러리

더 많은 블로그 살펴보기

보안 코딩, AI 거버넌스, 소프트웨어 리스크 관리에 관한 전문가 콘텐츠를 확인해 보세요.

전체 보기
사례 연구
필터 라벨
div 블록 내부의 텍스트입니다.

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

더 알아보기
사례 연구
필터 라벨
div 블록 내부의 텍스트입니다.

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

더 알아보기
사례 연구
필터 라벨
div 블록 내부의 텍스트입니다.

하나의 보안 문화: Sage는 어떻게 챔피언 프로그램을 구축했는가

Sage가 유연하고 관계 중심적인 접근 방식을 통해 보안을 강화하고, 200명 이상의 보안 챔피언을 양성하며 실질적인 위험 감소를 달성한 사례를 확인해 보세요.

더 알아보기
블로그
필터 라벨
div 블록 내부의 텍스트입니다.

2026년 사이버 보안 인식의 달: 기업 방어의 핵심, AI 보안 이해하기

주요 AI 기업 대부분이 안전 가이드라인이 마련될 때까지 AI 개발 속도를 전 세계적으로 늦춰야 한다고 공개적으로 촉구하는 시점에 이르렀지만, 사실 심각한 보안 문제는 이미 현실화되었습니다. 이로 인해 AI 도입에 따른 금전적 비용과 위험 부담이 계속 쌓이면서 수많은 보안 책임자와 경영진이 절박한 상황에 놓였습니다.

더 알아보기
블로그
필터 라벨
div 블록 내부의 텍스트입니다.

인에이블러 8: 프로그램 브랜딩

성공적인 보안 코딩 프로그램을 위해서는 훌륭한 콘텐츠 그 이상의 것이 필요합니다. 인에이블러 8에서는 브랜딩을 통해 참여를 누구나 선망하는 위상 중심의 경험으로 바꾸는 방법을 알아봅니다.

더 알아보기
블로그
필터 라벨
div 블록 내부의 텍스트입니다.

이제 모든 직원이 AI 사이버 보안의 최전선에 있습니다

엔터프라이즈 기술 환경은 너무 늦기 전까지는 아무도 예상하지 못한 속도로 변화하고 있습니다. 우리는 공식적으로 사람이 직접 작성한 코드와 기본적인 코파일럿 지원의 시대를 지나 '에이전트 기반 개발 수명 주기(ADLC)'의 시대로 진입했습니다. 자율형 AI 에이전트는 여러 기능 전반에 걸쳐 전례 없는 효율성을 약속하지만, 동시에 완전히 새로운 차원의 보안 및 규제 위험을 야기합니다.

더 알아보기

배포 전 AI 기반 개발 보안 확보

소프트웨어 개발 수명 주기 전반에서 개발자 리스크를 파악하고, 정책을 시행하며, 취약점을 예방하세요.

데모 예약하기
항목이 없습니다.