{"data":{"skill":{"slug":"tahodev-invoice-winning-numbers","name":"invoice-winning-numbers","icon":"📦","repo":"https://github.com/tahodev/baodao-skill/tree/3ce4b58e4525f5a66390e1236b6d38702790225a/invoice-winning-numbers","status":"approved","author":"tahodev","authorVersion":null,"skillstoreRevision":1},"audit":{"id":"de12e868-43f4-46a9-ac43-3b3699d8b4d9","skill_id":"01067f5f-fc39-4460-908e-2f4406e15aac","version":1,"content_hash":"v3:2aab20a3878daa05021884e089a7dd7739e08581:ca3b9ae4c05e6f5c79e17782439e2752a52e868ae68520d960a65d0658387925:04cd24105791209fd6426b2b4e7caf98cefc31227b389030edb102e3075e31db:736b696c6c732f7461686f6465762f696e766f6963652d77696e6e696e672d6e756d62657273:696ae53a987eec60466f0a1b2a668dfb","risk_level":"medium","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"The 19 backtick alerts, eight URL alerts, and two entropy alerts are false positives involving Markdown, official public sources, and readable multilingual text. Seven temporary-file alerts identify predictable shared paths that permit local tampering or symlink-based overwrites. Automatic rechecking also lacks explicit consent and can misuse carrier suffixes or reuse invoice numbers across periods; no credential exfiltration evidence was found.","remediation":[{"issue":"Predictable shared temporary paths permit file replacement and symlink-based overwrites.","severity":"medium","suggestion":"Create a private directory with mktemp -d, keep downloads and converted text inside it, and remove it after processing."},{"issue":"Automatic rechecking can retain invoice identifiers and create recurring actions without explicit user consent.","severity":"medium","suggestion":"Require explicit approval for scheduling and retention, define expiry, and provide cancellation and deletion controls."},{"issue":"Carrier suffixes cannot identify invoices, and saved invoice numbers can produce invalid matches in later periods.","severity":"medium","suggestion":"Require complete invoice identifiers and issue periods; reject carrier suffixes as matching inputs and process each invoice only for its period."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":14,"line_start":14},{"file":"SKILL.md","line_end":26,"line_start":24},{"file":"SKILL.md","line_end":28,"line_start":26},{"file":"SKILL.md","line_end":30,"line_start":28},{"file":"SKILL.md","line_end":30,"line_start":30},{"file":"SKILL.md","line_end":36,"line_start":36},{"file":"SKILL.md","line_end":63,"line_start":38},{"file":"SKILL.md","line_end":65,"line_start":63},{"file":"SKILL.md","line_end":65,"line_start":65},{"file":"SKILL.md","line_end":118,"line_start":91},{"file":"SKILL.md","line_end":126,"line_start":118},{"file":"SKILL.md","line_end":134,"line_start":126},{"file":"SKILL.md","line_end":136,"line_start":134},{"file":"SKILL.md","line_end":136,"line_start":136},{"file":"SKILL.md","line_end":143,"line_start":137},{"file":"SKILL.md","line_end":143,"line_start":143},{"file":"SKILL.md","line_end":144,"line_start":144},{"file":"SKILL.md","line_end":148,"line_start":148},{"file":"SKILL.md","line_end":152,"line_start":152}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":14,"line_start":14},{"file":"SKILL.md","line_end":25,"line_start":25},{"file":"SKILL.md","line_end":32,"line_start":32},{"file":"SKILL.md","line_end":128,"line_start":128},{"file":"SKILL.md","line_end":132,"line_start":132},{"file":"SKILL.md","line_end":139,"line_start":139},{"file":"SKILL.md","line_end":143,"line_start":143},{"file":"SKILL.md","line_end":148,"line_start":148}]},{"factor":"filesystem","evidence":[{"file":"SKILL.md","line_end":25,"line_start":25},{"file":"SKILL.md","line_end":41,"line_start":41},{"file":"SKILL.md","line_end":94,"line_start":94},{"file":"SKILL.md","line_end":128,"line_start":128},{"file":"SKILL.md","line_end":129,"line_start":129},{"file":"SKILL.md","line_end":132,"line_start":132},{"file":"SKILL.md","line_end":133,"line_start":133}]}],"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 https://invoice.etax.nat.gov.tw/lastNumber.html -o /tmp/lastNumber.html","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"curl writes to a predictable shared temporary filename without private-directory isolation. A local attacker can pre-create a symlink to overwrite another agent-writable file."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":41,"line_start":41}],"confidence":0.92,"description":"h = open('/tmp/lastNumber.html', encoding='utf-8').read()","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The parser trusts a predictable shared temporary file without ownership or isolation checks. Another local user can replace its contents and falsify prize results."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":94,"line_start":94}],"confidence":0.92,"description":"h = open('/tmp/lastNumber.html', encoding='utf-8').read()","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"Batch matching reads the same predictable shared file without establishing trusted provenance. Local file replacement can produce false winning or losing results."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":128,"line_start":128}],"confidence":0.94,"description":"curl -sm 30 https://invoice.etax.nat.gov.tw/cloudNowNumber.html -o /tmp/cloud.html","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"curl writes the cloud-prize page to a predictable shared filename. A pre-created symlink can redirect the write to another agent-writable file."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":129,"line_start":129}],"confidence":0.91,"description":"grep -oE 'pdf/[^\"]+\\.pdf' /tmp/cloud.html | sort -u","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"PDF link extraction trusts a predictable shared file that another local user can replace. Tampering can substitute prize-document paths and compromise subsequent matching."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":132,"line_start":132}],"confidence":0.94,"description":"curl -sm 30 'https://invoice.etax.nat.gov.tw/pdf/<檔名>.pdf' -o /tmp/prize.pdf","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"The PDF download writes to a fixed shared temporary path. A pre-created symlink can overwrite an unrelated file writable by the agent."},{"title":"Temp directory access","locations":[{"file":"SKILL.md","line_end":133,"line_start":133}],"confidence":0.93,"description":"pdftotext /tmp/prize.pdf /tmp/prize.txt","review_kind":"capability","source_category":"filesystem","source_severity":"medium","confidence_reasoning":"pdftotext reads a predictable PDF path and writes a predictable text path. Local replacement can tamper with inputs, while output symlinks can redirect writes."},{"title":"Recurring Actions Without Explicit Consent","locations":[{"file":"SKILL.md","line_end":144,"line_start":144},{"file":"SKILL.md","line_end":157,"line_start":157}],"confidence":0.93,"description":"Line 144 says the agent may schedule rechecking itself ('代理可自行排定') after receiving invoice numbers or carrier suffixes. This expands a prior lookup into recurring processing without explicit scheduling or retention consent.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"Both the Chinese workflow and English summary authorize proactive rechecking of saved identifiers. No explicit opt-in, retention limit, or cancellation requirement appears."},{"title":"Invalid Inputs and Period Reuse in Automatic Matching","locations":[{"file":"SKILL.md","line_end":87,"line_start":82},{"file":"SKILL.md","line_end":138,"line_start":137},{"file":"SKILL.md","line_end":144,"line_start":144}],"confidence":0.94,"description":"Line 144 allows fixed invoice numbers or carrier suffixes to trigger rechecking every draw. Carrier suffixes cannot identify invoices, and reusing invoice numbers across periods can report invalid wins.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"The matching instructions require complete eight-digit numbers or ten-character cloud serials. Automatic guidance nevertheless accepts carrier suffixes and omits invoice issue-period checks."}],"low_findings":[],"dangerous_patterns":[],"files_scanned":1,"total_lines":158,"audit_model":"codex","audited_at":"2026-10-13T02:51:12.836+00:00","created_at":"2026-10-13T18:33:56.668987+00:00","static_findings":[{"id":"external_commands:SKILL.md:14:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"從財政部電子發票整合服務平台(https://invoice.etax.nat.gov.tw)的公開頁面取得統一發票中獎號碼,並用手上的發票號碼對獎。不需要 API 金鑰或登入,`curl` 即可。支","category":"external_commands","line_end":14,"severity":"medium","line_start":14},{"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-09 實測:HTTP 200、約 20KB、不需特殊 User-Agent。頁面含最新一期的「中獎號碼單」(當日為 115年05-06月,特別獎 19531471、特獎 8594132","category":"external_commands","line_end":30,"severity":"medium","line_start":28},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2026-09-26 實測(115年07-08月期,9/25 開獎次日):特別獎 `38548029`、特獎 `10138845`、頭獎 `24121106` / `28589937` / `8366","category":"external_commands","line_end":30,"severity":"medium","line_start":30},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**務必先把 HTML 標籤「整個刪掉」(取代成空字串)再取數字。** 號碼會被標籤切開(例如頭獎 07225810 在原始碼中被拆成 `072</span><span ...>25810` 兩段)。","category":"external_commands","line_end":36,"severity":"medium","line_start":36},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":63,"severity":"medium","line_start":38},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":65,"severity":"medium","line_start":63},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2026-09-09 實測(115年05-06月期):特別獎 `19531471`、特獎 `85941329`、頭獎 `07225810` `20231230` `83518781` 三組皆完整取出,","category":"external_commands","line_end":65,"severity":"medium","line_start":65},{"id":"external_commands:SKILL.md:91:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":118,"severity":"medium","line_start":91},{"id":"external_commands:SKILL.md:118:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":126,"severity":"medium","line_start":118},{"id":"external_commands:SKILL.md:126:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":134,"severity":"medium","line_start":126},{"id":"external_commands:SKILL.md:134:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":136,"severity":"medium","line_start":134},{"id":"external_commands:SKILL.md:136:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- PDF 連結形如 `pdf/<期別>_<時間戳>_sorted_AI_<X>.pdf`;**獎別不要靠檔名猜**,開啟後第一行有標題(2026-09-09 實測:`AI_B`=兩千元獎、`AI_C","category":"external_commands","line_end":136,"severity":"medium","line_start":136},{"id":"external_commands:SKILL.md:137:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- 號碼格式是「2 碼英文字軌 + 8 碼數字」(例 `AD00349792`)。專屬獎規則(頁面領獎注意事項記載):**字軌號碼完全相同才中獎**,沒有末幾碼的部分獎;且開獎前已列印紙本電子發票者喪","category":"external_commands","line_end":143,"severity":"medium","line_start":137},{"id":"external_commands:SKILL.md:143:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **一般統一發票**:`lastNumber.html` 只有最新一期。歷史期別在財政部稅務入口網,URL 規則為 `https://www.etax.nat.gov.tw/etw-main/ET","category":"external_commands","line_end":143,"severity":"medium","line_start":143},{"id":"external_commands:SKILL.md:144:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **每期自動對獎流程(代理主動提醒)**:統一發票每兩個月一期,**單月 25 日開獎**。使用者若給過固定發票號碼(或載具末幾碼),代理可自行排定:開獎日當天下載最新 `lastNumber.h","category":"external_commands","line_end":144,"severity":"medium","line_start":144},{"id":"external_commands:SKILL.md:148:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **連線逾時**:`curl` 一律加 `-m 30`。逾時或 5xx 時隔幾秒重試 1~2 次;仍失敗就告知「財政部電子發票整合服務平台可能暫時異常,請直接到 https://invoice.e","category":"external_commands","line_end":148,"severity":"medium","line_start":148},{"id":"external_commands:SKILL.md:152:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **專屬獎 PDF 失效**:PDF 檔名含期別與時間戳,每期都換。永遠從 `cloudNowNumber.html`(或歷年頁 `cloudListNumber.html`)即時取連結,不要 h","category":"external_commands","line_end":152,"severity":"medium","line_start":152},{"id":"network:SKILL.md:14:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"從財政部電子發票整合服務平台(https://invoice.etax.nat.gov.tw)的公開頁面取得統一發票中獎號碼,並用手上的發票號碼對獎。不需要 API 金鑰或登入,`curl` 即可。支","category":"network","line_end":14,"severity":"low","line_start":14},{"id":"network:SKILL.md:25:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"curl -sm 30 https://invoice.etax.nat.gov.tw/lastNumber.html -o /tmp/lastNumber.html","category":"network","line_end":25,"severity":"low","line_start":25},{"id":"network:SKILL.md:32:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"**領獎期間陷阱:** 頁面上的「領獎期間」文字只屬於它所在區塊的期別。2026-09-09 實測時,最新號碼單已是 115年05-06月,頁面殘留的「領獎期間自115年06月06日起至115年09月","category":"network","line_end":32,"severity":"low","line_start":32},{"id":"network:SKILL.md:128:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"curl -sm 30 https://invoice.etax.nat.gov.tw/cloudNowNumber.html -o /tmp/cloud.html","category":"network","line_end":128,"severity":"low","line_start":128},{"id":"network:SKILL.md:132:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"curl -sm 30 'https://invoice.etax.nat.gov.tw/pdf/<檔名>.pdf' -o /tmp/prize.pdf","category":"network","line_end":132,"severity":"low","line_start":132},{"id":"network:SKILL.md:139:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"- 歷年專屬獎:https://invoice.etax.nat.gov.tw/cloudListNumber.html 列出所有過往期別的 PDF 連結(2026-09-09 實測 HTTP 200","category":"network","line_end":139,"severity":"low","line_start":139},{"id":"network:SKILL.md:143:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"- **一般統一發票**:`lastNumber.html` 只有最新一期。歷史期別在財政部稅務入口網,URL 規則為 `https://www.etax.nat.gov.tw/etw-main/ET","category":"network","line_end":143,"severity":"low","line_start":143},{"id":"network:SKILL.md:148:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"- **連線逾時**:`curl` 一律加 `-m 30`。逾時或 5xx 時隔幾秒重試 1~2 次;仍失敗就告知「財政部電子發票整合服務平台可能暫時異常,請直接到 https://invoice.e","category":"network","line_end":148,"severity":"low","line_start":148},{"id":"filesystem:SKILL.md:25:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"curl -sm 30 https://invoice.etax.nat.gov.tw/lastNumber.html -o /tmp/lastNumber.html","category":"filesystem","line_end":25,"severity":"medium","line_start":25},{"id":"filesystem:SKILL.md:41:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"h = open('/tmp/lastNumber.html', encoding='utf-8').read()","category":"filesystem","line_end":41,"severity":"medium","line_start":41},{"id":"filesystem:SKILL.md:94:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"h = open('/tmp/lastNumber.html', encoding='utf-8').read()","category":"filesystem","line_end":94,"severity":"medium","line_start":94},{"id":"filesystem:SKILL.md:128:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"curl -sm 30 https://invoice.etax.nat.gov.tw/cloudNowNumber.html -o /tmp/cloud.html","category":"filesystem","line_end":128,"severity":"medium","line_start":128},{"id":"filesystem:SKILL.md:129:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"grep -oE 'pdf/[^\"]+\\.pdf' /tmp/cloud.html | sort -u","category":"filesystem","line_end":129,"severity":"medium","line_start":129},{"id":"filesystem:SKILL.md:132:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"curl -sm 30 'https://invoice.etax.nat.gov.tw/pdf/<檔名>.pdf' -o /tmp/prize.pdf","category":"filesystem","line_end":132,"severity":"medium","line_start":132},{"id":"filesystem:SKILL.md:133:temp-directory-access","file":"SKILL.md","pattern":"Temp directory access","snippet":"pdftotext /tmp/prize.pdf /tmp/prize.txt","category":"filesystem","line_end":133,"severity":"medium","line_start":133},{"id":"obfuscation:SKILL.md:143:heuristic-very-high-entropy-string-5-51-bits-lik","file":"SKILL.md","pattern":"[HEURISTIC] Very high entropy string (5.51 bits) - likely encoded/encrypted payload","snippet":" 抓不到號碼內容（2026-09-09 實測），只能給使用者連結手動確認；可程式化解析的歷史只有雲端發票專屬獎（","category":"obfuscation","line_end":143,"severity":"high","line_start":143},{"id":"obfuscation:SKILL.md:1:heuristic-high-file-entropy-6-92-bits-possible-b","file":"SKILL.md","pattern":"[HEURISTIC] High file entropy (6.92 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:14:ruby-shell-backtick-execution","reason":"The backticks format the curl command name in Markdown prose. They do not execute shell or Ruby code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","reason":"These backticks open a Markdown code fence containing a fixed public-page download. They are not shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:26:ruby-shell-backtick-execution","reason":"This line closes a Markdown code fence. No executable backtick expression exists.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:28:ruby-shell-backtick-execution","reason":"The backticks mark cloudNowNumber.html as an inline filename in a historical test description. No shell execution occurs.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","reason":"Backticks highlight historical winning numbers in Markdown prose. They are not executable shell expressions.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:36:ruby-shell-backtick-execution","reason":"Inline code shows HTML fragments and split digit examples. The text explains parsing and does not execute those fragments.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","reason":"A Markdown fence encloses a quoted Python heredoc using regular expressions on downloaded HTML. The example does not evaluate downloaded content as code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","reason":"This is the closing Markdown fence for the parsing example. It is not command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","reason":"Backticks format extracted historical prize numbers as inline text. No executable expression is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:91:ruby-shell-backtick-execution","reason":"The fence contains a quoted Python heredoc performing string-based invoice comparisons. No Ruby execution or shell backtick substitution appears.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:118:ruby-shell-backtick-execution","reason":"This line closes the batch example's Markdown fence. It cannot execute a shell command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:126:ruby-shell-backtick-execution","reason":"The backticks introduce Markdown examples using curl, grep, sort, and pdftotext for public prize documents. No executable backtick substitution exists.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:134:ruby-shell-backtick-execution","reason":"This is a closing Markdown code fence. It does not invoke shell or Ruby execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:136:ruby-shell-backtick-execution","reason":"Inline formatting identifies PDF filename patterns and prize-category codes. These are descriptive examples, not executable expressions.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:137:ruby-shell-backtick-execution","reason":"The backticks highlight a sample invoice serial. The surrounding prose explains exact matching and contains no shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:143:ruby-shell-backtick-execution","reason":"Backticks format filenames and an official historical-page URL pattern. The prose explicitly recommends manual confirmation rather than executing page content.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:144:ruby-shell-backtick-execution","reason":"Inline filenames use Markdown backticks, not shell substitution. The separate consent and matching problems in this guidance are covered by semantic findings.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:148:ruby-shell-backtick-execution","reason":"Backticks format curl and its timeout option in error-handling guidance. No backtick command execution occurs.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:152:ruby-shell-backtick-execution","reason":"Backticks mark cloud prize page filenames in guidance against stale links. This is Markdown formatting, not execution.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:14:hardcoded-url","reason":"The HTTPS URL names the official public source for the skill's stated task. No private invoice data or credentials are sent.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:25:hardcoded-url","reason":"curl performs a bounded HTTPS download of the official winning-number page. The request contains no invoice identifiers, secrets, or upload payload.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:32:hardcoded-url","reason":"This official-site link asks users to verify claim deadlines. It is a reference, not an exfiltration destination.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:128:hardcoded-url","reason":"The HTTPS download retrieves public cloud-prize document links from the official platform. It transmits no user invoice data.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:132:hardcoded-url","reason":"The quoted URL template downloads a public prize PDF from the same official HTTPS host. No credential access or data upload is shown.","verdict":"false_positive","confidence":0.97},{"id":"network:SKILL.md:139:hardcoded-url","reason":"The URL references the official historical cloud-prize index. It serves the stated historical lookup function without transmitting private data.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:143:hardcoded-url","reason":"This official tax-portal URL pattern identifies historical draw periods. The skill directs users there for manual confirmation.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:148:hardcoded-url","reason":"The official URL is a fallback reference after bounded retries fail. No user data transmission or unrelated network destination appears.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:25:temp-directory-access","reason":"curl writes to a predictable shared temporary filename without private-directory isolation. A local attacker can pre-create a symlink to overwrite another agent-writable file.","verdict":"confirmed","severity":"medium","confidence":0.94},{"id":"filesystem:SKILL.md:41:temp-directory-access","reason":"The parser trusts a predictable shared temporary file without ownership or isolation checks. Another local user can replace its contents and falsify prize results.","verdict":"confirmed","severity":"medium","confidence":0.92},{"id":"filesystem:SKILL.md:94:temp-directory-access","reason":"Batch matching reads the same predictable shared file without establishing trusted provenance. Local file replacement can produce false winning or losing results.","verdict":"confirmed","severity":"medium","confidence":0.92},{"id":"filesystem:SKILL.md:128:temp-directory-access","reason":"curl writes the cloud-prize page to a predictable shared filename. A pre-created symlink can redirect the write to another agent-writable file.","verdict":"confirmed","severity":"medium","confidence":0.94},{"id":"filesystem:SKILL.md:129:temp-directory-access","reason":"PDF link extraction trusts a predictable shared file that another local user can replace. Tampering can substitute prize-document paths and compromise subsequent matching.","verdict":"confirmed","severity":"medium","confidence":0.91},{"id":"filesystem:SKILL.md:132:temp-directory-access","reason":"The PDF download writes to a fixed shared temporary path. A pre-created symlink can overwrite an unrelated file writable by the agent.","verdict":"confirmed","severity":"medium","confidence":0.94},{"id":"filesystem:SKILL.md:133:temp-directory-access","reason":"pdftotext reads a predictable PDF path and writes a predictable text path. Local replacement can tamper with inputs, while output symlinks can redirect writes.","verdict":"confirmed","severity":"medium","confidence":0.93},{"id":"obfuscation:SKILL.md:143:heuristic-very-high-entropy-string-5-51-bits-lik","reason":"The flagged line is readable Chinese prose with an official URL pattern and filenames. No encoded payload, decoder, or hidden executable content appears.","verdict":"false_positive","confidence":0.99},{"id":"obfuscation:SKILL.md:1:heuristic-high-file-entropy-6-92-bits-possible-b","reason":"The complete file is readable multilingual Markdown with YAML metadata and plain code examples. No binary, encrypted content, or decoding mechanism was found.","verdict":"false_positive","confidence":0.99}],"semantic_findings":[{"title":"Recurring Actions Without Explicit Consent","severity":"medium","locations":[{"file":"SKILL.md","line_end":144,"line_start":144},{"file":"SKILL.md","line_end":157,"line_start":157}],"confidence":0.93,"description":"Line 144 says the agent may schedule rechecking itself ('代理可自行排定') after receiving invoice numbers or carrier suffixes. This expands a prior lookup into recurring processing without explicit scheduling or retention consent.","confidence_reasoning":"Both the Chinese workflow and English summary authorize proactive rechecking of saved identifiers. No explicit opt-in, retention limit, or cancellation requirement appears."},{"title":"Invalid Inputs and Period Reuse in Automatic Matching","severity":"medium","locations":[{"file":"SKILL.md","line_end":87,"line_start":82},{"file":"SKILL.md","line_end":138,"line_start":137},{"file":"SKILL.md","line_end":144,"line_start":144}],"confidence":0.94,"description":"Line 144 allows fixed invoice numbers or carrier suffixes to trigger rechecking every draw. Carrier suffixes cannot identify invoices, and reusing invoice numbers across periods can report invalid wins.","confidence_reasoning":"The matching instructions require complete eight-digit numbers or ten-character cloud serials. Automatic guidance nevertheless accepts carrier suffixes and omits invoice issue-period checks."}],"subject_marketplace_commit_sha":"2aab20a3878daa05021884e089a7dd7739e08581","subject_content_hash":"ca3b9ae4c05e6f5c79e17782439e2752a52e868ae68520d960a65d0658387925","subject_tree_hash":"04cd24105791209fd6426b2b4e7caf98cefc31227b389030edb102e3075e31db","subject_plugin_path":"skills/tahodev/invoice-winning-numbers","audit_payload_hash":"696ae53a987eec60466f0a1b2a668dfb","confirmed_risk_level":"medium","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"2aab20a3878daa05021884e089a7dd7739e08581","contentHash":"ca3b9ae4c05e6f5c79e17782439e2752a52e868ae68520d960a65d0658387925","treeHash":"04cd24105791209fd6426b2b4e7caf98cefc31227b389030edb102e3075e31db","pluginPath":"skills/tahodev/invoice-winning-numbers","auditPayloadHash":"696ae53a987eec60466f0a1b2a668dfb"},"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-invoice-winning-numbers/audits/1/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"medium","confirmedFindingCount":2,"capabilityReviewCount":7,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}