{"data":{"skill":{"slug":"sudoprivacy-shareone","name":"shareone","icon":"📦","repo":"https://github.com/sudoprivacy/shareone-skill/tree/df96cc7c4d602c816b6a50704e840b8224a501ad/","status":"approved","author":"sudoprivacy","authorVersion":null,"skillstoreRevision":null},"audit":{"id":"4dd37cb2-03de-4111-9f27-039b95991a9b","skill_id":"f4ccc650-e4a1-46d1-ab10-d660d0141237","version":3,"content_hash":"ef83796b889c70559be9f7f024b239d1","risk_level":"high","is_blocked":false,"safe_to_publish":false,"analysis_status":"ok","agent_auto_install_policy":null,"manual_install_policy":null,"summary":"Static external-command and weak-crypto alerts are mostly false positives: reviewed lines are Markdown command examples, JavaScript template strings, URL parsing, timeout handling, and crypto.randomBytes for multipart boundaries. The skill still has confirmed high-risk behavior because it reads local files, sends content and API keys over the network, stores credentials locally, prints API keys, and can derive an authenticated request host from a user-supplied URL.","remediation":[],"risk_factor_evidence":[{"factor":"scripts","evidence":[{"file":"scripts/upload_page.js","line_end":8,"line_start":1},{"file":"scripts/shareone_upload.js","line_end":13,"line_start":1},{"file":"scripts/download_share.js","line_end":8,"line_start":1}]},{"factor":"network","evidence":[{"file":"scripts/shareone_client.js","line_end":90,"line_start":58},{"file":"scripts/shareone_upload.js","line_end":78,"line_start":58},{"file":"scripts/upload_page.js","line_end":90,"line_start":83}]},{"factor":"filesystem","evidence":[{"file":"scripts/shareone_client.js","line_end":43,"line_start":28},{"file":"scripts/shareone_upload.js","line_end":59,"line_start":36},{"file":"scripts/upload_page.js","line_end":62,"line_start":60}]},{"factor":"env_access","evidence":[{"file":"scripts/shareone_client.js","line_end":21,"line_start":12},{"file":"scripts/shareone_client.js","line_end":39,"line_start":38},{"file":"scripts/shareone_client.js","line_end":190,"line_start":168}]},{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":23,"line_start":17},{"file":"workflows/environment-and-credentials.md","line_end":11,"line_start":7},{"file":"workflows/publish-text-page.md","line_end":49,"line_start":45}]}],"critical_findings":[],"high_findings":[{"title":"API Key Can Be Sent to a User-Supplied Host","locations":[{"file":"scripts/update_share_settings.js","line_end":103,"line_start":98},{"file":"scripts/update_share_settings.js","line_end":153,"line_start":147},{"file":"scripts/shareone_client.js","line_end":190,"line_start":164}],"confidence":0.9,"description":"update_share_settings.js derives SHAREONE_BASE_URL from a full URL supplied as the target link, then sends authenticated PUT requests through shareone_client.js. A non-ShareOne URL could receive the X-API-Key header or Sudowork proxy authorization flow, creating a credential disclosure risk.","confidence_reasoning":"The host is taken from user-controlled URL input and later used by the authenticated request builder. The reviewed code shows no allowlist that restricts this flow to shareone.app."},{"title":"API Keys Are Printed to Command Output","locations":[{"file":"scripts/check_api_key.js","line_end":20,"line_start":18},{"file":"scripts/create_guest_key.js","line_end":31,"line_start":16},{"file":"workflows/environment-and-credentials.md","line_end":64,"line_start":60}],"confidence":0.94,"description":"The credential check and guest-key scripts print API keys in machine-readable output. The workflows then instruct the assistant to display newly created keys and binding links to the user, which can persist secrets in transcripts and logs.","confidence_reasoning":"Direct code evidence shows API key values are written to stdout. The workflow also explicitly requires user-facing display of generated key material."}],"medium_findings":[{"title":"Local Files Are Uploaded to External Services","locations":[{"file":"scripts/upload_page.js","line_end":90,"line_start":60},{"file":"scripts/shareone_upload.js","line_end":78,"line_start":58},{"file":"scripts/shareone_upload.js","line_end":151,"line_start":123}],"confidence":0.88,"description":"The skill reads user-selected local files and uploads them to ShareOne, Azure, or S3 upload URLs returned by ShareOne. This is core functionality, but it creates data exposure risk if sensitive files are selected or consent is mishandled.","confidence_reasoning":"The file reads and outbound upload requests are explicit. The workflow includes a publish consent step, so this is high-impact legitimate functionality rather than confirmed malicious behavior."},{"title":"API Keys Are Stored Locally Without Permission Hardening","locations":[{"file":"scripts/shareone_client.js","line_end":8,"line_start":8},{"file":"scripts/shareone_client.js","line_end":43,"line_start":42},{"file":"scripts/save_api_key.js","line_end":17,"line_start":9}],"confidence":0.82,"description":"Local ShareOne API keys are written to a home-directory credentials file as JSON. The code does not set restrictive file permissions or encrypt the credential before writing it.","confidence_reasoning":"The code writes the raw API key value directly to disk and no chmod or encryption step appears near the write. Local config storage can be legitimate, but this implementation has weak protection."},{"title":"Owner Downloads Can Bypass Public Download Restrictions","locations":[{"file":"scripts/download_share.js","line_end":80,"line_start":60},{"file":"workflows/download-file.md","line_end":18,"line_start":11},{"file":"workflows/download-file.md","line_end":57,"line_start":53}],"confidence":0.76,"description":"The download workflow first attempts owner download when credentials are present, which bypasses public password and allow-download restrictions for owned links. This is documented behavior but should be clear to users because it changes privacy expectations.","confidence_reasoning":"The behavior is explicit in code and documentation. It appears intended for owner workflows, so the concern is user expectation and access control clarity rather than malicious intent."}],"low_findings":[{"title":"External Command Alerts Are Mostly False Positives","locations":[{"file":"SKILL.md","line_end":23,"line_start":17},{"file":"scripts/check_api_key.js","line_end":20,"line_start":20},{"file":"workflows/publish-text-page.md","line_end":49,"line_start":45}],"confidence":0.87,"description":"Most static external-command matches are Markdown code examples or JavaScript template literals. I found no evidence in the reviewed files of child_process, eval, shell execution, or backticks executing OS commands.","confidence_reasoning":"Reviewed representative locations contain command documentation or string interpolation. No shell execution API was found in the inspected implementation files."},{"title":"Weak Crypto Alerts Are False Positives in Reviewed Code","locations":[{"file":"scripts/shareone_upload.js","line_end":38,"line_start":36},{"file":"scripts/download_share.js","line_end":58,"line_start":41},{"file":"scripts/shareone_client.js","line_end":86,"line_start":83}],"confidence":0.86,"description":"The reviewed weak-crypto locations do not show MD5, SHA-1, DES, RC4, or custom encryption. The only crypto use found is crypto.randomBytes for a multipart boundary, which is appropriate for that purpose.","confidence_reasoning":"Targeted review found URL parsing, timeout handling, and multipart boundary generation rather than weak cryptographic algorithms. No evidence found for insecure hashing or encryption in the reviewed code."},{"title":"No Prompt Injection Pattern Found","locations":[{"file":"SKILL.md","line_end":5,"line_start":1},{"file":"workflows/environment-and-credentials.md","line_end":3,"line_start":1}],"confidence":0.78,"description":"I searched the skill instructions, workflows, and scripts for explicit override, ignore, pre-approved, and skip-security language from the audit warning list. No evidence found in the searched files.","confidence_reasoning":"The search covered the listed suspicious phrases across the provided skill files. This does not prove absence of every possible injection, but no direct warning-pattern evidence was found."}],"dangerous_patterns":[{"title":"User-Controlled Base URL for Authenticated Requests","locations":[{"file":"scripts/update_share_settings.js","line_end":103,"line_start":98},{"file":"scripts/shareone_client.js","line_end":190,"line_start":188}],"confidence":0.91,"description":"Authenticated update requests can use a base URL derived from user input, which is dangerous when API keys are attached automatically.","confidence_reasoning":"The relevant assignments and header attachment are explicit. There is no visible host allowlist in the reviewed path."},{"title":"Secret Values in Standard Output","locations":[{"file":"scripts/check_api_key.js","line_end":20,"line_start":18},{"file":"scripts/create_guest_key.js","line_end":31,"line_start":29}],"confidence":0.95,"description":"API key values are emitted in status strings such as KEY_FOUND and GUEST_KEY_CREATED.","confidence_reasoning":"The output strings directly include the API key variable. This is a confirmed secret exposure pattern."},{"title":"Filesystem Read Followed by Network Upload","locations":[{"file":"scripts/upload_page.js","line_end":90,"line_start":60},{"file":"scripts/shareone_upload.js","line_end":78,"line_start":58}],"confidence":0.88,"description":"The upload scripts read local file contents and transmit them through HTTP requests to ShareOne or returned cloud upload URLs.","confidence_reasoning":"The code directly combines local file reads with outbound network requests. It is intended functionality, but still a dangerous pattern for marketplace review."}],"files_scanned":20,"total_lines":1935,"audit_model":"codex","audited_at":"2026-06-30T21:49:37.445+00:00","created_at":"2026-06-30T23:48:54.974064+00:00","static_findings":[],"finding_verdicts":[],"semantic_findings":[],"subject_marketplace_commit_sha":null,"subject_content_hash":null,"subject_tree_hash":null,"subject_plugin_path":null,"audit_payload_hash":null,"confirmed_risk_level":null,"scanner_version":null,"policy_version":null,"subject":{"marketplaceCommitSha":null,"contentHash":null,"treeHash":null,"pluginPath":null,"auditPayloadHash":null},"scannerVersion":null,"policyVersion":null},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"not_attestable","url":null,"status":null,"reason":"canonical install advisories are incomplete"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"high","confirmedFindingCount":3,"capabilityReviewCount":3,"needsReviewCount":0,"falsePositiveCount":2,"agentAutoInstallPolicy":null,"manualInstallPolicy":null,"artifactSignatureState":"available","attestationState":"not_attestable","verificationState":"not_verified"},"isLatest":false}}