{"data":{"skill":{"slug":"tahodev-taiwan-museum","name":"taiwan-museum","icon":"📦","repo":"https://github.com/tahodev/baodao-skill/tree/3ce4b58e4525f5a66390e1236b6d38702790225a/taiwan-museum","status":"approved","author":"tahodev","authorVersion":null,"skillstoreRevision":1},"audit":{"id":"8da80a2a-48dd-4747-9e4a-03503525d0ff","skill_id":"f9976743-6050-40ec-a3d2-2886fb439350","version":1,"content_hash":"v3:2aab20a3878daa05021884e089a7dd7739e08581:78eb8b37c6be719d22eb04e055fa2ace5e50d3aad6078bbe37c081f75a67d77b:752b06726a0b49a0222edaf262304253116472bbaddff337f654a56c6eed4e42:736b696c6c732f7461686f6465762f74616977616e2d6d757365756d:34fa5bc75bbdf9f918ae2673729b3735","risk_level":"safe","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"Seven findings are false positives: Markdown fences, public government URLs, and readable multilingual text do not demonstrate execution, exfiltration, or obfuscation. Two filesystem findings are confirmed because a predictable shared temporary path permits symlink overwrite and local data substitution. No evidence found of prompt injection, credential access, or malicious intent.","remediation":[{"issue":"The download writes to a predictable shared temporary filename that can be precreated as a symlink.","severity":"medium","suggestion":"Create a private temporary directory with restrictive permissions and download into it, rather than using a fixed shared filename."},{"issue":"The parser trusts a shared temporary file that another local actor can replace or populate.","severity":"medium","suggestion":"Parse only the file from the same private download operation, check HTTP success and expected fields, and treat dataset text as untrusted data."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":26,"line_start":24},{"file":"SKILL.md","line_end":36,"line_start":26},{"file":"SKILL.md","line_end":43,"line_start":36},{"file":"SKILL.md","line_end":60,"line_start":43}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":25,"line_start":25},{"file":"SKILL.md","line_end":60,"line_start":60}]},{"factor":"filesystem","evidence":[{"file":"SKILL.md","line_end":25,"line_start":25},{"file":"SKILL.md","line_end":38,"line_start":38}]}],"critical_findings":[],"high_findings":[],"medium_findings":[{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":25,"line_start":25}],"confidence":0.94,"description":"curl -sm 30 -A 'Mozilla/5.0' 'https://cloud.culture.tw/frontsite/trans/emapOpenDataAction.do?method=","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"curl writes to the predictable /tmp/museum.json path without exclusive creation or symlink protection. A local actor could precreate a symlink and overwrite another writable file."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":38,"line_start":38}],"confidence":0.9,"description":"d = json.load(open('/tmp/museum.json'))","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The parser opens the same predictable shared file without verifying its provenance. A local actor could substitute records, including after a failed download, and corrupt results."}],"low_findings":[],"dangerous_patterns":[],"files_scanned":1,"total_lines":61,"audit_model":"codex","audited_at":"2026-10-13T03:43:05.884+00:00","created_at":"2026-10-13T18:35:49.02375+00:00","static_findings":[{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":26,"severity":"medium","line_start":24},{"id":"external_commands:SKILL.md:26:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":36,"severity":"medium","line_start":26},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```python","category":"external_commands","line_end":43,"severity":"medium","line_start":36},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":60,"severity":"medium","line_start":43},{"id":"network:SKILL.md:25:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"curl -sm 30 -A 'Mozilla/5.0' 'https://cloud.culture.tw/frontsite/trans/emapOpenDataAction.do?method=","category":"network","line_end":25,"severity":"low","line_start":25},{"id":"network:SKILL.md:60:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"Taiwan museum directory (Ministry of Culture emap), keyless. `curl 'https://cloud.culture.tw/frontsi","category":"network","line_end":60,"severity":"low","line_start":60},{"id":"filesystem:SKILL.md:25:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"curl -sm 30 -A 'Mozilla/5.0' 'https://cloud.culture.tw/frontsite/trans/emapOpenDataAction.do?method=","category":"filesystem","line_end":25,"severity":"medium","line_start":25},{"id":"filesystem:SKILL.md:38:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"d = json.load(open('/tmp/museum.json'))","category":"filesystem","line_end":38,"severity":"medium","line_start":38},{"id":"obfuscation:SKILL.md:1:heuristic-high-file-entropy-6-70-bits-possible-b","file":"SKILL.md","pattern":"[HEURISTIC] High file entropy (6.70 bits) - possible binary/encrypted content","snippet":"File: SKILL.md","category":"obfuscation","line_end":1,"severity":"high","line_start":1}],"finding_verdicts":[{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","reason":"Line 24 opens a Markdown bash fence, not shell command substitution. The fenced command downloads public data and does not execute its response.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:26:ruby-shell-backtick-execution","reason":"Line 26 closes a Markdown code fence. No Ruby execution or shell backtick substitution appears in this region.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","reason":"Line 36 opens a Markdown Python fence. The example parses JSON and filters museum records without dynamic code execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","reason":"Line 43 closes a Markdown fence, and later backticks format an inline curl example. Neither construct performs shell backtick execution.","verdict":"false_positive","confidence":1},{"id":"network:SKILL.md:25:hardcoded-url","reason":"The HTTPS request retrieves public museum data from cloud.culture.tw using fixed query parameters. It sends no credentials or local file contents.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:60:hardcoded-url","reason":"The English summary repeats the same public government data endpoint for the advertised lookup workflow. No upload or secret-bearing request is specified.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:25:temp-directory-access","reason":"curl writes to the predictable /tmp/museum.json path without exclusive creation or symlink protection. A local actor could precreate a symlink and overwrite another writable file.","verdict":"confirmed","severity":"medium","confidence":0.94},{"id":"filesystem:SKILL.md:38:temp-directory-access","reason":"The parser opens the same predictable shared file without verifying its provenance. A local actor could substitute records, including after a failed download, and corrupt results.","verdict":"confirmed","severity":"medium","confidence":0.9},{"id":"obfuscation:SKILL.md:1:heuristic-high-file-entropy-6-70-bits-possible-b","reason":"The full file is readable Chinese and English Markdown with ordinary command examples. No evidence found of encrypted payloads, binary content, or concealed instructions.","verdict":"false_positive","confidence":0.99}],"semantic_findings":[],"subject_marketplace_commit_sha":"2aab20a3878daa05021884e089a7dd7739e08581","subject_content_hash":"78eb8b37c6be719d22eb04e055fa2ace5e50d3aad6078bbe37c081f75a67d77b","subject_tree_hash":"752b06726a0b49a0222edaf262304253116472bbaddff337f654a56c6eed4e42","subject_plugin_path":"skills/tahodev/taiwan-museum","audit_payload_hash":"34fa5bc75bbdf9f918ae2673729b3735","confirmed_risk_level":"safe","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"2aab20a3878daa05021884e089a7dd7739e08581","contentHash":"78eb8b37c6be719d22eb04e055fa2ace5e50d3aad6078bbe37c081f75a67d77b","treeHash":"752b06726a0b49a0222edaf262304253116472bbaddff337f654a56c6eed4e42","pluginPath":"skills/tahodev/taiwan-museum","auditPayloadHash":"34fa5bc75bbdf9f918ae2673729b3735"},"scannerVersion":"3.0.0","policyVersion":"skillstore-security-audit-policy-v1"},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"issued","url":"/api/skills/tahodev-taiwan-museum/audits/1/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"safe","confirmedFindingCount":0,"capabilityReviewCount":2,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}