慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

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 款流行的開源 Android 應用程式 — 這些是每天有數百萬人使用的應用程式 — 並將它們通過了我的靜態分析安全掃描器。接著我手動驗證了每一個發現,對應的 decompiled APK 程式碼。

結果:10 款應用程式中有 60 個確認的漏洞。


應用程式

我故意選擇了不同類別中知名度高且持續維護的應用程式:

  • AntennaPod — Podcast 管理器
  • Bitcoin Wallet — 加密貨幣錢包
  • DAVx5 — CalDAV/CardDAV 同步
  • GnuCash Android — 會計軟體
  • K-9 Mail — 郵件客戶端
  • KeePassDX — 密碼管理器
  • NewPipe — YouTube 前端
  • Nextcloud — 雲端儲存客戶端
  • Signal — 加密通訊軟體
  • VLC — 媒體播放器

這些不是被遺棄的副項目。它們是成熟的、受歡迎的應用程式,擁有活躍的開發者社群。其中一些處理極其敏感的數據 — 密碼、加密貨幣、私人訊息、財務記錄.


方法論

針對每個應用程式我:

  1. 從F-Droid下載APK
  2. 運行我的靜態分析掃描器 (自動化SAST,涵蓋清單分析、smali代碼分析、原生庫檢查、汙染分析及加密檢查)
  3. 使用apktool反編譯APK以獲取smali代碼、清單及資源
  4. 人工核實每個發現與實際反編譯代碼對比 — 核實標記的代碼是否真正易受攻擊或為假陽性

這最後一步至關重要。自動掃描器會產生很多候選項。沒有手動驗證,你不知道什麼是實際的,什麼是噪音.


我發現的:5 個最常見的漏洞

在仔細驗證了 10 個應用程式的所有發現後,清晰的模式顯現出來。相同的錯誤一再出現——無論應用程式的普及程度或其處理數據的敏感性如何。

1. 未經授權保護的導出組件

發現於:10個應用程式中的9個

Android組件(活動、服務、接收器、內容提供者)被宣告為exported="true",而無需任何權限即可與它們互動。這意味著任何安裝在同一設備上的應用程式都可以啟動這些組件、向它們發送數據,或從它們接收數據。

為何這很危險:在一個金融應用程式中,這可能意味著惡意應用程式可以啟動「發送錢」的畫面。在一個密碼管理器中,它可能觸發資料庫解除鎖定流程。在一個電子郵件客戶端中,它可能啟動填好預設資料的草稿畫面.

修正方法很簡單 — 對不需要外部訪問的組件設定 exported="false",或者添加一個android:permission 用於限制誰可以與它們互動.

2. 文件提供者路徑過於寬泛

發現於:10個應用程式的4個

安卓的FileProvider是設計用於在應用程式之間安全地分享文件。但當提供者的路徑配置包含<root-path path="." /><external-path path="." />,它能有效地通過內容URI授權訪問整個文件系統或所有外部存儲空間。

我發現了一些應用程式,其中FileProvider的配置允許訪問/storage/(所有外部存儲空間)、整個應用程式內部目錄,在最壞的情況下,甚至是整個設備的文件系統。

儘管這些提供者通常是非導出的,但它們使用grantUriPermissions="true" — 所以如果任何導出的活動傳遞 URI 權限(一種常見的 Android 模式),廣泛的路徑就會變得可被利用。

3. 允許明文流量 + 使用者 CA 信賴

發現於:10 個應用程式中的 6 個

許多應用程式在其網路安全性設定中具有 cleartextTrafficPermitted="true",允許未加密的 HTTP 連接。幾個也明確信任使用者安裝的 CA 証明書與<certificates src="user" />.

對於連接自訂伺服器的應用程式(CalDAV、電子郵件、雲端儲存),這部分是故意的——使用者需要連接他們自己的伺服器,這些伺服器可能使用HTTP或自簽名憑證。但這個設定是全域性的,不僅適用於自訂的終端點。應用程式所建立的每一個連接——包括API呼叫、分析、更新檢查——預設允許被攔截。

一個特別令人關注的案例:一個媒體播放器透過明文HTTP下載更新檔案。在同一網路上的一個中間人攻擊者可以將一個惡意APK作為合法更新來提供。

4. 弱加密實現

發現於:10個應用程式中的3個

這些從危險到古老都有:

  • SSL驗證完全禁用 — 一個應用程式呼叫了一個字面意思上接受所有憑證而不進行任何驗證的方法。在一個金融應用程式中。處理現金。
  • ECB 加密模式 — 一個媒體播放器的遠程訪問功能使用 AES 在 ECB 模式下,其中相同的明文塊產生相同的密文塊。這是一本教科書中的加密錯誤。
  • java.util.Random 在加密術語下 — 而不是SecureRandom,使輸出可預測。
  • 信任首次使用 (TOFU) 而無釘住 — 一旦接受伺服器憑證,就永遠信任,即使憑證變更(這可能表示存在中間人攻擊)。

5. 缺少鎖定觸屏 (疊加攻擊) 保護

發現於:10 應用程式中 8 個

幾乎沒有應用程式設置filterTouchesWhenObscured="true" 在敏感的UI元素上。這意味著惡意應用程式如果有疊加權限,可以在應用程式上方繪製一層不可見的層,並捕捉用戶的點擊 — 或者騙用戶點擊他們沒有打算點擊的按鈕。

這對於以下情況尤其令人擔憂:

  • 密碼管理器(捕捉主密碼輸入)
  • 加密貨幣錢包(確認交易)
  • 證書信任對話方塊(接受惡意證書)
  • OAuth/登入螢幕(授權存取)

這代表什麼

開源不代表自動安全。它表示程式碼是 可供檢閱 — 不是表示它 已經被 已經評估。這些是備受歡迎、維護良好的應用程式,擁有活躍的社群,但它們仍然存在安全問題,這些問題可以透過系統性的評估來發現。

這不是要羞辱開發者。開源維護者通常是義工,從事非凡的工作。重點在於,安全需要專注、集中的注意。這與開發功能的技能不同,並且受益於專用的工具和專業知識。

若您的 Android 应用處理敏感資料 — 財務信息、憑證、個人通訊、健康資料 — 它值得一個安全性審查. 不僅僅是自動掃描產生數百個候選項就結束,而是一個正確的評估,其中每個發現都經過驗證和語境化.


主要收穫

  1. 自動掃描器發現候選項,而不是確認的漏洞。 沒有手動驗證,你不知道什麼是真的。

  2. 几乎每個應用程式都出現相同的 5 個漏洞模式。 輸出的組件、廣泛的檔案提供者、明文流量、弱加密和缺失的疊加保護。這些是任何安全審查都應該發現的低垂果實。

  3. 背景資訊極其重要。 媒體播放器串流公眾影片的明文交通,與銀行應用程式的明文交通所面臨的風險不同。沒有背景資訊的安全發現,僅僅是報告中的一行文字。

  4. 開源軟體促進了安全審查,但它並不能取代審查。 語言公開是進行全面分析的先決條件,而不是保證分析已經發生。


我是一名專業從事安卓應用程式安全評估的移動安全研究者。如果您想討論您的應用程式的安全性,隨時可以透過yehor.mamaiev@gmail.com聯繫我。