registry  /  @canonry/canonry  /  4.105.0

@canonry/canonry@4.105.0

Agent-first open-source AEO operating platform - track how answer engines cite your domain

AI Security Review

scanned 8d ago · by lpm-firewall-ai

No confirmed malicious attack surface was found. The package is a CLI/server tool with opt-out telemetry, local config writes, explicit skill installation, and provider/API integrations aligned with its AEO platform purpose.

Static reason
One or more suspicious static signals were detected.; previous stored version diff introduced dangerous source
Trigger
User runs canonry/cnry CLI commands, serve/init/skills install, or MCP server.
Impact
Telemetry and local project/config modifications occur during normal use; no unconsented lifecycle execution or credential exfiltration was confirmed.
Mechanism
user-invoked CLI operations, telemetry, local config and skill setup
Rationale
Static source inspection found privacy-sensitive telemetry and user-invoked agent skill writes, but they are disclosed or command-triggered and aligned with the package's CLI product behavior. There is no lifecycle hook, hidden import-time payload, credential harvesting, persistence, destructive action, or unconsented AI-agent control mutation.
Evidence
package.jsonbin/canonry.mjsbin/canonry-mcp.mjsdist/cli.jsdist/chunk-XRKGLZF6.jsdist/chunk-IDSJTITA.jsdist/chunk-UCKUZCIM.jsassets/agent-workspace/AGENTS.mdassets/agent-workspace/skills/canonry/SKILL.md~/.canonry/config.yaml~/.canonry/canonry.pid.claude/skills/<skill>.codex/skills/<skill>~/.canonry/plugins~/.canonry/cache/commoncrawl~/.canonry/screenshots
Network endpoints10
canonry.ai/api/telemetryregistry.npmjs.org/-/package/@canonry/canonry/dist-tagsapi.perplexity.aiapi.ads.openai.com/v1places.googleapis.com/v1oauth2.googleapis.com/tokenwww.googleapis.com/webmasters/v3searchconsole.googleapis.com/v1/urlInspection/index:inspectindexing.googleapis.com/v3ssl.bing.com/webmaster/api.svc/json

Decision evidence

public snapshot
AI called this Clean at 84.0% confidence as Benign with medium false-positive risk.
Evidence for block
  • dist/chunk-XRKGLZF6.js builds a deterministic anonymous ID from hostname and MAC when no config ID exists, then posts telemetry to canonry.ai.
  • dist/cli.js sends cli.command telemetry on normal CLI runs when telemetry is enabled.
  • dist/chunk-XRKGLZF6.js can install bundled skills into .claude/skills and symlink .codex/skills, but only via explicit skills install/init flow.
Evidence against
  • package.json has no install/preinstall/postinstall lifecycle scripts.
  • bin/canonry.mjs and bin/canonry-mcp.mjs only import CLI/MCP entrypoints; no install-time execution.
  • Telemetry is disclosed in first-run notice and can be disabled by config, CANONRY_TELEMETRY_DISABLED, DO_NOT_TRACK, or CI.
  • Child process usage is package-aligned: opening OAuth URL, daemonizing local server, or user-invoked DuckDB plugin install.
  • Credential references are for local Canonry config, OAuth integrations, and database migrations; no source shows credential harvesting/exfiltration.
Behavioral surface
Source
ChildProcessCryptoEnvironmentVarsFilesystemNetworkShell
Supply chain
HighEntropyStringsMinifiedObfuscatedProtestwareTelemetryUrlStrings
ManifestNo manifest risk signals triggered.
scanned 26 file(s), 4.35 MB of source, external domains: accounts.google.com, aistudio.google.com, analyticsdata.googleapis.com, api.ads.openai.com, api.deepinfra.com, api.perplexity.ai, bit.ly, brightkidsdental.com, businessprofileperformance.googleapis.com, canonry.ai, canonry.local, citypointdental.com, commoncrawl.org, console.cloud.google.com, console.developers.google.com, data.commoncrawl.org, developers.google.com, downtownsmiles.com, example.com, github.com, harbordental.com, hooks.example.com, indexing.googleapis.com, json-schema.org, logging.googleapis.com, mybusinessaccountmanagement.googleapis.com, mybusinessbusinessinformation.googleapis.com, mybusinesslodging.googleapis.com, oauth2.googleapis.com, openai.com, parkpediatricdental.com, places.googleapis.com, platform.claude.com, platform.openai.com, radix-ui.com, rdap.arin.net, react.dev, redacted.invalid, redux-toolkit.js.org, redux.js.org, registry.npmjs.org, schema.org, searchconsole.googleapis.com, ssl.bing.com, support.google.com, vercel.com, www.bing.com, www.googleapis.com, www.npmjs.com, www.perplexity.ai

Source & flagged code

4 flagged · loading source
dist/chunk-UCKUZCIM.jsView file
25763// ../integration-commoncrawl/src/plugin-installer.ts L25764: import { spawn } from "child_process"; L25765: import fs4 from "fs/promises";
High
Child Process

Package source references child process execution.

dist/chunk-UCKUZCIM.jsView on unpkg · L25763
dist/cli.jsView file
10330databasePath, L10331: apiUrl: env.apiUrl || existingConfig?.apiUrl || `http://localhost:${process.env.CANONRY_PORT || "4100"}`, L10332: providers: Object.keys(mergedProviders ?? {}), ... L10345: // src/commands/daemon.ts L10346: import { spawn } from "child_process"; L10347: import fs9 from "fs";
High
Same File Env Network Execution

A single source file combines environment access, network access, and code or shell execution; review context before blocking.

dist/cli.jsView on unpkg · L10330
dist/chunk-XRKGLZF6.jsView file
187var _require = createRequire(import.meta.url); L188: var { version: VERSION } = _require("../package.json"); L189: var TELEMETRY_ENDPOINT = "https://canonry.ai/api/telemetry"; L190: var TIMEOUT_MS = 3e3; ... L201: function isTelemetryEnabled() { L202: if (process.env.CANONRY_TELEMETRY_DISABLED === "1") return false; L203: if (process.env.DO_NOT_TRACK === "1") return false; L204: if (process.env.CI) return false; L205: if (!configExists()) return true; ... L243: try { L244: const hostname = os.hostname() || ""; L245: const mac = firstNonInternalMac();
High
Host Fingerprint Exfiltration

Source collects local host identity data and sends it to an external endpoint.

dist/chunk-XRKGLZF6.jsView on unpkg · L187
dist/chunk-IDSJTITA.jsView file
matchType = previous_version_dangerous_delta matchedPackage = @canonry/canonry@4.111.0 matchedIdentity = npm:QGNhbm9ucnkvY2Fub25yeQ:4.111.0 similarity = 0.846 summary = stored previous version shares package body but lacks this dangerous source file
Critical
Previous Version Dangerous Delta

This package version adds a dangerous source file absent from the previous stored version; route for source-aware review.

dist/chunk-IDSJTITA.jsView on unpkg

Findings

1 Critical4 High4 Medium6 Low
CriticalPrevious Version Dangerous Deltadist/chunk-IDSJTITA.js
HighChild Processdist/chunk-UCKUZCIM.js
HighShell
HighSame File Env Network Executiondist/cli.js
HighHost Fingerprint Exfiltrationdist/chunk-XRKGLZF6.js
MediumNetwork
MediumEnvironment Vars
MediumProtestware
MediumStructural Risk Force Deep Review
LowScripts Present
LowFilesystem
LowObfuscated
LowHigh Entropy Strings
LowTelemetry
LowUrl Strings