SecurityAndroid

안드로이드 서비스 배포 체크리스트 1편

2024.12.03R&D | June

 

안드로이드 앱 개발은 단순히 기능을 구현하는 것을 넘어, 보안 문제를 철저히 관리하는 것이 필수적인 시대가 되었습니다. 사용자 데이터를 보호하고 보안 위협을 예방하기 위해 어떤 점들을 체크해야 할까요? 📋

 


 

 

📌 1. 안전한 파일 저장소 관리

 

안드로이드 앱에서 데이터를 저장하는 방법은 보안성을 높이는 데 큰 영향을 미칩니다. 잘못된 저장소 사용은 데이터 유출이나 악성 공격에 노출될 위험이 있기 때문에, 올바른 저장소 방식을 선택하는 것이 중요합니다.

 

✅ 내부 저장소 사용 권장

 

 

  • 내부 저장소는 앱 전용 파일을 저장하는 공간으로, 다른 앱이 접근할 수 없기 때문에 보안성이 뛰어납니다.
  • 안드로이드에서 제공하는 getFilesDir() 또는 getCacheDir() 메서드를 사용해 데이터를 저장하세요.
  • 민감한 사용자 정보를 저장해야 할 때는 항상 내부 저장소를 우선적으로 고려하세요.

 

⚠️ 외부 저장소 사용 주의

 

 

외부 저장소는 데이터를 쉽게 접근하고 수정할 수 있는 공간입니다. 외부 저장소 사용 시 다음 사항에 주의하세요:

 

  • 민감한 정보 저장 금지: 사용자 데이터, API 키, 비밀번호와 같은 민감한 정보는 외부 저장소에 절대 저장하지 마세요.
  • 파일 접근 권한 제한: 파일 접근을 최소화하고, 외부 저장소에 저장할 경우 반드시 파일 암호화를 사용하세요.

 

📚 사례: Man-in-the-Disk 공격

 

외부 저장소의 데이터를 조작하거나 탈취할 수 있는 Man-in-the-Disk 공격은 안드로이드 앱에서 발생할 수 있는 대표적인 보안 문제입니다. 이를 방지하려면 외부 저장소 사용을 철저히 검토하고 대체 가능한 내부 저장소를 활용해야 합니다.

 

👉  Man-in-the-Disk 공격 연구 더 알아보기

 

 

 


 

 

🔒 2. 퍼미션 관리: 불필요한 권한 요청 최소화

 

안드로이드 앱 개발에서는 퍼미션(권한) 요청을 최소화하고, 필요한 권한만 사용하도록 설정해야 합니다. 잘못된 퍼미션 관리는 보안 위협을 초래할 수 있습니다.

 

✅ Signature-based Permission 활용

 

퍼미션의 protectionLevel 속성을 활용해 데이터 접근 권한을 안전하게 관리하세요.

 

  • signature 보호 레벨: 동일 서명을 가진 앱 간 데이터 공유만 허용하여, 무단 접근을 방지합니다.
  • 권한 최소화 원칙: 앱이 실제로 필요한 권한만 요청하고, 사용자 동의가 필요한 권한에 대해 정확히 이유를 설명하세요.

 

⚠️ Normal Permission 주의

 

Normal Permission은 사용자 동의 없이 자동으로 허용됩니다. 따라서 다음 사항을 고려하세요:

 

  • 불필요한 Normal 퍼미션 요청은 피하세요.
  • 앱 리뷰 프로세스에서 거절당하지 않도록 권한 요청의 목적을 명확히 설정하세요.

 

👉 퍼미션 보호 레벨 자세히 알아보기

 

 


 

 

📂 3. ContentProvider 관리: 데이터 공유 시 보안 설정 필수

 

안드로이드 앱에서 데이터 공유를 위해 ContentProvider를 사용할 때, 외부 접근을 제한하는 설정이 필요합니다.

 

exported=false 설정

 

ContentProvider가 데이터를 공유하지 않아도 된다면, AndroidManifest.xml 파일에서 exported=false로 설정하세요. 이는 외부 애플리케이션이 ContentProvider에 접근하지 못하도록 차단합니다.

 

<provider
    android:name="com.example.app.MyContentProvider"
    android:exported="false" />

 

✅ URI 권한 관리

 

외부 앱이 ContentProvider에 접근해야 한다면, 반드시 URI 권한 검사를 수행하고 적절히 제한하세요.

 

📌 4. Input Validation 및 Sanitization: 입력 데이터 검증은 필수!

 

 

안드로이드 앱에서 사용자 입력 검증(Input Validation)정제(Sanitization)는 모든 보안의 기본이 됩니다. 입력 값이 의도하지 않은 방식으로 애플리케이션의 동작을 제어하지 못하도록 방어해야 합니다.

 

✅ 검증하지 않은 데이터의 위험성

 

사용자 입력으로 들어오는 데이터는 의심 없이 신뢰해서는 안 됩니다. 잘못된 데이터는 아래와 같은 보안 위협으로 이어질 수 있습니다:

 

  • XSS (크로스 사이트 스크립팅): 악성 스크립트를 실행하여 앱 내부 데이터를 유출.
  • CSRF (크로스 사이트 요청 위조): 사용자를 속여 악성 요청을 전송.
  • Intent Spoofing: 의도하지 않은 Intent로 Activity를 실행.

 

📚 실제 사례

 

  1. WebView의 악성 URL 문제:

    WebView에서 사용자 입력을 기반으로 URL을 로드할 때 적절한 검증이 이루어지지 않으면 XSS 공격에 노출됩니다.

     

     

    👉 HackerOne 리포트

 

 

  1. Deeplink의 잘못된 처리:

     

    Deeplink가 외부 앱에서 악의적으로 호출되어, 앱 내부의 민감 데이터에 접근하는 취약점 사례가 보고되었습니다.

     

     

    👉  Deeplink 사례 1

     

    👉 Deeplink 사례 2

     

🛠️ Best Practices

 

 

  • 검증과 정제 철저히 수행:

     

    • WebView URL 로드 전 URL 형식을 검증하는 로직 추가.
    • 사용자 입력 데이터가 예상 형식에 부합하지 않을 경우 차단.

     

  • 의도하지 않은 Intent 방어:

     

    • Exported Activity, Service, ContentProvider 등은 android:exported="false"로 설정.
    • Intent 데이터를 사용하는 경우 추가 검증 수행.

 

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent = getIntent();
    String data = intent.getStringExtra("key");

    if (data != null && data.matches("[a-zA-Z0-9]+")) {
        // 안전한 데이터 처리
    } else {
        // 예외 처리
    }
}

 

이어지는 글에서 더 다양한 주의사항과 사례들을 알아봅시다. 🌐

 

 

추천컬럼

추천컬럼 이미지

200건 이상 프로젝트 성공으로 실력이 검증된 개발 회사?

2024.09.20
추천컬럼 이미지

홈페이지 제작기획, 올바른 사이트 개발 및 리뉴얼

2025.03.18

상담만 받아보셔도 좋습니다 긱다이브의 상담으로 업체 비교를 시작해보세요

CONTACT US