Back to skill

Security audit

微信小游戏本地化Skill

Security checks for vulnerabilities and agentic risk

Overview

This localization skill is useful but needs review because it can upload project images, read stored MCP credentials, install packages, and rewrite project files with insufficient containment.

Review before installing. Use only on trusted projects, prefer an isolated workspace, keep backups, avoid enabling image translation unless you are comfortable uploading project assets, provide MCP credentials explicitly over HTTPS, and avoid copying tokens into every IDE config until the path validation and HTTP handling are hardened.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
Findings (7)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/upload-images.js:202
Finding
Arbitrary Local File Read and Exfiltration Through Image Path Traversal<![CDATA[ ## Vulnerability Details **File Location**: `scripts/upload-images.js`, lines 202–209 and 241–274 **Vulnerability Type**: Path traversal leading to unauthorized file disclosure and remote upload **Risk Level**: High ### Vulnerable Code ```js for (const relPath of imageRelPaths) { const srcPath = path.join(PROJECT_ROOT, relPath); if (!fs.existsSync(srcPath)) { console.warn(`Image does not exist, skipping: ${relPath}`); continue; } const destPath = path.join(filesDir, relPath); fs.mkdirSync(path.dirname(destPath), { recursive: true }); fs.copyFileSync(srcPath, destPath); copiedCount++; } ``` The resulting archive is subsequently read and transmitted: ```js const zipBuf = fs.readFileSync(zipPath); const totalBytes = zipBuf.length; const totalChunks = Math.ceil(totalBytes / CHUNK_SIZE); for (let i = 0; i < totalChunks; i++) { const start = i * CHUNK_SIZE; const end = Math.min(start + CHUNK_SIZE, totalBytes); const chunkBuf = zipBuf.slice(start, end); const chunkB64 = chunkBuf.toString('base64'); const partNum = i + 1; const partResult = await mcpCall('UploadScanFilesPartMcp', { file_id: fileId, part_number: partNum, content_base64: chunkB64 }); const etag = typeof partResult === 'string' ? partResult : (partResult && partResult.etag); if (!etag) { throw new Error(`Part ${partNum} did not return an etag: ${JSON.stringify(partResult)}`); } partList.push({ part_number: partNum, etag: String(etag) }); } ``` ### Technical Analysis Image paths are accepted through `--images` or `--images-file` and used directly with `path.join(PROJECT_ROOT, relPath)`. The script does not reject absolute paths, `..` components, or symbolic links resolving outside the project. `path.join()` normalizes traversal components but does not enforce containment. A value such as `../private-file` therefore resolves outside the intended project root. The selected file is copied into the upload staging directory ...[truncated 1179 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Resolve every requested path before use: ```js const root = fs.realpathSync(PROJECT_ROOT); const candidate = fs.realpathSync(path.resolve(root, relPath)); if (candidate !== root && !candidate.startsWith(root + path.sep)) { throw new Error(`Image path escapes project root: ${relPath}`); } ``` 2. Reject absolute paths and paths containing parent traversal components before resolution. 3. Resolve symbolic links with `fs.realpathSync()` and perform containment checks on the resolved result. 4. Allow only expected image extensions and verify file signatures before uploading. 5. Do not derive archive destination names from user-controlled relative paths. Generate sanitized internal names and maintain a separate mapping. 6. Apply the same containment validation to both source and staging destination paths. 7. Require explicit user confirmation of the final normalized file list before network upload. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
scripts/upload-images.js:220
Finding
Shell Command Injection Through the Project Path During ZIP Creation<![CDATA[ ## Vulnerability Details **File Location**: `scripts/upload-images.js`, lines 220–226 **Vulnerability Type**: OS command injection **Risk Level**: High ### Vulnerable Code ```js if (process.platform === 'win32') { execSync( `powershell -Command "Compress-Archive -Path '${tempDir}${path.sep}*' -DestinationPath '${zipPath}' -Force"`, { stdio: 'pipe' } ); } else { execSync(`cd "${tempDir}" && zip -r "${zipPath}" .`, { stdio: 'pipe' }); } ``` ### Technical Analysis `tempDir` and `zipPath` are derived from `PROJECT_ROOT`, which is populated from the user-controlled `--project` argument: ```js const PROJECT_ROOT = path.resolve(args.project || process.cwd()); ``` These paths are interpolated into shell command strings passed to `execSync()`. Quoting a value does not safely neutralize embedded quotes, command substitutions, shell metacharacters, or PowerShell expression syntax. On Unix-like systems, a malicious project path containing a double quote and shell operators can terminate the quoted `cd` argument and append another command. The PowerShell branch has a similar issue because attacker-controlled paths are nested inside both double-quoted PowerShell command text and single-quoted PowerShell arguments. ### Attack Path 1. An attacker convinces the Agent or user to run the uploader against a directory with a specially crafted name, or directly controls `--project`. 2. The project path contains shell or PowerShell metacharacters that escape the intended quoting. 3. The path is incorporated into `tempDir` and `zipPath`. 4. ZIP creation passes the interpolated command to a command shell through `execSync()`. 5. The injected command executes with the privileges of the Agent process. ### Impact Assessment Successful exploitation provides arbitrary local command execution. The attacker can read or modify files, access credentials available to the process, install additional software, make network requests, or alter the localized project. ...[truncated 99 chars]
Remediation
<![CDATA[ ## Remediation Suggestions Avoid invoking a shell. Use an API that accepts the executable and arguments separately: ```js const { execFileSync } = require('child_process'); execFileSync('zip', ['-r', zipPath, '.'], { cwd: tempDir, stdio: 'pipe' }); ``` For Windows, call PowerShell with a fixed command and pass paths through safely separated parameters, or preferably use a reviewed ZIP library that does not require a shell. Additional hardening should include: 1. Validate and canonicalize the project root. 2. Reject control characters and unusual path components. 3. Avoid `shell: true`. 4. Run the uploader with restricted filesystem and network privileges. 5. Add regression tests using paths containing quotes, spaces, semicolons, command substitutions, and PowerShell metacharacters. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
scripts/replace-text.js:125
Finding
Arbitrary File Modification and Command Injection in Text Replacement<![CDATA[ ## Vulnerability Details **File Location**: `scripts/replace-text.js`, lines 125–170 and 286 **Vulnerability Type**: Path traversal and OS command injection **Risk Level**: High ### Vulnerable Code ```js for (const [filePath, entries] of Object.entries(fileGroups)) { const fullPath = path.join(PROJECT_ROOT, filePath); if (!fs.existsSync(fullPath)) { totalSkipped += entries.length; results.push({ filePath, status: 'file_not_found', replaced: 0, failed: 0, skipped: entries.length }); continue; } const originalContent = fs.readFileSync(fullPath, 'utf8'); if (BACKUP && !DRY_RUN) { backupFile(fullPath, filePath); } const { newContent, replaced, failed, details } = replaceInFileWithValidation( originalContent, entries, filePath, fullPath, DRY_RUN ); if (replaced > 0 && !DRY_RUN) { fs.writeFileSync(fullPath, newContent, 'utf8'); const valid = validateFile(fullPath, filePath); if (!valid) { fs.writeFileSync(fullPath, originalContent, 'utf8'); } } } ``` JavaScript validation invokes a shell command containing the same path: ```js if (ext === '.js') { execSync(`node --check "${fullPath}"`, { stdio: 'pipe' }); return true; } ``` ### Technical Analysis `filePath` originates from translation metadata and is joined to `PROJECT_ROOT` without canonical containment enforcement. A malicious or corrupted `text_translations.json` can therefore specify paths containing `..` and cause the script to read, back up, modify, or restore files outside the project. If an external JavaScript filename includes shell metacharacters or embedded quotes, the path also reaches `execSync()` during syntax validation. This converts the path traversal primitive into a potential command-injection primitive. The backup path is constructed from the same untrusted relative path, so the backup operation does not establish a safe boundary. ### Attack P ...[truncated 890 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Resolve and validate every translation path against the canonical project root. 2. Reject absolute paths, parent traversal, null bytes, and symbolic links escaping the project. 3. Use a reusable safe-path function for reads, writes, backups, restoration, and validation. 4. Replace shell interpolation with an argument-array API: ```js const { execFileSync } = require('child_process'); execFileSync(process.execPath, ['--check', fullPath], { stdio: 'pipe' }); ``` 5. Validate the translation manifest against a strict schema. 6. Require every manifest path to match a file previously produced by the trusted scanner. 7. Refuse to process translation entries whose paths were not present in the scan report. 8. Run replacement in a restricted workspace and preserve immutable originals outside the writable tree. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/replace-image.js:202
Finding
Arbitrary File Overwrite Through Image Replacement Path Traversal<![CDATA[ ## Vulnerability Details **File Location**: `scripts/replace-image.js`, lines 202–258 and 303–307 **Vulnerability Type**: Path traversal resulting in arbitrary file overwrite **Risk Level**: High ### Vulnerable Code ```js const sourcePath = path.join(PROJECT_ROOT, sourceFile); if (MODE === 'replace') { if (!fs.existsSync(sourcePath)) { totalFailed++; results.push({ key, sourceFile, status: 'missing_source' }); continue; } const translatedStat = fs.statSync(translatedPath); if (translatedStat.size === 0) { totalFailed++; results.push({ key, sourceFile, status: 'empty_target' }); continue; } if (BACKUP && !DRY_RUN) { backupFile(sourcePath, sourceFile); } if (!DRY_RUN) { fs.copyFileSync(translatedPath, sourcePath); const replacedStat = fs.statSync(sourcePath); if (replacedStat.size === 0) { const backupPath = path.join(BACKUP_DIR, sourceFile); if (fs.existsSync(backupPath)) { fs.copyFileSync(backupPath, sourcePath); } } } } else { const langDir = path.join(PROJECT_ROOT, `assets_${TARGET_LANG}`); const targetPath = path.join(langDir, sourceFile); const targetDir = path.dirname(targetPath); if (!DRY_RUN) { fs.mkdirSync(targetDir, { recursive: true }); fs.copyFileSync(translatedPath, targetPath); } } ``` The backup path is constructed in the same unsafe manner: ```js function backupFile(fullPath, relativePath) { const backupPath = path.join(BACKUP_DIR, relativePath); const backupDir = path.dirname(backupPath); fs.mkdirSync(backupDir, { recursive: true }); fs.copyFileSync(fullPath, backupPath); } ``` ### Technical Analysis `sourceFile` is supplied by `image_translations.json` and is used as a filesystem path without checking whether it remains under the project root. Parent traversal components can escape both `PROJECT_ROOT` and the language-specific destination directory. The same problem affects backup and restoration paths. Existen ...[truncated 948 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Canonicalize and enforce project-root containment for `sourceFile`, `targetFile`, translated assets, backups, and language-directory destinations. 2. Resolve symbolic links before checking containment. 3. Reject absolute paths and any path containing parent traversal. 4. Verify that source paths correspond to image entries in the trusted scan report. 5. Restrict processing to approved image formats and validate file signatures. 6. Generate backup paths from sanitized identifiers rather than untrusted relative paths. 7. Use atomic replacement: write to a safe temporary file in the destination directory, validate it, then rename it. 8. Fail closed when any path validation fails. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
references/mcp-image-translation.md:32
Finding
MCP Credentials and Project Images May Be Transmitted Over Plaintext HTTP<![CDATA[ ## Vulnerability Details **File Location**: `references/mcp-image-translation.md`, lines 32–117; `scripts/upload-images.js`, lines 113–136 **Vulnerability Type**: Cleartext transmission of credentials and project data **Risk Level**: High ### Vulnerable Configuration The documentation repeatedly instructs users to configure an HTTP endpoint: ```json { "mcpServers": { "minigame-l10n": { "url": "http://gamemp.weixin.qq.com/cgi-bin/gamewxagl10nwap/mcptransfer", "headers": { "APPID": "<AppID>", "TOKEN": "<access token>" }, "disabled": false } } } ``` The uploader explicitly permits either HTTP or HTTPS and sends credentials in request headers: ```js const url = new URL(MCP_URL); const isHttps = url.protocol === 'https:'; const transport = isHttps ? https : http; const reqOptions = { hostname: url.hostname, port: url.port || (isHttps ? 443 : 80), path: url.pathname + (url.search || ''), method: 'POST', headers: { 'Content-Type': 'application/json', 'APPID': APPID, 'TOKEN': TOKEN, 'Content-Length': Buffer.byteLength(body) } }; const req = transport.request(reqOptions, (res) => { // Response handling }); ``` ### Technical Analysis The documented endpoint uses unencrypted HTTP, and the implementation accepts that protocol without warning or rejection. The access token, AppID, image archives, tool calls, and server responses are therefore exposed to network observation and modification. HTTP provides neither confidentiality nor server authentication. An on-path attacker can read the token, replay it, replace responses, or modify uploaded data. ### Attack Path 1. A user follows the documented MCP configuration. 2. `upload-images.js` loads the HTTP URL and credentials. 3. The uploader sends `APPID` and `TOKEN` headers over an unencrypted connection. 4. A network observer captures the credentials and uploaded project data. 5. The observer can replay the token or alter MCP ...[truncated 397 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace every documented HTTP endpoint with the service's verified HTTPS endpoint. 2. Reject all non-HTTPS MCP URLs in code: ```js const url = new URL(MCP_URL); if (url.protocol !== 'https:') { throw new Error('MCP uploads require HTTPS'); } ``` 3. Do not silently downgrade from HTTPS to HTTP. 4. Validate the expected hostname against an allowlist. 5. Use normal TLS certificate validation and do not add certificate-bypass options. 6. Rotate tokens that may previously have been transmitted over HTTP. 7. Use short-lived, narrowly scoped credentials where supported. 8. Avoid printing sensitive configuration values or URLs containing signed query parameters. ]]>

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
scripts/upload-images.js:60
Finding
Overbroad Automatic Access to Multiple IDE Credential Stores<![CDATA[ ## Vulnerability Details **File Location**: `scripts/upload-images.js`, lines 60–88 **Vulnerability Type**: Excessive credential-file access and violation of least privilege **Risk Level**: Medium ### Vulnerable Code ```js const homeDir = process.env.USERPROFILE || process.env.HOME || ''; const mcpJsonPaths = [ path.join(PROJECT_ROOT, 'mcp.json'), path.join(PROJECT_ROOT, '.workbuddy', 'mcp.json'), path.join(PROJECT_ROOT, '.codebuddy', 'mcp.json'), path.join(PROJECT_ROOT, '.cursor', 'mcp.json'), path.join(PROJECT_ROOT, '.claude', 'mcp.json'), path.join(PROJECT_ROOT, '.codex', 'mcp.json'), path.join(homeDir, '.workbuddy', 'mcp.json'), path.join(homeDir, '.codebuddy', 'mcp.json'), path.join(homeDir, '.cursor', 'mcp.json'), path.join(homeDir, '.claude', 'mcp.json'), path.join(homeDir, '.codex', 'mcp.json') ]; for (const mcpPath of mcpJsonPaths) { if (fs.existsSync(mcpPath)) { try { const mcpConfig = JSON.parse(fs.readFileSync(mcpPath, 'utf8')); const l10nConfig = mcpConfig.mcpServers && mcpConfig.mcpServers['minigame-l10n']; if (l10nConfig) { MCP_URL = MCP_URL || l10nConfig.url; APPID = APPID || (l10nConfig.headers && l10nConfig.headers.APPID); TOKEN = TOKEN || (l10nConfig.headers && l10nConfig.headers.TOKEN); break; } } catch (e) { // Ignored } } } ``` ### Technical Analysis Authenticated image upload legitimately requires access to one localization-service credential. The implementation instead probes project-level and user-level configuration files for five different IDE products. These files can contain credentials for unrelated MCP servers. Although the current code extracts only the `minigame-l10n` entry, parsing every available configuration file expands the trusted-data surface beyond what is necessary for the declared task. The accompanying instructions also recommend placing credentials into all installed ...[truncated 1069 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Require an explicit `--config` path, or use narrowly named environment variables for the MCP URL, AppID, and token. 2. If automatic discovery is retained, identify the active IDE and inspect only its configuration after explicit user consent. 3. Do not probe all user-level credential stores. 4. Remove the recommendation to write the same token into every installed IDE. 5. Support operating-system credential stores or a dedicated secret manager rather than plaintext JSON. 6. Request credentials only when image translation is enabled. 7. Document exactly which file will be read before access occurs. 8. Apply restrictive permissions to any generated credential file. ]]>

T08 · Insecure Dependencies

Warning
Location
scripts/package.json:6
Finding
Unpinned Dependency Installation Without a Lockfile<![CDATA[ ## Vulnerability Details **File Location**: `scripts/package.json`, lines 6–14; `SKILL.md`, lines 69–71 and 293 **Vulnerability Type**: Mutable third-party dependency resolution **Risk Level**: Medium ### Vulnerable Configuration ```json "dependencies": { "@babel/parser": "^7.24.0", "@babel/traverse": "^7.24.0", "@typescript-eslint/typescript-estree": "^7.0.0", "esprima": "^4.0.1", "json-source-map": "^0.6.1", "papaparse": "^5.4.0", "pinyin": "^4.0.0", "yaml": "^2.4.0" } ``` The Skill requires a mutable installation: ```bash cd scripts/ && npm install ``` ### Technical Analysis Dependency versions use caret ranges, and no package lockfile was present in the audited directory structure. Consequently, separate installations can resolve different package versions even when the Skill itself has not changed. The workflow mandates `npm install`, causing code from the package registry and dependency graph to be downloaded into the local environment. A compromised future release, dependency-account takeover, or malicious transitive dependency could introduce code that was not present during this audit. No evidence established that the currently named packages are malicious. The vulnerability is the non-reproducible and insufficiently constrained supply-chain process. ### Attack Path 1. A dependency or transitive dependency publishes a compromised version that satisfies a configured range. 2. A user runs the mandatory `npm install` command. 3. npm resolves the newly published version because no reviewed lockfile fixes the dependency graph. 4. The compromised package is installed. 5. Malicious package code may run during installation or when the scanner imports the dependency. ### Impact Assessment A compromised dependency executes with the privileges of the user running the Skill. It could read project files and credentials, alter localization output, modify source code, or communicate with external services. The scope includes the ...[truncated 102 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin reviewed dependency versions exactly rather than using range operators. 2. Generate and commit a reviewed `package-lock.json`. 3. Replace `npm install` in the workflow with `npm ci`. 4. Perform dependency integrity and vulnerability checks in continuous integration. 5. Review transitive dependencies and installation scripts before updates. 6. Consider installing with `--ignore-scripts` where dependency functionality permits it. 7. Use a trusted registry and enforce package-integrity metadata. 8. Update dependencies through a controlled review process rather than resolving mutable versions during normal Skill execution. ]]>
Vulnerability Patterns
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • 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 (83)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The skill advertises localization features but also performs remote upload of local images, reads user-level IDE MCP configuration files, and conducts chunked network communication with external services. Those behaviors materially change the trust and privacy profile of the skill, because local project assets and local configuration secrets may be exposed without sufficiently prominent disclosure at the trigger/overview level.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill advertises localization features but also performs remote upload of local images, reads user-level IDE MCP configuration files, and conducts chunked network communication with external services. Those behaviors materially change the trust and privacy profile of the skill, because local project assets and local configuration secrets may be exposed without sufficiently prominent disclosure at the trigger/overview level.

Vague Triggers

High
Confidence
95% confidence
Finding
The trigger conditions include broad generic terms such as '翻译' and '多语言', which can match ordinary conversation and activate a skill that performs scanning, dependency installation, file writes, and possible network uploads. Because this skill is stateful and mutating, overbroad invocation criteria materially increase the chance of accidental execution and unintended project changes.

Vague Triggers

High
Confidence
98% confidence
Finding
The catch-all fuzzy trigger ('game for overseas users' and similar phrasing) lacks clear boundaries and can invoke a powerful workflow from ambiguous intent. In this context that is especially risky because the skill can install packages, read configs, upload images, and modify source files, so accidental activation has meaningful security and integrity consequences.

Ae1

High
Category
analysis-evasion
Content
- `references/scan-analysis.md` — 扫描分析
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `references/scan-analysis.md` — 扫描分析
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `references/execute-translation.md` — 执行翻译
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `references/execute-translation.md` — 执行翻译
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `references/execute-translation.md` — 执行翻译
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `references/apply-resources.md` — 应用本地化资源(文本替换、图片替换、语言包生成)
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `references/apply-resources.md` — 应用本地化资源(文本替换、图片替换、语言包生成)
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `references/quality-verification.md` — 本地化质量验证
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `references/quality-verification.md` — 本地化质量验证
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `scripts/scan-chinese.js` — **中文字符串全量扫描脚本 v1.0**(AST 扫描 JS/TS/JSON/CSV/TSV/WXML/HTML/CSS/Cocos/Unity/C#/XML/TXT,双引擎解析 esprima + @babel/parser 容错模式,精确行列 range
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `scripts/scan-chinese.js` — **中文字符串全量扫描脚本 v1.0**(AST 扫描 JS/TS/JSON/CSV/TSV/WXML/HTML/CSS/Cocos/Unity/C#/XML/TXT,双引擎解析 esprima + @babel/parser 容错模式,精确行列 range
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `scripts/scan-chinese.js` — **中文字符串全量扫描脚本 v1.0**(AST 扫描 JS/TS/JSON/CSV/TSV/WXML/HTML/CSS/Cocos/Unity/C#/XML/TXT,双引擎解析 esprima + @babel/parser 容错模式,精确行列 range
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `scripts/scan-chinese.js` — **中文字符串全量扫描脚本 v1.0**(AST 扫描 JS/TS/JSON/CSV/TSV/WXML/HTML/CSS/Cocos/Unity/C#/XML/TXT,双引擎解析 esprima + @babel/parser 容错模式,精确行列 range
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `scripts/replace-text.js` — 文本替换脚本 v3.5(含备份、dry-run、逐条即时语法校验、逐文件校验、最终全局校验、自动回滚、模板字符串增强兼容、TS 语法检查修复、CSV/TSV 数据文件替换支持、**精确字符串字面量定位** — 优先替换引号内的字符串,排除注释中的同名文本、**
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `scripts/replace-text.js` — 文本替换脚本 v3.5(含备份、dry-run、逐条即时语法校验、逐文件校验、最终全局校验、自动回滚、模板字符串增强兼容、TS 语法检查修复、CSV/TSV 数据文件替换支持、**精确字符串字面量定位** — 优先替换引号内的字符串,排除注释中的同名文本、**
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `scripts/generate-langpack.js` — 语言包生成脚本 v3.0(支持 Cocos Creator i18n 插件 / Cocos Creator L10N / LayaAir / Egret / Unity / 原生微信小游戏。自动部署语言包到引擎目录、自动注入 i18n 初始化代码、生
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `scripts/generate-langpack.js` — 语言包生成脚本 v3.0(支持 Cocos Creator i18n 插件 / Cocos Creator L10N / LayaAir / Egret / Unity / 原生微信小游戏。自动部署语言包到引擎目录、自动注入 i18n 初始化代码、生
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `scripts/verify-build-strings.js` — 编译产物二次复核脚本(基于 AST 扫描编译后 JS/JSON 中的残留中文,可选步骤)
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `scripts/verify-build-strings.js` — 编译产物二次复核脚本(基于 AST 扫描编译后 JS/JSON 中的残留中文,可选步骤)
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `scripts/verify-build-strings.js` — 编译产物二次复核脚本(基于 AST 扫描编译后 JS/JSON 中的残留中文,可选步骤)
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- `references/scan-report-schema.md` — 扫描报告格式定义
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/replace-text.js:286

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/upload-images.js:220