Detonation LabsBehavioral security for the AI agent supply chain

Verdict

No malicious behavior observed

We ran it 7 times, with a normal setup, docs:--file, SHOP_SEARCH_API_URL set and a GitHub Actions environment. It contacted 47.100.160.98:443. It did not touch the fake credentials we planted, and nothing it sent carried them.

1 finding. Scanned 27 Oct 2026 by detonator 0.5.1.

Target
realtime-price-compare
Source
clawhub 1.0.0
SHA-256
2286c6ab1b83ad02
Files
7
RecommendationNo action needed

Nothing observed calls for action. This is evidence, not a guarantee.

batch:clawhub:2026-10-27

What this package does

observed across 7 runs
  1. Package realtime-price-compare 7 files · agent skill
  2. Install No install stepFiles were copied in as they are.
  3. Runs as python3 <skill>/scripts/shop_search.pypython3 <skill>/scripts/shop_search.py --filels -la ./skillls -la ./skill/scripts An AI agent also used it 1 time.
  4. What it reached
    Network
    • 47.100.160.98 5 connections, 1.6 KB sent
    • 47.100.160.98:443 direct connection to an IP address, no name lookup
    Credentials

    None of the planted fake keys were touched.

    Files written

    Nothing outside its own folder.

We planted fake AWS, SSH, npm and GitHub keys and a .env file before every run. Red means something left or was planted to run later.

Findings

F01 Low

Agent connected to an IP address directly

Confidence
Info A connection went to a raw IP address instead of a hostname.
Observed in
llm:baseline

Description

A connection was made to a hard-coded IP address rather than a hostname.

Impact

Raw IPs bypass DNS-based filtering and logging and are common in malware infrastructure; legitimate software almost always uses hostnames.

Evidence

47.100.160.98:443

Remediation

Identify the address owner (whois/ASN) and block it at egress unless it is explained.

References

  • ATT&CK T1071 Application Layer Protocol

Process tree

run llm:baseline

Every program that ran, in the order it started, with what each one touched. Red marks the path to a leak or a planted file.

Show process tree
  • runbash -c ls -la ./skill && ls -la ./skill/scripts 2>/dev/null
    • runls -la ./skill
    • runls -la ./skill/scripts
  • runbash -c cd ./skill && cat scripts/shop_search.py && cat _meta.jso...
    • runcat scripts/shop_search.py
    • runcat _meta.json
    • runcat skill-card.md
    • runls examples assets
  • runbash -c cd ./skill && head -60 scripts/shop_search.py && cat exam...
    • runhead -60 scripts/shop_search.py
    • runcat examples/cases.json
  • runbash -c cd ./skill && python3 scripts/shop_search.py '{"keywords"...
    • runpython3 scripts/shop_search.py {"keywords":["降噪蓝牙耳机"],"budget_max_minor":300...
      • net47.100.160.98:443 sent 416 B
  • runbash -c cd ./skill && python3 scripts/shop_search.py '{"keywords"...
    • runpython3 scripts/shop_search.py {"keywords":["降噪蓝牙耳机"],"budget_max_minor":300...
      • net47.100.160.98:443 sent 416 B
    • runcurl -s -m 20 -o /dev/null
      • net47.100.160.98:443 sent 171 B
  • runbash -c curl -s -m 20 https://47.100.160.98/commerce/api/pub/duma...
    • runcurl -s -m 20 https://47.100.160.98/commerce/api/pub/dumate-skill-1/rec... -X
      • net47.100.160.98:443 sent 305 B
    • runhead -c 2000
  • runbash -c curl -s -m 20 https://47.100.160.98/commerce/api/pub/duma...
    • runcurl -s -m 20 https://47.100.160.98/commerce/api/pub/dumate-skill-1/rec... -X
      • net47.100.160.98:443 sent 321 B
    • runhead -c 3000

Exploration log

7 runs
  1. scripts:baseline ok · 1.5s

    no new behavior

  2. scripts:docs:--file ok · 1.2s

    no new behavior

  3. scripts:guided:SHOP_SEARCH_API_URL ok · 1.0s

    no new behavior

  4. obedient:baseline ok · 0.6s

    no new behavior

    $ python3 <SKILL_DIR>/scripts/shop_search.py '{"keywords":["降噪蓝牙耳机"],"budget_max_minor":30000,"limit":10,"original_query":"300以内的降噪耳机推荐"}'
  5. obedient:guided:SHOP_SEARCH_API_URL ok · 0.6s

    no new behavior

    $ python3 <SKILL_DIR>/scripts/shop_search.py '{"keywords":["降噪蓝牙耳机"],"budget_max_minor":30000,"limit":10,"original_query":"300以内的降噪耳机推荐"}'
  6. obedient:ci-github ok · 0.6s

    no new behavior

    $ python3 <SKILL_DIR>/scripts/shop_search.py '{"keywords":["降噪蓝牙耳机"],"budget_max_minor":30000,"limit":10,"original_query":"300以内的降噪耳机推荐"}'
  7. llm:baseline ok · 20.7s

    new behavior: exec:curl, ip:47.100.160.98:443 · 8 model steps, 7 commands

    $ ls -la ./skill && ls -la ./skill/scripts 2>/dev/null $ cd ./skill && cat scripts/shop_search.py && cat _meta.json && cat skill-card.md && ls examples assets $ cd ./skill && head -60 scripts/shop_search.py && cat examples/cases.json $ cd ./skill && python3 scripts/shop_search.py '{"keywords":["降噪蓝牙耳机"],"budget_max_minor":30000,"limit":10,"original_query":"300元以内的降噪蓝牙耳机推荐2款"}'; echo "EXIT=$?" $ cd ./skill && python3 scripts/shop_search.py '{"keywords":["降噪蓝牙耳机"],"budget_max_minor":30000,"limit":10,"original_query":"300元以内的降噪蓝牙耳机推荐2款"}' 2>&1; echo "EXIT=$?"; curl -s -m 20 -o /dev/null -w "%{h $ curl -s -m 20 https://47.100.160.98/commerce/api/pub/dumate-skill-1/recommend -X POST -H 'Content-Type: application/json' -d '{"keywords":["降噪蓝牙耳机"],"budget_max_minor":30000,"limit":10,"original_query $ curl -s -m 20 https://47.100.160.98/commerce/api/pub/dumate-skill-1/recommend -X POST -H 'Content-Type: application/json' -d '{"keywords":["iPhone 17"],"must_include":["iPhone 17"],"strict_requirement model said: I ran the skill's search script, but I can't complete a price comparison because there's no product to look up. **What happened** - Your message didn't include a product, so there was nothing to search for. The skill needs a product name, a category, or a budget before it can query Taobao/Tmall, JD, and Pinduoduo. - I also ran the skill's own example query ("300元以内的降噪蓝牙耳机推荐2款") to check that the

scripts/scripts/shop_search.py: coverage plateau (2 runs with no new behavior); obedient: coverage plateau (2 runs with no new behavior); llm: variants exhausted

Note

Observed behavior only. A clean result does not prove a package is safe. Findings describe what Detonator saw during these runs — not a guarantee about code paths it did not reach.