ykus4/shingan

GitHub: ykus4/shingan

一款同时支持 iOS 和 Android 的移动应用静态+动态安全分析工具,将逆向暴露风险映射至 OWASP MASVS,帮助团队在发布前把控安全质量。

Stars: 0 | Forks: 0

shingan **针对 iOS 和 Android 应用的静态 + 动态安全分析** 在发布之前,直观展示您的应用暴露出哪些可被逆向工程的风险。 [![Python 3.13+](https://img.shields.io/badge/python-3.13%2B-blue?logo=python&logoColor=white)](https://www.python.org/) [![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE) [![OWASP MASVS](https://img.shields.io/badge/mapped%20to-OWASP%20MASVS-orange)](https://mas.owasp.org/MASVS/) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/8407b619c9012934.svg)](https://github.com/ykus4/shingan/actions/workflows/ci.yml)
``` .ipa / .app / .xcarchive .apk │ │ └──────────┬──────────────┘ ▼ ┌───────────────────┐ │ shingan │ │ static checkers │ │ dynamic checks* │ └────────┬──────────┘ │ ┌──────────────┼──────────────┐ ▼ ▼ ▼ terminal HTML report SARIF (rich table) (EN / JA) (GitHub Code Scanning) ``` ## 检查内容
iOS — 静态 (IPA / .app / .xcarchive) | 规则 ID | 类别 | 检测内容 | |---|---|---| | `IOS-SYM-001` | 符号 | 调试符号,ObjC 类/方法元数据,Swift 混淆名 | | `IOS-SEC-002` | 机密信息 | 硬编码的 API 密钥、token、HTTP URL(正则表达式 + Shannon 熵) | | `IOS-ATS-003` | 传输 | `NSAllowsArbitraryLoads`、按域名例外、弱 TLS、文件共享 | | `IOS-DBG-004` | 调试 | `get-task-allow` 授权,`NSLog`/`print` 字符串,`NSAssertionsEnabled` | | `IOS-RASP-005` | 保护 | 越狱检测、Frida/LLDB 防篡改、SSL pinning — 存在或缺失 | | `IOS-RASP-006` | 二进制 | PIE (Position Independent Executable) | | `IOS-RASP-007` | 二进制 | Stack canary | | `IOS-RASP-008` | 二进制 | ARC (Automatic Reference Counting) | | `IOS-SEC-009` | Keychain | 弱 `kSecAttrAccessible*` 访问级别 | | `IOS-SEC-010` | 加密 | MD5、SHA-1、DES/3DES、RC4、ECB 模式 | | `IOS-DEP-011` | SBOM | 第三方 SDK 指纹识别 (Firebase、Stripe、OpenSSL、…) | | `IOS-META-012` | 元数据 | 权限过高的后台模式、敏感权限、缺少 ATS |
iOS — 动态 (需要 shingan[dynamic] + 已连接的设备) | 规则 ID | 测试内容 | |---|---| | `IOS-DYN-001` | 通过 Frida 绕过 SSL pinning — pinning 是否真正阻止了 MITM? | | `IOS-DYN-002` | 通过 Frida 绕过越狱检测 — 检测机制能否被绕过? | | `IOS-DYN-003` | `PT_DENY_ATTACH` 有效性 — LLDB 能否成功附加? |
Android — 静态 (APK) | 规则 ID | 类别 | 检测内容 | |---|---|---| | `AND-SEC-002` | 机密信息 | DEX 和原生库中硬编码的凭据(正则表达式 + 熵) | | `AND-NET-003` | 传输 | `cleartextTrafficPermitted`、用户 CA 信任、`network_security_config.xml` 中缺少 pinning | | `AND-DBG-004` | 调试 | `android:debuggable=true`、DEX 中的 `Log.d`/`Log.v` 调用 | | `AND-RASP-005` | 保护 | Root 检测、Frida/Xposed、调试器检测、SSL pinning — 存在或缺失 | | `AND-RASP-006` | 二进制 | 捆绑的 `.so` 库上的 PIE | | `AND-RASP-007` | 二进制 | 捆绑的 `.so` 库上的 NX bit、stack canary、RELRO | | `AND-SEC-010` | 加密 | 弱 JCA/JCE:MD5、SHA-1、DES、ECB 模式、RSA/PKCS1 | | `AND-META-012` | 权限 | 危险权限:SEND_SMS、READ_CALL_LOG、ACCESS_FINE_LOCATION、… | | `AND-META-013` | Manifest | `android:allowBackup=true`、未受权限保护而暴露的组件 | | `AND-DEP-011` | SBOM | SDK 指纹识别 (Firebase、OkHttp、Sentry、Unity、Flutter、…) | | `AND-SDK-015` | Manifest | `minSdkVersion` 低于 API 23 | | `AND-SIGN-014` | 签名 | 仅 v1 (JAR) 签名 — 未检测到 v2/v3 方案 |
Android — 动态 (需要 shingan[dynamic] + 已连接的设备) | 规则 ID | 测试内容 | |---|---| | `AND-DYN-001` | 通过 Frida 绕过 SSL unpinning — hooks OkHttp3、TrustManager、HostnameVerifier | | `AND-DYN-002` | 通过 Frida 绕过 Root 检测 — hooks File.exists、Runtime.exec、Build.TAGS |
所有发现均映射至 **[OWASP MASVS](https://mas.owasp.org/MASVS/)**。 动态结果:`bypassed` (高危) · `resistant` (信息) · `unavailable` (信息) · `error` (中危) ## 安装 ### 从源码构建 ``` git clone https://github.com/ykus4/shingan.git cd shingan uv sync # 启用 dynamic analysis (基于 Frida 的运行时检查) uv sync --extra dynamic ``` ### Docker ``` # Web UI docker run -p 8000:8000 -v shingan-data:/data ghcr.io/ykus4/shingan # CLI docker run --rm \ -v shingan-data:/data \ -v /path/to/artifacts:/artifacts:ro \ ghcr.io/ykus4/shingan \ uv run shingan scan /artifacts/MyApp.ipa ``` ## 用法 ### Web UI ``` uv run shingan serve # → http://localhost:8000 ``` 将 `.ipa`、`.app`、`.xcarchive` 或 `.apk` 拖放到页面上。结果将本地存储,并呈现为带有差异高亮的暗黑/明亮模式 HTML 报告。 ### CLI ``` # Scan uv run shingan scan MyApp.ipa uv run shingan scan MyApp.apk # Export formats uv run shingan scan MyApp.ipa --format html --out report.html --lang ja uv run shingan scan MyApp.apk --format sarif --out report.sarif uv run shingan export --format pdf --out report.pdf # CI gate — 发现新的高危 (high-severity) 漏洞时以 exit 1 退出 uv run shingan scan MyApp.ipa --fail-on high # 与之前的 scan 进行 Diff uv run shingan scan MyApp.ipa --baseline # Dynamic analysis (需要 shingan[dynamic] + 在设备上运行 app) uv run shingan devices # list connected devices + simulators uv run shingan scan MyApp.ipa --dynamic # static + dynamic (iOS) uv run shingan scan MyApp.apk --dynamic # static + dynamic (Android) uv run shingan scan MyApp.ipa --dynamic --device # target a specific device/simulator ``` ### GitHub Actions ``` - uses: ykus4/shingan@v1 with: ipa: build/MyApp.ipa fail-on: high sarif-upload: true ```
手动工作流 ``` - name: Scan run: uv run shingan scan build/MyApp.ipa --format sarif --out shingan.sarif --fail-on high - name: Upload to GitHub Code Scanning uses: github/codeql-action/upload-sarif@v3 with: sarif_file: shingan.sarif ```
### Fastlane ``` lane :security_check do shingan_scan( ipa: "build/MyApp.ipa", fail_on: "high", output_format: "html", output_path: "shingan_report.html" ) end ``` ## 输出格式 | 格式 | 最适合 | |---|---| | `text` | 终端 — 带严重性颜色的富文本表格 | | `json` | 自动化、自定义仪表板 | | `sarif` | GitHub Code Scanning (SARIF 2.1.0) | | `html` | 人工审查 — 独立的暗黑/明亮模式报告,`--lang en\|ja` | | `pdf` | 可共享的报告 | ## 差异 / 基线 ``` scan A ──► scan B │ ├── NEW ← regressions to fix ├── FIXED ← improvements since last build └── PERSISTED ← known issues carried over ``` 使用 `--baseline ` 运行以比较构建。CI 中的 `--fail-on` 仅在出现真正的新回归时触发。 扫描结果存储在 `~/.shingan/shingan.db` (SQLite) 中。 ## 抑制 / 白名单 ``` uv run shingan suppress add IOS-SEC-002-entropy --reason "test fixture key" uv run shingan suppress add AND-SEC-002-aws_key --evidence-prefix AKIATEST --reason "CI test key" uv run shingan suppress list ``` REST API:`POST /api/suppressions` · `GET /api/suppressions` · `DELETE /api/suppressions` ## 自定义规则 将 YAML 文件放入 `~/.shingan/rules/` 以添加项目特定的检查: ``` - id: MYAPP-001 title: "Internal staging URL leaked in binary" severity: high description: "Staging endpoint found in release binary." recommendation: "Strip staging URLs before release builds." masvs: MASVS-NETWORK-1 match: type: regex target: binary # binary | info_plist | android_manifest patterns: - "https://staging\\.internal\\.example\\.com" ``` 匹配类型:`string` (子串)、`regex`、`plist_key` (点路径查找)。 ## 开发 ``` uv sync uv run pre-commit install uv run pytest uv run pytest -k test_ats ``` ## 更新日志 · 路线图 - [CHANGELOG.md](docs/CHANGELOG.md) - [ROADMAP.md](docs/ROADMAP.md)
MIT License © [ykus4](https://github.com/ykus4)
标签:Android安全, APK分析, DAST, Debug检测, iOS安全, IPA分析, OWASP MASVS, Python, SARIF, SAST, 云资产清单, 合规性检查, 安全助手, 安全合规, 密钥硬编码, 应用安全测试, 恶意软件分析, 无后门, 源码泄露检测, 目录枚举, 盲注攻击, 移动安全, 网络代理, 聊天机器人, 请求拦截, 越狱检测, 逆向工具, 逆向工程, 错误基检测, 静态代码分析