Last Updated on 1월 4th, 2021, By
 In 앱실링 블로그, AppSealing News

코로나19 대유행은 기업과 공공 서비스 그리고 사용자가 디지털 세계에 참여하는 방식을 변화 시켰습니다. 비즈니스 활동이 온라인으로 이동함에 따라서 모바일 앱, 특히 안드로이드 디바이스에서 구동되는 앱에서 수행되는 트랜잭션의 양이 크게 증가하였습니다. 이것은 안드로이드 OS가 매우 널리 사용되는 운영체제이기 때문입니다. 반면에 이러한 사실은 안드로이드 앱 보안에 대한 우려를 크게 증가시켰고 개발자와 보안 전문가가 기존 및 새로운 위협에 대응하는 방법을 모색하는데 더 많은 시간을 할애하게 하였습니다. 

안드로이드 앱 보안

기업의 수익감소는 매우 현실적인 문제입니다. 보안팀은 사용자 데이터 유출이 기업에 많은 비용을 초래할 수 있음을 알고 있습니다. 동시에 브랜드 가치를 훼손하고 사용자의 앱 소유 회사에 대한 신뢰를 파괴합니다. 이것은 핀테크 및 유사 분야에서 특히 그렇습니다. 왜냐하면 금융과 같은 중요한 서비스를 일반 사용자에게 보다 쉽게 접근할 수 있고 보다 저렴하게 사용할 수 있게 만든 바로 그 기술이 악성코드가 사용자 디바이스에 침입할 수 있게 만드는 관문의 역할을 했기 때문입니다.

안드로이드 운영체제를 탑재한 많은 수의 디바이스가 다양한 이유로 인해 정기적으로 보안 업데이트를 받지 못합니다. 이것은 안드로이드 디바이스가 관리해야 할 다양한 문제를 존재케 합니다. 이로 인해 데이터 탈취의 형태가 다양해지고 그 수는 증가할 가능성이 있습니다. BBC에 따르면 전 세계 안드로이드 사용자 5명 중 2명은 더 이상 보안 업데이트를 받지 않고 있습니다.

출처: BBC

이러한 현실적인 도전 과제에 비추어, 개발자는 그 어느 때보다 안드로이드 앱 보안 문제에 집중해야 합니다.

안드로이드 앱 보안 모범 사례

앱 보안을 개선하면 비즈니스에 대한 사용자 신뢰를 구축하는데 도움이 되며, 이것은 또한 디바이스 무결성을 확립하는데 큰 도움이 됩니다. 아래에는 개발자 커뮤니티와 보안 전문가들이 따르는 모범 사례 목록을 보여주고 있습니다. 

보안 통신 적용

디바이스의 데이터를 보호하는 가장 중요한 단계는 안전한 통신을 수행하는 것입니다. 앱과 앱 사이 또는 앱에서 웹 사이트 사이에 교환되는 데이터를 보호하는 것은 앱의 안정성 개선에 큰 도움이 됩니다. 다음은 이를 수행할 수 있는 몇 가지 방법입니다.

  • 묵시적 인텐트 및 넌익스포티드(non-exported) 콘텐츠 제공자 사용
  • 앱 선택기 사용

안드로이드 운영체제는 인텐트를 사용하여 서비스, 콘텐츠 제공자, 활동(activity), 브로드캐스트 수신자와 같은 다양한 시스템 구성 요소간에 서로 통신합니다. 메시지 객체로서 인텐트는 활동간에 데이터를 전송하기도 합니다. 묵시적 인텐트를 사용하는 앱은 인텐트를 생성하는 앱이 할 수 없거나 또는 하지 않는 특정 작업을 수행하기 위해 안드로이드 내에서 다른 앱을 호출합니다. 따라서 앱은 특정 구성 요소를 호출하는 대신 묵시적 인텐트를 사용하여 둘 이상의 앱에서 수행할 수 있는 작업을 호출합니다.

이 시점에서 개발자는 앱 선택기를 배포하여 묵시적 인텐트로 호출된 작업을 수행하는데 사용할 앱을 사용자가 결정할 수 있도록 해야합니다. 일반적으로 사용자는 디바이스에서 사용할 수 있는 옵션 중에서 더 안전한 앱을 선택하는 경향을 나타냅니다.

