모바일 정적분석 #Android
안전하지 않은 네트워크 통신 분석
1. 서론
현대 모바일 애플리케이션은 사용자 인증, 데이터 조회, 기능 수행 등 대부분의 핵심 기능을 서버와의 통신을 통해 처리합니다.
이 과정에서 아이디, 비밀번호, 개인정보, 금융 정보 등 수많은 민감 데이터가 단말기와 서버 사이를 오고 갑니다. 만약 이 통신 구간이 암호화되지 않는다면, 제3자가 네트워크 상의 데이터를 가로채는 중간자 공격(MitM)에 의해 모든 정보가 그대로 노출될 수 있습니다.
민감 데이터를 취급하는 모든 통신은 반드시 TLS 프로토콜을 통해 암호화되어야 하고 일반적으로 HTTPS를 통해 구현됩니다. 암호화되지 않은 평문 통신(HTTP)을 사용하는 것은 모바일 앱에서 발견될 수 있는 가장 심각하고 기본적인 보안 취약점 중 하나입니다.
2. 분석 환경
분석 대상: InsecureBankv2.apk
분석 도구: JADX-GUI 1.4.7
3. 분석 절차
3.1. 분석 전략: 네트워크 관련 코드 식별
서버와 통신하는 코드를 찾기 위해, 네트워크 연결과 관련된 키워드를 검색하는 것이 가장 효율적입니다. 일반적으로 http://, https, HttpClient, HttpPost, URL 등의 키워드는 네트워크 통신 코드와 직접적인 관련이 있습니다. 이전 미션에서 분석했던 로그인 처리 클래스(DoLogin.java)는 서버 통신이 필수적이기 떄문에 이 파일을 다시 한번 분석합니다.
3.2. 단서 식별: JADX를 이용한 코드 분석
JADX에서 com.android.insecurebankv2.DoLogin 클래스 파일을 열어보면, 로그인 요청을 처리하는 postData 메소드 내에서 평문 HTTP 통신을 수행하는 전체 과정을 확인할 수 있습니다.

// DoLogin.java > RequestTask 클래스 내부
//클래스 멤버 변수로 http://가 하드코딩 되어 있음
String protocol = "http://";
public void postData(String valueIWantToSend) throws...{
//Deprecated 되었지만, InsecureBankv2에서 사용 중인 HttpClient 객체를 생성
HttpClient httpclient = new DefaultHttpClient();
//VULNERABILITY: 클래스 변수에 하드코딩된 "http://" 프로토콜을 사용하여 로그인 URL을 조합
HttpPost httppost = new HttpPost(DoLogin.this.protocol + DoLogin.this.serverip + ":" + DoLogin.this.serverport + "/login");
//서버로 전송할 파라미터(아이디, 비밀번호)를 리스트에 추가
List<NameValuePair> nameValuePairs = new ArrayList<>(2);
nameValuePairs.add(new BasicNameValuePair("username", DoLogin.this.username));
nameValuePairs.add(new BasicNameValuePair("password", DoLogin.this.password));
//..
//평문 상태의 아이디와 비밀번호가 포함된 파라미터를 HTTP 요청 본문에 담음
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// 암호화되지 않은 HTTP 요청을 서버로 전송
HttpResponse responseBody = httpclient.execute(httppost);
//...
}
분석 결과, InsecureBankv2 앱은 protocol 변수에 하드코딩된 http:// 값을 사용하여 로그인 URL을 생성하고, 사용자의 아이디와 비밀번호를 아무런 암호화 없이 평문 그대로 서버에 전송하고 있음을 확인했습니다.
4. 취약점 분석 및 영향
- 취약점 분류: CWE-319
- 위험도: 심각
- 상세 설명: 애플리케이션이 암호화되지 않은 통신 채널을 통해 민감한 정보(사용자 계정 정보 등)를 전송할 때 발생하는 취약점
- 영향: 동일한 네트워크(공용 Wi-Fi 등)에 접속한 공격자는 Wireshark, Burp Suite와 같은 네트워크 스니핑 도구를 사용하여 앱과 서버 간의 모든 통신 패킷을 가로챌 수 있습니다. 이 경우 로그인 요청 패킷에 포함된 아이디와 비밀번호가 평문으로 그대로 노출되어 공격자에게 계정을 탈취당하게 됩니다. 이는 금융 정보 유출, 개인정보 침해 등 직접적인 피해로 이어질 수 있습니다.
5. 결론 및 대응 방안
모바일 앱에서 서버로 민감 정보를 전송하는 모든 구간은 반드시 HTTPS를 사용하여 암호화해야 합니다. 이는 모바일 애플리케이션 보안의 기본적인 원칙 중 하나입니다.
안전한 네트워크 통신 구현 방안
- HTTPS 강제 사용: 모든 서버 통신 URL은 https://로 시작해야 합니다.
- 네트워크 보안 구성 (Network Security Configuration): Android 7.0 (API 레벨 24) 이상에서는 res/xml/network_security_config.xml 파일을 사용하여 앱의 네트워크 보안 정책을 선언적으로 관리할 수 있습니다. 이 파일을 통해 평문 트래픽(HTTP)을 차단하고, 특정 도메인에 대해서만 통신을 허용하는 등 강력한 보안 정책을 적용할 수 있습니다.
- <!-- res/xml/network_security_config.xml --> <network-security-config> <domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">insecure-bank.com</domain> </domain-config> </network-security-config>
- SSL/TLS 인증서 고정 (Certificate Pinning): 신뢰할 수 없는 CA(인증 기관)에서 발급한 인증서를 이용한 정교한 중간자 공격을 방어하기 위해, 서버의 공개키나 인증서를 앱 내에 미리 지정해두고 통신 시 일치하는지 검증하는 '인증서 고정' 기술을 구현하는 것이 좋습니다.
'해킹&보안 > 모바일' 카테고리의 다른 글
| 모바일 정적분석 #5 (0) | 2025.10.18 |
|---|---|
| 모바일 정적분석 #4 (0) | 2025.10.17 |
| 모바일 정적분석 #3 (0) | 2025.10.17 |
| 모바일 정적분석 #2 (0) | 2025.10.16 |
| 모바일 정적분석 #1 (0) | 2025.10.16 |