Back to skill

Security audit

通义晓蜜 - 智能外呼

Security checks for vulnerabilities and agentic risk

Overview

The skill matches its outbound-calling purpose, but it handles real phone campaigns, cloud credentials, and personal contact data with logging and environment-file behavior that users should review carefully.

Install only if you are comfortable giving the skill Alibaba Cloud OutboundBot authority to create resources and place real outbound calls. Use least-privileged credentials, run it from a clean directory without unrelated .env files, confirm every call list before execution, and avoid passing full CRM or candidate records in metadata unless logs are protected and redacted.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
scripts/bundle.js:83320
Finding
Sensitive recipient and CRM data is exposed in process output<![CDATA[ ## Vulnerability Details **File Location**: `scripts/bundle.js:83084-83123` and `scripts/bundle.js:83320-83370` **Vulnerability Type**: Sensitive information exposure through application logs **Risk Level**: Medium ### Vulnerable Code Task inputs can retain complete candidate records and arbitrary metadata: ```javascript metadata: { source: "candidates-list", previousStep: args.previousStep, candidates: args.candidates, ...args.metadata } ``` The complete task input is included in the result: ```javascript return { taskInput, jobGroupId: result.jobGroupId, instanceId: result.instanceId, scriptId: result.scriptId, totalPhones: valid.length }; ``` The result, including `taskInput`, is then serialized to standard output: ```javascript executeOutboundTask(options).then((result) => { console.log("\n\u2705 \u4EFB\u52A1\u6267\u884C\u6210\u529F"); console.log("\n\u7ED3\u679C:"); console.log(JSON.stringify(result, null, 2)); process.exit(0); }).catch((error) => { console.error("\n\u274C \u4EFB\u52A1\u6267\u884C\u5931\u8D25:", error.message); process.exit(1); }); ``` ### Technical Analysis The returned `taskInput` contains complete telephone numbers and may contain candidate names, evaluation scores, CRM attributes, campaign data, and arbitrary caller-supplied metadata. Serializing the complete result with `JSON.stringify` writes all of this data to standard output without redaction or field-level filtering. Standard output is commonly retained by CI systems, agent execution transcripts, container logging drivers, orchestration platforms, terminal recording systems, and centralized monitoring services. These systems may have wider access permissions and longer retention periods than the original task data. The exposure is not limited to telephone numbers because the parsing logic preserves full source objects under fields such as `metadata.candidates` and spreads arbitrary metadata into the task object. ### Attack Path ...[truncated 1362 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove `taskInput` from the returned operational result. Return only non-sensitive status information: ```javascript return { jobGroupId: result.jobGroupId, instanceId: result.instanceId, scriptId: result.scriptId, totalPhones: valid.length }; ``` 2. Do not preserve complete upstream candidate or CRM records unless they are strictly required for execution. Use an allowlist of necessary metadata fields. 3. If telephone numbers must be displayed for troubleshooting, redact them: ```javascript function maskPhone(phone) { return phone.replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2"); } ``` 4. Separate user-facing results from diagnostic logs. Keep verbose logging disabled by default and require an explicit debugging option. 5. Apply structured log sanitization before serializing any object. Recursively remove fields such as `phone`, `phoneNumber`, `mobile`, `contacts`, `candidates`, and other organization-specific personal-data fields. 6. Configure execution environments to restrict access to logs and establish short retention periods for any logs that may already contain personal information. 7. Add automated tests asserting that task output and logs do not contain complete telephone numbers or arbitrary input metadata. ]]>

T05 · Unauthorized Access and Privilege Escalation

Note
Location
scripts/bundle.js:82686
Finding
Automatic environment-file discovery reads configuration outside the Skill directory<![CDATA[ ## Vulnerability Details **File Location**: `scripts/bundle.js:82686-82698` **Vulnerability Type**: Excessive filesystem access and unintended secret loading **Risk Level**: Low ### Vulnerable Code ```javascript var envPaths = [ path.resolve(process.cwd(), ".env"), path.resolve(__dirname, "../../.env"), path.resolve(__dirname, "../../../.env") ]; for (const envPath of envPaths) { if (fs.existsSync(envPath)) { dotenv.config({ path: envPath }); console.log(`\u2705 \u5DF2\u52A0\u8F7D\u73AF\u5883\u53D8\u91CF: ${envPath}`); break; } } ``` ### Technical Analysis The Skill automatically searches for `.env` files in the current working directory and up to three directory levels relative to the bundled script. The parent paths can resolve outside the Skill package and into a shared workspace or unrelated parent application. Loading the first discovered file introduces all variables parsed by `dotenv` into the process environment. Although the application explicitly consumes only the two documented Alibaba Cloud OutboundBot credential variables, every bundled dependency and any code importing this module can access all loaded environment variables. This behavior violates least privilege because the Skill only requires two specifically named credentials but reads an entire configuration file that may belong to another project. The selected file is determined by runtime directory layout rather than explicit user authorization. ### Attack Path 1. The Skill is installed or executed within a shared workspace or application directory. 2. A `.env` file exists in the current working directory or one of the searched parent locations. 3. The file contains secrets or configuration belonging to the surrounding application. 4. The Skill starts and automatically reads the file without requiring an explicit path or user confirmation. 5. All parsed values become available through `process.env` to the Skill and its bundled dependencies. 6. If anoth ...[truncated 874 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Prefer credentials inherited explicitly from the parent process and remove automatic `.env` discovery entirely. 2. If environment-file support is necessary, require an explicit command-line option such as `--env-file <path>` rather than searching parent directories. 3. Restrict automatic loading to a fixed file within the Skill root. Resolve the canonical path and verify that it remains inside the expected directory before reading it. 4. Parse only the required keys instead of importing an entire file: - `ALIYUN_OUTBOUND_BOT_ACCESS_KEY_ID` - `ALIYUN_OUTBOUND_BOT_ACCESS_KEY_SECRET` 5. Reject symbolic links or paths that resolve outside the approved configuration directory. 6. Avoid logging the full environment-file path where workspace layout is considered sensitive. 7. Add tests that execute the Skill beneath a parent directory containing an unrelated `.env` file and verify that the parent file is not read. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (37)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The most serious mismatch is the apparent ability to read cloud credentials from environment and local files, query the ECS metadata service at 100.100.100.200 for role credentials, make arbitrary credential-refresh network requests, enumerate local network identifiers, and perform AES operations. In a skill advertised merely as outbound calling, these capabilities are highly sensitive because they can enable credential theft, lateral movement, host fingerprinting, and stealthy data handling far beyond the stated task.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The most serious mismatch is the apparent ability to read cloud credentials from environment and local files, query the ECS metadata service at 100.100.100.200 for role credentials, make arbitrary credential-refresh network requests, enumerate local network identifiers, and perform AES operations. In a skill advertised merely as outbound calling, these capabilities are highly sensitive because they can enable credential theft, lateral movement, host fingerprinting, and stealthy data handling far beyond the stated task.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The most serious mismatch is the apparent ability to read cloud credentials from environment and local files, query the ECS metadata service at 100.100.100.200 for role credentials, make arbitrary credential-refresh network requests, enumerate local network identifiers, and perform AES operations. In a skill advertised merely as outbound calling, these capabilities are highly sensitive because they can enable credential theft, lateral movement, host fingerprinting, and stealthy data handling far beyond the stated task.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The most serious mismatch is the apparent ability to read cloud credentials from environment and local files, query the ECS metadata service at 100.100.100.200 for role credentials, make arbitrary credential-refresh network requests, enumerate local network identifiers, and perform AES operations. In a skill advertised merely as outbound calling, these capabilities are highly sensitive because they can enable credential theft, lateral movement, host fingerprinting, and stealthy data handling far beyond the stated task.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The most serious mismatch is the apparent ability to read cloud credentials from environment and local files, query the ECS metadata service at 100.100.100.200 for role credentials, make arbitrary credential-refresh network requests, enumerate local network identifiers, and perform AES operations. In a skill advertised merely as outbound calling, these capabilities are highly sensitive because they can enable credential theft, lateral movement, host fingerprinting, and stealthy data handling far beyond the stated task.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The most serious mismatch is the apparent ability to read cloud credentials from environment and local files, query the ECS metadata service at 100.100.100.200 for role credentials, make arbitrary credential-refresh network requests, enumerate local network identifiers, and perform AES operations. In a skill advertised merely as outbound calling, these capabilities are highly sensitive because they can enable credential theft, lateral movement, host fingerprinting, and stealthy data handling far beyond the stated task.

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/bundle.js taskInput.json
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Content
_this;
        }
        return BaseError2;
      })(Error)
    );
    exports2.BaseError = BaseError;
    var ResponseError = (
      /** @class */
      (function(_super) {
        __extends(ResponseError2, _super);
        function ResponseError2(map) {
          var _this = _super.call(this, map) || this;
          _this.name = "ResponseError";
          _this.data = map.data;
          _this.description = map.description;
          _this.retryAfter = map.retryAfter;
          _this.accessDeniedDetail = map.accessDeniedDetail;
          if (_this.data && _this.data.statusCode) {
            _this.statusCode = Number(_this.data.statusCode);
          }
          return _this;
        }
        return ResponseError2;
      })(BaseError)
    );
    exports2.ResponseError = ResponseError;
    var UnretryableError = (
      /** @class */
      (function(_super) {
        __extends(UnretryableError2, _super);
        function UnretryableError2(message) {
          var _this = _super.call
Confidence
80% confidence
Finding
YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Cloud Metadata Access

High
Category
Server-Side Request Forgery
Content
var utils = __importStar(require_utils());
    var http_1 = require_http();
    var config_1 = __importDefault(require_config());
    var SECURITY_CRED_URL = "http://100.100.100.200/latest/meta-data/ram/security-credentials/";
    var RsaKeyPairCredential = class extends session_credential_1.default {
      constructor(publicKeyId, privateKeyFile) {
        if (!publicKeyId) {
Confidence
85% confidence
Finding
Code accesses a cloud instance metadata endpoint (e.g. 169.254.169.254). A single request can return temporary IAM credentials, making this a high-value SSRF target for credential theft.

Static analysis

No suspicious patterns detected.