아래는 묵시적 인텐트를 사용하는 예제입니다.

(출처: https://developer.android.com/topic/security/best-practices)

  • 서명 기반 권한 적용

이 접근 방식은 원활하고 바람직하지만 데이터를 교환하는 두 개 이상의 앱이 동일한 개발자 그룹에 속한 경우에만 작동합니다. 개발자가 이러한 앱에 동일한 서명키를 적용할 수 있다면, 데이터 전송이 안전하게 유지되는 동안 사용자 개입 없이 데이터를 교환할 수 있습니다. 다음은 서명 기반 권한을 적용한 예제입니다.

(출처: https://developer.android.com/topic/security/best-practices)

  • 콘텐츠 제공자에 대한 무제한 액세스 제한

안드로이드는 콘텐츠 제공자를 사용한 앱 간의 데이터 전송을 허용합니다. 앱의 콘텐츠 제공자는 외부 앱이 작업을 실행하는데 사용할 수 있는 테이블을 제공합니다. 앱의 콘텐츠 제공자 사용에는 다른 앱과 앱 데이터에 대한 액세스 공유하는 것, 앱의 데이터를 가져 오도록 허용하는 것, 안드로이드 검색 프레임워크가 SearchRecentSuggestionsProvider 수퍼 클래스를 사용하여 앱에서 사용자 맞춤 검색 결과를 생성하도록 허용하는 것, 데이터를 AbstractThreadedSyncAdapter 클래스를 사용하여 앱 서버와 동기화하는 것, 그리고 CursorLoader 옵션을 사용하여 앱 UI에 데이터를 로딩하는 것을 포함합니다.

앱 개발자는 특히 콘텐츠 제공자를 통하여 앱 데이터를 사용하는 외부 앱에서 이러한 통신 보안을 잊어 버리는 경향이 있습니다. 개발팀은 명시적으로 지정하지 않는 한, 다른 앱이 앱의 데이터 테이블에 액세스 할 수 없도록 ContentProvider 객체의 기본 설정이 false로 되어 있는지 확인해야 합니다. 버전 4.1.1 이하에서는 <provider> 요소의 android:exported 속성이 기본적으로 true로 설정됩니다. 앱이 이 버전의 안드로이드를 대상으로 하는 경우라면, 개발자는 android:exported 값을 false로 지정해야 합니다. 아래 예를 참고하십시오.

(출처: https://developer.android.com/topic/security/best-practices)

  • 민감한 정보에 대한 자격 증명 사용

프리미엄 콘텐츠 또는 앱의 민감한 정보에 대한 액세스를 제공할 경우에는 지문이나 얼굴 인식과 같은 생체 인식 자격 증명이나 PIN 또는 패턴과 같은 과정이 선행되어야 합니다. 개발자는 처음에 앱에서 지원하는 인증 방법의 종류를 선언해야 합니다. 예를 들어, BiometricManager.Authenticators 인터페이스는 개발자가 BIOMETRIC_STRONG, BIOMETRIC_WEAK 및 DEVICE_CREDENTIAL의 세 가지 인증 유형을 선언하는데 도움이 됩니다. 만약 DEVICE_CREDENTIAL 유형을 사용한다면, 개발자는 PIN이나 비밀번호 또는 패턴과 같은 화면 잠금 사용자 인증 정보를 만들 수 있습니다. 하나 또는 모든 인증 메소드를 허용하려면 setAllowedAuthenticators() 메소드를 사용해야 합니다. 등록 절차에서 앱은 canAuthenticate() 메서드를 사용하여 사용자에게 PIN 또는 패턴 설정 프로세스를 시작하라는 메시지를 표시해야 합니다. 앱은 ACTION_BIOMETRIC_ENROLL 인텐트 작업에서 허용된 인증 방법을 선언할 수 있습니다. 개발자는 getAuthenticationType() 메소드를 호출하여 사용자가 인증에 사용한 방법을 확인할 수 있습니다.

  • 네트워크 보안 조치 적용

안드로이드 디바이스를 인터넷 및 기타 네트워크에 연결하는 것은 앱의 기본 요구 사항이지만, 반면에 디바이스와 앱을 다양한 취약점에 노출시킵니다. 네트워크 보안이 약하면 기밀 정보가 손실될 수 있습니다. 따라서 인터넷을 통해 침입할 수 있는 유해한 스파이웨어로부터 앱을 방어하는 것이 중요합니다. 아래에서 보호 방법을 살펴 보겠습니다.

  • SSL 사용

웹 클라이언트와 웹 서버간의 통신을 보호하기 위해 설계된 네트워킹 프로토콜인 SSL(Secure Sockets Layer)을 사용하면 개발자가 네트워크를 보호할 수 있습니다. 예를 들어, 앱이 신뢰있는 인증 기관(CA)에서 발급한 인증서가 있는 웹 서버와 통신한다면, HTTPS 요청은 다음과 같습니다.

URL url = new URL(“https://www.google.com“);

HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();

urlConnection.connect();

InputStream in = urlConnection.getInputStream();

  • 네트워크 보안 구성 추가

그러나 앱이 커스텀 또는 상대적으로 잘 알려지지 않은 인증 기관을 사용해야 하는 경우에, 개발자는 앱 코드의 통합 없이 구성 파일내에 네트워크의 보안 시스템을 별도로 선언해야 합니다. 다음은 따라야 할 단계입니다.

1. 앱에서 구성을 선언합니다.

<manifest … >

<application android:networkSecurityConfig=”@xml/network_security_config” … >

<!– Place child elements of <application> element here. –>

</application>

</manifest>

2. Manifest가 선언되면 res/xml/network_security_config.xml 경로에 있는 XML 리소스 파일을 추가하고 clear-text를 비활성화하여 모든 네트워크 트래픽을 HTTPS로 따르도록 강제로 실행합니다.

<network-security-config>

<domain-config cleartextTrafficPermitted=”false”>

<domain includeSubdomains=”true”>secure.example.com</domain>
        …

</domain-config>

</network-security-config>

(출처: https://developer.android.com/topic/security/best-practices)

사용자가 디버깅 및 테스트를 위해 보안 수준이 낮은 인증서를 설치할 수 있도록 네트워크 보안 구성을 재정의 할 수 있습니다. 릴리스 구성에 영향을 주지 않고 의도된 위반을 허용하는 안전한 방법은 다음과 같습니다.

<network-security-config>

<debug-overrides>

<trust-anchors>

<certificates src=”user” />

</trust-anchors>

</debug-overrides>

</network-security-config>

  • TrustManager 생성

SSL 인증서와 함께 제공되는 모든 트래픽이 안전한 것은 아닙니다. 앱은 의심스러운 활동을 감지할 때 SSL 관련 경고를 처리하는 TrustManager를 통해 잘 알려진 기관에서 발급된 인증서를 신뢰하도록 만들어야 합니다. 다음과 같은 경우 이러한 경고가 발생할 수 있습니다.

    • 앱이 사용자 맞춤 인증서나 잘 알려진 온라인 CA 저장소에 포함되어 있지 않은 새로운 CA로 서명된 인증서가 있는 서버를 호출할 경우
    • 디바이스 사용자가 CA를 신뢰하지 않고 차단할 경우
    • 개발자가 네트워크 보안 구성을 사용할 수 없을 경우

이러한 경고가 앱에서 감지되면 SSLHandshakeException을 발생시키도록 TrustManager를 구성해야 합니다. 종종 사설 CA에서도 이 예외가 발생할 수 있습니다. 정부 부처, 기업, 비영리 단체, 교육 기관 등에서 사설 CA를 사용하는 경우도 있기 때문에, 사설 CA를 항상 신뢰할 수 없다고 할 수는 없습니다. 이러한 CA를 처리하는 가장 좋은 방법은 TrustManager를 초기화하는 것입니다. 이 절차에는 InputStream에서 대상 CA를 사용하여 KeyStore를 만들고 TrustManager를 호출하는 과정이 포함됩니다. TrustManager는 웹 서버 및 키 저장소에서 CA를 대조하여 안전한 트래픽만을 허용합니다. 특정 TrustManager는 대상 앱과 관련 웹 서버간의 트래픽을 위한 하나 이상의 CA만 저장합니다. 자체 서명된 서버 인증서도 비슷한 방식으로 사용자 정의 TrustManager에 수용될 수 있습니다.

워싱턴 대학교의 인증서를 사용하는 다음 예를 참고하십시오.

  • 상황에 적절하게 WebView 객체 사용

안드로이드 WebView 클래스를 사용하면 개발자가 앱에 웹 페이지를 삽입하고 사용자 인터페이스를 제어할 수 있으며 앱 내에서 호출할 수 있는 웹 콘텐츠를 제한할 수 있습니다. 일반적으로 크롬 또는 파이어폭스와 같은 풀 모바일 브라우저보다는 기능이 적지만, 제어를 보다 자유롭게 할 수 있다는 점에서 앱 보안을 강화하려는 개발자에게 인기가 많습니다. 개발자는 WebView 객체가 호출할 수 있는 웹 요청을 제한하고, 다른 모든 유형의 웹 트래픽을 허용하지 않을 수 있습니다. WebView안에 포함된 콘텐츠만 허용하면 앱의 보안이 강화됩니다.

WebView에서 반드시 주의해야 할 부분은 JavaScript를 활성화하는 것입니다. 기본적으로 WebView에서는 비활성화되어 있으므로 앱 내에서 악성 코드가 실행되지 않습니다. WebView 객체가 안전한 것으로 간주되지 않는 한 JavaScript 인터페이스 지원을 비활성화해야 합니다. 안전한 JavaScript 인터페이스 사용을 보장하는 한가지 방법은 앱과 웹 서버간에 직접 통신을 설정하는 대신 HTML 메시지 채널을 사용하는 것입니다.

적절한 권한 제공하기

적절한 권한을 부여하지 않거나 필요한 것보다 많은 권한을 부여하면, 앱이 안드로이드 디바이스에서 동작하는 방식이 변경됩니다. 전자는 성능에 영향을 미칠 수 있으며, 후자는 보안을 손상시킬 수 있습니다. 따라서 황금률은 앱이 원활한 동작을 위해 필요한 최소한의 권한만 갖도록 하는 것입니다. 새로운 버전의 빈번한 사용과 출시로 인해 특정 권한이 필요하지 않을 수 있습니다. 개발자는 필요한 경우 권한이 즉시 포기되는지 확인해야 합니다.

안드로이드는 앱이 적절한 시간에 요청해야 하는 네트워크 액세스, 알림 등과 같은 내부 작업에 대한 권한을 사전 정의합니다. 이러한 요청을 허용하는 시간이 안드로이드 마시멜로(Android 6.0) 이후 설치시 요청하는 것에서 현재 런타임으로 변경되었습니다. 권한 생성을 위한 사용자 및 그룹 아이디의 개념(리눅스 시스템과 동일)은 적절한 권한 구조가 생성된 이후에만 ​실행중인 애플리케이션이 서로 통신하거나 시스템과 통신하도록 허용 합니다.

안드로이드는 일반 및 위험의 두 가지 유형으로 권한을 정의합니다. 일반 권한의 경우 시스템은 사용자 데이터가 손상되지 않는다고 가정하기 때문에, 앱에 대해 자동으로 생성됩니다. 이러한 권한은 앱이 앱 외부의 데이터와 리소스에 액세스할 수 있도록 허용하지만, 사용자의 개인 정보를 불안하게 만들 가능성은 희박합니다. (하지만 악성코드는 일반 권한도 악용할 수 있으므로, 개발자는 무조건 안전하다고 가정해서는 안됩니다.) 앱 Manifest가 표준 권한(예를 들어, 시간대 설정 기능)을 찾는 경우 안드로이드는 사용자의 승인을 구하지 않고 앱 설치 프로세스 중에 자동으로 권한을 부여합니다. 동시에 사용자는 일반 권한을 취소할 수 있는 선택권이 없습니다.

반면에 위험한 권한에는 앱이 사용자 데이터 또는 시스템 리소스에 대한 액세스를 요구하는 권한(예를 들어, 사용자 개인 정보에 직접적인 영향을 주는 저장된 연락처 목록)이 포함됩니다. 안드로이드는 앱 사용자가 런타임에 특별히 허용하지 않는 한 앱에 위험한 권한을 허가하지 않습니다. 따라서 개발자는 런타임시 사용자에게 위험한 권한 승인을 요청하는 메시지를 표시해야하며, 권한이 부여되지 않으면 해당 기능을 앱에서 사용할 수 없습니다.

  • 권한을 지연하는 인텐트
    개발자가 사용해야하는 또 다른 보안 기능은 지연 권한입니다. 만약 어떠한 작업을 완료할 수 있는 앱이 이미 있는 경우라면, 개발자는 앱 내에서 해당 작업을 완료하려고 하지 않아야 합니다. 대신 이러한 앱 중 하나를 사용하여 이미 필요한 권한이 있는 앱으로 요청을 지연할 수 있는 인텐트를 사용하여 작업을 완료해야 합니다. 예를 들어, 앱은 READ_CONTACTS 및 WRITE_CONTACTS 권한을 요청하는 대신 사용자를 연락처 앱으로 안내할 수 있습니다. 연락처 앱을 사용하여 작업을 완료하는 예는 아래와 같습니다.

(출처: https://developer.android.com/topic/security/best-practices)

  • 데이터 공유 권한
    안드로이드 앱 생태계는 앱이 서로의 기능을 기반으로 구축되어 사용자에게 원활한 환경을 제공할 때 효율적으로 작동합니다. 그러나 데이터 공유는 개인 정보 보호와 보안상의 위험으로 가득 차 있습니다. 앱과 시스템 프로세스간에 데이터를 공유하는 건전한 관행은 올바른 권한을 설정하는 것입니다. 개발자는 필요에 따라 읽기 전용 또는 쓰기 전용 권한 중에서 선택해야 합니다. FLAG_GRANT_READ_URI_PERMISSION 및 FLAG_GRANT_WRITE_URI_PERMISSION 플래그를 사용하여 클라이언트에게 일회성 데이터 액세스 권한을 부여합니다. 콘텐츠 권한을 부여하는 가장 안전한 방법은 ‘file://’ URI 대신 ‘content://’ URI를 사용하는 것입니다. 이는 ContentProvider 클래스의 FileProvider 하위 클래스를 통해 구현됩니다. ‘content://’ URI 사용의 장점은 클라이언트 앱과 데이터를 공유하기 위해 인텐트가 작성될 때 공급자 앱이 Intent.setFlags()를 호출하여 임시로 읽기 및/또는 쓰기 권한을 설정할 수 있다는 것입니다. ‘file://’ URI는 관련 파일의 시스템 권한에 따라 다르기 때문에 허용되지 않습니다. 따라서 더 세세한 권한 설정을 위해서 ‘content://’ URI를 권장합니다.

임시 권한 설정의 논리와 필요성을 이해하는 쉬운 방법은 이메일 앱의 예를 고려하는 것입니다. PDF 리더에는 이메일 앱의 콘텐츠를 읽을 수 있는 권한이 없을 수 있지만 사용자가 첨부 파일을 열려면 필요할 수 있습니다. 따라서 앞서 이야기한데로 PDF 리더 앱은 이메일 앱의 콘텐츠에 액세스하기 위해 중요한 시스템 수준 권한을 설정할 수 없습니다. 따라서 부득이 PDF 리더 앱은 readPermission, writePermission, permission 및 익스포티드(exported) 속성에 설정된 값을 무효화하는 임시 권한을 가져야 합니다.

안전하게 데이터 저장하기

앱 사용자의 개인 정보 보호에 대한 인식은 점점 커지고 있습니다. 데이터 침해 위험은 우리 주변에 있으며, 사용자는 데이터나 사용자 자격 증명을 보호하는 앱을 선호합니다. 개발자는 앱이 최상의 개인 정보 보호를 제공하도록 안드로이드의 다음과 같은 제안을 사용할 수 있습니다.

운영체제에서 앱별로 샌드박스를 허용하므로 비공개 데이터는 앱의 디바이스 내부 저장소에 저장되어야 합니다. 이렇게하면 호스트 앱이 명시적인 권한을 허용하지 않는 한, 다른 앱이 사용자 데이터를 읽지 못하도록 차단합니다. 반면에 호스트 앱의 액세스 권한은 원활하게 유지됩니다. 이것은 또한 사용자가 앱을 제거할 때 디바이스에서 이 데이터도 함께 쉽게 제거할 수 있다는 것을 의미합니다.

추가 보안을 위해 개발자는 File 객체보다 더 세분화된 보안 권한을 허용하는 안드로이드의 보안 라이브러리를 사용해야 합니다. 이것은 앱에서 EncryptedFile 객체를 사용할 수 있도록 하며, FileInputStream 및 FileOutputStream을 사용하여 안전한 스트리밍 읽기/쓰기 작업을 할 수 있습니다. 안드로이드 보안 라이브러리는 구글의 오픈 소스 Tink 암호화 라이브러리를 기반으로 합니다. 이 라이브러리는 안드로이드 내에서 키 관리를 지원하기 위한 것으로 두 부분으로 구성되어 있습니다. 첫 번째 부분은 대상 파일 또는 공유 데이터를 암호화하기 위해 사용되는 하나 이상의 키를 포함하는 키 집합을 만드는 것입니다. 두 번째 부분에는 키 세트를 암호화하고 안드로이드 키 저장소 시스템에 저장되는 기본/마스터 키가 포함됩니다.

다음 코드는 EncryptedFile을 사용하여 파일 내용을 안전하게 읽는 방법을 설명합니다.

마찬가지로 다음 코드 예제를 사용하여 EncryptedFile을 이용하여 파일을 작성할 수 있습니다.

  • 앱은 사용자 개인 정보가 아니고, 기능에 필수적이지 않은 대용량 파일을 저장하고 공유하기 위해서는 외부 저장소를 사용해야 합니다. 일반적으로 여기에는 앱 간에 공유해야 하는 대용량 미디어 파일이 포함됩니다. 또한 다른 앱에 필요하지 않을 수 있지만 여전히 사용자의 개인 정보를 포함하지 않는 앱의 특정 파일이 포함됩니다. 이러한 파일은 외부 저장소의 앱별 전용 폴더에 저장되어야 합니다. 공유 파일의 경우, 개발자는 공유 가능한 미디어 파일을 저장하기 위해 Media Store API를 사용하거나 다운로드 한 파일을 포함하여 미디어가 아닌 파일을 저장하기 위해 Storage Access Framework를 사용할 수 있습니다.

많은 디바이스들에서 사용자는 마음대로 외부 저장소를 제거할 수 있기 때문에, 개발자는 중요하지 않은 파일을 사용하는 경우에만 외부 저장소를 사용해야 합니다. 앱 작동에 필수적인 파일들은 항상 내부 저장소, 환경 설정 및/또는 데이터베이스에 저장되어야 합니다. SD 카드와 같은 외부 저장소는 일반적으로 안드로이드 디바이스 내의 /sdcard 위치에서 사용할 수 있으며 항상 읽을 수 있는 것은 아닙니다. 그러나 요즘 출시되는 새로운 세대의 디바이스는 내부 저장 용량이 크기 때문에 앱이 대용량 파일까지도 내부 저장소에 저장할 수 있습니다. 시간이 지남에 따라 외부 저장소 사용이 최소화되고 앱이 더 나은 권한으로 더 큰 파일을 보호할 수 있습니다. 그러나 데이터가 외부 저장소에 저장되어 있는 한, 개발자는 데이터의 손상 및 변경 여부를 확인해야 합니다. 다음과 같은 해시 검증기 예제를 참고하십시오.

  • 앱은 사실상 민감하지 않은 데이터의 일부를 캐시 할 수도 있습니다. 다른 데이터와 마찬가지로 캐시 된 데이터도 File 객체를 사용하여 코드에서 호출할 수 있는 파일의 크기에 따라 내부 및 외부 저장소에 저장할 수 있습니다. 개발자는 캐시된 객체에 민감한 정보를 남기지 않도록 주의해야 합니다.

3rd party 라이브러리 및 서비스 업데이트하기

안전하지 않거나 오래된 라이브러리는 앱에서 일반적으로 볼 수 있는 보안약점 입니다. 해커들은 앱에서 사용되는 보안 취약점이 있는 라이브러리를 찾습니다. 개발자가 3rd party API를 사용하여 앱 내에서 다양한 기능을 구현하는 것은 일반적입니다. 이러한 라이브러리의 대부분은 오픈 플랫폼에 존재하며, 개발자나 해커 커뮤니티의 시선을 받고 있습니다. 버그는 즉시 보고되고 수정됩니다. 개발자가 앱에서 라이브러리를 사용할 경우, 만약 지속적인 업데이트가 없다면, 앱은 심각한 위험에 처하게 될 것입니다. 따라서 Google Play 서비스를 포함한 모든 종속성을 최신 상태로 유지하는 것이 좋습니다. 실제로 앱은 인증 오류를 촉발시켜야 합니다.

안드로이드는 네트워크 보안을 보장하기 위해 Provider 클래스를 제공합니다. 이것은 Java 보안 프로토콜을 구현하는 Java 보안 API의 공급자를 나타냅니다. 이 API에서 취약점이 발견될 때 마다 Google Play 서비스는 이를 막기위한 업데이트를 제공합니다. 따라서 Google Play 서비스에서 발행한 패치는 알려진 보안 위협이 쓸모 없게 되기 전에 앱에 통합되어야 합니다. 개발자는 ProviderInstaller 클래스를 사용하여 Google Play 서비스 라이브러리를 업데이트 할 수 있습니다.

동기화 어댑터를 사용하여 서비스 라이브러리를 패치하는 코드는 아래를 참조하십시오.

앱 보안 테스트 도구

개발자는 앱을 디자인하고 개발하는데 대부분의 시간을 소요합니다. 그러다보니 때때로 보안은 후순위로 여겨지곤 합니다. 아래는 널리 사용되는 보안 테스트 도구를 사용하여 위험한 멀웨어로부터 앱을 보호할 수 있는 방법에 대해 설명합니다.

  • Androguard

Androguard는 Python 기반 리버스 엔지니어링 도구입니다. 이 테스트 도구는 앱에 멀웨어가 있는지 여부에 대해서 진단할 수 있습니다. 이 도구는 두 개의 APK 파일의 ‘차이’를 확인, 다양한 난독기(예를 들어, ProGuard 및 DexGuard)의 효율성 측정, 테스트 중인 앱이 불법적으로 수정 또는 변조되었는지 확인하는 등의 유용한 기능을 지원합니다. 

  • ApkTool

ApkTool은 개발자가 비공개된 3rd party 안드로이드 앱을 열고 원본 형식과 매우 유사하게 변환할 수 있는 안드로이드용 리버스 엔지니어링 도구입니다. ApkTool을 이용하여, 개발자는 애플리케이션을 분석할 수 있을 뿐만 아니라 사용자 맞춤 수정으로 다시 빌드 할 수도 있습니다. 이것을 사용하면 리버스 엔지니어링 프로세스와 관련된 중복 작업이 간소화되기 때문에, 개발자가 선호하는 대표적인 도구라고 할 수 있습니다. 

  • Appknox

앱의 잠재적인 보안 결함 및 취약성에 대해서 코드 바이너리를 정적 분석합니다. Appknox는 앱을 수동으로 테스트하여 심각한 보안 허점이나 민감한 데이터 유출, 멀웨어에 의한 공격 가능성이 있는 기타 잠재적 위험 요소를 찾는 윤리적 해커가 주로 사용하는 것으로 알려져 있습니다.

  • CharlesProxy

이 도구는 앱에서 모든 종류의 HTTP 관련 항목을 감시하고 디버깅하는데 도움이 됩니다. 안드로이드에만 국한되지 않으며 iOS와 같은 다른 운영 체제에서도 사용할 수 있습니다. 이 도구는 필요한 경우 앱이 네트워크와 상호 작용하는 방식을 검사하고 변경합니다.

  • ClassyShark

ClassyShark는 안드로이드용 바이너리 검사 도구입니다. 사용자는 모든 클래스, 멤버 및 종속성을 찾아보고 모든 앱의 메서드 수를 쉽게 확인할 수 있습니다. 또한 쉬운 브라우징을 하도록 패키지와 같은 편리한 파일 구조를 가지고 있습니다. 그리고 ‘Methods Count’ 탭은 앱의 각 패키지에 포함된 메소드의 수를 알려줍니다.

  • DevKnox

이 도구는 개발자가 코드의 보안을 향상시키는데 도움이 됩니다. IDE 상에서 몇 가지 알려진 보안 문제를 자동 수정합니다. 안드로이드 스튜디오에서 잘 작동하는 DevKnox는 사용자에게 실시간 보안 제안과 원 클릭 수정을 제공하여 생산성을 향상시키는데 도움을 줍니다. 

  • Dex2Jar

Dex2Jar는 DEX 파일을 읽고 쓰고, 변환하거나 수정하는데 사용됩니다. 또한 사용자는 모든 DEX 파일을 클래스 파일로 변환하고 모든 파일을 JAR(Java Archive) 파일 형식으로 압축할 수 있습니다.

  • QARK

QARK는 Quick Android Review Kit의 약자이며 또 다른 유용한 보안 도구입니다. 소스 코드뿐만 아니라 앱의 패키지에서도 일반적인 보안 취약성을 찾는데 도움이 됩니다. 사용자에게 취약성에 대한 깊이있는 설명을 많이 제공합니다.

보안상의 이유로 플래그가 지정된 앱 처리

안드로이드는 개발자가 Google Play 플랫폼에 앱을 제출하기 전에, 사용자에게 가장 안전한 환경을 제공하고 앱 보안 모범 사례를 따르기를 원할것으로 가정합니다. 이 플랫폼은 약 280만 개의 앱을 자랑하며, 앱 생태계에서 약 189억 달러의 가치로 평가됩니다. 이 정도 규모의 인프라에서 사용자 데이터 및 코드의 보안을 보장하는 것은 매우 큰 규모의 일입니다. 이러한 측면의 상당 부분을 자동화하기 위해 안드로이드는 2014년에 앱 보안 개선 프로그램을 시작했으며, 구글에 따르면 약 30만 명의 개발자에 의해서 개발된 약 100만 개의 앱이 이 프로그램에 의해서 보안 업데이트 되었음이 확인되었습니다.

앱 보안 개선 프로그램

이 프로그램에 따라 구글은 개발자에게 Google Play 플랫폼에 업로드된 앱을 철저히 스캔한 후 보안을 업데이트하는 서비스를 제공합니다. 앱에 대해서 새롭게 부상하는 위협과 기존에 존재하는 위협을 지속적으로 검색합니다. 이 서비스는 개발자에게 보안 향상 방법에 대한 권장 사항을 제공합니다.

잠재적인 보안 문제를 감지하는 즉시, 안드로이드는 앱에 플래그를 지정하고 이메일 및 Google Play Console을 통해 개발자에게 알림을 보냅니다. 필요한 경우에는 제안된 솔루션과 패치 구현 방법에 대한 팁 및 링크가 알림에 포함되어 있습니다. 모든 업데이트가 시간 제한 방식으로 적용되도록 합니다. 치명적인 보안 허점이 발견된 경우, Google Play는 해당 취약점이 모범 사례등으로 해결되지 않는 한, 업데이트된 버전의 앱 업로드를 더 이상 허용하지 않을 수 있습니다.

개발자는 다양한 개발자가 공격 및 취약성을 식별하고 자신의 경험치를 통한 잠재적인 솔루션을 제공하는 Google Play 플랫폼의 커뮤니티 리소스를 사용하는 것이 권장됩니다.

결론

사용자가 개발자의 앱을 사용하기로 선택하면, 앱은 신뢰와 안전한 데이터를 제공해야 합니다. 고객 데이터를 보호하기 위해 최선을 다하는 것은 모든 개발자의 최우선 책임입니다.

안드로이드는 가장 많이 사용되는 모바일 운영 체제 중 하나이다 보니, 해커와 악의적인 프로그래머의 관심의 중심이기도 합니다. 보안 네트워크 연결을 보장하고 위에 나열된 테스트 도구를 사용함으로써 개발자는 애플리케이션에 대한 위험을 크게 감소시킬 수 있습니다.

 

Dustin Hong
Dustin Hong
Dustin은 잉카엔트웍스의 앱실링 비즈니스 개발을 이끌고 있습니다. 그는 사이버 보안, IT, 컨텐츠 및 애플리케이션 보안 분야의 소프트웨어 개발과 혁신에 많은 관심을 가지고 있습니다. 또한 사이버 보안 세계에서 주요 사건의 대상, 이유 및 방법에 대해 다양한 사람들에게 공유하고 토론하는 것을 좋아합니다. 업계 동향 및 모범 사례에 대한 그의 견해는 기사, 백서에 실려있으며, 여러 보안 행사에서 유사 주제로 발표를 하였습니다.

Leave a Comment