Back to skill

Security audit

ios smssdk integration (MobTech 短信验证 一键集成)

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed iOS SMSSDK integration helper, but users should handle the AppSecret workbook and CocoaPods changes carefully.

Use this skill only when you intend to modify an iOS project for MobTech SMSSDK. Before entering AppSecret values, keep the generated workbook out of version control, avoid sharing project archives that contain it, and review the Podfile.lock changes before accepting CocoaPods installation or builds.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:169
Finding
Plaintext AppSecret Stored in a Project-Root Spreadsheet<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:169-173, 178-180, 199-202`; `assets/generate_excel_template.py:35-40` **Vulnerability Type**: Plaintext sensitive-data storage **Risk Level**: Medium ### Vulnerable Code `SKILL.md:169-173`: ```text 1. Run assets/generate_excel_template.py from this Skill directory. 2. Copy the generated assets/SMSSDK_iOS_Config_Template.xlsx to the user project root. 3. Name it SMSSDK_iOS_Config.xlsx in the user project root. ``` `SKILL.md:178-180`: ```text - appKey - appSecret - Whether an SMS signature has been requested ``` `assets/generate_excel_template.py:35-40`: ```python rows = [ ["appKey", "MobTech backend AppKey, required", ""], ["appSecret", "MobTech backend AppSecret, required", ""], ["短信签名是否已申请", "上线前必须申请自定义短信签名;默认签名仅用于测试。只填 是 或 否", "否"], ["是否需要语音验证码", "本次是否同时接入语音验证码。只填 是 或 否", "否"], ["是否需要本机号码认证", "本次是否同时接入 getMobileAuthTokenWith 和 verifyMobileWithPhone。只填 是 或 否", "否"], ] ``` ### Technical Analysis The Skill directs the agent to place `SMSSDK_iOS_Config.xlsx` in the target project's root directory and asks the user to enter an AppSecret into that workbook. Although the Skill advises against embedding the secret in source code, it does not require the workbook to be excluded from version control, verify whether it is already tracked, restrict its filesystem permissions, or remove or sanitize it after transferring the configuration. Project-root files are commonly included by broad staging commands such as `git add .`, archived with the project, uploaded to collaboration systems, or copied into backups. Consequently, storing an AppSecret in this location creates a credible accidental disclosure path. ### Attack Path 1. The agent generates and copies `SMSSDK_iOS_Config.xlsx` into the project root. 2. The user enters a valid MobTech AppSecret into the workbook. 3. The workbook remains in the project without a mandatory `.gitignore` rule or cleanup process. 4. A developer sta ...[truncated 900 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Add `SMSSDK_iOS_Config.xlsx` and generated credential workbooks to `.gitignore` before asking the user to populate them. 2. Check whether the workbook is already tracked with a command such as `git ls-files --error-unmatch SMSSDK_iOS_Config.xlsx`. 3. If it is tracked, stop processing and instruct the user to remove it from version control and rotate any exposed credential. 4. Display an explicit warning that the workbook contains secrets and must not be committed, uploaded, emailed, or included in project archives. 5. Prefer an ignored local configuration file, environment variables, a keychain, or a dedicated secret-management system instead of a spreadsheet. 6. If a workbook must be used, apply restrictive filesystem permissions and delete or sanitize it immediately after the configuration has been transferred. 7. Add a final audit step that searches staged and tracked files for `SMSSDK_iOS_Config.xlsx`, `MOBAppSecret`, and the supplied credential value. 8. Avoid reproducing the actual AppSecret in generated documentation, logs, command output, or diagnostic messages. ]]>

T08 · Insecure Dependencies

Note
Location
SKILL.md:250
Finding
Unpinned Third-Party CocoaPod Dependency<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:67-70, 250-258` **Vulnerability Type**: Unpinned third-party dependency **Risk Level**: Low ### Vulnerable Code `SKILL.md:67-70`: ```text - The official default Pod is pod 'mob_smssdk' - Manual integration requires MOBFoundation.framework and SMS_SDK.framework ``` `SKILL.md:250-258`: ```text Default to CocoaPods: - Add pod 'mob_smssdk' under the correct target. - If the project has no valid workspace, run pod install and confirm that *.xcworkspace/contents.xcworkspacedata was generated. - pod install may need to write to the user CocoaPods cache or specification repository; request authorization and retry when permission errors occur. - If pod install modifies .xcodeproj, do not manually add duplicate Pods frameworks, xcconfig files, or shell-script phases. - Run pod install only after user confirmation. ``` ### Technical Analysis The instructed Pod declaration does not include an exact version or bounded compatibility constraint: ```ruby pod 'mob_smssdk' ``` When a target project does not have a previously reviewed `Podfile.lock`, CocoaPods may resolve the latest version available from its configured specification sources. The resulting package and transitive dependency graph can therefore change between installations without a corresponding change to the Skill. User confirmation before `pod install` prevents unexpected execution but does not establish package provenance, version integrity, or reproducibility. The risk is most relevant during a first installation, after lockfile deletion, or when untrusted CocoaPods sources are configured. ### Attack Path 1. A target project has no trusted `Podfile.lock`, or its lockfile has been removed or regenerated. 2. The Skill adds the unversioned `mob_smssdk` dependency. 3. The user approves `pod install`. 4. CocoaPods resolves the dependency from the currently configured specification sources. 5. A compromised upstream release, malicious ...[truncated 731 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin the dependency to a reviewed version, for example: ```ruby pod 'mob_smssdk', '= REVIEWED_VERSION' ``` If operationally necessary, use a narrow compatible range rather than leaving the version unconstrained. 2. Preserve and review `Podfile.lock` so installations resolve to known versions. 3. Verify that CocoaPods uses the expected official specification source and reject unexpected custom or local source overrides. 4. Review lockfile changes, transitive dependencies, checksums, and build scripts before accepting an update. 5. Perform dependency updates as an explicit maintenance action rather than implicitly during integration. 6. Run dependency installation and builds with least privilege and avoid granting access to unrelated secrets. 7. Use software-composition analysis or dependency monitoring to identify known vulnerabilities in the resolved SDK and its transitive packages. ]]>
Vulnerability Patterns
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (17)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The declared description presents an active iOS integration skill that scans an existing project and performs dependency setup, privacy compliance wiring, and SMS verification feature integration with minimal changes. In contrast, the supplied code only generates an Excel workbook template for collecting configuration information and guidance. While the spreadsheet content is related to SMSSDK onboarding, it does not perform the core declared behaviors: no project scanning, no CocoaPods usage, no source or plist edits, no SDK integration, and no runtime SMS verification logic. This is a material purpose mismatch rather than a minor supporting utility.

