Ae1
- Category
- analysis-evasion
- Confidence
- 100% confidence
- Finding
Referenced artifact was not completely inspected
- Content
md - Windows x64: `scripts/install-windows.js`
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a disclosed JishuDB installer/connector that uses high-impact local installation steps, but its artifacts keep them scoped to reviewed helpers, fixed release sources, explicit approval, and user consent gates.
Install only if you intend to let an agent download, install, and launch JishuDB Desktop and edit the selected MCP client configuration. Review the helper approval envelope carefully, especially release source, paths, profile, and the unsigned Windows publisher notice; do not provide OAuth codes or tokens in chat.
Referenced artifact was not completely inspected
- Windows x64: `scripts/install-windows.js`
Referenced artifact was not completely inspected
- Windows x64: `scripts/install-windows.js`
Referenced artifact was not completely inspected
- Windows x64: `scripts/install-windows.js`
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
assert_digest "$partial_path" "$expected_sha" installer
cnb_revalidate_approval
/bin/mv -- "$partial_path" "$installer_path"
/bin/rm -f -- "${root}/download-location.txt"
fi
jxa result download "$PLAN_PATH" "$PLAN_SHA256" "$offset" "$added"
}
The skill explicitly instructs the agent to use shell execution, network access, environment/proxy settings, and local file manipulation, but it declares no corresponding tool scope or permission boundaries. That creates a real least-privilege gap: a host may expose broader capabilities than intended, and users/reviewers are not given a machine-readable restriction on what the skill is allowed to do.
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
- `route=password-login`: retain ordinary browser login and OAuth consent.
- `route=password-setup`, `route=unavailable`, a missing field, or an unknown
schema: explain that the current installation may require ordinary app setup.
Do not promise passwordless onboarding, silently upgrade, or disable verification.
Browser consent and client connection are separate completion steps. If the
browser shows "authorized" but remains on the handoff page, direct the user to
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
| Observation | Check and recovery |
| --- | --- |
| No host entry or wrong effective entry | Locate the configuration actually loaded by the client. Resolve overlapping scopes or overrides before editing. Offer a target choice if unresolved. |
| File contains JishuDB but the host's MCP list does not | This is an unloaded configuration, not yet an OAuth failure. Use the host's supported reload/refresh or configuration-save action and read its list back. If no such action is exposed, return `USER_ACTION_REQUIRED` for a safe user-operated reload/import or restart. Do not ask the user to trust an entry that has not appeared. |
| DNS failure, no route, or connection timeout | Verify the selected host and service reachability from the client. Ask for an updated address or restoration of the required network only when needed. A private IP or timeout does not prove a VPN or subnet cause. |
| Local connection refused | Resolve `desktop-endpoint.json`; check the installed app and listener. Start the existing app within the authorized scope and current user's desktop session. An SSH service-session process is not proof of a working desktop launch. |
| App uninstalled; endpoint or data-location JSON remains | Preserve the files. The endpoint is a port preference; the data bootstrap locates retained data. Use the installation helper's reviewed plan: valid retained data selects an interactive data-preserving reinstall, while an endpoint alone can be reused by a fresh install. Do not delete data or configuration to satisfy fresh-install checks. |
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
| Observation | Check and recovery |
| --- | --- |
| No host entry or wrong effective entry | Locate the configuration actually loaded by the client. Resolve overlapping scopes or overrides before editing. Offer a target choice if unresolved. |
| File contains JishuDB but the host's MCP list does not | This is an unloaded configuration, not yet an OAuth failure. Use the host's supported reload/refresh or configuration-save action and read its list back. If no such action is exposed, return `USER_ACTION_REQUIRED` for a safe user-operated reload/import or restart. Do not ask the user to trust an entry that has not appeared. |
| DNS failure, no route, or connection timeout | Verify the selected host and service reachability from the client. Ask for an updated address or restoration of the required network only when needed. A private IP or timeout does not prove a VPN or subnet cause. |
| Local connection refused | Resolve `desktop-endpoint.json`; check the installed app and listener. Start the existing app within the authorized scope and current user's desktop session. An SSH service-session process is not proof of a working desktop launch. |
| App uninstalled; endpoint or data-location JSON remains | Preserve the files. The endpoint is a port preference; the data bootstrap locates retained data. Use the installation helper's reviewed plan: valid retained data selects an interactive data-preserving reinstall, while an endpoint alone can be reused by a fresh install. Do not delete data or configuration to satisfy fresh-install checks. |
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
if (matches.length !== 1) throw new Error(label + ' must exist exactly once');
const asset = matches[0];
assetDigest(asset, label);
const expected = 'https://api.github.com/repos/x-aijishu/jishudb-desktop-releases/releases/assets/' + asset.id;
if (asset.url !== expected) throw new Error(label + ' API URL is not canonical');
return asset;
}
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
if (matches.length !== 1) throw new Error(label + ' must exist exactly once');
const asset = matches[0];
assetDigest(asset, label);
const expected = 'https://api.github.com/repos/x-aijishu/jishudb-desktop-releases/releases/assets/' + asset.id;
if (asset.url !== expected) throw new Error(label + ' API URL is not canonical');
return asset;
}
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
if (matches.length !== 1) throw new Error(label + ' must exist exactly once');
const asset = matches[0];
assetDigest(asset, label);
const expected = 'https://api.github.com/repos/x-aijishu/jishudb-desktop-releases/releases/assets/' + asset.id;
if (asset.url !== expected) throw new Error(label + ' API URL is not canonical');
return asset;
}
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
if (matches.length !== 1) throw new Error(label + ' must exist exactly once');
const asset = matches[0];
assetDigest(asset, label);
const expected = 'https://api.github.com/repos/x-aijishu/jishudb-desktop-releases/releases/assets/' + asset.id;
if (asset.url !== expected) throw new Error(label + ' API URL is not canonical');
return asset;
}
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
[[ ! -e "$endpoint_path" ]] || fail "endpoint_conflict" "Desktop endpoint configuration appeared before launch"
/usr/bin/printf '{\n "localPort": %d,\n "schemaVersion": %d\n}\n' "$port" "$ENDPOINT_CONFIG_SCHEMA" > "$endpoint_path" ||
fail "endpoint_persistence_failed" "Desktop endpoint could not be persisted"
/bin/chmod 600 "$endpoint_path"
}
run_plan() {
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
[[ ! -e "$endpoint_path" ]] || fail "endpoint_conflict" "Desktop endpoint configuration appeared before launch"
/usr/bin/printf '{\n "localPort": %d,\n "schemaVersion": %d\n}\n' "$port" "$ENDPOINT_CONFIG_SCHEMA" > "$endpoint_path" ||
fail "endpoint_persistence_failed" "Desktop endpoint could not be persisted"
/bin/chmod 600 "$endpoint_path"
}
run_plan() {
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.
validate_bundle_symlinks "${mount_point}/JishuDB.app" "mounted application bundle"
[[ -z "$signed_team" ]] || verify_signed_artifact "${mount_point}/JishuDB.app" "$signed_team" app
local bundle_id bundle_version runtime_binary
bundle_id=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' "${mount_point}/JishuDB.app/Contents/Info.plist")
bundle_version=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' "${mount_point}/JishuDB.app/Contents/Info.plist")
[[ "$bundle_id" == "com.aijishu.jishudb" && "$bundle_version" == "$version" ]] || fail "installer_content_invalid" "bundle identity or version does not match the plan"
runtime_binary="${mount_point}/JishuDB.app/Contents/Resources/runtime/jishudb"
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.
validate_bundle_symlinks "${mount_point}/JishuDB.app" "mounted application bundle"
[[ -z "$signed_team" ]] || verify_signed_artifact "${mount_point}/JishuDB.app" "$signed_team" app
local bundle_id bundle_version runtime_binary
bundle_id=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' "${mount_point}/JishuDB.app/Contents/Info.plist")
bundle_version=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' "${mount_point}/JishuDB.app/Contents/Info.plist")
[[ "$bundle_id" == "com.aijishu.jishudb" && "$bundle_version" == "$version" ]] || fail "installer_content_invalid" "bundle identity or version does not match the plan"
runtime_binary="${mount_point}/JishuDB.app/Contents/Resources/runtime/jishudb"
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.
validate_bundle_symlinks "${mount_point}/JishuDB.app" "mounted application bundle"
[[ -z "$signed_team" ]] || verify_signed_artifact "${mount_point}/JishuDB.app" "$signed_team" app
local bundle_id bundle_version runtime_binary
bundle_id=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' "${mount_point}/JishuDB.app/Contents/Info.plist")
bundle_version=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' "${mount_point}/JishuDB.app/Contents/Info.plist")
[[ "$bundle_id" == "com.aijishu.jishudb" && "$bundle_version" == "$version" ]] || fail "installer_content_invalid" "bundle identity or version does not match the plan"
runtime_binary="${mount_point}/JishuDB.app/Contents/Resources/runtime/jishudb"
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.
validate_bundle_symlinks "${mount_point}/JishuDB.app" "mounted application bundle"
[[ -z "$signed_team" ]] || verify_signed_artifact "${mount_point}/JishuDB.app" "$signed_team" app
local bundle_id bundle_version runtime_binary
bundle_id=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' "${mount_point}/JishuDB.app/Contents/Info.plist")
bundle_version=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' "${mount_point}/JishuDB.app/Contents/Info.plist")
[[ "$bundle_id" == "com.aijishu.jishudb" && "$bundle_version" == "$version" ]] || fail "installer_content_invalid" "bundle identity or version does not match the plan"
runtime_binary="${mount_point}/JishuDB.app/Contents/Resources/runtime/jishudb"
The helper defines removeFileQuietly and removeDirectoryQuietly using fs.rmSync(..., { force: true, recursive: true }) and intentionally suppresses all errors, but these deletion behaviors have no user-facing prompt, log, or warning in this code file. Because the script later invokes these functions to remove probe, evidence, and plan directories, users are not explicitly informed that local filesystem content will be deleted as part of execution.
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
offset = fs.existsSync(installerPath) ? (await assertDownloadFile(installerPath, context)).size : 0;
if (offset > plan.assets.installer.size) fail('invalid_download_cache', 'partial installer exceeds the approved size');
const snapshotPath = path.join(transactionRoot, 'download-release.json');
if (sourceInfo && offset > 0 && !fs.existsSync(snapshotPath)) fail('invalid_download_cache', 'partial mirror cache has no approval binding');
if (fs.existsSync(snapshotPath)) {
const snapshot = await readDownloadJson(snapshotPath, context);
if (sourceInfo && (snapshot.approvalSha256 !== approvalSha256 || snapshot.catalogSha256 !== sha256Bytes(sourceInfo.catalogBytes))) fail('invalid_download_cache', 'cached release belongs to another approval');
The script launches a Windows installer via childProcess.spawnSync with silent install flags (/S) and no accompanying console output, confirmation prompt, or other direct user-facing disclosure in this file at the execution point. Although the operation is central to an install helper, this specific code path gives no immediate warning that an external installer will now run and modify the system.
Detected: suspicious.dangerous_exec, suspicious.env_credential_access