본문 바로가기
4. 모바일 앱 취약점 진단

[Android, iOS] 3.1. 백그라운드 화면 보호 취약점

by Robert8478 2024. 6. 19.

개요

백그라운드 화면 보호 취약점은 앱이 백그라운드 상태에 진입했을 경우 별도의 경로에 화면 스냅샷 파일이 저장되는데 해당 파일에 중요정보가 포함되는 경우에 취약한 것으로 보고있다.

 

점검 방법

우선 Android와 iOS는 스냅샷 파일이 저장되는 경로만 다를 뿐 결국 같은 방향으로 취약점이 발현되는데 스냅샷 파일이 저장되는 경로는 아래와 같다.

  • Android

/data/system_ce/0/snapshots - 공통된 버전

  • iOS

/var/mobile/Application/[BundleID]/Library/Caches/Snapshots/[PackageName]/ - 7버전 미만

/var/mobile/Containers/Data/Application/[BundleID]/Library/Caches/Snapshots/[PackageName]/ - 8 ~ 12 버전

/var/mobile/Containers/Data/Application/[BundleID]/Library/SplashBoard/Snapshots/sceneID:[PackageName]-default/ - 13 ~ 이후 버전

앱 내 개인정보 페이지에서 백그라운드 이동 후 해당 경로에 생긴 스냅샷 파일을 확인하여 개인정보가 노출되는 스냅샷 파일이 존재하는지 확인한다. 양호한 경우에는 스냅샷이 생성되지 않았거나 스냅샷 파일이 공백으로 보이게 될 것이다.

 

대응 방안

대응 방안은 Android와 iOS로 나눌 수 있다.

 

Android

안드로이드에서는 앱의 설정 값을 간단히 변경함으로써 화면 보호 취약점을 개선할 수 있다.

* 실행 중인 앱의 스냅샷 파일이 노출되지 않도록 FLAG_SECURE 상수 설정

* 실행 중인 앱의 스냅샷 파일이 노출되지 않도록 “android:excludeFromRecents=”true“ 속성 설정

 

iOS

iOS는 메서드 옵션 설정 및 화면 변경 함수를 생성하는 등 대응 방안 조치를 취해야 한다.

* 실행 중인 앱의 스냅샷 파일이 노출되지 않도록 “applicationDidBecomeActive” 메소드 옵션 설정

// 어플리케이션이 백그라운드로 전환되는 순간 화면에서 숨김
- (void)applicationWillResignActive:(UIApplication *)application {
    if(isIOS7Or8) {
        self.window.hidden = YES;
    }
}

// 백그라운드에 있던 어플리케이션이 다시 실행될 때 화면에 출력
- (void)applicationDidBecomeActive:(UIApplication *)application {
    if(isIOS7Or8) {
        self.window.hidden = NO;
    }
}

applicationDidBecomeActive : 백그라운드 상태로 전환된 앱이 재구동될 때 실행되는 메소드

* 실행 중인 앱의 화면을 변경하여 중요 정보가 노출되지 않도록 함수 설정

func callBackgroundImage(_ bShow: Bool) {
    let TAG_BG_IMG = -101
    let backgroundView = window?.rootViewController?.view.window?.viewWithTag(TAG_BG_IMG)

    if bShow {
        if backgroundView == nil {
            // 여기서 보여주고 싶은 뷰 자유롭게 생성
            let bgView = UIView()
            bgView.frame = UIScreen.main.bounds
            bgView.tag = TAG_BG_IMG
            bgView.backgroundColor = .black

            let lbl = UILabel()
            lbl.frame = UIScreen.main.bounds
            lbl.textAlignment = .center
            lbl.font = UIFont.systemFont(ofSize: 30)
            lbl.textColor = .white
            lbl.numberOfLines = 0
            lbl.text = "백그라운드 진입 시\n민감한 정보 숨기기"
            bgView.addSubview(lbl)

            window?.rootViewController?.view.window?.addSubview(bgView)
        }
   } else {
        if let backgroundView = backgroundView {
            backgroundView.removeFromSuperview()
        }
    }
}