Code Injection은 공격자가 애플리케이션의 입력 데이터를 통해 악성 코드를 전달하여 무단 작업을 수행하는 공격 유형입니다. OWASP, 2024에 따르면 인젝션은 가장 심각한 취약점 상위 3개에 포함됩니다. 코드 인젝션 메커니즘을 이해하면 개발자가 개발 첫 날부터 안전한 시스템을 설계할 수 있습니다.
주요 사항
Code Injection은 공격자가 신뢰할 수 없는 입력 데이터를 통해 애플리케이션에 실행 가능한 코드를 주입하는 공격 클래스입니다. 모바일 애플리케이션에서는 입력 필드, 딥 링크, 푸시 알림, QR 코드 및 파일 교환을 통해 공격이 가능합니다.
OS 수준 공격과 달리 Code Injection은 애플리케이션 자체 코드의 논리적 오류(이스케이프 부족, 안전하지 않은 문자열 연결, 외부 데이터 소스에 대한 신뢰)를 악용합니다. Positive Technologies(2025)의 보고서에 따르면 금융 분야 모바일 애플리케이션의 모든 취약점 중 23%가 인젝션입니다.
Code Injection의 주요 위험은 완전한 데이터 유출입니다. 공격자는 데이터베이스, 기기 파일 시스템 또는 다른 사용자의 계정에 액세스할 수 있습니다. 결제 데이터나 의료 정보를 처리하는 모바일 애플리케이션의 경우 결과가 심각할 수 있습니다.
개발자는 인젝션 유형을 이해하고 데이터 입력부터 표시 및 저장까지 모든 수준에서 보호 메커니즘을 적용해야 합니다. 최신 프레임워크는 내장 보안 도구를 제공하지만 이를 사용하려면 의식적인 접근 방식이 필요합니다.
Code Injection의 분류에는 모바일 개발 맥락에서 세 가지 주요 공격 유형이 포함됩니다. 각 유형은 애플리케이션의 다른 구성 요소를 악용하며 특정 보호 방법이 필요합니다.
SQL Injection(SQLi)은 로컬 또는 원격 데이터베이스에 대한 쿼리 매개변수를 통해 악성 SQL 코드를 주입하는 것입니다. 모바일 애플리케이션에서는 기기에서 SQLite를 안전하지 않게 사용하거나 문자열 연결로 REST API에 HTTP 요청을 구성할 때 취약점이 발생합니다.
일반적인 공격 벡터는 검색 또는 필터 필드로, 그 값이 SQL 쿼리에 직접 대입됩니다. 개발자가 매개변수화된 쿼리 대신 원시 연결을 사용하는 경우 공격자는 1' OR '1'='1과 같은 문자열을 전달할 수 있습니다. OWASP Mobile Top 10(2024)에 따르면 SQL Injection은 안전하지 않은 데이터 저장소 범주에서 모바일 애플리케이션의 두 번째로 빈번한 심각한 취약점으로 남아 있습니다.
SQLi 방어는 세 가지 수준으로 구축됩니다: 매개변수화된 쿼리 사용(Java의 PreparedStatement, Android의 bindArgs를 사용한 rawQuery), 클라이언트 및 서버 측 입력 유효성 검사, 최소 데이터베이스 권한.
모바일 애플리케이션의 XSS 공격은 HTML 콘텐츠를 표시하는 내장 브라우저인 WebView 구성 요소를 대상으로 합니다. 애플리케이션이 삭제 없이 WebView에 외부 소스의 데이터를 로드하는 경우 공격자는 애플리케이션 컨텍스트에서 실행되는 JavaScript 코드를 주입할 수 있습니다.
XSS에는 두 가지 하위 유형이 있습니다: Stored XSS — 악성 스크립트가 서버에 저장되어 페이지를 볼 때마다 실행됩니다. Reflected XSS — 코드가 URL 또는 POST 매개변수를 통해 전달되어 한 번 실행됩니다. 모바일 애플리케이션에서는 WebView에서 다른 사용자에게 표시되는 댓글, 리뷰 또는 사용자 콘텐츠를 통한 Stored XSS가 특히 위험합니다.
보호 방법에는 WebView에서 JavaScript 비활성화(필요하지 않은 경우), CSP(Content Security Policy) 사용, Android용 Jsoup 또는 iOS용 SwiftSoup과 같은 라이브러리를 통한 HTML 콘텐츠 삭제가 포함됩니다.
Command Injection은 Runtime.exec(), ProcessBuilder 또는 NSTask에 대한 삭제되지 않은 호출을 통해 기기에서 시스템 명령을 실행하는 것입니다. 모바일 애플리케이션에서는 애플리케이션이 셸 명령이나 작업이 포함된 Intent에 사용자 데이터를 전달하는 경우 공격이 가능합니다.
가장 취약한 영역은 파일 변환 기능, 미디어 처리(ffmpeg, ImageMagick) 및 타사 라이브러리 설치입니다. 공격자는 파이프 또는 리디렉션 문자가 포함된 명령을 전달하여 기기에서 임의 코드를 실행할 수 있습니다. Android는 샌드박스를 통해 셸 액세스를 부분적으로 제한하지만 루트 액세스 또는 PrivEsc 익스플로잇이 있는 애플리케이션은 손상될 수 있습니다.
권장되는 보호 방법은 사용자 데이터 처리를 위한 Runtime.exec()의 완전한 사용 금지, 안전한 API를 가진 라이브러리 사용, 외부 프로세스의 엄격한 격리입니다.
Code Injection의 메커니즘은 아키텍처 차이로 인해 Android와 iOS 플랫폼에서 다릅니다. Android에서 인젝션은 종종 Intent(애플리케이션 구성 요소 간에 전달되는 시스템 메시지)와 관련됩니다. 공격자는 SQL 코드나 셸 명령이 포함된 추가 데이터가 있는 악성 Intent를 보낼 수 있습니다.
iOS에서는 프로세스 간 통신(XPC) 메커니즘, 유니버설 링크 및 URL 스킴 처리를 통해 공격이 더 자주 발생합니다. 검증 없이 외부 소스의 데이터를 수락하는 애플리케이션은 인젝션에 취약해집니다. Apple Security Research(2025)에 따르면 iOS 애플리케이션 취약점의 약 12%가 불충분한 입력 데이터 삭제와 관련되어 있습니다.
두 플랫폼의 공통 벡터는 로컬 스토리지(SQLite, Realm, UserDefaults)를 통한 공격입니다. 악성 애플리케이션이 공유 디렉터리에 데이터를 쓸 수 있는 경우 읽을 때 대상 애플리케이션에 의해 실행될 코드를 주입할 수 있습니다.
일반적인 공격 프로세스는 세 단계로 구성됩니다: 정찰 — 애플리케이션 입력 지점(양식, 딥 링크, 파일) 분석, 주입 — 발견된 입력 지점을 통한 악성 페이로드 전달, 악용 — 데이터 또는 기능에 액세스하기 위한 인젝션 실행. 이 주기를 이해하면 개발자가 각 단계에서 보호를 설계하는 데 도움이 됩니다.
Android용 Kotlin과 iOS용 Swift의 Code Injection 구체적인 예를 살펴보겠습니다. 각 예제는 취약한 패턴과 그 안전한 대안을 보여줍니다.
첫 번째 예제는 사용자 입력으로 쿼리 문자열을 직접 연결하는 것입니다. userInput = "1' OR '1'='1" 값의 경우 쿼리는 하나 대신 테이블의 모든 행을 반환합니다.
// 취약: 문자열 연결
fun getUserById(userInput: String): List<User> {
val db = openOrCreateDatabase()
val query = "SELECT * FROM users WHERE id = " + userInput
return db.rawQuery(query, null)
}
// 안전: 매개변수화된 쿼리
fun getUserByIdSafe(userInput: String): List<User> {
val db = openOrCreateDatabase()
val query = "SELECT * FROM users WHERE id = ?"
return db.rawQuery(query, arrayOf(userInput))
}
두 번째 예제는 WKWebView에서 사용자 HTML 콘텐츠의 잘못된 로드와 올바른 로드를 보여줍니다. SwiftSoup을 사용하면 렌더링 전에 악성 스크립트를 제거할 수 있습니다.
// 취약: 직접 HTML 로드
let webView = WKWebView()
let html = "<div>\(userComment)</div>"
webView.loadHTMLString(html, baseURL: nil)
// 안전: SwiftSoup을 통한 삭제
import SwiftSoup
let cleanHtml = try SwiftSoup.clean(
userComment,
Whitelist.basic()
)
webView.loadHTMLString(cleanHtml, baseURL: nil)
세 번째 예제는 사용자 인수로 Runtime.exec()를 호출할 때의 위험과 고정 API를 가진 라이브러리를 통한 안전한 대안입니다.
// 취약: 사용자 입력이 포함된 셸 명령
fun convertVideo(inputPath: String) {
val cmd = "ffmpeg -i $inputPath -vcodec libx264 output.mp4"
Runtime.getRuntime().exec(cmd)
}
// 안전: 인수 격리
fun convertVideoSafe(inputPath: String) {
val cmd = listOf(
"ffmpeg", "-i", inputPath,
"-vcodec", "libx264", "output.mp4"
)
ProcessBuilder(cmd).start()
}
Code Injection으로부터의 보호는 코드, 인프라 및 개발 프로세스를 포괄하는 체계적인 접근 방식이 필요합니다. 단일 방법으로는 완전한 보안을 보장할 수 없습니다. 여러 방법의 조합이 필요합니다.
첫 번째 수준은 예방입니다: 모든 입력 데이터의 엄격한 유효성 검사. 애플리케이션이 사용자, 다른 애플리케이션 또는 네트워크로부터 받는 모든 필드는 유형, 길이 및 형식에 대해 확인되어야 합니다. OWASP ESAPI와 같은 라이브러리는 일반적인 시나리오에 대한 기성 유효성 검사기를 제공합니다.
두 번째 수준은 삭제 및 이스케이프입니다: SQL 쿼리, HTML 템플릿 또는 셸 명령에서 사용하기 전에 데이터를 변환합니다. 매개변수화된 쿼리는 SQL Injection을 완전히 제거하고 HTML 이스케이프는 XSS를 방지합니다. Android에서 SQLite 작업에는 Room(바인드 매개변수를 자동으로 적용하는 ORM)을 사용하세요.
세 번째 수준은 권한 최소화입니다: 애플리케이션은 최소한의 필요한 권한으로 작동해야 합니다. 데이터베이스, 파일 시스템 및 프로세스 간 통신에 최소 권한 원칙을 사용하세요. iOS는 애플리케이션 샌드박스를 통해 이 원칙을 구현하고 Android는 권한 모델과 프로세스 격리를 통해 구현합니다.
네 번째 수준은 모니터링 및 대응입니다: 의심스러운 작업 기록, 이상 징후 탐지 및 공격 반복 시 자동 차단. Firebase App Check와 같은 도구는 손상된 클라이언트의 백엔드에 대한 가짜 요청을 탐지하는 데 도움이 됩니다. RASP(Runtime Application Self-Protection) 통합을 통해 런타임에 인젝션을 차단할 수 있습니다.
Google Project Zero(2025)의 연구에 따르면 이러한 네 가지 수준의 조합은 Code Injection 공격 성공 위험을 94% 감소시킵니다. 개발자는 취약점 발견 후 추가하는 것이 아니라 아키텍처 설계 단계에서 보호 메커니즘을 구현하는 것이 좋습니다.
자주 묻는 질문
Code Injection은 공격자가 애플리케이션에 데이터가 아닌 코드를 보내는 것입니다. 예를 들어 사용자 이름 대신 SQL 쿼리를 보내면 애플리케이션이 데이터베이스에서 이를 실행하여 다른 레코드에 액세스합니다.
SQL Injection은 SQL 쿼리를 통해 데이터베이스를 공격하여 레코드 읽기 및 수정을 가능하게 합니다. XSS는 사용자 브라우저에서 실행하기 위해 WebView에 JavaScript 코드를 주입합니다. 다른 대상이지만 공통 메커니즘(불충분한 입력 검증)을 공유합니다.
SQLite에는 매개변수화된 쿼리를 사용하는 Room을 사용하고 WebView에서 JavaScript를 비활성화하며 코드 난독화에 ProGuard/R8을 적용하고 사용자 데이터를 Runtime.exec()에 절대 전달하지 마세요. 보안 패치로 종속성을 정기적으로 업데이트하세요.
네, iOS 애플리케이션은 Core Data(원시 쿼리)를 통한 SQL Injection, WKWebView를 통한 XSS, Process를 통한 Command Injection에 취약합니다. iOS 샌드박스는 공격 규모를 제한하지만 완전히 방지하지는 않습니다. 사용 전에 항상 데이터를 삭제하세요.
소스 코드 스캔에는 SAST(정적 분석) — SonarQube, MobSF 또는 QARK와 같은 도구를 사용하세요. 추가로 실행 중인 애플리케이션 테스트에는 DAST 스캐너를 사용하세요: 모든 입력 필드에 특수하게 제작된 문자열(‘, OR 1=1, <script>)을 입력합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.