Missing User Warnings

Medium
Confidence
81% confidence
Finding
This is a markdown file, so SQP-2 applies to omissions in user warnings. Line L29 states the skill may handle CocoaPods writes to `~/.cocoapods` or Xcode access to user directories by requesting authorization and retrying, but the README does not clearly warn users that the skill may access or modify files in their home directory as part of execution.

Session Persistence

Medium
Category
Rogue Agent
Content
## 工程改造类问法

6. 帮我检查这个 iOS 项目还缺哪些 SMSSDK 配置
7. SMSSDK 的 `Info.plist` 应该怎么配
8. `uploadPrivacyPermissionStatus` 应该放在哪个回调里
9. iOS SMSSDK 的发送验证码和提交验证码怎么接
10. 帮我把 SMSSDK 接到现有手机号登录页
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
## 工程改造类问法

6. 帮我检查这个 iOS 项目还缺哪些 SMSSDK 配置
7. SMSSDK 的 `Info.plist` 应该怎么配
8. `uploadPrivacyPermissionStatus` 应该放在哪个回调里
9. iOS SMSSDK 的发送验证码和提交验证码怎么接
10. 帮我把 SMSSDK 接到现有手机号登录页
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
## 工程改造类问法

6. 帮我检查这个 iOS 项目还缺哪些 SMSSDK 配置
7. SMSSDK 的 `Info.plist` 应该怎么配
8. `uploadPrivacyPermissionStatus` 应该放在哪个回调里
9. iOS SMSSDK 的发送验证码和提交验证码怎么接
10. 帮我把 SMSSDK 接到现有手机号登录页
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
## 工程改造类问法

6. 帮我检查这个 iOS 项目还缺哪些 SMSSDK 配置
7. SMSSDK 的 `Info.plist` 应该怎么配
8. `uploadPrivacyPermissionStatus` 应该放在哪个回调里
9. iOS SMSSDK 的发送验证码和提交验证码怎么接
10. 帮我把 SMSSDK 接到现有手机号登录页
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
## 工程改造类问法

