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 1.18.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, )
proc = subprocess.Popen( [sys.executable, "-m", "boss_agent_cli.bridge.daemon", "--serve"], stdout=log_fd, stderr=log_fd, stdin=subprocess.DEVNULL, **kwargs, )
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(snapshot_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", )
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")with open(_LOG_FILE, "a") as log_fd:
_PID_FILE.write_text(str(os.getpid()))
with open(output_path, "w", encoding="utf-8", newline="") as f:
with open(snapshot_path, "w", encoding="utf-8") as f:
shutil.rmtree(path)
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
from urllib.parse import urlparse
req = urllib.request.Request(url, headers={"User-Agent": "contributors-svg"})if token and urlparse(url).hostname == "api.github.com":
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,
)from urllib.parse import urlparse
host = urlparse(url).hostname
import httpx
resp = httpx.get(f"{http_url}/json/version", timeout=timeout)import urllib.parse
full_url = f"{url}?{urllib.parse.urlencode(params)}"import urllib.request
with urllib.request.urlopen(list_url, timeout=3) as resp:
from urllib.parse import urlparse
parsed = urlparse(value)
import httpx
self._client = httpx.Client(
cookies=token.get("cookies", {}),
headers=headers,
follow_redirects=True,
timeout=30,
)from urllib.parse import urlparse
host = urlparse(url).hostname
import httpx
resp = httpx.get(f"{base}/json/version", timeout=_CDP_PROBE_TIMEOUT)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 →