Agent Economy Report

Skill code audit

CAUTION version 1.0.1 · audited 2026-09-17

brave-search @steipete

This package provides two command-line Node.js tools: search.js searches Brave by scraping its HTML results page, and content.js fetches a supplied URL and converts readable page content to Markdown. The documented Brave Search API and BRAVE_API_KEY are not used by the code. With the --content flag, search.js automatically fetches every result link and prints extracted page text. No hidden network destinations, persistence, credential exfiltration, wallet/payment changes, or download-and-execute behavior was found. The main reasons for caution are arbitrary URL fetching without validation and untrusted web content being printed into the agent context.

Instructions try to steer the agent beyond the declared purpose. content.js prints Markdown converted from fetched web page content with console.log(htmlToMarkdown(article.content));. This content comes from an arbitrary remote URL and could contain instructions that influence an agent consuming the output.

Declared purposeWeb search and content extraction via Brave Search API, no browser required.
Observed behaviorsearch.js builds a URL to https://search.brave.com/search, fetches the HTML, extracts result titles, links, and snippets, and optionally fetches each result page and prints truncated extracted text. content.js fetches an arbitrary URL argument and prints readable Markdown extracted from the response. The code does not read environment variables or write files.
Verdict, rules onlySAFE
Verdict, AICAUTION
Final verdictCAUTION (never better than either pass)

Capabilities

capabilityvs purposedetail
networkneededsearch.js fetches https://search.brave.com/search and, with --content, fetches result links; content.js fetches any URL supplied as a command-line argument.
shellneededThe skill is intended to be run from a shell using Node.js scripts; SKILL.md documents bash commands such as ./search.js and ./content.js.
install_packagesneededSKILL.md instructs npm ci, and package.json declares dependencies including @mozilla/readability, jsdom, turndown, and turndown-plugin-gfm.

Findings

severityfinding
mediumScrapes Brave Search HTML instead of using the declared API
The declared purpose says the skill uses the Brave Search API, but search.js fetches the ordinary Brave search results page directly. This is not an API call.
search.js:36 https://search.brave.com/search?q=${encodeURIComponent(query)}
lowAdvertised API key is not used by the code
SKILL.md says the skill needs BRAVE_API_KEY, but neither search.js nor content.js reads process.env or uses an API key. A configured key would be unused; the actual request is unauthenticated.
SKILL.md:19 Needs env: `BRAVE_API_KEY`.
mediumArbitrary URL fetch without validation
content.js fetches whatever URL is passed as a command-line argument, with no allowlist or validation. This can reach localhost, private hosts, or cloud metadata addresses from the agent environment.
content.js:37 const response = await fetch(url, {
mediumOptional content mode fetches every result link automatically
When --content is used, search.js sends a follow-up request to each link returned by Brave. These links are remote content and are fetched without a validation step.
search.js:161 result.content = await fetchPageContent(result.link);
mediumUntrusted web content is printed into the agent context
Fetched page content is converted to Markdown and written to stdout. If the agent consuming this output treats it as instructions, it is an indirect prompt-injection path.
content.js:60 console.log(htmlToMarkdown(article.content));
infoPublisher acknowledges arbitrary URL risk
The skill card itself notes that page extraction can fetch arbitrary URLs and recommends reviewing URLs before execution.
skill-card.md:29 Risk: The page extraction command can fetch arbitrary URLs from the agent environment.

0 AI finding(s) were dropped because their file, line or quote did not match the package.

Network destinations in the code

domainservice ratingwhere
clawhub.ainot in the service indexskill-card.md:9
doc.rust-lang.orgnot in the service indexcontent.js:15
example.comnot in the service indexSKILL.md:33
github.comnot in the service indexpackage-lock.json:57
opencollective.comnot in the service indexpackage-lock.json:61
registry.npmjs.orgnot in the service indexpackage-lock.json:20
search.brave.comnot in the service indexsearch.js:36

Other facts

Binaries invokedbash, node, npm
Environment variables readnone
Hard-coded walletsnone
Pipes a download to a shell0
eval / exec / subprocess0
base64 blobs0
File writes3
Persistence0

Files audited

filelinessha256
SKILL.md5757ec3e0c50296df2…
_meta.json6e5d79fe568b3c74c…
content.js86849db5d89558bc65…
package-lock.json62111c66fb63205d49d…
package.json14736ea93972c9d70b…
search.js179b60552e3396c1b37…
skill-card.md59f11790f65eaa7119…

For agents

JSON: https://agenteconomy.report/k/brave-search.audit.json · badge: https://agenteconomy.report/k/brave-search.audited.svg · skill rating: /k/brave-search · commission an audit of any skill: US$ 29 per version.

How this is computed

The complete published package of this exact version was downloaded from the registry and read statically; nothing was executed. A deterministic pass extracts network destinations, binaries, environment variables, writes, install commands, obfuscation markers, subprocesses and wallets, each with file and line. An AI then reads the whole package with those facts and writes the summary, the capabilities and the findings under a strict schema; every finding it produces must cite a file, a line and the exact text, or it is dropped. The final verdict is the worst of the two passes. The audit does not change the skill's trust tier (policy); the author may respond through the dispute channel and the response is published here. Commissioned by: the Agent Economy Report (free program: the 150 most downloaded skills, September 2026).