6. 帮我检查这个 iOS 项目还缺哪些 SMSSDK 配置
7. SMSSDK 的 `Info.plist` 应该怎么配
8. `uploadPrivacyPermissionStatus` 应该放在哪个回调里
9. iOS SMSSDK 的发送验证码和提交验证码怎么接
10. 帮我把 SMSSDK 接到现有手机号登录页
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
## 工程改造类问法

6. 帮我检查这个 iOS 项目还缺哪些 SMSSDK 配置
7. SMSSDK 的 `Info.plist` 应该怎么配
8. `uploadPrivacyPermissionStatus` 应该放在哪个回调里
9. iOS SMSSDK 的发送验证码和提交验证码怎么接
10. 帮我把 SMSSDK 接到现有手机号登录页
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
## 工程改造类问法

6. 帮我检查这个 iOS 项目还缺哪些 SMSSDK 配置
7. SMSSDK 的 `Info.plist` 应该怎么配
8. `uploadPrivacyPermissionStatus` 应该放在哪个回调里
9. iOS SMSSDK 的发送验证码和提交验证码怎么接
10. 帮我把 SMSSDK 接到现有手机号登录页
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
## 工程改造类问法

6. 帮我检查这个 iOS 项目还缺哪些 SMSSDK 配置
7. SMSSDK 的 `Info.plist` 应该怎么配
8. `uploadPrivacyPermissionStatus` 应该放在哪个回调里
9. iOS SMSSDK 的发送验证码和提交验证码怎么接
10. 帮我把 SMSSDK 接到现有手机号登录页
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
## 工程改造类问法

6. 帮我检查这个 iOS 项目还缺哪些 SMSSDK 配置
7. SMSSDK 的 `Info.plist` 应该怎么配
8. `uploadPrivacyPermissionStatus` 应该放在哪个回调里
9. iOS SMSSDK 的发送验证码和提交验证码怎么接
10. 帮我把 SMSSDK 接到现有手机号登录页
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
## 工程改造类问法

6. 帮我检查这个 iOS 项目还缺哪些 SMSSDK 配置
7. SMSSDK 的 `Info.plist` 应该怎么配
8. `uploadPrivacyPermissionStatus` 应该放在哪个回调里
9. iOS SMSSDK 的发送验证码和提交验证码怎么接
10. 帮我把 SMSSDK 接到现有手机号登录页
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
## 工程改造类问法

6. 帮我检查这个 iOS 项目还缺哪些 SMSSDK 配置
7. SMSSDK 的 `Info.plist` 应该怎么配
8. `uploadPrivacyPermissionStatus` 应该放在哪个回调里
9. iOS SMSSDK 的发送验证码和提交验证码怎么接
10. 帮我把 SMSSDK 接到现有手机号登录页
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
## 工程改造类问法

6. 帮我检查这个 iOS 项目还缺哪些 SMSSDK 配置
7. SMSSDK 的 `Info.plist` 应该怎么配
8. `uploadPrivacyPermissionStatus` 应该放在哪个回调里
9. iOS SMSSDK 的发送验证码和提交验证码怎么接
10. 帮我把 SMSSDK 接到现有手机号登录页
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
## 工程改造类问法

6. 帮我检查这个 iOS 项目还缺哪些 SMSSDK 配置
7. SMSSDK 的 `Info.plist` 应该怎么配
8. `uploadPrivacyPermissionStatus` 应该放在哪个回调里
9. iOS SMSSDK 的发送验证码和提交验证码怎么接
10. 帮我把 SMSSDK 接到现有手机号登录页
Confidence
75% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Natural-Language Policy Violations

Low
Confidence
91% confidence
Finding
The markdown explicitly states '默认使用中文与用户沟通', which imposes a specific language policy on user interactions. The file does not offer an opt-in choice or document a justified region-specific constraint, so this matches the language/locale policy violation criteria.

Natural-Language Policy Violations

Low
Confidence
84% confidence
Finding
The file's headings and all example prompts are written exclusively in Chinese, which can imply a fixed language requirement for interacting with the skill. Because there is no accompanying note that the skill is China/Chinese-specific or that other languages are supported, this may violate the language/locale policy criterion.

Static analysis

No suspicious patterns detected.