Translated ['mobile-pentesting/android-app-pentesting/android-applicatio

This commit is contained in:
Translator 2024-10-05 13:17:10 +00:00
parent 580ae27234
commit 316da13b18

View file

@ -34,18 +34,18 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
### Sandboxing
**Android 애플리케이션 샌드박스**는 **각 애플리케이션을 별도의 사용자 ID로 별도의 프로세스로 실행할 수 있게 합니다**. 각 프로세스는 자신의 가상 머신을 가지므로, 앱의 코드는 다른 앱과 격리되어 실행됩니다.\
Android 5.0(L)부터 **SELinux**가 시행됩니다. 기본적으로 SELinux는 모든 프로세스 상호작용을 거부하고, 그 **예상되는 상호작용만 허용하는 정책을 생성합니다**.
Android 5.0(L)부터 **SELinux**가 시행됩니다. 기본적으로 SELinux는 모든 프로세스 상호작용을 거부하고, 그들 간의 **예상되는 상호작용만 허용하는 정책을 생성합니다**.
### Permissions
애플리케이션을 설치할 때 **앱이 권한을 요청하면**, 앱은 **AndroidManifest.xml** 파일의 **`uses-permission`** 요소에 구성된 권한을 요청하는 것입니다. **uses-permission** 요소는 **name** **속성** 내에서 요청된 권한의 이름을 나타냅니다. 또한 **maxSdkVersion** 속성이 있어 지정된 버전보다 높은 버전에서는 권한 요청을 중지합니다.\
안드로이드 애플리케이션은 처음에 모든 권한을 요청할 필요는 없으며, **동적으로 권한을 요청할 수 있지만 모든 권한은 매니페스트에 **명시되어야 합니다.**
애플리케이션을 설치할 때 **앱이 권한을 요청하면**, 앱은 **AndroidManifest.xml** 파일의 **`uses-permission`** 요소에 구성된 권한을 요청하는 것입니다. **uses-permission** 요소는 **name** **속성 내에서 요청된 권한의 이름을 나타냅니다.** 또한 **maxSdkVersion** 속성이 있어 지정된 버전보다 높은 버전에서는 권한 요청을 중지합니다.\
안드로이드 애플리케이션은 처음에 모든 권한을 요청할 필요는 없으며, **동적으로 권한을 요청할 수 있지만 모든 권한은 **매니페스트에 **선언되어야 합니다.**
앱이 기능을 노출할 때, **지정된 권한을 가진 앱만 접근할 수 있도록 제한할 수 있습니다**.\
권한 요소는 세 가지 속성을 가집니다:
* 권한의 **이름**
* 관련 권한을 그룹화할 수 있는 **permission-group** 속성
* 관련 권한을 그룹화할 수 있는 **permission-group** 속성.
* 권한이 부여되는 방식을 나타내는 **protection-level**. 네 가지 유형이 있습니다:
* **Normal**: 앱에 **알려진 위협이 없을 때** 사용됩니다. 사용자가 **승인할 필요가 없습니다**.
* **Dangerous**: 요청하는 애플리케이션에 **상승된 접근**을 부여하는 권한을 나타냅니다. **사용자에게 승인을 요청합니다**.
@ -54,7 +54,7 @@ Android 5.0(L)부터 **SELinux**가 시행됩니다. 기본적으로 SELinux는
## Pre-Installed Applications
이 앱들은 일반적으로 **`/system/app`** 또는 **`/system/priv-app`** 디렉토리에서 발견되며, 그 중 일부는 **최적화되어 있습니다** (심지어 `classes.dex` 파일을 찾지 못할 수도 있습니다). 이러한 애플리케이션은 때때로 **너무 많은 권한으로 실행되고 있기 때문에** 확인할 가치가 있습니다 (루트 권한으로).
이 앱들은 일반적으로 **`/system/app`** 또는 **`/system/priv-app`** 디렉토리에서 발견되며, 그 중 일부는 **최적화되어 있습니다** (심지어 `classes.dex` 파일을 찾지 못할 수도 있습니다). 이러한 애플리케이션은 때때로 **너무 많은 권한으로 실행되고 있기 때문에** 확인할 가치가 있습니다 (루트로).
* **AOSP** (Android OpenSource Project) **ROM**과 함께 제공되는 것
* 장치 **제조업체**에 의해 추가된 것
@ -132,9 +132,9 @@ su 바이너리가 구성되면, 다른 안드로이드 앱이 `su` 바이너리
인텐트 필터는 카테고리, 작업 및 데이터 필터로 구성되며, 추가 메타데이터를 포함할 수 있는 가능성이 있습니다. 이 설정은 구성 요소가 선언된 기준에 맞는 특정 인텐트를 처리할 수 있게 합니다.
안드로이드 구성 요소(활동/서비스/콘텐츠 제공자/브로드캐스트 수신자)의 중요한 측면은 그들의 가시성 또는 **공개 상태**입니다. 구성 요소가 **`exported`** 속성이 **`true`**로 설정되거나 매니페스트에 인텐트 필터가 선언되면, 해당 구성 요소는 공개로 간주되며 다른 앱과 상호작용할 수 있습니다. 그러나 개발자는 이러한 구성 요소를 명시적으로 비공개로 유지하여 다른 앱과 의도치 않게 상호작용하지 않도록 할 수 있는 방법이 있습니다. 이는 매니페스트 정의에서 **`exported`** 속성을 **`false`**로 설정하여 달성됩니다.
안드로이드 구성 요소(활동/서비스/콘텐츠 제공자/브로드캐스트 수신자)의 중요한 측면은 그들의 가시성 또는 **공개 상태**입니다. 구성 요소가 **`exported`** 속성이 **`true`**로 설정되어 있거나 매니페스트에 인텐트 필터가 선언되어 있으면, 해당 구성 요소는 공개로 간주되며 다른 앱과 상호작용할 수 있습니다. 그러나 개발자는 이러한 구성 요소를 명시적으로 비공개로 유지하여 다른 앱과 의도치 않게 상호작용하지 않도록 할 수 있는 방법이 있습니다. 이는 매니페스트 정의에서 **`exported`** 속성을 **`false`**로 설정하여 달성됩니다.
또한, 개발자는 특정 권한을 요구하여 이러한 구성 요소에 대한 접근을 추가로 보안할 수 있는 옵션이 있습니다. **`permission`** 속성을 설정하여 지정된 권한을 가진 앱만 구성 요소에 접근할 수 있도록 강제할 수 있으며, 이는 누가 상호작용할 수 있는지에 대한 추가 보안 및 제어 계층을 추가합니다.
또한, 개발자는 특정 권한을 요구하여 이러한 구성 요소에 대한 접근을 더욱 안전하게 할 수 있는 옵션이 있습니다. **`permission`** 속성을 설정하여 지정된 권한을 가진 앱만 구성 요소에 접근할 수 있도록 강제할 수 있으며, 이는 누가 상호작용할 수 있는지에 대한 추가 보안 및 제어 계층을 추가합니다.
```java
<activity android:name=".MyActivity" android:exported="false">
<!-- Intent filters go here -->
@ -159,7 +159,7 @@ The **Action** of the previously declared intent is **ACTION\_SEND** and the **E
```
An intent-filter는 메시지를 수신하기 위해 **action**, **data** 및 **category**와 일치해야 합니다.
"Intent resolution" 프로세스는 각 메시지를 수신할 앱을 결정합니다. 이 프로세스는 **priority attribute**를 고려하며, 이는 i**ntent-filter 선언**에서 설정할 수 있고, **더 높은 우선 순위를 가진 것이 선택됩니다**. 이 우선 순위는 -1000에서 1000 사이로 설정할 수 있으며, 애플리케이션은 `SYSTEM_HIGH_PRIORITY` 값을 사용할 수 있습니다. **충돌**이 발생하면 "choser" 창이 나타나 **사용자가 결정할 수 있습니다**.
"Intent resolution" 프로세스는 각 메시지를 수신할 앱을 결정합니다. 이 프로세스는 **priority attribute**를 고려하며, 이는 i**ntent-filter 선언**에서 설정할 수 있고, **더 높은 우선 순위를 가진 것이 선택됩니다**. 이 우선 순위는 -1000 1000 사이로 설정할 수 있으며, 애플리케이션은 `SYSTEM_HIGH_PRIORITY` 값을 사용할 수 있습니다. **충돌**이 발생하면, **사용자가 결정할 수 있도록** "choser" 창이 나타납니다.
### Explicit Intents
@ -190,11 +190,11 @@ context.startService(intent);
### Sticky Broadcasts
러한 종류의 브로드캐스트는 **전송된 후 오랜 시간 동안 접근할 수 있습니다**.\
이것은 API 레벨 21에서 사용 중단되었으며 **사용하지 않는 것이 권장됩니다**.\
**이들은 모든 애플리케이션이 데이터를 엿볼 수 있게 하지만, 또한 수정할 수 있게 합니다.**
종류의 브로드캐스트는 **전송된 후 오랜 시간 동안 접근할 수 있습니다**.\
이것은 API 레벨 21에서 사용 중단되었으며 **사용하지 않는 것이 좋습니다**.\
**이들은 어떤 애플리케이션이 데이터를 엿볼 수 있게 할 뿐만 아니라 수정할 수도 있습니다.**
"sticky"라는 단어가 포함된 함수(예: **`sendStickyBroadcast`** 또는 **`sendStickyBroadcastAsUser`**)를 발견하면, **영향을 확인하고 제거하려고 시도하세요**.
"sticky"라는 단어가 포함된 함수, 예를 들어 **`sendStickyBroadcast`** 또는 **`sendStickyBroadcastAsUser`**를 발견하면, **영향을 확인하고 제거하려고 시도하세요**.
## Deep links / URL schemes
@ -212,7 +212,7 @@ context.startService(intent);
</intent-filter>
[...]
```
이전 예제의 스킴은 `exampleapp://`입니다 (또한 **`category BROWSABLE`**도 주목하세요)
이전 예제의 스킴은 `examplescheme://`입니다 (또한 **`category BROWSABLE`**도 주목하세요)
그런 다음, 데이터 필드에서 **host**와 **path**를 지정할 수 있습니다:
```xml
@ -235,7 +235,7 @@ HTML 페이지를 사용하지 않고 [딥 링크를 호출하는 방법](./#exp
### 주요 개념
- **바운드 서비스**: 이러한 서비스는 IPC를 위해 AIDL을 사용하여 액티비티나 구성 요소가 서비스에 바인딩하고 요청을 하며 응답을 받을 수 있게 합니다. 서비스 클래스의 `onBind` 메소드는 상호작용을 시작하는 데 중요하며, 취약점을 찾기 위한 보안 검토의 중요한 영역으로 표시됩니다.
- **바운드 서비스**: 이러한 서비스는 IPC를 위해 AIDL을 사용하여 액티비티나 컴포넌트가 서비스에 바인딩하고 요청을 하며 응답을 받을 수 있게 합니다. 서비스 클래스의 `onBind` 메소드는 상호작용을 시작하는 데 중요하며, 취약점을 찾기 위한 보안 검토의 중요한 영역으로 표시됩니다.
- **메신저**: 바운드 서비스로 작동하는 메신저는 `onBind` 메소드를 통해 데이터를 처리하는 데 중점을 두고 IPC를 용이하게 합니다. 이 메소드를 면밀히 검사하여 안전하지 않은 데이터 처리나 민감한 기능의 실행이 있는지 확인하는 것이 중요합니다.
@ -243,13 +243,13 @@ HTML 페이지를 사용하지 않고 [딥 링크를 호출하는 방법](./#exp
## 구성 요소
여기에는 **액티비티, 서비스, 브로드캐스트 수신기 및 프로바이더**가 포함됩니다.
여기에는 **액티비티, 서비스, 브로드캐스트 리시버 및 프로바이더**가 포함됩니다.
### 런처 액티비티 및 기타 액티비티
안드로이드 앱에서 **액티비티**는 화면과 같으며, 앱의 사용자 인터페이스의 다양한 부분을 보여줍니다. 앱은 여러 개의 액티비티를 가질 수 있으며, 각 액티비티는 사용자에게 고유한 화면을 제공합니다.
**런처 액티비티**는 앱의 주요 게이트웨이로, 앱 아이콘을 탭할 때 실행됩니다. 이는 앱의 매니페스트 파일에 특정 MAIN 및 LAUNCHER 인텐트로 정의됩니다:
**런처 액티비티**는 앱의 주요 게이트웨이로, 앱 아이콘을 탭할 때 시작됩니다. 이는 앱의 매니페스트 파일에 특정 MAIN 및 LAUNCHER 인텐트와 함께 정의됩니다:
```markup
<activity android:name=".LauncherActivity">
<intent-filter>
@ -258,7 +258,7 @@ HTML 페이지를 사용하지 않고 [딥 링크를 호출하는 방법](./#exp
</intent-filter>
</activity>
```
모든 앱이 런처 액티비티를 필요로 하는 것은 아니며, 특히 사용자 인터페이스가 없는 백그라운드 서비스와 같은 앱은 그렇습니다.
모든 앱이 런처 액티비티가 필요하지는 않으며, 특히 사용자 인터페이스가 없는 백그라운드 서비스와 같은 앱은 그렇습니다.
액티비티는 매니페스트에서 "exported"로 표시하여 다른 앱이나 프로세스에서 사용할 수 있도록 만들 수 있습니다. 이 설정은 다른 앱이 이 액티비티를 시작할 수 있도록 허용합니다:
```markdown
@ -266,11 +266,11 @@ HTML 페이지를 사용하지 않고 [딥 링크를 호출하는 방법](./#exp
```
그러나 다른 앱의 활동에 접근하는 것이 항상 보안 위험은 아닙니다. 민감한 데이터가 부적절하게 공유될 경우 우려가 발생하며, 이는 정보 유출로 이어질 수 있습니다.
활동의 생명주기 **onCreate 메서드로 시작**되며, UI를 설정하고 사용자와의 상호작용을 위해 활동을 준비합니다.
활동의 생명주기 **onCreate 메서드로 시작**되며, UI를 설정하고 사용자와의 상호작용을 위해 활동을 준비합니다.
### 애플리케이션 서브클래스
안드로이드 개발에서 앱은 [Application](https://developer.android.com/reference/android/app/Application) 클래스의 **서브클래스**를 생성할 수 있는 옵션이 있지만, 필수는 아닙니다. 이러한 서브클래스가 정의되면 앱 내에서 가장 먼저 인스턴스화되는 클래스가 됩니다. 이 서브클래스에서 구현된 **`attachBaseContext`** 메서드는 **`onCreate`** 메서드 이전에 실행됩니다. 이 설정은 나머지 애플리케이션이 시작되기 전에 초기화를 조기에 수행할 수 있게 합니다.
안드로이드 개발에서 앱은 [Application](https://developer.android.com/reference/android/app/Application) 클래스의 **서브클래스**를 생성할 수 있는 옵션이 있지만, 필수는 아닙니다. 이러한 서브클래스가 정의되면, 앱 내에서 가장 먼저 인스턴스화되는 클래스가 됩니다. 이 서브클래스에서 구현된 **`attachBaseContext`** 메서드는 **`onCreate`** 메서드 이전에 실행됩니다. 이 설정은 나머지 애플리케이션이 시작되기 전에 초기화를 가능하게 합니다.
```java
public class MyApp extends Application {
@Override
@ -302,7 +302,7 @@ Services는 다재다능하며, 다양한 방법으로 시작될 수 있으며,
**Intent 필터**는 두 등록 방법 모두에서 중요하며, 어떤 브로드캐스트가 리시버를 트리거하는지를 결정합니다. 일치하는 브로드캐스트가 전송되면 리시버의 **`onReceive`** 메서드가 호출되어 앱이 저전력 경고에 대한 반응과 같은 방식으로 적절히 반응할 수 있게 합니다.
브로드캐스트는 **비동기**일 수 있으며, 순서 없이 모든 리시버에 도달하거나 **동기**일 수 있으며, 리시버가 설정된 우선 순위에 따라 브로드캐스트를 받습니다. 그러나 모든 앱이 자신을 우선시하여 브로드캐스트를 가로챌 수 있는 잠재적인 보안 위험이 있다는 점에 유의해야 합니다.
브로드캐스트는 **비동기**일 수 있으며, 순서 없이 모든 리시버에 도달하거나 **동기**일 수 있으며, 리시버가 설정된 우선 순위에 따라 브로드캐스트를 수신합니다. 그러나 모든 앱이 브로드캐스트를 가로채기 위해 자신을 우선시할 수 있으므로 잠재적인 보안 위험을 주의해야 합니다.
리시버의 기능을 이해하려면 해당 클래스 내에서 **`onReceive`** 메서드를 찾아보세요. 이 메서드의 코드는 수신된 Intent를 조작할 수 있으며, 특히 Intent를 수정하거나 삭제할 수 있는 **Ordered Broadcasts**에서 리시버에 의한 데이터 검증의 필요성을 강조합니다.
@ -347,9 +347,9 @@ Android는 두 가지 주요 WebView 유형을 제공합니다:
콘텐츠를 로드하기 위해 ````loadUrl````, ````loadData````, 및 ````loadDataWithBaseURL````와 같은 메서드를 사용할 수 있습니다. 이러한 URL 또는 파일이 **안전하게 사용될 수 있는지** 확인하는 것이 중요합니다. 보안 설정은 ````WebSettings```` 클래스를 통해 관리할 수 있습니다. 예를 들어, ````setJavaScriptEnabled(false)````로 JavaScript를 비활성화하면 XSS 공격을 방지할 수 있습니다.
JavaScript "Bridge"는 Java 객체가 JavaScript와 상호작용할 수 있게 하며, Android 4.2 이 보안을 위해 메서드에 ````@JavascriptInterface````로 표시해야 합니다.
JavaScript "Bridge"는 Java 객체가 JavaScript와 상호작용할 수 있게 하며, Android 4.2 이상부터 보안을 위해 메서드에 ````@JavascriptInterface````로 표시해야 합니다.
콘텐츠 접근을 허용하는 (````setAllowContentAccess(true)````) 것은 WebViews가 콘텐츠 제공자에 접근할 수 있게 하며, 콘텐츠 URL이 안전하다고 확인되지 않으면 위험이 될 수 있습니다.
콘텐츠 접근을 허용하는 (````setAllowContentAccess(true)````) 것은 WebViews가 콘텐츠 제공자에 접근할 수 있게 하며, 콘텐츠 URL이 안전하다고 확인되지 않으면 위험 수 있습니다.
파일 접근을 제어하기 위해:
- 파일 접근 비활성화 (````setAllowFileAccess(false)````)는 파일 시스템에 대한 접근을 제한하며, 특정 자산에 대한 예외를 두어 비민감 콘텐츠에만 사용되도록 보장합니다.