dingtalk-todo

github.com/breath57/dingtalk-skills
Verdict: Do not install
4 critical0 high1 medium
F
SCORE 0 / 100
$skillox install dingtalk-todoSoon
Sign in to followFollowing emails you when a re-scan drops the grade. Opt-out is per-creator on /account/billing.

Why grade F?

score · 0 / 100

The current grade reflects 4 critical findings (any 2+ CRITs → F).

4 CRIT0 HIGH1 MED0 LOW
To reach a higher grade
  • D
    Reach Dtarget score 30

    Resolve 3 of your 4 CRIT findings — any single CRIT still keeps you at D.

  • C
    Reach Ctarget score 55

    Resolve all 4 CRIT findings.

  • B
    Reach Btarget score 75

    Resolve all 4 CRIT.

  • A
    Reach Atarget score 95

    Resolve all 4 CRIT.

Thresholds are documented at /docs/grading. Source-of-truth is the grade() function in @skillox/scanner.

Latest scan findings

Scan crawl-qfdw5qvs4vvgftdqv7hqw1xy · Thu, 28 May 2026 17:50:07 GMT · 1ms

crit
URL embeds a credential variable
The skill builds a URL that interpolates a secret into the query string. If the agent makes this request, the credential leaves the trust boundary.
rule: url-exfiltrationline: 50CWE-200
48```bash
49# 1. 获取旧版 token
50OLD_TOKEN=$(curl -s "https://oapi.dingtalk.com/gettoken?appkey=${APP_KEY}&appsecret=${APP_SECRET}" | grep -o '"access_token":"[^"]*"' | cut -d'"' -f4)URL interpolates a credential into the query string
51
52# 2. userId → unionId
crit
URL embeds a credential variable
The skill builds a URL that interpolates a secret into the query string. If the agent makes this request, the credential leaves the trust boundary.
rule: url-exfiltrationline: 53CWE-200
51
52# 2. userId → unionId
53UNION_ID=$(curl -s -X POST "https://oapi.dingtalk.com/topapi/v2/user/get?access_token=${OLD_TOKEN}" \URL interpolates a credential into the query string
54 -H 'Content-Type: application/json' \
55 -d "{\"userid\":\"${USER_ID}\"}" | grep -o '"unionid":"[^"]*"' | cut -d'"' -f4)
crit
URL embeds a credential variable
The skill builds a URL that interpolates a secret into the query string. If the agent makes this request, the credential leaves the trust boundary.
rule: url-exfiltrationline: 96CWE-200
94UNION_ID=$(grep '^DINGTALK_MY_OPERATOR_ID=' "$CONFIG" 2>/dev/null | cut -d= -f2-)
95if [ -z "$UNION_ID" ]; then
96 OLD_TOKEN=$(curl -s "https://oapi.dingtalk.com/gettoken?appkey=${APP_KEY}&appsecret=${APP_SECRET}" | grep -o '"access_token":"[^"]*"' | cut -d'"' -f4)URL interpolates a credential into the query string
97 UNION_ID=$(curl -s -X POST "https://oapi.dingtalk.com/topapi/v2/user/get?access_token=${OLD_TOKEN}" \
98 -H 'Content-Type: application/json' \
crit
URL embeds a credential variable
The skill builds a URL that interpolates a secret into the query string. If the agent makes this request, the credential leaves the trust boundary.
rule: url-exfiltrationline: 97CWE-200
95if [ -z "$UNION_ID" ]; then
96 OLD_TOKEN=$(curl -s "https://oapi.dingtalk.com/gettoken?appkey=${APP_KEY}&appsecret=${APP_SECRET}" | grep -o '"access_token":"[^"]*"' | cut -d'"' -f4)
97 UNION_ID=$(curl -s -X POST "https://oapi.dingtalk.com/topapi/v2/user/get?access_token=${OLD_TOKEN}" \URL interpolates a credential into the query string
98 -H 'Content-Type: application/json' \
99 -d "{\"userid\":\"${USER_ID}\"}" | grep -o '"unionid":"[^"]*"' | cut -d'"' -f4)
med
No capability manifest declared
The skill ships without a `manifest.yaml` or `capabilities` block in its frontmatter. Without a manifest, the runtime cannot enforce what this skill is permitted to do.
rule: no-manifest
View latest scan →
skillox.io/c/dingtalk-todo