인셔셔RSS 관심 있는 블로그, 뉴스, 기술 정보를 효율적으로 추적하고 읽으세요
원문 읽기 InertiaRSS에서 열기

추천 피드

Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
M
MIT News - Artificial intelligence
博客园 - 叶小钗
MyScale Blog
MyScale Blog
V
Visual Studio Blog
月光博客
月光博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
I
InfoQ
有赞技术团队
有赞技术团队
阮一峰的网络日志
阮一峰的网络日志
Jina AI
Jina AI
V
V2EX
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Blog — PlanetScale
Blog — PlanetScale
Last Week in AI
Last Week in AI
雷峰网
雷峰网
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python)
나는 보안 스캐너로 인기 있는 10개 F-Droid 앱을 스캔했습니다 — 오픈 소스 보안
Yehor Mamaie · 2026-05-24 · via DEV Community

Yehor Mamaiev

"오픈 소스이기 때문에 안전하다."

나는 이런 말을 자주 들어. 아이디어는 간단하다: 코드가 공개되어 있다면 누군가가 검토했을 것이다. 취약점이 포착될 것이다. 커뮤니티가 이를 수정할 것이다.

나는 실제 데이터로 이 가설을 테스트하기로 결정했다.

F-Droid에서 10개의 인기 있는 오픈 소스 안드로이드 앱을 가져와서 — 매일 수백만 명이 사용하는 앱들 — 그리고 나는 그것들을 내 정적 분석 보안 스캐너를 통해 실행했습니다. 그런 다음 저는 디컴파일된 APK 코드에 대해 각각의 발견을 수동으로 검증했습니다.

결과: 10개 앱에 걸쳐 60개의 확인된 취약점.


앱들

나는 의도적으로 다양한 카테고리에서 유명하고 활발히 유지보수되는 앱을 선택했습니다:

  • AntennaPod — 파드 관리자
  • Bitcoin Wallet — 암호화폐 지갑
  • DAVx5 — CalDAV/CardDAV 동기화
  • GnuCash Android — 재무 회계
  • K-9 Mail — 이메일 클라이언트
  • KeePassDX — 비밀번호 관리자
  • NewPipe — 유튜브 프론트엔드
  • Nextcloud — 클라우드 저장소 클라이언트
  • Signal — 암호화 메신저
  • VLC — 미디어 플레이어

이것들은 버려진 부가 프로젝트가 아닙니다. 이것들은 발전했고 인기 있는 앱들로 활발한 개발자 커뮤니티가 있습니다. 그중 일부는 매우 민감한 데이터를 처리합니다 - 비밀번호, 암호화폐, 개인 메시지, 금융 기록.


방법론

각 앱에 대해 I:

  1. F-Droid에서 APK를 다운로드
  2. 내 정적 분석 스캐너를 실행(자동화된 SAST가 매니페스트 분석, smali 코드 분석, 네이티브 라이브러리 검사, 오염 분석 및 암호화 검사를 포함합니다)
  3. APK를 디컴파일했습니다.APKTool을 사용하여 smali 코드, мани페스트, 및 리소스를 얻기
  4. 수동으로 모든 발견을 확인했습니다실제 디컴파일 코드와 대조하여, 지정된 코드가 진정으로 취약한지 아니면 거짓 긍정인지 확인합니다.

이 마지막 단계는 중요합니다. 자동 스캐너는 많은 후보를 생성합니다. 수동 검증 없이 진짜 것이 무엇이고 노이즈가 무엇인지 알 수 없습니다.


나는 발견한 것: 가장 흔한 5가지 취약점

10개 앱 전체의 모든 결과를 수동으로 검증한 후, 명확한 패턴이 나타났습니다. 같은 실수가 반복되었습니다 — 앱의 인기 여부나 다루는 데이터의 민감도에 관계없이.

1. 허가 없이Экспор트된 구성 요소

10앱 중 9개에서 찾음

안드로이드 구성 요소(액티비티, 서비스, 리시버, 콘텐츠 제공자)가 선언된 것들exported="true"그들과 상호작용할 때 허가 없이도 가능하다는 것을 의미합니다. 이는 같은 기기에 설치된 어떤 앱도 이러한 구성 요소를 실행할 수 있으며, 이들에게 데이터를 보내거나 이들로부터 데이터를 받을 수 있다는 것을 의미합니다.

이것이 위험한 이유: 금융 앱에서는 악성 앱이 "돈을 보내기" 화면을 실행할 수 있습니다. 비밀번호 관리자에서는 데이터베이스 해제 흐름을 트리거할 수 있습니다. 이메일 클라이언트에서는 사전에 채워진 데이터와 함께 편집 화면을 실행할 수 있습니다.

수정은 간단합니다 — 외부 접근이 필요하지 않은 컴포넌트에 대해 exported="false"를 설정하거나 추가하면 됩니다.android:permission는 어떤 사람이 그들과 상호작용할 수 있는지 제한하는 속성으로 사용됩니다.

2. 너무 광범위한 FileProvider 경로

발견된 곳: 10개 앱 중 4개

안드로이드의 FileProvider는 앱 간 파일을 안전하게 공유하기 위해 설계되었습니다. 하지만 제공자의 경로 구성이 <root-path path="." />를 포함하고 있으면<external-path path="." />는 효과적으로 전체 파일 시스템 또는 모든 외부 저장 공간에 접근을 허용합니다.

파일 제공자 설정이 /storage/ (모든 외부 저장 공간), 전체 앱 내부 디렉토리, 그리고 최악의 경우 전체 기기 파일 시스템에 접근을 허용하는 앱을 발견했습니다.

