OWASP 카테고리: MASVS-PLATFORM: 플랫폼 상호작용
개요
많은 모바일 애플리케이션이 외부 API를 사용하여 기능을 제공합니다. 일반적으로 정적 토큰이나 키는 서비스에 연결하는 애플리케이션을 인증하는 데 사용됩니다.
하지만 클라이언트-서버 설정 (또는 모바일 앱 및 API)의 경우 일반적으로 정적 키를 사용하는 것은 민감한 데이터 또는 서비스에 액세스하기 위한 안전한 인증 방법으로 간주되지 않습니다. 내부 인프라와 달리 이 키에 액세스할 수 있는 사람은 누구나 외부 API에 액세스하고 서비스를 악용할 수 있습니다.
예를 들어 정적 키는 애플리케이션에서 리버스 엔지니어링되거나 모바일 애플리케이션이 외부 API와 통신할 때 가로채일 수 있습니다. 또한 이 정적 키가 애플리케이션 내에 하드 코딩될 가능성이 더 높습니다.
충분히 안전한 인증 및 액세스 제어가 사용되지 않으면 API 데이터 및 서비스에 위험이 발생합니다.
정적 키를 사용하는 경우 시간 제한 없이 요청을 재생하거나 (가로채거나 리버스 엔지니어링된) 키를 사용하여 새 요청을 구성하여 API를 악용할 수 있습니다.
영향
개발자가 AI 또는 ML API 서비스를 결제하는 경우 공격자가 이 키를 훔쳐서 서비스에 부채를 발생시키거나 가짜 콘텐츠를 만드는 데 사용할 수 있습니다.
API에 저장된 사용자 데이터, 파일 또는 PII를 자유롭게 사용할 수 있어 유출로 인한 피해가 발생할 수 있습니다.
공격자는 이 액세스 권한을 사용하여 사기를 저지르고, 서비스를 리디렉션하며, 드물지만 서버를 완전히 제어할 수도 있습니다.
완화 조치
상태 저장 API
애플리케이션에서 사용자 로그인을 제공하거나 사용자 세션을 추적할 수 있는 경우 개발자는 앱과의 상태 저장 통합을 위해 Google Cloud와 같은 API 서비스를 사용하는 것이 좋습니다.
또한 API 서비스에서 제공하는 보안 인증, 클라이언트 유효성 검사, 세션 제어를 사용하고 정적 키 대신 동적 토큰을 사용하는 것이 좋습니다. 토큰이 적당히 짧은 시간 (일반적으로 1시간) 내에 만료되는지 확인합니다.
그런 다음 동적 토큰을 사용하여 API에 대한 액세스 권한을 제공하도록 인증해야 합니다. 이 가이드라인에서는 OAuth 2.0을 사용하여 이를 달성하는 방법을 보여줍니다. 이러한 가이드라인 외에도 다음 기능을 구현하여 OAuth 2.0을 더욱 강화하여 Android 앱의 취약점을 줄일 수 있습니다.
적절한 오류 처리 및 로깅을 구현합니다.
- OAuth 오류를 말끔하고 명시적으로 처리하고 디버깅 목적으로 로깅합니다.
- 공격 표면이 줄어들면 발생할 수 있는 문제를 식별하고 해결하는 데도 도움이 됩니다.
- 사용자에게 기록되거나 표시되는 메시지는 명확해야 하지만 적에게 유용한 정보를 포함해서는 안 됩니다.
애플리케이션에서 OAuth를 안전하게 구성합니다.
- 승인 및 토큰 엔드포인트 모두에
redirect_uri
매개변수를 전송합니다. - 앱이 서드 파티 서비스와 함께 OAuth를 사용하는 경우 교차 출처 리소스 공유 (CORS)를 구성하여 앱 리소스에 대한 액세스를 제한합니다.
- 이렇게 하면 승인되지 않은 크로스 사이트 스크립팅 (XSS) 공격을 방지할 수 있습니다.
- 상태 매개변수를 사용하여 CSRF 공격을 방지합니다.
보안 라이브러리를 사용합니다.
- AppAuth와 같은 보안 라이브러리를 사용하여 보안 OAuth 흐름의 구현을 간소화하는 것이 좋습니다.
- 이러한 Android 라이브러리를 사용하면 앞에서 언급한 많은 보안 권장사항을 자동화할 수 있습니다.
Firebase 및 Google ID 토큰을 비롯한 기타 인증 방법은 OpenAPI 문서에 설명되어 있습니다.
스테이트리스 API
API 서비스에서 앞에서 권장한 보호 기능을 제공하지 않고 사용자 로그인 없이 상태 비저장 세션이 필요한 경우 개발자는 자체 미들웨어 솔루션을 제공해야 할 수 있습니다.
여기에는 앱과 API 엔드포인트 간의 요청을 '프록시'하는 작업이 포함됩니다. 이를 수행하는 한 가지 방법은 JSON 웹 토큰 (JWT) 및 JSON 웹 서명 (JWS)을 사용하거나 앞에서 권장한 대로 완전히 인증된 서비스를 제공하는 것입니다. 이렇게 하면 취약한 정적 키를 애플리케이션 (클라이언트)이 아닌 서버 측에 저장할 수 있습니다.
모바일 애플리케이션에서 엔드 투 엔드 무상태 솔루션을 제공하는 데는 내재된 문제가 있습니다. 가장 중요한 과제 중 일부는 클라이언트 (앱)의 유효성 검사와 기기에 비공개 키 또는 비밀을 안전하게 저장하는 것입니다.
Play Integrity API는 애플리케이션과 요청의 무결성을 검증합니다. 이렇게 하면 이 액세스가 악용될 수 있는 일부 시나리오를 완화할 수 있습니다. 키 관리의 경우 대부분 키 저장소가 비공개 키를 안전하게 저장하는 데 가장 적합한 위치입니다.
일부 모바일 애플리케이션은 등록 단계를 사용하여 애플리케이션의 무결성을 확인하고 보안 교환을 사용하여 키를 제공합니다. 이러한 방법은 복잡하며 이 문서의 범위를 벗어납니다. 하지만 클라우드 키 관리 서비스가 한 가지 해결책이 될 수 있습니다.