{"data":{"skill":{"slug":"tahodev-taiwan-parking","name":"taiwan-parking","icon":"📦","repo":"https://github.com/tahodev/baodao-skill/tree/3ce4b58e4525f5a66390e1236b6d38702790225a/taiwan-parking","status":"approved","author":"tahodev","authorVersion":null,"skillstoreRevision":1},"audit":{"id":"db140d32-045d-4768-8980-2fdc3f2a05b4","skill_id":"2ea0aced-1451-4510-9e25-8b3c1712985a","version":1,"content_hash":"v3:2aab20a3878daa05021884e089a7dd7739e08581:537583c7a66802df35c047c5a477f70ab9e31021090b1a053d124df0246075f2:abb9fec4993104ab6e4367ccbf5509c06a8d1804a4f6731c4645e27421510626:736b696c6c732f7461686f6465762f74616977616e2d7061726b696e67:92d9a8d27222a73ee4e4e49297fb94d4","risk_level":"safe","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"Eighteen findings are false positives involving Markdown, public parking feeds, JSON reads, and parking identifiers. Two download commands use predictable shared temporary paths, enabling local file overwrite through preexisting symlinks. No evidence found of prompt injection, credential theft, or concealed executable content.","remediation":[{"issue":"Downloads write to predictable shared temporary paths at SKILL.md lines 25 and 35.","severity":"medium","suggestion":"Create a private temporary directory with mktemp -d, store both feeds inside it, and update jq paths. Clean up after use."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":26,"line_start":24},{"file":"SKILL.md","line_end":28,"line_start":26},{"file":"SKILL.md","line_end":28,"line_start":28},{"file":"SKILL.md","line_end":34,"line_start":30},{"file":"SKILL.md","line_end":36,"line_start":34},{"file":"SKILL.md","line_end":38,"line_start":36},{"file":"SKILL.md","line_end":38,"line_start":38},{"file":"SKILL.md","line_end":48,"line_start":42},{"file":"SKILL.md","line_end":63,"line_start":48},{"file":"SKILL.md","line_end":63,"line_start":63}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":25,"line_start":25},{"file":"SKILL.md","line_end":35,"line_start":35},{"file":"SKILL.md","line_end":63,"line_start":63}]},{"factor":"filesystem","evidence":[{"file":"SKILL.md","line_end":25,"line_start":25},{"file":"SKILL.md","line_end":35,"line_start":35},{"file":"SKILL.md","line_end":44,"line_start":44},{"file":"SKILL.md","line_end":47,"line_start":47}]}],"critical_findings":[],"high_findings":[],"medium_findings":[{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":25,"line_start":25}],"confidence":0.96,"description":"curl -sm 30 -o /tmp/park.json 'https://tcgbusfs.blob.core.windows.net/blobtcmsv/TCMSV_allavailable.j","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"curl writes to predictable /tmp/park.json without exclusive creation. A local attacker can precreate a symlink, causing overwrite of another file writable by the agent."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":35,"line_start":35}],"confidence":0.96,"description":"curl -sm 30 -o /tmp/parkdesc.json 'https://tcgbusfs.blob.core.windows.net/blobtcmsv/TCMSV_alldesc.js","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"curl writes to predictable /tmp/parkdesc.json without a private temporary directory. A preexisting attacker-controlled symlink can redirect the write to another agent-writable file."}],"low_findings":[],"dangerous_patterns":[],"files_scanned":1,"total_lines":64,"audit_model":"codex","audited_at":"2026-10-13T03:49:49.131+00:00","created_at":"2026-10-13T18:36:09.102481+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":28,"severity":"medium","line_start":26},{"id":"external_commands:SKILL.md:28:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2026-09-26 實測:HTTP 200、約 474KB、1,188 場,UPDATETIME 與查詢時刻同小時(近即時)。場數會隨開歇業緩慢變動,本數字是該日實測值。欄位:`id`(場站代碼,如","category":"external_commands","line_end":28,"severity":"medium","line_start":28},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**`-9` = 該場無此車種資料**(2026-09-26 實測 1,188 場中 88 場 availablecar 為 -9),不是「停滿」也不是錯誤,回報時略過或說「無資料」。","category":"external_commands","line_end":34,"severity":"medium","line_start":30},{"id":"external_commands:SKILL.md:34:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":36,"severity":"medium","line_start":34},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":38,"severity":"medium","line_start":36},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2026-09-26 實測:HTTP 200、約 2.8MB、1,775 場(含無即時資料的場)。欄位:`id`、`area`(行政區)、`name`、`address`、`tel`、`payex`(","category":"external_commands","line_end":38,"severity":"medium","line_start":38},{"id":"external_commands:SKILL.md:42:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":48,"severity":"medium","line_start":42},{"id":"external_commands:SKILL.md:48:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":63,"severity":"medium","line_start":48},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Taipei City parking availability, keyless. Real-time availability: `https://tcgbusfs.blob.core.windo","category":"external_commands","line_end":63,"severity":"medium","line_start":63},{"id":"network:SKILL.md:25:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"curl -sm 30 -o /tmp/park.json 'https://tcgbusfs.blob.core.windows.net/blobtcmsv/TCMSV_allavailable.j","category":"network","line_end":25,"severity":"low","line_start":25},{"id":"network:SKILL.md:35:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"curl -sm 30 -o /tmp/parkdesc.json 'https://tcgbusfs.blob.core.windows.net/blobtcmsv/TCMSV_alldesc.js","category":"network","line_end":35,"severity":"low","line_start":35},{"id":"network:SKILL.md:63:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"Taipei City parking availability, keyless. Real-time availability: `https://tcgbusfs.blob.core.windo","category":"network","line_end":63,"severity":"low","line_start":63},{"id":"filesystem:SKILL.md:25:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"curl -sm 30 -o /tmp/park.json 'https://tcgbusfs.blob.core.windows.net/blobtcmsv/TCMSV_allavailable.j","category":"filesystem","line_end":25,"severity":"medium","line_start":25},{"id":"filesystem:SKILL.md:35:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"curl -sm 30 -o /tmp/parkdesc.json 'https://tcgbusfs.blob.core.windows.net/blobtcmsv/TCMSV_alldesc.js","category":"filesystem","line_end":35,"severity":"medium","line_start":35},{"id":"filesystem:SKILL.md:44:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"jq -r --slurpfile d /tmp/parkdesc.json '","category":"filesystem","line_end":44,"severity":"medium","line_start":44},{"id":"filesystem:SKILL.md:47:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"| \"\\($info[.id].name) 剩 \\(.availablecar) 位 (\\($info[.id].addr))\"' /tmp/park.json | sort -t'剩' -k2 -r","category":"filesystem","line_end":47,"severity":"medium","line_start":47},{"id":"blocker:SKILL.md:18:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"1. 抓靜態場站表(alldesc),用地名或場名找出停車場 id","category":"blocker","line_end":19,"severity":"low","line_start":18},{"id":"blocker:SKILL.md:19:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"2. 抓即時剩位表(allavailable),用 id 取出可停數","category":"blocker","line_end":19,"severity":"low","line_start":19},{"id":"obfuscation:SKILL.md:1:heuristic-high-file-entropy-6-63-bits-possible-b","file":"SKILL.md","pattern":"[HEURISTIC] High file entropy (6.63 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 code fence around a fixed curl command. No shell backtick substitution or Ruby execution appears.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:26:ruby-shell-backtick-execution","reason":"Line 26 closes a Markdown code fence; line 28 uses inline field labels. These backticks are documentation formatting, not executable substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:28:ruby-shell-backtick-execution","reason":"Backticks delimit parking feed field names such as id and availablecar. The sentence contains no executable backtick expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","reason":"Line 30 formats the missing-data sentinel -9, and line 34 opens a Markdown fence. Neither construct executes a shell command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:34:ruby-shell-backtick-execution","reason":"The backticks mark a fenced curl example with a literal public feed URL. They are not command substitution syntax.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","reason":"Line 36 closes a Markdown fence, followed by inline JSON field documentation. No Ruby or shell backtick execution exists.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","reason":"The inline backticks identify static parking fields including name, address, and payex. They only format prose.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:42:ruby-shell-backtick-execution","reason":"The fenced example uses a fixed jq filter with sort and head. It parses parking records without evaluating their contents as commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:48:ruby-shell-backtick-execution","reason":"Line 48 closes the jq Markdown fence; later backticks label URLs and fields. No executable backtick substitution appears.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","reason":"The English summary formats feed URLs, id, and -9 with inline backticks. It does not execute them.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:25:hardcoded-url","reason":"The fixed HTTPS GET downloads the documented public Taipei availability feed. It sends no credentials, local files, or user-supplied payload.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:35:hardcoded-url","reason":"The fixed HTTPS GET downloads public parking descriptions for the stated task. No upload, secret access, or unrelated destination appears.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:63:hardcoded-url","reason":"The summary documents the same two public feed URLs used by the examples. The prose contains no additional network action or exfiltration instruction.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:25:temp-directory-access","reason":"curl writes to predictable /tmp/park.json without exclusive creation. A local attacker can precreate a symlink, causing overwrite of another file writable by the agent.","verdict":"confirmed","severity":"medium","confidence":0.96},{"id":"filesystem:SKILL.md:35:temp-directory-access","reason":"curl writes to predictable /tmp/parkdesc.json without a private temporary directory. A preexisting attacker-controlled symlink can redirect the write to another agent-writable file.","verdict":"confirmed","severity":"medium","confidence":0.96},{"id":"filesystem:SKILL.md:44:temp-directory-access","reason":"jq reads the downloaded description file as JSON without executing its contents or modifying files. Unsafe shared download paths are addressed by the separate write findings.","verdict":"false_positive","confidence":0.94},{"id":"filesystem:SKILL.md:47:temp-directory-access","reason":"The command reads parking JSON and prints filtered records through fixed sort and head commands. It does not execute feed values or access secrets.","verdict":"false_positive","confidence":0.94},{"id":"blocker:SKILL.md:18:system-reconnaissance","reason":"The instructions locate parking-lot identifiers by place or lot name. These are public transport records, not host identities or system reconnaissance.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:19:system-reconnaissance","reason":"The id field joins availability records to parking descriptions. The text does not request operating-system identity or environment inspection.","verdict":"false_positive","confidence":0.99},{"id":"obfuscation:SKILL.md:1:heuristic-high-file-entropy-6-63-bits-possible-b","reason":"The complete file is readable Chinese and English Markdown with YAML metadata and short shell examples. No binary, encrypted payload, or decoding mechanism appears.","verdict":"false_positive","confidence":0.99}],"semantic_findings":[],"subject_marketplace_commit_sha":"2aab20a3878daa05021884e089a7dd7739e08581","subject_content_hash":"537583c7a66802df35c047c5a477f70ab9e31021090b1a053d124df0246075f2","subject_tree_hash":"abb9fec4993104ab6e4367ccbf5509c06a8d1804a4f6731c4645e27421510626","subject_plugin_path":"skills/tahodev/taiwan-parking","audit_payload_hash":"92d9a8d27222a73ee4e4e49297fb94d4","confirmed_risk_level":"safe","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"2aab20a3878daa05021884e089a7dd7739e08581","contentHash":"537583c7a66802df35c047c5a477f70ab9e31021090b1a053d124df0246075f2","treeHash":"abb9fec4993104ab6e4367ccbf5509c06a8d1804a4f6731c4645e27421510626","pluginPath":"skills/tahodev/taiwan-parking","auditPayloadHash":"92d9a8d27222a73ee4e4e49297fb94d4"},"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-parking/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}}