이 제공자들은 일반적으로 내보내지지 않지만, 그들은 사용합니다grantUriPermissions="true" — 그래서 어떤 xuất khẩu된 활동이 URI 권한을 전달한다면 (일반적인 Android 패턴), 광범위한 경로는 활용될 수 있습니다.

3. 평문 트래픽 허용 + 사용자 CA 신뢰

발견된 곳: 10개 앱 중 6개

많은 앱들이 네트워크 보안 설정에 cleartextTrafficPermitted="true"를 가지고 있어 암호화되지 않은 HTTP 연결을 허용했습니다. 몇몇은 또 사용자가 설치한 CA 인증서를 명시적으로 신뢰했습니다.<certificates src="user" />.

자체 호스팅 서버(캘다브, 이메일, 클라우드 저장소)에 연결하는 앱에 대해서는 일부 의도적입니다 — 사용자는 자신의 서버에 연결해야 하며, 이는 HTTP 또는 자체 서명 인증서를 사용할 수 있습니다. 하지만 구성은 전역적으로 적용되며, 자체 호스팅 엔드포인트에만 적용되지 않습니다. 앱이 수행하는 모든 연결 — API 호출, 분석, 업데이트 확인 —은 기본적으로 중단을 허용합니다.

특히 우려되는 사례: 미디어 플레이어가 평문 HTTP를 통해 업데이트 파일을 다운로드했습니다. 같은 네트워크에 있는 중간자 공격자는 악성 APK를 정당한 업데이트로 제공할 수 있습니다.

4. 약한 암호화 구현

발견된 곳: 10개 앱 중 3개

위험한 것부터 고대적인 것까지 다양했습니다.

  • SSL 검증이 완전히 비활성화되었습니다 — 하나의 앱이 실제로 모든 인증서를 검증 없이 받는 메서드를 호출한다. 금융 앱. 실제 돈을 다루고 있다.
  • ECB 암호 모드 — 미디어 플레이어의 원격 액세스 기능이 AES를 ECB 모드로 사용하며, 동일한 평문 블록은 동일한 암호문 블록을 생성한다. 이는 교과서적인 암호학 오류이다.
  • java.util.Random 암호학적 맥락에서 — 대신SecureRandom로 출력이 예측 가능해집니다.
  • TOFU(Trust-On-First-Use) 없이 고정하지 않음 — 서버 인증서가 수락되면 영원히 신뢰하며, 인증서가 변경되더라도 (MITM 공격을 시사할 수 있음) 신뢰합니다.

5. 탭잭킹(오버레이 공격) 방지 기능 누락

발견된 곳: 10개 앱 중 8개

앱 중 거의 없이 설정하지 않음filterTouchesWhenObscured="true"는 민감한 UI 요소 위에서 작동합니다. 이는 오버레이 권한을 가진 악성 앱이 앱 위에 가시성 없는 레이어를 그리고 사용자의 탭을 캡처할 수 있거나, 사용자가 의도하지 않은 버튼을 탭하도록 속일 수 있음을 의미합니다.

특히 다음과 같은 경우에 문제가 됩니다.

  • 비밀번호 관리자 (마스터 비밀번호 입력 캡처)
  • 암호화폐 지갑 (거래 확인)
  • 인증서 신뢰 대화 상자 (악성 인증서 수락)
  • OAuth/로그인 화면 (접근 권한 부여)

의미

오픈 소스는 자동으로 안전하다는 의미는 아닙니다. 코드가 검토에 확장된다는 의미이지, 그것이 확인되었다는 의미는 아닙니다을 검토했습니다. 이 앱들은 인기가 많고 잘 유지되고 있으며, 활발한 커뮤니티를 가지고 있지만, 시스템적인 검토를 통해 발견될 수 있는 보안 문제가 여전히 있습니다.

이것은 개발자들을 비난하는 것이 아닙니다. 오픈 소스 유지보수자들은 종종 뛰어난 업적을 이루는 자원봉사자들이 많습니다. 중요한 것은 보안은 헌신적이고 집중적인 주의가 필요하다는 것입니다. 기능 구축과는 다른 기술 세트이며, 전문 도구와 전문 지식의 혜택을 받습니다.

Android 앱이 민감한 데이터를 처리하는 경우——금융 정보, 자격 증명, 개인적인 통신, 건강 데이터——보안 검토가 필요합니다. 단순히 수백 개의 후보를 생성하고 일을 끝내는 자동 스캔만으로는 아니라, 모든 발견 사항이 검증되고 맥락에 맞게 평가하는 올바른 접근이 필요합니다.


핵심 요약

  1. 자동 스캐너는 후보를 찾는 것이 아니라 확인된 취약점은 아닙니다. 수동 검증 없이 진짜 것이 무엇인지 알 수 없습니다.

  2. 거의 모든 앱에서 동일한 5가지 취약점 패턴이 나타납니다.Экспортированные компоненты, 광범위한 파일 공급자, 평문 트래픽, 약한 암호화 및 누락된 오버레이 보호. 이는 어떤 보안 검토도 포착해야 할 쉬운 과일입니다.

  3. 문맥은 매우 중요합니다. 미디어 플레이어에서 공개 비디오를 스트리밍하는 때의 평문 트래픽은 은행 앱에서의 평문 트래픽과는 다른 위험입니다. 맥락 없이 발견된 보안 문제는 보고서의 한 줄에 불과합니다.

  4. 오픈 소스는 보안 검토를 가능하게 하지만, 그것을 대체하지는 않습니다. 코드가 공개되어 있어 철저한 분석의 전제 조건이지만, 분석이 이루어진 것을 보장하지는 않습니다.


안드로이드 애플리케이션 보안 평가에 특화된 모바일 보안 연구원입니다. 앱의 보안 포지션에 대해 논의하고 싶으시면 yehor.mamaiev@gmail.com으로 연락해 주세요.