AI agent를 위해 소스 코드, APK, AAB, IPA 파일에 대한 증거 기반 Android 및 iOS 보안 감사를 수행합니다.
다른 이름 ictechgy/apsa, apsa
- 스타
- 0
- Tools
- —
- 다운로드, 30일
- —
- 최신 버전
- 1.7.0
- 마지막 커밋
- 2026년 11월 6일
- 라이선스
- MIT
APSA MCP란?
APSA은(는) MCP server입니다. AI agent를 위해 소스 코드, APK, AAB, IPA 파일에 대한 증거 기반 Android 및 iOS 보안 감사를 수행합니다.
프로젝트 README에서 생성된 요약
APSA MCP server 정보
APSA는 Android 및 iOS 플랫폼을 대상으로 모바일 애플리케이션에 대한 증거 기반 보안 감사를 제공합니다. 개발자와 보안 팀이 소스 코드와 함께 APK, AAB, IPA와 같은 컴파일된 파일을 검사할 수 있도록 설계되었습니다. 이 도구는 발견된 취약점을 공개 취약점 정보와 연관시키며 보고서, 커버리지 및 증거 이력을 관리합니다.
사용자는 명령줄 인터페이스(CLI), apsa tui 명령어를 통한 터미널 사용자 인터페이스(TUI), 또는 AI agent를 위한 MCP server를 통해 엔진과 상호작용할 수 있습니다. 시스템은 의존성 취약점 확인을 위한 온라인 OSV 쿼리와 macOS Seatbelt 또는 Linux bubblewrap을 사용한 샌드박스 격리 기반의 로컬 파싱을 포함하여 다양한 분석 모드를 지원합니다. 또한 Gradle 버전 카탈로그, Android 보안 게시물, Mach-O 메타데이터와 같은 복잡한 모바일 구조를 처리하여 애플리케이션의 상세한 보안 상태를 제공합니다.
활용 사례
- 1의존성 취약점 식별개발자는 OSV 쿼리를 통해 배포된 의존성에 알려진 취약점이 있는지 확인할 수 있습니다.
- 2CI 보안 검사 자동화GitHub Actions를 사용하여 모바일 보안 감사를 지속적 통합(CI) 파이프라인에 통합할 수 있습니다.
프로젝트의 README를 바탕으로 작성되었습니다. 모든 활용 사례는 해당 내용의 인용문과 대조하여 확인합니다.
APSA MCP 설치 방법
형식 확인: 2026년 11월 10일Cursor에 추가Goose에 추가Claude Code에 APSA MCP 설치
$ claude mcp add apsa -- uvx apsaCursor에 APSA MCP 설치
~/.cursor/mcp.json
{
"mcpServers": {
"apsa": {
"command": "uvx",
"args": [
"apsa"
]
}
}
}VS Code에 APSA MCP 설치
.vscode/mcp.json
{
"servers": {
"apsa": {
"type": "stdio",
"command": "uvx",
"args": [
"apsa"
]
}
}
}VS Code CLI에 APSA MCP 설치
$ code --add-mcp '{"name":"apsa","type":"stdio","command":"uvx","args":["apsa"]}'Claude Desktop에 APSA MCP 설치
claude_desktop_config.json
{
"mcpServers": {
"apsa": {
"command": "uvx",
"args": [
"apsa"
]
}
}
}Codex에 APSA MCP 설치
$ codex mcp add apsa -- uvx apsaCodex config.toml에 APSA MCP 설치
~/.codex/config.toml
[mcp_servers.apsa] command = "uvx" args = ["apsa"]
Gemini CLI에 APSA MCP 설치
$ gemini mcp add -s user apsa uvx -- apsaGemini settings.json에 APSA MCP 설치
~/.gemini/settings.json
{
"mcpServers": {
"apsa": {
"command": "uvx",
"args": [
"apsa"
]
}
}
}자동 검사
2026년 11월 14일에 실행됨전체 보고서 →자동 검사를 통과했습니다. 이는 보안 감사가 아닙니다. 코드를 직접 읽고 서버에 필요한 최소한의 권한만 부여하십시오. 검사 방식
- 소스 저장소 연결 및 접근 가능ictechgy/apsa is public and reachablegithub.com/ictechgy/apsa ↗통과
- 패키지가 이 저장소를 소스로 명시apsa names ictechgy/apsa as sourcepypi.org/project/apsa/ ↗통과
- 빌드 출처(Sigstore 증명)Sigstore attestation for apsapypi.org/project/apsa/ ↗통과
- 오픈 소스 라이선스 (OSI)MITspdx.org/licenses/MIT.html ↗통과
- 최근 1년 내 커밋 또는 릴리스Last commit or release 2026-11-06github.com/ictechgy/apsa ↗통과
- OpenSSF Scorecard검사되지 않음
- 패키지 이름이 인기 패키지와 유사하지 않음No popular package one edit away from apsa통과
- 패키지 및 해당 종속성에 중요한 보안 권고 없음82 resolved dependencies checked; no critical advisoryosv.dev ↗통과
- 모델에 대한 숨겨진 지침 없음0 tool descriptions and the README read; no override phrases, credential paths or hidden characters통과
- 파괴적인 도구에 라벨 표시됨검사되지 않음
- 원격 엔드포인트가 MCP 핸드셰이크에 응답검사되지 않음
README
GitHub에서 보기APSA
APSA 1.7.0. See the release scope and upgrade notes. Release readiness separates local validation from the hosted publication and public installation gates.
CI semantics change in 1.7.0. Coverage now separates execution gaps (partial, exit 3) from precision limits of the bounded static model (limited, exit 0 unless --strict-coverage or policy strict_coverage is set), and a threshold failure (exit 4) now takes precedence over an incomplete audit (exit 3). Waivers can record the approved severity, dependency advisory findings keep matching across advisory alias changes, and detection is broader for Kotlin, Swift/SwiftUI, archives and platform configuration. Review the upgrade notes before reusing 1.6.x CI conditions or baselines.
Evidence-first security audits for Android and iOS.
This English README is the source of truth. The Korean README follows it.
AI-assisted attack follow-up in 1.6.3. Packaged plaintext
credentials now have a separate, masked candidate check; compiled source-flow
coverage remains distinct. Model context retains the untrusted-evidence guidance
on detailed and truncated pages. See scope and research.
For easier use today, run apsa tui. A desktop app roadmap
describes a future local wrapper around the same engine; no desktop installer is
included in this release.
APSA 1.6.2 fixes Objective-C binding scope, incomplete OSV queries, precise claim verification, runtime cancellation and APK-set finding provenance. See patch scope and upgrade effects.
Upgrading to 1.6.3. Rescan before comparing reports or approving baselines: explicit synthetic evidence path kinds and deterministic CVE-alias selection can change finding IDs. Candidate-only SARIF descriptor IDs also migrate; APSA rule IDs and finding fingerprints remain unchanged by that SARIF change. Review baseline and waiver effects in the upgrade notes.
APSA 1.6 analysis extensions. This version adds bounded native cross-file
flow and input-bound path guards, JS/TS/Dart candidates, recorded Gradle variant
selection, OSV batching and transmission exclusions, authenticated runtime evidence,
AAB scalar resources, detached CMS consistency and paired verification.
See scope, options and remaining limits and the
new labeled synthetic results.
The remaining follow-up adds explicit .apks device
selection, IPA sparse-page/resource seals and supplied-anchor chain checks,
and a typed runtime recorder exercised with fresh synthetic app models.
The synthetic bundletool selection checks pass; installed split merging, Apple
signer identity and physical-device validation remain outside verified scope.
Fresh comparator samples remain partial and do not establish accuracy rankings.
iOS OS URL delivery is still under validation; callback dispatch alone is not
proof of app acquisition or backend revocation.
The five validation gates record new compiler,
signature-mutation and installed iOS simulator evidence, along with the separate
package, comparator, bundletool and backend measurement scopes.
See 1.6 release validation for the original 1.6 validation gates
and upgrade effects, including the changed MCP tool manifest.
APSA 1.6 large-input follow-up. Rule version: 2026.10.15.apsa.160.
Input staging and AST analysis share code priorities and round-robin scheduling
within inferred module groups. Lock inventories follow app code; ambiguous
*Tests/ and plain Frameworks/ directories retain production priority.
Reports record module omissions, comparisons expose input completeness, and the
Action summary shows staging omissions. Partial fingerprints remain SBOM
metadata instead of application hashes. See scope and validation.
APSA 1.6 review fixes. Bounded device-spec metadata, per-file partial reasons, text/compiled hybrid coverage, explicit signature binding scope, portable source comparisons and exact package-content checks are documented in strengthening scope and evidence limits. Synthetic acquisition adapters are source-test helpers and are excluded from the installed wheel.
APSA helps developers and security teams audit their own mobile apps. It inspects source code and APK/AAB/IPA builds, correlates public vulnerability information, and keeps evidence, coverage, and report history together. Use the CLI, terminal UI, or the same audit engine through MCP and reusable skills.
Pronounced “ap-sah”; Korean name 앱사. The name connects “app + audit” with App Security Audit. APSA combines the earlier Quaygate lint engine and Mobile Audit workflows in one package.
APSA 1.1 adds bounded model report pages, portable approved baselines, exported policy decisions, and explicit source module/configuration selection. See model and team workflows for the contract and release sequence for later analysis milestones.
Mixed unsupported source languages and truncated pattern results are incomplete. Declared Gradle versions remain candidates until resolved-build evidence is supplied. OS-CVE correlation reports a bounded recent window, so feed freshness alone cannot satisfy historical coverage.
APSA 1.2 adds AAB base-manifest/module DEX analysis, embedded IPA Mach-O
metadata, bounded Objective-C .m candidates and parser OS isolation that is
on by default where it can start.
Every AAB audit stays partial, and embedded IPA metadata does not authenticate
signatures. See analysis scope and limits and the
independent holdout.
Upgrading from 1.1. With the default APSA_PARSER_SANDBOX=auto, the parser
runs under macOS Seatbelt or Linux bubblewrap after an input-free activation
probe succeeds. Without a backend, the report records
parser_isolation.state: unavailable and parses with resource limits only. If
the backend is present but cannot start (for example inside another sandbox or
with blocked user namespaces), the report also records the attempted backend
and probe reason and adds an inventory warning. required refuses such audits; off skips the backend. A parser
failure after isolation has started aborts the audit without an unsandboxed
retry. Dependencies declared only in a Gradle version catalog no longer receive
CVE matches until build usage or resolved versions are supplied. New rules
(AST-CRYPTO-ECB, AST-CRYPTO-WEAK-HASH, AST-SQL-CONCAT,
OBJC-CRYPTO-WEAK-HASH, OBJC-WEBVIEW-UNTRUSTED-REQUEST) can add findings
relative to existing 1.1 baselines.
APSA 1.3 links Gradle version-catalog aliases to the shipped dependency
configurations that use them and reads application-module gradle.lockfile
coordinates as resolved versions. It also decodes AAB feature-module manifests,
recomputes Mach-O CodeDirectory page and entitlement hashes without
authenticating the signature, adapts more Swift and Objective-C syntax, and can
backfill an explicit range of Android security bulletins with SoC vendor and
vendor patch-level context. See the
dependency evidence results,
the independent source pairs
and analysis scope and limits.
Upgrading from 1.2.
- Catalog aliases referenced from shipped configurations become
declaredcandidates and can receive CVE matches again; unreferenced, test-only and build-tooling aliases stay unresolved. Application-module lockfile coordinates are exact, so their matches areversion-affected, and the default policy fails on high and critical ones; other modules' lockfile coordinates staydeclaredcandidates. A declared candidate that every shipping application resolved is superseded and leaves CVE correlation. Partial inputs keep every candidate, and with unparsed project references only an application's own declarations can be superseded. - Lockfile assumptions: APSA does not check that dependency locking is enabled
or that the lockfile is current, and it merges the release runtime classpaths
of every application module (flavors and wear, TV or automotive apps).
--source-modulescans only that module's directory, so a root version catalog and library-module declarations outside it are not read. - Baselines and waivers: a lockfile-resolved finding has a new location
(
gradle.lockfile) and status, soonly_newtreats it as new and waivers for the old finding ID no longer match. Re-approve baselines after upgrading. --onlinesends dependency names and versions to OSV, including shipped catalog aliases, transitive lockfile coordinates and private group IDs unless excluded. The defaultautomode uses legacy queries for at most 100 eligible unique package-version coordinates and batch queries for larger inventories. Default online budgets are 1000 packages, 100 packages per batch and 2000 OSV requests, including pagination and vulnerability-record lookups.scan --online --osv-query-mode legacyretains the 100-package limit;--osv-query-mode batchexplicitly selects batching with the default budgets. Use scan's--osv-exclude-ecosystem,--osv-exclude-nameor--osv-exclude-coordinatefor local transmission exclusions. Excluded dependencies are never sent or marked checked, even with a prior cached result. Unchecked, unresolved, unsupported or excluded dependencies keep online coverage incomplete; a fresh result for one package does not complete the rest.- IPA reports gain
BINARY-IOS-CODE-INTEGRITY. Consistent hashes do not prove authenticity, because a modified binary that was re-signed is consistent. A mismatch adds a warning, not a finding; App Store encrypted and unsigned executables staynot-run. intel syncrefreshes only the recent Android bulletin window; useintel backfillfor older months. Records cached by 1.2 derive their vendor scope from the component name; entries outside chipset and kernel sections use the platform patch level only. AAB feature-module installation stays unknown.- Adapted Swift and Objective-C files stay partial, and an Objective-C function
overlapping a normalized preprocessor conditional is skipped as uncertain.
Unmodified 1.2 skills upgrade with
apsa skill install.
APSA 1.4 is easier to put in front of developers and coding agents. A GitHub Action uploads SARIF to code scanning with stable fingerprints, security severity, MASWE tags and evidence status; every report carries an OWASP MASWE v1.0 coverage matrix that names the weaknesses APSA did not assess; and the MCP server is packaged for the MCP Registry and as a Claude Code plugin, with a documented MCP security model.
Upgrading from 1.3.
- SARIF exports now list a descriptor for every rule with results (help,
security-severity, precision, MASVS/MASWE tags), addpartialFingerprintsfrom the finding identity, and report not-run and partial coverage as tool execution notifications. Candidate findings arewarningrather thanerrorand their rules are taggedcandidate.--sarif-rootmakes locations repository-relative; URIs are percent-encoded, and APK/AAB/IPA members and files outside the target appear as logical locations on the target. Code scanning may therefore show re-keyed alerts once. - New source checks (exported components, backup,
targetSdk, privacy manifests, ATS exceptions, hard-coded secrets, insecure randomness, trust-all TLS, external storage, Java deserialization, more SQL sinks, mutablePendingIntent) add findings and coverage entries. A policy withrequired_rulesor a severity gate can fail where 1.3 passed; review the first 1.4 report before tightening gates. - Rule metadata gains MASWE v1.0 identifiers; model context and
capabilitiesgain amaswesection, and Markdown reports a MASWE coverage table. Reports derived byreports ingestaddexternal_inputsand findings withorigin: external; existing fields keep their meaning. - The MCP server adds
verify_finding,specs_validate,reports_ingest_sarif,reports_checklistandreports_history.tool_manifest_sha256now covers a normalized APSA-owned surface, so its value changes; update any pinned hash. Unmodified 1.3 skills upgrade withapsa skill install.
APSA 1.5 widens what a source scan looks for. New checks cover the OWASP
MASWE weaknesses behind most MASTG demo misses: broken ciphers and implicit
ECB, key material and IVs built from constants, short (512–1536-bit) RSA, DSA
and DH key sizes and CryptoKit Insecure digests; biometric results not bound to a key,
device-credential fallback and keys that survive new enrollment; TLS below
1.2, iOS connections outside App Transport Security, and user CAs or cleartext
in the network security configuration; unverified App Links, intent
redirection and implicit internal Intents; path traversal and keyed
unarchiving without secure coding; and Safe Browsing turned off, UIWebView and
WKWebView file access. On a blind holdout of 24 public vulnerable/fixed pairs
labeled by MASWE weakness, APSA 1.5.0 found 7 of the 21 scored in-scope pairs
at the labeled lines (Wilson 95% 17–55%). Two of the seven come from rules new
in 1.5 and five from rules 1.4 already had; the fixed-side FP upper bound is 4
of 21, and a 22nd in-scope pair failed to scan. See the
blind pair results
and analysis scope and limits.
Upgrading from 1.4.
- New rules add findings and coverage entries:
AST-CRYPTO-WEAK-CIPHER,IOS-CRYPTO-WEAK-CIPHER,AST-CRYPTO-HARDCODED-KEY,AST-CRYPTO-STATIC-IV,SOURCE-WEAK-KEY-SIZE,SOURCE-BIOMETRIC-EVENT-BOUND,SOURCE-BIOMETRIC-FALLBACK,SOURCE-BIOMETRIC-ENROLLMENT,SOURCE-WEAK-TLS-VERSION,IOS-ATS-BYPASS-API,ANDROID-NSC-USER-CA,ANDROID-DEEPLINK-AUTOVERIFY,AST-INTENT-REDIRECTION,AST-IMPLICIT-INTENT,IOS-WEBVIEW-FILE-ACCESS,WEBVIEW-SAFE-BROWSING-OFF,IOS-UIWEBVIEW,AST-PATH-TRAVERSALandIOS-INSECURE-UNARCHIVE. Candidates are not gated by default. The new configuration-confirmed findings (ANDROID-NSC-USER-CA, andANDROID-CLEARTEXTfrom the network security configuration) count under the defaultallowed_statuses, but medium and low thresholds are off by default. Policies that gate candidates or medium/low findings, andonly_newbaselines, will see them. - The MASWE matrix changes: MASWE-0003, 0013, 0020, 0021 and 0022 leave
not-assessed (they are not-run for APK and IPA, which these source checks do
not read), and
ANDROID-NSC-CONFIGadds coverage to MASWE-0026 and 0027. - Existing rules find more:
AST-CRYPTO-ECBalso reports a bare"AES"transformation (its title is now "AES in ECB mode is selected"; fingerprints are unchanged),AST-CRYPTO-WEAK-HASHreports CryptoKitInsecure.MD5andInsecure.SHA1,AST-SQL-CONCATreadsSQLiteQueryBuilder.query, the groupBy/having/orderBy/limit arguments and nested exported providers, andSOURCE-INSECURE-RANDOMruns on Swift and Objective-C (its coverage on iOS-only trees changes from not-applicable to checked). - The AST engine now follows Kotlin
let,also,use,apply,runandwithlambdas, so every structural rule can report code inside them. A?.letlambda, or one withreturn@, merges like a branch that may not run; a reassignment inside a lambda that always runs can now also remove a 1.4 finding. Other lambdas and Swift closures are still not analyzed. ANDROID-CLEARTEXTalso comes from the referenced network security configuration (configuration-confirmed, so code scanning rates it). The manifest'susesCleartextTrafficcandidate is dropped when that configuration was parsed, minSdk is 24 or higher, and the configuration statescleartextTrafficPermittedor targetSdk is 28 or higher. Findings from a configuration that several source sets define are candidates.- New coverage states can make an audit incomplete:
ANDROID-NSC-USER-CAandANDROID-NSC-CONFIGare partial when a referenced configuration cannot be parsed, is missing from the scanned sources or is a build placeholder, and checks that stop at their match budget report partial. With the defaultfail_on_partial, such a scan fails the gate and cannot be exported as a baseline. Compiled AAB configurations are not-run. - Text rules no longer count binary XML from packages as checked, so
WEBVIEW-SAFE-BROWSING-OFFis not-run on APKs. The rules resource may carrycase_sensitiveandonce_per_file; inventory gainsdeep_links[].browsableandnetwork_security_parsed. Unmodified 1.4 skills upgrade withapsa skill install; the MCP tool manifest hash is unchanged.
Upgrading from 1.5.0. 1.5.1 audits large source trees partially instead of refusing them and fixes a slowdown on Android translations.
- A source tree over the text staging budgets (64 MiB, 12,000 files) no longer
fails with an input-budget error (exit 1). Files are staged by kind: app
code and configuration, other shipped text, localized or qualified Android
res/values-*files, then tests.inventory.input_snapshot.omittedcounts what was left out, and the audit is incomplete (exit 3). With the defaultfail_on_partialthe gate still fails, and a partial report cannot become a baseline. The 100,000-entry and 64-level budgets also stop reading instead of refusing. - If app code, configuration or other shipped text is left out
(
app_scope_complete: false), not-applicable coverage becomes partial too andDEPENDENCY-CVEgains a partial entry (unless--sbomsupplies the dependencies), so required rules cannot pass even withfail_on_partial = false. - SARIF from such an audit carries a warning notification and
run.properties.inputSnapshot. A workflow withfail-on-incomplete: "false"now passes with a warning and uploads partial results where 1.5.0 failed; code scanning sees no results for omitted files. Scan a narrowerpath(one module per job, with its owncategory) for complete results. MCP report context gainsinput.input_snapshot. - In 1.5.0,
strings.xmlfiles with many escaped apostrophes (\'), common in French and Italian translations, madeWEBVIEW-SAFE-BROWSING-OFFslow enough to hit the parser timeout (about 150 s for a 694 KiB file). XML files are now cleaned of<!-- -->comments only, so//in XML text no longer hides a match. Comment cleaning also stays linear on unterminated strings and comments; a/*with no closing*/after it is read as text. - Unmodified 1.5.0 skills upgrade with
apsa skill install; the MCP tool manifest hash is unchanged.
What it checks
| Area | Available checks |
|---|---|
| Source code | Java/Kotlin/Swift AST analysis; bounded Objective-C .m candidates; WebView and deep-link patterns; Manifest, Info.plist, storage, and dependency inspection, including Gradle catalog usage and application lockfiles; exported components, backup and targetSdk; Apple required-reason APIs against privacy manifests; known credential formats (masked); weak random for security values; mutable implicit PendingIntents; trust-all TrustManagers and hostname verifiers, unevaluated iOS server trust and weakened ATS exception domains; external storage writes; Java deserialization; (1.5) broken ciphers, constant keys and IVs, short RSA keys, biometric binding and fallback, TLS versions, iOS APIs outside ATS, network security configuration, App Links, intent redirection and implicit Intents, path traversal, keyed unarchiving, Safe Browsing, UIWebView and WKWebView file access |
| Android builds | DEX calls and constant flow; AAB base and feature-module manifests and module DEX (always partial); resources and network configuration; exported components/providers; signing-block and v1 certificate evidence; ELF hardening |
| iOS builds | Mach-O headers, including embedded framework/extension metadata; CodeDirectory page and entitlement hash integrity (not signature authentication); limited entitlement/configuration checks (embedded XML entitlements, ATS exceptions, provisioning indicators); PIE, canary, and string evidence |
| Public intelligence | Apple/Android advisories with bounded Android bulletin backfill, CVE, CISA KEV, OWASP guidance, and OSV dependency correlation |
| Reports and CI | SQLite history, comparison and reassessment, JSON/Markdown/SARIF export, coverage requirements, and expiring waivers |
| Runtime | Prepared scenarios for owned Android test apps and iOS simulator apps; physical iOS devices are unsupported |
| Model integration | stdio MCP tools/resources and packaged skills, without a required model provider or LLM API key |
Findings distinguish candidate, configuration-confirmed, version-affected, and runtime-confirmed evidence. coverage and warnings show what actually ran. A signing block does not prove signature authenticity, and an affected dependency version does not prove exploitability. A scan with no findings does not establish that the whole app is secure.
OWASP mappings describe relevant checks; APSA does not certify MASVS compliance or implement every MASTG test. Public advisories cannot reveal undisclosed zero-days. App files alone cannot establish a device's OS patch state. See OWASP coverage and the support matrix, both currently in Korean, for tested scope and limits.
APSA MCP 질문
APSA MCP를 Claude Code에 추가하려면 어떻게 하나요?
터미널에서 claude mcp add apsa -- uvx apsa를 실행합니다. 모든 프로젝트에서 사용할 수 있게 하려면 --scope user를 추가합니다.
APSA MCP를 Cursor에 추가하려면 어떻게 하나요?
~/.cursor/mcp.json를 열고 mcpServers 아래에 서버를 추가합니다. 위 설치 섹션에 표시된 Cursor 구성을 사용합니다.
APSA는 어떤 플랫폼을 지원하나요?
APSA는 Android 및 iOS 모바일 애플리케이션 모두에 대한 보안 감사를 제공합니다.
APSA로 컴파일된 모바일 바이너리를 감사할 수 있나요?
네, 소스 코드뿐만 아니라 APK, AAB, IPA 빌드 파일도 검사할 수 있습니다.
AI agent와 함께 APSA를 어떻게 사용하나요?
MCP server를 통하거나 Claude Code 플러그인으로 감사 엔진을 사용할 수 있습니다.