Is Boss Agent Cli safe?
- Python shell/command execution
- Python filesystem read
- Python filesystem write/delete
boss-agent-cli is an AI python_package analyzed by SkillTotal's deterministic static scanner. The scan found no malicious indicators, though 6 risky constructs are reported for review. It can: filesystem read, filesystem write, mcp tools detected, network egress and shell execution — capabilities are what the code can do, not a verdict on intent. Risk score 0/100 (low).
boss-agent-cli 2.0.0
Automated static-analysis result. It can contain false positives and false negatives, and is not a claim about the intent of Boss Agent Cli's authors. Report a false positive.
Behavioral traits
How this component maps to the CSA agentic threat model. Descriptive — it never affects the risk score.
Findings (6)
The component can run operating-system commands or spawn processes.
completed = subprocess.run( command, cwd=cwd, input=input, capture_output=capture_output, text=text, timeout=timeout, check=check, )
result = subprocess.run( ["uv", "build", "--wheel"], cwd=project_root, check=False, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, )
proc = subprocess.run( resolved, cwd=ROOT, env=env, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False, )
completed = subprocess.run( command, check=check, cwd=cwd, capture_output=capture_output, text=text, timeout=timeout, )
result = subprocess.run( ["ioreg", "-rd1", "-c", "IOPlatformExpertDevice"], capture_output=True, text=True, check=False, )
result = subprocess.run( ["reg", "query", r"HKLM\SOFTWARE\Microsoft\Cryptography", "/v", "MachineGuid"], capture_output=True, text=True, check=False, )
result = subprocess.run( ["ollama", "pull", model], check=False, capture_output=True, text=True, )
subprocess.Popen( # noqa: S603 - fixed interpreter and in-package entrypoint command, stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, creationflags=getattr(subprocess, "CREATE_NO_WINDOW", 0), )
result = subprocess.run( cmd, capture_output=True, text=True, timeout=120, stdin=subprocess.DEVNULL, )
Why it matters: Powerful and often legitimate — confirm the commands aren't built from untrusted input.
Fix: Confirm the command and its arguments are fully controlled and not derived from untrusted input; avoid shell=True.
The component reads files from disk.
raw = json.loads(path.read_text(encoding="utf-8"))
text = pyproject_path.read_text(encoding="utf-8")
return salt_path.read_bytes()
plaintext = fernet.decrypt(self._key_path.read_bytes())
saved = json.loads(self._config_path.read_text(encoding="utf-8"))
rows = json.loads(path.read_text(encoding="utf-8"))
lines = port_file.read_text().strip().splitlines()
result: dict[str, Any] = yaml.safe_load(ref.read_text(encoding="utf-8"))
return machine_id.read_text().strip()
return self._salt_path.read_bytes()
encrypted = self._session_path.read_bytes()
return cast("dict[str, Any]", json.loads(self.state_path.read_text(encoding="utf-8")))for line in path.read_text(encoding="utf-8").splitlines():
with (self.root / name).open("a", encoding="utf-8") as handle:pid = int(_PID_FILE.read_text().strip())
pid = int(_PID_FILE.read_text().strip())
jd_text = file_path.read_text(encoding="utf-8")
jd_text = file_path.read_text(encoding="utf-8")
jd_text = file_path.read_text(encoding="utf-8")
return file_path.read_text(encoding="utf-8")
jd_text = file_path.read_text(encoding="utf-8")
chat_text = file_path.read_text(encoding="utf-8")
jd_text = file_path.read_text(encoding="utf-8")
jd_text = file_path.read_text(encoding="utf-8")
with open(config_path, encoding="utf-8") as f:
Why it matters: Usually legitimate, but worth confirming it can't be steered into reading sensitive files.
Fix: Confirm which files are read and that paths cannot be influenced by untrusted input to reach sensitive locations.
The component writes or deletes files on disk.
path.write_text(json.dumps(report, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
shutil.rmtree(bundle_dir)
shutil.copy2(wheel_path, bundle_dir / "wheels" / wheel_path.name)
(bundle_dir / "README-PORTABLE.md").write_text(_portable_readme(version), encoding="utf-8")
(bundle_dir / "examples" / "opencode.json").write_text(_opencode_example(), encoding="utf-8")
path.write_text(content, encoding="utf-8")
with open(args.output, "w", encoding="utf-8") as fp:
with open(OUT, "w") as f:
salt_path.write_bytes(salt)
self._key_path.write_bytes(encrypted)
self._config_path.write_text( json.dumps(current, ensure_ascii=False, indent=2), encoding="utf-8", )
shutil.rmtree(target)
shutil.copytree(source, target)
shutil.copy2(source, target)
registry.write_text( json.dumps([asdict(item) for item in rows], ensure_ascii=False, indent=2), encoding="utf-8", )
with open(fd, "wb", closefd=False) as stream:
self._salt_path.write_bytes(salt)
self._session_path.write_bytes(encrypted)
self.state_path.write_text( json.dumps(state, ensure_ascii=False, indent=2, sort_keys=True), encoding="utf-8", )
path.write_text(body, encoding="utf-8")
path.write_text("candidate_key,interview_time,reason\n", encoding="utf-8")_PID_FILE.write_text(str(os.getpid()))
with open(output_path, "w", encoding="utf-8", newline="") as f:
shutil.rmtree(path)
with open(config_path, "w", encoding="utf-8") as f:
Why it matters: Usually legitimate, but worth confirming the paths can't be controlled by untrusted input.
Fix: Confirm which files are written/deleted and that paths cannot be influenced by untrusted input.
The component makes outbound network requests.
const res = await fetch(DAEMON_PING_URL, { signal: AbortSignal.timeout(1000) });Why it matters: Usually legitimate, but confirm the destinations are expected and no sensitive data leaves.
Fix: Confirm the destination hosts are expected and that no sensitive data is sent off-host.
The component makes outbound network requests.
import urllib.request
req = urllib.request.Request(url, headers={"User-Agent": "contributors-svg"})with urllib.request.urlopen(req, timeout=30) as r:
import httpx
response = httpx.post(url, json=payload, headers=headers, timeout=60)
import httpx
self._client = httpx.Client(
base_url=self._BASE_URL,
cookies=token.get("cookies", {}),
headers=headers,
follow_redirects=True,
timeout=30,
)import httpx
resp = httpx.get(f"{http_url}/json/version", timeout=timeout)import urllib.request
with urllib.request.urlopen(list_url, timeout=3) as resp:
import httpx
import httpx
resp = httpx.get(f"{base}/json/version", timeout=_CDP_PROBE_TIMEOUT)import httpx
resp = httpx.get(
endpoints.USER_INFO_URL,
cookies=token.get("cookies", {}),
headers={
"User-Agent": token.get("user_agent") or "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
"Referer": "https:// …import httpx
with httpx.Client(base_url=endpoints.BASE_URL, headers=headers, follow_redirects=True, timeout=30) as client:
import httpx
resp = httpx.get(
f"{self._base_url}{DAEMON_PING_PATH}",
timeout=2.0,
)resp = httpx.get(
f"{self._base_url}{DAEMON_STATUS_PATH}",
timeout=2.0,
)resp = httpx.post(
f"{self._base_url}{DAEMON_COMMAND_PATH}",
json=cmd.to_dict(),
timeout=self._timeout,
)from aiohttp import web
return web.json_response({"ok": True})return web.json_response({
"ok": True,
"extensionConnected": ext_ws is not None,
"extensionVersion": ext_version,
"pid": os.getpid(),
"uptime": int(time.time() - start_time),
})Why it matters: Usually legitimate, but confirm the destinations are expected and no sensitive data leaves.
Fix: Confirm the destination hosts are expected and that no sensitive data is sent off-host.
An MCP tool surface (manifest or tool definitions) was found.
Why it matters: Just context — review which tools it offers and their permissions.
Fix: Review the declared MCP tools and their permissions.
Check your own component
Run the same evidence-backed scan on any MCP server, agent skill, or package.
Scan your own componentHow we determine this: deterministic static analysis (regex + AST), evidence-anchored, no code execution. Methodology →