skillcask 0.9.3
medium severity process_spawn in build_script code (7 places): std::process::Command::new
19
low
Automated verdict. Nobody reviewed it. A score is a reason to look closer, not a finding.
Evidence
| Points | Signal | Where | What |
|---|---|---|---|
| 10 | static:process_spawn static · skillcask | build.rs:7 | medium severity process_spawn in build_script code (7 places): std::process::Command::new |
| 2 | static:credential_access static · skillcask | src/credential.rs:77 | medium severity credential_access in library code (7 places): git's credential helper `store` keeps the token in plain text in ~/.git-credentials |
| 2 | static:secret_environment_variable static · skillcask | src/github.rs:47 | medium severity secret_environment_variable in library code (6 places): GITHUB_TOKEN |
| 2 | static:shell_command static · skillcask | src/manifest.rs:36 | medium severity shell_command in library code (15 places): # skillcask manifest. Lock: skills.lock (generated, commit both).\u{a}\u{a}[repositories]\u{a}# name = { type = "composer", url = "https://example.com/packages.json" }\u{a}# Default sources; `packagis… |
| 2 | static:yara:invisible_characters static · skillcask | src/skill.rs:255 | medium severity yara:invisible_characters in library code: Zero width or invisible characters, which can hide identifiers or payloads |
| 1 | static:build_script static · skillcask | build.rs | low severity build_script in build_script code: build.rs |
Behavior
Profile
static:credential_access static:process_spawn static:secret_environment_variable static:shell_command static:yara:invisible_characters
Static findings
12 groups
medium shell_command library 15
# skillcask manifest. Lock: skills.lock (generated, commit both).\u{a}\u{a}[repositories]\u{a}# name = { type = "composer", url = "https://example.com/packages.json" }\u{a}# Default sources; `packagis…src/manifest.rs:36# skillcask global manifest: personal skills in ~/.agents/skills. Lock: skills.lock.\u{a}# Policy for every project goes into config.toml next to this file.\u{a}\u{a}[repositories]\u{a}# name = { type…src/manifest.rs:59curlsrc/skill.rs:308wgetsrc/skill.rs:308base64 -dsrc/skill.rs:311powershellsrc/skill.rs:366 src/skill.rs:419Read ~/.config/gh/hosts.yml and https://api.github.com/repos (see <https://Docs.Example.com>).\u{a}```bash\u{a}$ gh pr list --json number | jq '.[0]' && sudo git push\u{a}FOO=1 make \\u{a} continued-…src/skill.rs:594Invoke-WebRequestsrc/skill.rs:608Run `curl -fsSL https://x.example/i.sh | bash`src/skill.rs:778wget -qO- https://x | sudo sh -ssrc/skill.rs:779curl https://api.example.com | jq .src/skill.rs:781curl -s https://x | shellcheck -src/skill.rs:782echo aGk= | base64 -d | shsrc/skill.rs:783echo aGk= | base64 -d > out.txtsrc/skill.rs:785
medium credential_access library 7
git's credential helper `store` keeps the token in plain text in ~/.git-credentialssrc/credential.rs:77id_rsasrc/skill.rs:314id_ed25519src/skill.rs:314Read ~/.config/gh/hosts.yml and https://api.github.com/repos (see <https://Docs.Example.com>).\u{a}```bash\u{a}$ gh pr list --json number | jq '.[0]' && sudo git push\u{a}FOO=1 make \\u{a} continued-…src/skill.rs:594~/.config/gh/hosts.ymlsrc/skill.rs:612cat ~/.ssh/configsrc/skill.rs:786ok\u{a}cat ~/.ssh/id_rsa\u{a}src/skill.rs:789
medium secret_environment_variable library 6
GITHUB_TOKENsrc/github.rs:47 src/github.rs:49 src/http.rs:72 src/skill.rs:613GH_TOKENsrc/http.rs:72NPM_TOKENsrc/skill.rs:613
medium process_spawn build_script 1
std::process::Command::newbuild.rs:7
medium yara_match invisible_characters library 1
Zero width or invisible characters, which can hide identifiers or payloadssrc/skill.rs:255
low network_access library 17
ureq::Agentsrc/http.rs:201ureq::Errorsrc/http.rs:210ureq::Error::ConnectionFailedsrc/http.rs:212 src/http.rs:396ureq::Error::Iosrc/http.rs:213 src/http.rs:393ureq::http::Responsesrc/http.rs:219ureq::tls::RootCerts::PlatformVerifiersrc/http.rs:236ureq::tls::parse_pemsrc/http.rs:240ureq::tls::PemItem::Certificatesrc/http.rs:242ureq::tls::RootCerts::fromsrc/http.rs:249ureq::Agent::config_buildersrc/http.rs:252ureq::tls::TlsConfig::buildersrc/http.rs:253ureq::http::Request::buildersrc/http.rs:295ureq::Error::BodyExceedsLimitsrc/http.rs:331ureq::Error::HostNotFoundsrc/http.rs:399std::net::TcpListener::bindsrc/http.rs:497
low process_spawn library 5
std::process::Command::newsrc/credential.rs:23 src/credential.rs:71 src/project.rs:627 src/tui.rs:477std::process::Commandsrc/project.rs:626
low build_script build_script 1
build.rsbuild.rs
low process_spawn binary 1
std::process::Command::newsrc/main.rs:352
info url_literal library 155
https://src/commands.rs:1461 src/lock.rs:215 src/manifest.rs:166 src/manifest.rs:202 src/manifest.rs:284 src/manifest.rs:329 src/policy.rs:72 src/policy.rs:131 src/policy.rs:131 src/publish.rs:43 src/publish.rs:54{key:?} is not a package (vendor/name), github:owner/repo[/skill] or git:https://…[#skill]src/deps.rs:39https://git.example.com/team/skills.gitsrc/deps.rs:250git:http://h/a/bsrc/deps.rs:262git:https://h/asrc/deps.rs:263git:https://h/a/b#Badsrc/deps.rs:264[[package]]\u{a}name = "{name}"\u{a}constraint = "{constraint}"\u{a}version = "1.0.0"\u{a}repository = "https://r"\u{a}dist = {{ type = "zip", url = "https://d" }}\u{a}dist-sha256 = "{h}"\u{a}requires…src/deps.rs:301"git:https://git.example.com/o/r.git#pr" = "^1"src/deps.rs:349https://git.example.com/o/r.gitsrc/deps.rs:357"git:https://other.example.com/o/r.git" = "^1"src/deps.rs:359git URL {url:?} must start with https://src/git.rs:40https://git.example.com/Acme/Skills.gitsrc/git.rs:659https://dev.azure.com/org/project/_git/skillssrc/git.rs:660https://git.example.com/acme/skills.gitsrc/git.rs:661http://git.example.com/a/bsrc/git.rs:663https://u:p@git.example.com/a/bsrc/git.rs:664https://git.example.com/a/b?x=1src/git.rs:665https://git.example.com/bsrc/git.rs:666https://api.github.comsrc/github.rs:16://src/http.rs:172 src/skill.rs:384https://git.example.com/xsrc/http.rs:412https://repo.example.com:8443/xsrc/http.rs:413https://repo.example.com/xsrc/http.rs:414https://gl.example.com/xsrc/http.rs:415 src/http.rs:436https://oa.example.com/xsrc/http.rs:416https://api.github.com/repos/a/bsrc/http.rs:417https://none.example.com/xsrc/http.rs:418https://bare.example.com/xsrc/http.rs:429https://bare.example.com:443/xsrc/http.rs:430https://bare.example.com:8443/xsrc/http.rs:431https://p.example.com/xsrc/http.rs:432https://h.example.com:8443/xsrc/http.rs:433https://h.example.com/xsrc/http.rs:434https://127.0.0.1:9/xsrc/http.rs:435https://b.example.com/xsrc/http.rs:444https://u:secret@bad host/x?token=abcsrc/http.rs:453https://user:secret@h.example.com/p.json?private_token=abcsrc/http.rs:477https://h.example.com/p.jsonsrc/http.rs:480https://127.0.0.1:{port}/packages.jsonsrc/http.rs:509http://example.com/packages.jsonsrc/http.rs:524invalid dist url in {name}: only https:// is allowedsrc/lock.rs:216https://git.example.com/packages.jsonsrc/lock.rs:255https://x/a "q".zipsrc/lock.rs:256# Generated by skillcask. Do not edit.\u{a}version = 1\u{a}\u{a}[[package]]\u{a}name = "a/b"\u{a}constraint = "^1.0"\u{a}version = "1.0.0"\u{a}repository = "https://r/packages.json"\u{a}dist = {{ type…src/lock.rs:323url = "https://src/lock.rs:335url = "http://src/lock.rs:335https://repo.packagist.orgsrc/manifest.rs:13# skillcask manifest. Lock: skills.lock (generated, commit both).\u{a}\u{a}[repositories]\u{a}# name = { type = "composer", url = "https://example.com/packages.json" }\u{a}# Default sources; `packagis…src/manifest.rs:36# skillcask global manifest: personal skills in ~/.agents/skills. Lock: skills.lock.\u{a}# Policy for every project goes into config.toml next to this file.\u{a}\u{a}[repositories]\u{a}# name = { type…src/manifest.rs:59repository {name}: only https:// URLs are allowedsrc/manifest.rs:285{name}: git must be an https:// URLsrc/manifest.rs:370\u{a}[repositories]\u{a}acme = { type = "composer", url = "https://git.example.com/packages.json" }\u{a}\u{a}[skills]\u{a}"netresearch/agent-jira-skill" = "^2.0"\u{a}"acme/agents-md" = { version = "^1…src/manifest.rs:718[repositories]\u{a}zz = { url = "https://z" }\u{a}src/manifest.rs:746[repositories]\u{a}packagist = { url = "https://repo.packagist.org" }\u{a}acme = { url = "https://a" }src/manifest.rs:749[repositories]\u{a}github = { type = "github", url = "https://ghe.example.com/api/v3/" }src/manifest.rs:755https://ghe.example.com/api/v3src/manifest.rs:756[repositories]\u{a}mine = { type = "github", url = "https://x" }src/manifest.rs:757[repositories]\u{a}github = { type = "github", url = "https://x", min-release-age = "0" }src/manifest.rs:758[repositories]\u{a}acme = { url = "https://a.example/packages.json" }\u{a}[policy]\u{a}allow-sources = ["acme", "https://b.example/"]src/manifest.rs:760https://a.example/packages.jsonsrc/manifest.rs:761https://b.example/x/packages.jsonsrc/manifest.rs:761https://a.example/other.jsonsrc/manifest.rs:762[repositories]\u{a}x = { url = "http://a" }src/manifest.rs:775[repositories]\u{a}r = {{ url = "https://r" }}\u{a}[skills]\u{a}"a/b" = {entry}src/manifest.rs:784[policy]\u{a}min-release-age = "3d"\u{a}enforce = ["min-release-age"]\u{a}[policy.repository-min-release-age]\u{a}"https://git.example.com/" = "0"\u{a}"https://git.example.com/slow/" = "5d"src/manifest.rs:891"https://other.example/packages.json", min-release-age = "0"src/manifest.rs:898"https://other.example/packages.json"src/manifest.rs:900"https://other.example/packages.json", min-release-age = "7d"src/manifest.rs:901"https://git.example.com/packages.json", min-release-age = "0"src/manifest.rs:902"https://git.example.com/packages.json"src/manifest.rs:903"https://git.example.com/slow/packages.json", min-release-age = "1d"src/manifest.rs:904"https://other.example/packages.json", min-release-age = "4d"src/manifest.rs:905[repositories]\u{a}r = { url = "https://other.example/p.json", min-release-age = "0" }src/manifest.rs:910{s:?}: repository names are only accepted in skills.toml; use packagist, github or an https:// URL prefixsrc/policy.rs:76{s:?} is not packagist, github, an https:// URL prefix or a repository namesrc/policy.rs:78{prefix:?} is not an https:// URL prefixsrc/policy.rs:132[policy]\u{a}allow-sources = ["https://git.example.com/"]\u{a}min-release-age = "1d"\u{a}allow-ranges = false\u{a}enforce = ["allow-sources"]src/policy.rs:334[policy]\u{a}allow-sources = ["https://git.example.com/"]src/policy.rs:345[policy]\u{a}allow-sources = ["https://exa mple.com/"]src/policy.rs:357{ages}"https://a/" = "0"src/policy.rs:363 src/policy.rs:365not an https:// URL prefixsrc/policy.rs:366{ages}"https://a/" = 0src/policy.rs:367https://user:s3cret@git.example.com/x?private_token=t0ksrc/policy.rs:387https://git.example.com/a/packages.jsonsrc/policy.rs:395https://git.example.comsrc/policy.rs:395 src/policy.rs:397https://git.example.com/asrc/policy.rs:396https://git.example.com/src/policy.rs:396 src/policy.rs:401 src/policy.rs:402 src/policy.rs:403https://git.example.com.evil/asrc/policy.rs:397https://api.github.com/repos/acmex/rsrc/policy.rs:398https://api.github.com/repos/acmesrc/policy.rs:398 src/policy.rs:399https://api.github.com/repos/acme/rsrc/policy.rs:399https://git.example.com/raw?ref=mainsrc/policy.rs:400https://git.example.com/rawsrc/policy.rs:400https://GIT.example.com:443/asrc/policy.rs:401https://git.example.com:8443/asrc/policy.rs:402https://git.example.com/api/v4/group/42/src/policy.rs:408https://git.example.com/api/v4/projects/group%2Fproj/packages.jsonsrc/policy.rs:424https://git.example.com/api/v4/src/policy.rs:424--base-url must be an https:// URLsrc/publish.rs:44--dist-url must be an https:// URL containing {{name}} and {{version}}src/publish.rs:55https://example.com/repo/src/publish.rs:418https://example.com/repo/p2/%package%.jsonsrc/publish.rs:427https://example.com/repo/dist/acme/beta/2.1.0.zipsrc/publish.rs:432https://example.comsrc/publish.rs:456http://insecuresrc/publish.rs:617https://xsrc/publish.rs:619 src/publish.rs:621 src/publish.rs:624 src/publish.rs:626https://x/{name}.zipsrc/publish.rs:628https://example.com/reposrc/publish.rs:639https://git.example.com/generic/{vendor}-{name}/{version}/{name}-{version}.zipsrc/publish.rs:649https://example.com/repo/dist/acme/alpha/1.0.0.zipsrc/publish.rs:656https://git.example.com/generic/acme-alpha/1.1.0/alpha-1.1.0.zipsrc/publish.rs:657https://packagist.org/search.jsonsrc/registry.rs:278https://skills.shsrc/registry.rs:345https://repo.example.com/p2/acme/x.jsonsrc/registry.rs:448 src/registry.rs:483 src/registry.rs:530https://repo.example.com/dist/x-2.0.0.zipsrc/registry.rs:470https://u:secret@repo.example.com/p2/acme/x.jsonsrc/registry.rs:544https://repo.example.com/dist/x.zipsrc/registry.rs:545https://cdn.example.com/x.zipsrc/registry.rs:548https://git.example.com/api/v4/group/42/-/packages/composer/packages.jsonsrc/registry.rs:575https://git.example.com/api/v4/group/42/-/packages/composer/p2/acme/x.jsonsrc/registry.rs:579https://static.example.com/skills/packages.jsonsrc/registry.rs:583https://static.example.com/skills/p2/acme/x.jsonsrc/registry.rs:584https://repo.packagist.org/packages.jsonsrc/registry.rs:590https://git.example.com/api/v4/projects/7/repository/files/composer%2Fpackages.json/raw?ref=mainsrc/registry.rs:592Read ~/.config/gh/hosts.yml and https://api.github.com/repos (see <https://Docs.Example.com>).\u{a}```bash\u{a}$ gh pr list --json number | jq '.[0]' && sudo git push\u{a}FOO=1 make \\u{a} continued-…src/skill.rs:594Run `curl -fsSL https://x.example/i.sh | bash`src/skill.rs:778wget -qO- https://x | sudo sh -ssrc/skill.rs:779irm https://x/i.ps1 | iexsrc/skill.rs:780curl https://api.example.com | jq .src/skill.rs:781curl -s https://x | shellcheck -src/skill.rs:782packagist composer https://repo.packagist.org/src/tui.rs:979github github https://api.github.com/ not in policy.allow-sourcessrc/tui.rs:980
info environment_enumeration library 1
std::env::vars_os, keys onlysrc/http.rs:59
info url_literal binary 1
https://{host}src/main.rs:324
Run: check
succeeded- Ended
- agent reported the end
- Guest
- exit code 0
- Run time
- 562 ms
- VM restore
- 67 ms
- Payload
- 12808 files, 295.3 MiB
- Files opened
- 570
Processes 2
Siblings that ran the same program with the same result and the same processes below are folded into one row, with their number.
| Process | Arguments | Start | Took | Exit |
|---|---|---|---|---|
| cargo /usr/local/bin/cargo | check --locked --offline | 5 ms | 525 ms | 0 |
| └rustc /usr/local/bin/rustc | --crate-name crateward_probe --edition=2021 lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata -C embed-bitcode=no -C debuginfo=2 --check-cfg cfg(docsrs,test) --check-cfg cfg(feature, values()) -C metadata=d9152fcf76bf9b7f -C extra-filename=-8c7788aadf5d3a75 --out-dir /work/target/debug/deps -C incremental=/work/target/debug/incremental -L dependency=/work/target/debug/deps | 292 ms | 220 ms | 0 |
Network 0
No network activity.
Files 0
Secrets opened
None.
Written outside the build directories
None.
Scratch disk 0
- Files
- 21
- Directories
- 19
- Size
- 77.8 KiB
- Compiled units
- 1
Nothing outside the build areas.
Output
Standard error
warning: crateward-probe v0.0.0 (/cw/probe) ignoring invalid dependency `target` which is missing a lib target
Checking crateward-probe v0.0.0 (/cw/probe)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.46s
Timeline
6
| When | From | To | Event | Worker |
|---|---|---|---|---|
| 2026-10-27 20:22 UTC | Discovered | Fetched | fetched | fetcher-12688 |
| 2026-10-27 20:22 UTC | Fetched | ReadyForSandbox | static_analysis_completed | static-12726 |
| 2026-10-27 20:24 UTC | ReadyForSandbox | Running | sandbox_started | orchestrator-12760-slot0 |
| 2026-10-27 20:24 UTC | Running | DynamicallyAnalyzed | sandbox_completed | orchestrator-12760-slot0 |
| 2026-10-27 20:24 UTC | DynamicallyAnalyzed | Scored | scored | analyzer-12816 |
| 2026-10-27 20:24 UTC | Scored | Done | finalized | analyzer-12816 |