iOSVulnLab

Jun 15, 2023

iOSVulnLab

Intentionally Vulnerable Training App

GitHub Repo

A break-me-on-purpose playground that bundles the  “greatest hits” of iOS security mistakes so engineers and pentesters can sharpen their claws—without risking a real production app.

The project is open-source on GitHub and in my mobile-security workshops and university courses that follow OWASP MASVS & MASTG curricula.

Overview

iOSVulnLab is a full-featured, but deliberately flawed, Swift app that mimics a real app. Every major layer (storage, networking, UI, auth, crypto) contains at least one exploitable weakness, giving learners a realistic, end-to-end target for:

  • Static analysis (code review, config inspection, secure-storage checks)

  • Dynamic analysis (runtime hooking, proxy interception, tampering)

  • MASVS mapping—each flaw is tagged to its corresponding control for easy reporting

Features & Built-In Vulnerabilities (spoiler alert)

Functional Area

Vulnerability Highlights

Secure Storage

• Unprotected Keychain items

• Secrets & feature flags in clear-text UserDefaults

App Configuration

• API keys & endpoints exposed in Info.plist

• Hard-coded credentials in source

Networking

• ATS disabled

• No SSL pinning on HTTPS calls

Web Views

• Unrestricted SFSafariViewController redirects

• Injectable JS in WKWebView

Logging & Debug

• Verbose logs leaking PII

• Hidden debug menus & back-door API endpoints

Access Control

• Role checks bypassable via parameter tampering

Easter Eggs

• Undocumented features & “flag” endpoints for CTF-style challenges


Suggested Testing Scenarios

  1. Static Analysis – grep for hard-coded secrets, inspect crypto misuse.

  2. HTTP Interception – proxy traffic, confirm lack of ATS & certificate pinning.

  3. Local Storage – dump UserDefaults, Keychain, SQLite for sensitive data.

  4. Auth Bypass – tamper with payloads and in-app parameters to reach admin views.

  5. Runtime Instrumentation – hook methods with Frida/Objection to force hidden flags.

LEDGE.DIGITAL

© 2019–2025

Marko Lihter