RepoPilotOpen in app →

seemoo-lab/openhaystack

Build your own 'AirTags' 🏷 today! Framework for tracking personal Bluetooth devices via Apple's massive Find My network.

Mixed

Stale — last commit 2y ago

worst of 4 axes
Use as dependencyConcerns

copyleft license (AGPL-3.0) — review compatibility; last commit was 2y ago

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

No critical CVEs, sane security posture — runnable as-is.

  • 13 active contributors
  • Distributed ownership (top contributor 42% of recent commits)
  • AGPL-3.0 licensed
Show 4 more →
  • CI configured
  • Tests present
  • Stale — last commit 2y ago
  • AGPL-3.0 is copyleft — check downstream compatibility
What would change the summary?
  • Use as dependency ConcernsMixed if: relicense under MIT/Apache-2.0 (rare for established libs)

Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Embed the "Forkable" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Forkable
[![RepoPilot: Forkable](https://repopilot.app/api/badge/seemoo-lab/openhaystack?axis=fork)](https://repopilot.app/r/seemoo-lab/openhaystack)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card (1200×630)

This card auto-renders when someone shares https://repopilot.app/r/seemoo-lab/openhaystack on X, Slack, or LinkedIn.

Onboarding doc

Onboarding: seemoo-lab/openhaystack

Generated by RepoPilot · 2026-05-10 · Source

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/seemoo-lab/openhaystack shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

🎯Verdict

WAIT — Stale — last commit 2y ago

  • 13 active contributors
  • Distributed ownership (top contributor 42% of recent commits)
  • AGPL-3.0 licensed
  • CI configured
  • Tests present
  • ⚠ Stale — last commit 2y ago
  • ⚠ AGPL-3.0 is copyleft — check downstream compatibility

<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live seemoo-lab/openhaystack repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/seemoo-lab/openhaystack.

What it runs against: a local clone of seemoo-lab/openhaystack — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in seemoo-lab/openhaystack | Confirms the artifact applies here, not a fork | | 2 | License is still AGPL-3.0 | Catches relicense before you depend on it | | 3 | Default branch main exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 700 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>seemoo-lab/openhaystack</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of seemoo-lab/openhaystack. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/seemoo-lab/openhaystack.git
#   cd openhaystack
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of seemoo-lab/openhaystack and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "seemoo-lab/openhaystack(\\.git)?\\b" \\
  && ok "origin remote is seemoo-lab/openhaystack" \\
  || miss "origin remote is not seemoo-lab/openhaystack (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(AGPL-3\\.0)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"AGPL-3\\.0\"" package.json 2>/dev/null) \\
  && ok "license is AGPL-3.0" \\
  || miss "license drift — was AGPL-3.0 at generation time"

# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
  && ok "default branch main exists" \\
  || miss "default branch main no longer exists"

# 4. Critical files exist
test -f "OpenHaystack/OpenHaystack.xcodeproj/project.pbxproj" \\
  && ok "OpenHaystack/OpenHaystack.xcodeproj/project.pbxproj" \\
  || miss "missing critical file: OpenHaystack/OpenHaystack.xcodeproj/project.pbxproj"
test -f "Firmware/ESP32/main/openhaystack_main.c" \\
  && ok "Firmware/ESP32/main/openhaystack_main.c" \\
  || miss "missing critical file: Firmware/ESP32/main/openhaystack_main.c"
test -f "CVE-2020-9986/OFReadKeys/OFReadKeys/FindMyKeyExtractor.swift" \\
  && ok "CVE-2020-9986/OFReadKeys/OFReadKeys/FindMyKeyExtractor.swift" \\
  || miss "missing critical file: CVE-2020-9986/OFReadKeys/OFReadKeys/FindMyKeyExtractor.swift"
test -f "CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/FindMyController.swift" \\
  && ok "CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/FindMyController.swift" \\
  || miss "missing critical file: CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/FindMyController.swift"
test -f "Firmware/Linux_HCI/HCI.py" \\
  && ok "Firmware/Linux_HCI/HCI.py" \\
  || miss "missing critical file: Firmware/Linux_HCI/HCI.py"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 700 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~670d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/seemoo-lab/openhaystack"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

TL;DR

OpenHaystack is a framework that lets you build custom Bluetooth tracking tags that leverage Apple's Find My network to locate devices anywhere globally. It reverse-engineers the offline finding protocol, allowing ESP32/micro:bit devices to broadcast encrypted location packets that nearby iPhones (running the companion app) discover and report to Apple's servers without cellular coverage. The core innovation is spoofing Apple Find My accessories to piggyback on Apple's infrastructure for personal device tracking. Multi-platform monorepo: CVE-2020-9986/OFReadKeys/ contains the proof-of-concept Swift app demonstrating the vulnerability; the root level contains firmware build configs (build-firmware.yaml, build-esp-idf/) for embedded targets; Dart codebase (157K LOC) suggests a Flutter mobile companion; C/C++/Python/Kotlin scattered across hardware abstraction layers. Architecture separates concern: cryptographic protocol layer, BLE advertisement generation, location report decryption (FindMyController.swift, DecryptReports.swift), and platform-specific UI (SwiftUI for macOS, Flutter for cross-platform mobile).

👥Who it's for

Security researchers and hobbyists building DIY tracking hardware; developers integrating Find My support into custom Bluetooth devices (IoT, wearables); SEEMOO Lab researchers conducting privacy/security analysis of closed Apple protocols; enterprise teams needing custom asset tracking independent of Apple's official AirTag ecosystem.

🌱Maturity & risk

Experimental/actively developed but with notable limitations: the README explicitly states 'untested and incomplete' code; the project is well-structured with CI/CD pipelines (.github/workflows/) and recent commits visible, but the codebase carries a security research heritage rather than production hardening. The CVE-2020-9986 mention shows real-world security implications were addressed, but OpenHaystack itself is a reference implementation, not battle-tested. Verdict: research-grade prototype with active maintenance.

High research/security risk: the project demonstrates protocol vulnerabilities (CVE-2020-9986 was a real flaw in Apple's implementation), and reverse-engineered implementations of closed protocols are inherently fragile across iOS updates. Dependency risk is moderate—Swift/Dart/C++ mix requires multiple build toolchains; the .gitmodules suggests git submodules that could point to unmaintained forks. No obvious test suite visible in file list, reducing confidence in regression detection. Breaking changes likely as Apple patches the Find My protocol.

Active areas of work

Active CI/CD pipeline: workflows for building ESP-IDF firmware, macOS app, and CVE PoC app suggest ongoing build/test validation. The .pre-commit config indicates development practices are being tightened. GitHub workflows reference release.yml, indicating semantic versioning is in place. Recent focus appears split between firmware builds (multiple .yaml files in .github/workflows/) and macOS/iOS app maintenance.

🚀Get running

git clone https://github.com/seemoo-lab/openhaystack.git && cd openhaystack && git submodule update --init --recursive

For macOS app: open CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj and build in Xcode.

For Flutter mobile: flutter pub get && flutter run (requires Flutter SDK in local.properties).

For ESP32 firmware: pip install -r requirements.txt && idf.py build (requires ESP-IDF).

Daily commands: macOS (Xcode): xcodebuild -project CVE-2020-9986/OFReadKeys/OFReadKeys.xcodeproj -scheme OFFetchReports build

Flutter Android/iOS: flutter run -v

ESP32 firmware: idf.py build && idf.py flash

🗺️Map of the codebase

  • OpenHaystack/OpenHaystack.xcodeproj/project.pbxproj — Main Xcode project configuration that defines the macOS app's build targets, dependencies, and code signing for the Find My network integration.
  • Firmware/ESP32/main/openhaystack_main.c — Core ESP32 firmware implementing Bluetooth LE advertising for Find My protocol—every hardware deployment depends on this.
  • CVE-2020-9986/OFReadKeys/OFReadKeys/FindMyKeyExtractor.swift — Key extraction logic that demonstrates the vulnerability and is foundational to understanding the Find My security model this project leverages.
  • CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/FindMyController.swift — Orchestrates Find My API communication and report fetching—central to the tracking backend workflow.
  • Firmware/Linux_HCI/HCI.py — Linux-based Bluetooth HCI implementation providing cross-platform firmware testing and emulation capabilities.
  • CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/DecryptReports.swift — Decryption of location reports using extracted keys—critical security and cryptographic logic all users must understand.
  • Firmware/Microbit_v1/offline-finding/main.c — Alternative firmware target demonstrating offline finding implementation on resource-constrained devices.

🛠️How to make changes

Add Support for a New Hardware Target

  1. Create a new firmware directory under Firmware/ (e.g., Firmware/NRF52) with a Makefile and main.c implementing BLE advertisement. (Firmware/ESP32/main/openhaystack_main.c)
  2. Implement the Find My advertisement payload format, rotating keys at regular intervals per the protocol. (Firmware/ESP32/main/openhaystack_main.c)
  3. Add a new GitHub Actions workflow (.github/workflows/build-firmware-<target>.yaml) to compile and test the firmware. (.github/workflows/build-firmware-esp32.yaml)
  4. Document hardware-specific setup (GPIO, BLE module configuration) in a README.md in the firmware directory. (Firmware/ESP32/README.md)

Add a New UI Feature to the macOS App

  1. Create a new SwiftUI View component in the OFReadKeys or OFFetchReports target. (CVE-2020-9986/OFReadKeys/OFFetchReports/ContentView.swift)
  2. Wire the view into the main ContentView or create a new tab using NavigationLink. (CVE-2020-9986/OFReadKeys/OFReadKeys/ContentView.swift)
  3. Connect any backend logic through FindMyController or existing models in FindMy/Models.swift. (CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/Models.swift)
  4. Update the Xcode project file to include new asset files if needed. (OpenHaystack/OpenHaystack.xcodeproj/project.pbxproj)

Extend Find My Report Decryption with New Analytics

  1. Add new data fields or filtering logic to the Models.swift file to capture additional report metadata. (CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/Models.swift)
  2. Extend DecryptReports.swift to process the new fields after AES-GCM decryption. (CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/DecryptReports.swift)
  3. Update the MapViewController or create a new analytics view to display the new insights. (CVE-2020-9986/OFReadKeys/OFFetchReports/MapViewController.swift)

Add Cross-Platform Testing via HCI Emulation

  1. Extend Firmware/Linux_HCI/HCI.py with test cases that simulate device advertisement and rotation. (Firmware/Linux_HCI/HCI.py)
  2. Create a new CI workflow that runs the HCI emulation tests on every commit. (.github/workflows/build-firmware.yaml)

🔧Why these technologies

  • Swift & SwiftUI — Native macOS development language ensuring seamless integration with Xcode, Apple frameworks, and system-level APIs for Find My network access.
  • Bluetooth Low Energy (BLE) / GAP — Required for energy-efficient continuous advertisement of device locations using small, rotating payloads compatible with Apple's Find My scanning infrastructure.
  • BoringSSL — Provides AES-GCM encryption and cryptographic primitives essential for encrypting/decrypting Find My reports and deriving session keys.
  • ESP-IDF (ESP32) & ARM Embedded — Industry-standard frameworks for low-cost, widely available microcontroller platforms enabling mass deployment of tracking hardware.
  • GitHub Actions — Automated CI/CD for firmware compilation, app codesigning, and release packaging across multiple target platforms.

⚖️Trade-offs already made

  • Leverage CVE-2020-9986 for key extraction instead of official Apple APIs

    • Why: Apple does not expose Find My pairing/key generation APIs; the CVE allows independent key generation matching Apple's protocol.
    • Consequence: Code depends on a specific vulnerability; Apple patches may break key extraction unless workarounds are implemented. Educational and research-only usage.
  • Support multiple hardware targets (ESP32, micro:bit, Linux HCI) rather than single platform

    • Why: Maximizes accessibility and allows users to choose hardware based on cost, power, and availability; demonstrates protocol portability.
    • Consequence: Increased maintenance burden; each target requires platform-specific build toolchain and testing.
  • macOS-only desktop app instead of cross-platform mobile

    • Why: Simplifies implementation and integrates tightly with macOS Bluetooth APIs; aligns with proof-of-concept research goals.
    • Consequence: Users with Windows/Linux cannot manage tags natively; mobile users are out of scope.
  • Separate CVE-2020-9986 exploit app from main OpenHaystack framework

    • Why: Clearly documents the vulnerability exploitation without embedding it in the primary distribution; allows
    • Consequence: undefined

🪤Traps & gotchas

BoringSSL dependency requires OpenSSL headers and Xcode command-line tools to be installed (brew install openssl); build may fail silently if not present. Submodules (.gitmodules) must be initialized or Firmware builds fail. ESP-IDF requires specific Python version pinning and a working C++ compiler toolchain (xtensa-esp32-elf). Apple's Find My protocol is proprietary/closed—updates to iOS can break compatibility without notice. CVE-2020-9986 was patched; using this PoC code against modern iOS may not work. The Flutter build requires both Dart and native platform toolchains (Xcode for iOS, Android SDK for Android). Local development requires setting flutter.sdk in local.properties for Gradle builds.

🏗️Architecture

💡Concepts to learn

  • Bluetooth Low Energy (BLE) Advertisement — OpenHaystack's core mechanism: the framework generates and broadcasts BLE advertisements spoofing Apple Find My accessories; understanding BLE packet structure, manufacturer data fields, and advertisement intervals is essential to modifying or extending the firmware.
  • Elliptic Curve Cryptography (ECC) — Find My protocol uses ECC (likely P-256) for key derivation and public-key operations; knowing ECC fundamentals helps you understand why ephemeral keys are rotated and how the protocol achieves privacy without server-side tracking.
  • Offline Location Tracking & Crowdsourced Reporting — OpenHaystack leverages Apple's massive network of iPhones as unwitting sensors to report locations; this architecture (offline device → encrypted beacon → crowdsourced discovery → central decryption) is the innovation being reverse-engineered and the security risk being analyzed.
  • HMAC-based Key Derivation (HKDF) — Find My likely uses HKDF to derive session keys from master keys; used in FindMyKeyDecoder.swift to compute the keys needed to decrypt location reports—fundamental to the decryption pipeline.
  • AES Encryption (GCM mode) — Location reports are encrypted with AES-GCM; OpenHaystack's DecryptReports.swift must correctly implement GCM decryption to recover positions—any flaw here breaks the entire tracking capability.
  • Reverse Engineering & Protocol Specification — This entire project is a case study in reverse-engineering a proprietary, closed protocol (Apple Find My); understanding how to infer message formats, state machines, and cryptographic flows from captured traffic is the meta-skill underlying all contributions.
  • Firmware Development for Constrained Devices (ESP32/micro:bit) — The Firmware/ directory targets resource-constrained MCUs; knowledge of bare-metal BLE stack programming, memory footprint optimization, and cryptographic library selection (BoringSSL vs. mbedTLS) is critical for implementing tracking accessories.
  • positive-security/airtag-hacking — Parallel AirTag security research exploring hardware exploitation and firmware extraction; similar reverse-engineering methodology but focused on the physical device layer.
  • hexway/apple_bluetooth_research — Broader Apple Bluetooth protocol analysis covering HomeKit and Continuity alongside Find My; useful for understanding the ecosystem OpenHaystack plugs into.
  • seemoo-lab/nexmon — Sister project from SEEMOO Lab providing firmware reverse-engineering tools for Broadcom Bluetooth chips; foundational for extracting and modifying BLE stacks used in OpenHaystack hardware.
  • micropython/micropython — MicroPython interpreter for micro:bit and ESP32; OpenHaystack firmware likely uses or could use MicroPython for rapid prototyping of BLE accessory logic.
  • espressif/esp-idf — Official ESP-IDF development framework for ESP32; the build pipeline (.github/workflows/build-firmware-esp32.yaml) is directly built on top of this.

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add comprehensive unit tests for FindMyKeyDecoder.swift in CVE-2020-9986 module

The CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/FindMyKeyDecoder.swift file handles critical cryptographic key decoding logic but has no corresponding test file in the repository. This is a security-sensitive component that decrypts Find My reports, making unit tests essential for preventing regressions and validating correctness of the decryption algorithm.

  • [ ] Create CVE-2020-9986/OFReadKeys/OFFetchReportsTests/ directory structure
  • [ ] Add FindMyKeyDecoderTests.swift with test cases for key decoding, edge cases, and known test vectors
  • [ ] Test DecryptReports.swift integration with sample encrypted payloads
  • [ ] Add tests to verify BoringSSL wrapper (BoringSSL.m) cryptographic operations
  • [ ] Update OFReadKeys.xcodeproj to include the new test target in build scheme

Create GitHub Action workflow to build and validate ESP32 firmware on pull requests

The repo has build-firmware.yaml and build-firmware-esp32.yaml workflows that appear incomplete or only trigger on releases. A dedicated PR validation workflow would catch firmware compilation errors early, similar to the existing build-app.yml for the Flutter app. This ensures contributors cannot merge code that breaks embedded device builds.

  • [ ] Review .github/workflows/build-firmware-esp32.yaml and verify ESP-IDF build action is correctly configured
  • [ ] Add a new .github/workflows/validate-firmware-pr.yml that triggers on pull_request events targeting main branches
  • [ ] Ensure the workflow uses the existing .github/actions/build-esp-idf/action.yaml custom action
  • [ ] Add build status checks to prevent merging if firmware compilation fails
  • [ ] Document firmware build requirements in CONTRIBUTING.md (create if missing)

Add integration tests for Find My location decryption pipeline (DecryptReports.swift → Models.swift)

The CVE-2020-9986/OFReadKeys/OFFetchReports/FindMy/ directory contains DecryptReports.swift, FindMyController.swift, and Models.swift that work together to fetch and decrypt Find My location reports, but there are no integration tests validating the end-to-end flow. Adding tests would ensure the report fetching, decryption, and model mapping work correctly together.

  • [ ] Create FindMyIntegrationTests.swift in OFFetchReportsTests/
  • [ ] Mock ReportsFetcher.m to return sample encrypted report payloads
  • [ ] Test FindMyController decryption pipeline with real Find My protocol message samples
  • [ ] Validate Models.swift parsing of decrypted location data
  • [ ] Add test fixtures for various report types (location, offline reports, etc.)
  • [ ] Update CI workflow to run integration tests alongside unit tests

🌿Good first issues

  • Add unit tests for FindMyKeyDecoder.swift—currently no test file visible; implement XCTest cases covering key derivation with known vectors to prevent regressions in crypto logic.
  • Document the BLE advertisement packet format in Models.swift with inline comments explaining each field (manufacturer ID, flag byte meanings, ephemeral key structure)—useful for contributors reverse-engineering other Find My clones.
  • Create a standalone CLI tool (Swift or Python) to generate sample encrypted location reports for testing without hitting Apple's servers; would unblock offline testing and CI/CD integration.

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 8d214aa — Use macOS 14 runner with Xcode 15.3 (sebinbash)
  • 27d975b — Add manual trigger for all workflows (sebinbash)
  • 173eb74 — Fix CI to use renamed GitHub Action (sebinbash)
  • 17410e2 — Create a SetttingsView to manually enter Search Party Token, add error handling for expired token (sebinbash)
  • 3ef4280 — Use AOSKit to generate anisette headers (sebinbash)
  • 1b66d15 — Fix report decryption for new report format (sebinbash)
  • e8dcf61 — Adding CITATION.cff file (Sn0wfreezeDev)
  • 7d72fa1 — [fix] Derive symmetric key correctly (freak4pc)
  • 6eb2822 — Updating Mail Plugin to work with macOS 13.5 and 13.6 (Sn0wfreezeDev)
  • fe1e286 — Compatibility with macOS 13.3 (Sn0wfreezeDev)

🔒Security observations

The OpenHaystack codebase exhibits moderate security concerns, primarily in the Android build configuration. Critical issues include the use of debug signing keys for release builds and significantly outdated SDK versions (compileSdkVersion 31, targetSdkVersion 30, minSdkVersion 21). The absence of code obfuscation for production builds increases reverse-engineering risk. The project would benefit from updating to modern Android API levels, implementing proper release signing, adding ProGuard/R8 obfuscation, and integrating automated security scanning into CI/CD pipelines. The CVE-2020-9986 proof-of-concept code should be better isolated from production sources.

  • High · Outdated Android compileSdkVersion and targetSdkVersion — build.gradle (Android configuration). The build.gradle file specifies compileSdkVersion 31 and targetSdkVersion 30, which are significantly outdated. As of 2024, the minimum recommended targetSdkVersion is 34+. Using outdated SDK versions exposes the application to known security vulnerabilities and misses critical security patches and improvements. Fix: Update compileSdkVersion to 34+ and targetSdkVersion to 34+. Ensure compatibility testing is performed with the latest SDK versions.
  • High · Insecure Release Build Configuration — build.gradle (buildTypes.release section). The release build type uses debug signing configuration instead of a proper release key. The code comment explicitly states 'Signing with the debug keys for now, so flutter run --release works.' This allows debug builds to be released to production, compromising app integrity and enablement of tampering. Fix: Create and configure a proper release signing key. Never use debug keys for release builds. Implement secure key management practices for production signing certificates.
  • Medium · Missing ProGuard/R8 Configuration — build.gradle (buildTypes section). The build.gradle file lacks ProGuard or R8 configuration for the release build type. This means production builds are not obfuscated, making reverse engineering significantly easier and potentially exposing sensitive logic, API endpoints, and encryption schemes. Fix: Add ProGuard/R8 configuration with appropriate obfuscation rules for the release build type. Include rules to protect critical classes and methods while maintaining necessary functionality.
  • Medium · Overly Permissive Minimum SDK Version — build.gradle (defaultConfig section). minSdkVersion is set to 21 (Android 5.0, released 2014), which is over 9 years old. This exposes the application to numerous security vulnerabilities present in older Android versions and prevents use of modern security APIs. Fix: Increase minSdkVersion to at least 24 (Android 7.0) or higher depending on business requirements. Modern API levels include better security features and cryptographic standards.
  • Medium · Potential Sensitive Data in Local Properties File — build.gradle (localPropertiesFile handling). The build.gradle file reads from 'local.properties' file which is used to store Flutter SDK path and versioning information. While this specific file may not contain secrets, the pattern suggests developer environment configuration that should not be committed to version control. Fix: Ensure local.properties is properly listed in .gitignore. Use environment variables or secure configuration management for sensitive build parameters instead of local property files.
  • Low · Missing Security Metadata in Project Structure — .github/workflows/ directory. There is no evidence of security testing frameworks, SAST tools, or dependency vulnerability scanning in the visible CI/CD workflows. The project lacks proactive security validation. Fix: Integrate security scanning tools such as: OWASP Dependency-Check, Firebase App Distribution with security testing, static analysis tools (lint, detekt), and dependency vulnerability scanners in CI/CD pipelines.
  • Low · CVE-2020-9986 Component Not Isolated — CVE-2020-9986/ directory. The CVE-2020-9986 directory contains a proof-of-concept exploitation code for a known vulnerability. While educational, this should be clearly marked and isolated to prevent accidental inclusion in production builds. Fix: Move CVE-related code to a separate 'research' or 'poc' branch/repository. Add clear documentation and ensure it's excluded from any production build configurations.

LLM-derived; treat as a starting point, not a security audit.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Mixed signals · seemoo-lab/openhaystack — RepoPilot