{"data":{"skill":{"slug":"tahodev-taiwan-toilet","name":"taiwan-toilet","icon":"📦","repo":"https://github.com/tahodev/baodao-skill/tree/3ce4b58e4525f5a66390e1236b6d38702790225a/taiwan-toilet","status":"approved","author":"tahodev","authorVersion":null,"skillstoreRevision":1},"audit":{"id":"de3e8b2f-300c-4ff7-ba4b-e04309c144f6","skill_id":"216f7ff3-ce80-4da5-8213-67ffd79f21ac","version":1,"content_hash":"v3:2aab20a3878daa05021884e089a7dd7739e08581:70121bfd5dd460723d4ed01c6d75f5a10068bba8fccec3dbd69d66616a6f4bcf:9c896b9c4a86d414b943c23da782e089418df61944381c8792e832b80219f480:736b696c6c732f7461686f6465762f74616977616e2d746f696c6574:97e36fce3431a6d0e6833f6e781929cb","risk_level":"safe","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"Markdown backticks, documented public-data requests, and the dataset access key do not establish command injection, secret theft, reconnaissance, or obfuscation. Predictable shared temporary files introduce local overwrite and tampering risks when another user can precreate or alter them. No evidence found of malicious intent, data exfiltration, or prompt injection.","remediation":[{"issue":"Downloads and merged data use predictable shared temporary filenames.","severity":"medium","suggestion":"Create a private temporary directory with mktemp or tempfile.TemporaryDirectory, and keep downloads, merged data, and subsequent reads inside it."},{"issue":"The nearest-toilet calculation trusts a cache that another local user could replace.","severity":"medium","suggestion":"Pass the private cache path explicitly between steps, validate record fields, and remove the directory after use."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":27,"line_start":24},{"file":"SKILL.md","line_end":29,"line_start":27},{"file":"SKILL.md","line_end":31,"line_start":29},{"file":"SKILL.md","line_end":45,"line_start":31},{"file":"SKILL.md","line_end":59,"line_start":45},{"file":"SKILL.md","line_end":77,"line_start":59},{"file":"SKILL.md","line_end":90,"line_start":77}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":32,"line_start":32},{"file":"SKILL.md","line_end":37,"line_start":37},{"file":"SKILL.md","line_end":38,"line_start":38},{"file":"SKILL.md","line_end":25,"line_start":25},{"file":"SKILL.md","line_end":33,"line_start":33},{"file":"SKILL.md","line_end":90,"line_start":90}]},{"factor":"filesystem","evidence":[{"file":"SKILL.md","line_end":26,"line_start":26},{"file":"SKILL.md","line_end":29,"line_start":29},{"file":"SKILL.md","line_end":43,"line_start":43},{"file":"SKILL.md","line_end":61,"line_start":61},{"file":"SKILL.md","line_end":43,"line_start":43}]},{"factor":"env_access","evidence":[{"file":"SKILL.md","line_end":25,"line_start":25},{"file":"SKILL.md","line_end":33,"line_start":33},{"file":"SKILL.md","line_end":90,"line_start":90}]}],"critical_findings":[],"high_findings":[],"medium_findings":[{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":26,"line_start":26}],"confidence":0.96,"description":"curl -sm 30 -A 'Mozilla/5.0' \"$BASE&limit=1000&offset=0&sort=ImportDate%20desc&format=JSON\" -o /tmp/","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"curl writes to predictable /tmp/toilet_p1.json without creating a private directory. A precreated symlink can redirect the write and overwrite files permitted by the executing account."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":43,"line_start":43}],"confidence":0.98,"description":"json.dump(rows, open('/tmp/toilet_all.json', 'w'), ensure_ascii=False)","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"Opening predictable /tmp/toilet_all.json in write mode follows symlinks and truncates an existing target. Another local user could redirect this write where filesystem protections permit."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":61,"line_start":61}],"confidence":0.92,"description":"rows = json.load(open('/tmp/toilet_all.json'))   # 上一節合併後的全部頁面","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The calculation trusts a predictable shared cache without checking ownership or isolating it. A local attacker could replace the file and influence toilet names, locations, or rankings."},{"title":"Python file write/append","locations":[{"file":"SKILL.md","line_end":43,"line_start":43}],"confidence":0.98,"description":"json.dump(rows, open('/tmp/toilet_all.json', 'w'), ensure_ascii=False)","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The write-mode open can truncate a preexisting file or follow a symlink at the fixed shared path. It lacks exclusive creation or a private temporary directory."}],"low_findings":[],"dangerous_patterns":[],"files_scanned":1,"total_lines":91,"audit_model":"codex","audited_at":"2026-10-13T04:16:41.888+00:00","created_at":"2026-10-13T18:37:29.611364+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":27,"severity":"medium","line_start":24},{"id":"external_commands:SKILL.md:27:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":29,"severity":"medium","line_start":27},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"要找最近的公廁必須看全部頁面(只看第 1 頁會漏掉別頁更近的點)。下面把所有頁合併成 `/tmp/toilet_all.json`,回傳筆數 < 1,000 即到底:","category":"external_commands","line_end":31,"severity":"medium","line_start":29},{"id":"external_commands:SKILL.md:31:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```python","category":"external_commands","line_end":45,"severity":"medium","line_start":31},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":59,"severity":"medium","line_start":45},{"id":"external_commands:SKILL.md:59:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```python","category":"external_commands","line_end":77,"severity":"medium","line_start":59},{"id":"external_commands:SKILL.md:77:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":90,"severity":"medium","line_start":77},{"id":"network:SKILL.md:32:python-http-libraries","file":"SKILL.md","pattern":"Python HTTP libraries","snippet":"import json, urllib.request","category":"network","line_end":32,"severity":"low","line_start":32},{"id":"network:SKILL.md:37:python-http-libraries","file":"SKILL.md","pattern":"Python HTTP libraries","snippet":"req = urllib.request.Request(f'{BASE}&limit=1000&offset={offset}&sort=ImportDate%20desc&format=JSON'","category":"network","line_end":37,"severity":"low","line_start":37},{"id":"network:SKILL.md:38:python-http-libraries","file":"SKILL.md","pattern":"Python HTTP libraries","snippet":"page = json.loads(urllib.request.urlopen(req, timeout=40).read())","category":"network","line_end":38,"severity":"low","line_start":38},{"id":"network:SKILL.md:25:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"BASE='https://data.moenv.gov.tw/api/v2/fac_p_07?api_key=b7df779e-71a6-4148-8379-5afbd441d803'","category":"network","line_end":25,"severity":"low","line_start":25},{"id":"network:SKILL.md:33:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"BASE = 'https://data.moenv.gov.tw/api/v2/fac_p_07?api_key=b7df779e-71a6-4148-8379-5afbd441d803'","category":"network","line_end":33,"severity":"low","line_start":33},{"id":"network:SKILL.md:90:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"Taiwan national public toilet registry (MOENV fac_p_07), keyless - use the resource API key publishe","category":"network","line_end":90,"severity":"low","line_start":90},{"id":"filesystem:SKILL.md:26:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"curl -sm 30 -A 'Mozilla/5.0' \"$BASE&limit=1000&offset=0&sort=ImportDate%20desc&format=JSON\" -o /tmp/","category":"filesystem","line_end":26,"severity":"medium","line_start":26},{"id":"filesystem:SKILL.md:29:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"要找最近的公廁必須看全部頁面(只看第 1 頁會漏掉別頁更近的點)。下面把所有頁合併成 `/tmp/toilet_all.json`,回傳筆數 < 1,000 即到底:","category":"filesystem","line_end":29,"severity":"medium","line_start":29},{"id":"filesystem:SKILL.md:43:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"json.dump(rows, open('/tmp/toilet_all.json', 'w'), ensure_ascii=False)","category":"filesystem","line_end":43,"severity":"medium","line_start":43},{"id":"filesystem:SKILL.md:61:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"rows = json.load(open('/tmp/toilet_all.json'))   # 上一節合併後的全部頁面","category":"filesystem","line_end":61,"severity":"medium","line_start":61},{"id":"filesystem:SKILL.md:43:python-file-write-append","file":"SKILL.md","pattern":"Python file write/append","snippet":"json.dump(rows, open('/tmp/toilet_all.json', 'w'), ensure_ascii=False)","category":"filesystem","line_end":43,"severity":"medium","line_start":43},{"id":"env_access:SKILL.md:25:generic-api-secret-keys","file":"SKILL.md","pattern":"Generic API/secret keys","snippet":"BASE='https://data.moenv.gov.tw/api/v2/fac_p_07?api_key=b7df779e-71a6-4148-8379-5afbd441d803'","category":"env_access","line_end":25,"severity":"high","line_start":25},{"id":"env_access:SKILL.md:33:generic-api-secret-keys","file":"SKILL.md","pattern":"Generic API/secret keys","snippet":"BASE = 'https://data.moenv.gov.tw/api/v2/fac_p_07?api_key=b7df779e-71a6-4148-8379-5afbd441d803'","category":"env_access","line_end":33,"severity":"high","line_start":33},{"id":"env_access:SKILL.md:90:generic-api-secret-keys","file":"SKILL.md","pattern":"Generic API/secret keys","snippet":"Taiwan national public toilet registry (MOENV fac_p_07), keyless - use the resource API key publishe","category":"env_access","line_end":90,"severity":"high","line_start":90},{"id":"blocker:SKILL.md:90:network-reconnaissance","file":"SKILL.md","pattern":"Network reconnaissance","snippet":"Taiwan national public toilet registry (MOENV fac_p_07), keyless - use the resource API key publishe","category":"blocker","line_end":90,"severity":"low","line_start":90},{"id":"obfuscation:SKILL.md:1:heuristic-high-file-entropy-6-55-bits-possible-b","file":"SKILL.md","pattern":"[HEURISTIC] High file entropy (6.55 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 code fence, not a shell substitution. The documented curl command does not execute backtick expressions.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:27:ruby-shell-backtick-execution","reason":"Line 27 closes a Markdown code fence. These delimiters are documentation syntax, not executable shell backticks.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","reason":"The backticks enclose a temporary filename in explanatory prose. No shell or Ruby execution occurs in this text.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:31:ruby-shell-backtick-execution","reason":"Line 31 opens a Markdown Python code fence. The enclosed program retrieves and parses JSON without shell substitution or dynamic code execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","reason":"Line 45 is a closing Markdown code fence. It is not an executable backtick expression.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:59:ruby-shell-backtick-execution","reason":"Line 59 opens a Markdown Python code fence. The example calculates numeric distances and prints records without invoking a shell.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:77:ruby-shell-backtick-execution","reason":"Line 77 closes a Markdown code fence. The matched backticks are formatting, not command execution.","verdict":"false_positive","confidence":1},{"id":"network:SKILL.md:32:python-http-libraries","reason":"urllib.request supports the documented government registry download. Importing this library does not establish unauthorized communication or exfiltration.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:37:python-http-libraries","reason":"The request targets the fixed MOENV dataset endpoint with pagination and format parameters. No user location, local file contents, or private credentials are included.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:38:python-http-libraries","reason":"The request retrieves public registry records over HTTPS with a timeout and parses them as JSON. This is the declared workflow, not remote code execution or data exfiltration.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:25:hardcoded-url","reason":"The URL identifies the government fac_p_07 registry endpoint. Its dataset key is described as publicly published, and no private data is appended.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:33:hardcoded-url","reason":"This fixed HTTPS URL is the documented public toilet dataset source. The Python example sends pagination parameters, not private local information.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:90:hardcoded-url","reason":"The English summary documents a GET request to the same government dataset. No unrelated destination or unauthorized network operation appears.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:26:temp-directory-access","reason":"curl writes to predictable /tmp/toilet_p1.json without creating a private directory. A precreated symlink can redirect the write and overwrite files permitted by the executing account.","verdict":"confirmed","confidence":0.96},{"id":"filesystem:SKILL.md:29:temp-directory-access","reason":"Line 29 only describes the cache filename and pagination requirement. The actual unsafe file operations are adjudicated separately at lines 43 and 61.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:43:temp-directory-access","reason":"Opening predictable /tmp/toilet_all.json in write mode follows symlinks and truncates an existing target. Another local user could redirect this write where filesystem protections permit.","verdict":"confirmed","confidence":0.98},{"id":"filesystem:SKILL.md:61:temp-directory-access","reason":"The calculation trusts a predictable shared cache without checking ownership or isolating it. A local attacker could replace the file and influence toilet names, locations, or rankings.","verdict":"confirmed","confidence":0.92},{"id":"filesystem:SKILL.md:43:python-file-write-append","reason":"The write-mode open can truncate a preexisting file or follow a symlink at the fixed shared path. It lacks exclusive creation or a private temporary directory.","verdict":"confirmed","confidence":0.98},{"id":"env_access:SKILL.md:25:generic-api-secret-keys","reason":"The document identifies this literal as the dataset key published on data.gov.tw, not a user secret. The example neither reads environment variables nor transmits private credentials.","verdict":"false_positive","confidence":0.94},{"id":"env_access:SKILL.md:33:generic-api-secret-keys","reason":"The Python example uses the same explicitly documented public dataset key. No environment access or private credential collection is present.","verdict":"false_positive","confidence":0.94},{"id":"env_access:SKILL.md:90:generic-api-secret-keys","reason":"The summary uses a published-key placeholder and describes its public dataset source. It contains no environment reads or requests for private secrets.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:90:network-reconnaissance","reason":"The summary describes ordinary registry retrieval with GET and offset pagination. No host discovery, port scanning, or service enumeration appears.","verdict":"false_positive","confidence":0.99},{"id":"obfuscation:SKILL.md:1:heuristic-high-file-entropy-6-55-bits-possible-b","reason":"The entire file is readable Chinese and English Markdown with short, inspectable examples. No evidence found of encrypted payloads, binary content, or decoding and execution.","verdict":"false_positive","confidence":0.99}],"semantic_findings":[],"subject_marketplace_commit_sha":"2aab20a3878daa05021884e089a7dd7739e08581","subject_content_hash":"70121bfd5dd460723d4ed01c6d75f5a10068bba8fccec3dbd69d66616a6f4bcf","subject_tree_hash":"9c896b9c4a86d414b943c23da782e089418df61944381c8792e832b80219f480","subject_plugin_path":"skills/tahodev/taiwan-toilet","audit_payload_hash":"97e36fce3431a6d0e6833f6e781929cb","confirmed_risk_level":"safe","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"2aab20a3878daa05021884e089a7dd7739e08581","contentHash":"70121bfd5dd460723d4ed01c6d75f5a10068bba8fccec3dbd69d66616a6f4bcf","treeHash":"9c896b9c4a86d414b943c23da782e089418df61944381c8792e832b80219f480","pluginPath":"skills/tahodev/taiwan-toilet","auditPayloadHash":"97e36fce3431a6d0e6833f6e781929cb"},"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-toilet/audits/1/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"safe","confirmedFindingCount":0,"capabilityReviewCount":4,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}