Agent skill

Siot Security Audit

by simpleiot in simpleiot/simpleiot

A skill your agent uses when auditing Simple IoT for security issues, reviewing a change that touches authentication, authorization, enrollment, sync, or a network-facing parser, or checking whether…

Apache-2.0Auto-check passedSecurity

Install Siot Security Audit

skills CLI
$ npx skills add simpleiot/simpleiot --skill siot-security-audit -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install simpleiot/simpleiot siot-security-audit --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/simpleiot/simpleiot.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/siot-security-audit .claude/skills/siot-security-audit && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
siot-security-audit
GitHub stars
219
Token cost
~3k tokens
SKILL.md length
1,261 words
Files
1
Skills in repo
3
Repo updated
First seen
Licence
Apache-2.0

At a glance

A skill your agent uses when auditing Simple IoT for security issues, reviewing a change that touches authentication, authorization, enrollment, sync, or a network-facing parser, or checking whether…

  • Works in 5 steps: List the entry points and principals as… → Read each enforcement point and form… → Prove each hypothesis with a throwaway… → …
  • Auditing Simple IoT for security issues
  • SKILL.md covers Order of work, Principals, Where enforcement lives and Proving a finding, plus 3 more sections
  • Calls go, npm and git; needs SIOT_AUTH_TOKEN

What it does

Siot Security Audit is an agent skill from simpleiot/simpleiot. Use when auditing Simple IoT for security issues, reviewing a change that touches authentication, authorization, enrollment, sync, or a network-facing parser, or checking whether an open item in the security cleanup plan still reproduces. Triggers on requests like "do a security audit", "is this scoped correctly", "can a user reach X", "re-check the security plan", or "prove this finding". Covers who the principals are, where enforcement lives, how to prove a finding against a test server, and where results are…

Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Security, covering Security review. The repository describes itself as: Simple IoT cloud/edge application/framework. The licence is Apache-2.0.

When your agent uses it

  • Auditing Simple IoT for security issues
  • Reviewing a change that touches authentication
  • A network-facing parser
  • Checking whether an open item in the security cleanup plan still reproduces

Example prompts

  • “do a security audit”
  • “is this scoped correctly”
  • “can a user reach X”
  • “/siot-security-audit”

Requirements

  • A credential in SIOT_AUTH_TOKEN

Workflow steps

5 steps, taken from the first numbered list in SKILL.md.

  1. List the entry points and principals as they are today, from the code,
  2. Read each enforcement point and form hypotheses. Write down what you
  3. Prove each hypothesis with a throwaway test (below). A finding that was
  4. Only then open
  5. Record results (below).

What it can do on your machine

Read from SKILL.md and the folder at commit 822524b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • go
    • npm
    • git
    • rg
    • sh

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use npm and git, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • SIOT_AUTH_TOKEN

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Siot Security Audit loads about 3k tokens when it runs. Until then it costs about 153 tokens; SKILL.md has 1,261 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~153
When it runs · the whole SKILL.md, loaded when a task matches
~3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from simpleiot/simpleiot at commit 822524b, republished under its Apache-2.0 licence (© simpleiot). 1,261 words, ~2,967 tokens.

Download SKILL.mdSave it as .claude/skills/siot-security-audit/SKILL.md (or your agent's skills folder).
name
siot-security-audit
description
Use when auditing Simple IoT for security issues, reviewing a change that touches authentication, authorization, enrollment, sync, or a network-facing parser, or checking whether an open item in the security cleanup plan still reproduces. Triggers on requests like "do a security audit", "is this scoped correctly", "can a user reach X", "re-check the security plan", or "prove this finding". Covers who the principals are, where enforcement lives, how to prove a finding against a test server, and where results are recorded. It does not list the findings themselves; those live in the plan.

Auditing Simple IoT

This skill holds what a fresh session cannot derive quickly: the principals, the enforcement points, and a test harness that works. It is deliberately not a checklist. The most useful findings so far came from reading an entry point with no list in hand and asking what each principal could do there.

Order of work

  1. List the entry points and principals as they are today, from the code, before reading any earlier findings. Every new feature adds one or the other, and this skill will not know about it. Start from server/server.go (what is started), server/nats-server.go (listeners), api/ (HTTP routes), the nc.Subscribe calls in store/store.go and server/, and client.DefaultClients.
  2. Read each enforcement point and form hypotheses. Write down what you expect to be refused and why.
  3. Prove each hypothesis with a throwaway test (below). A finding that was only read in code is labeled that way.
  4. Only then open plans/2026-08-24-security-cleanup.md and the Known limitations table, and use them as a regression pass: which open items still reproduce, which closed items stay closed, and which of your findings are new.
  5. Record results (below).

Reading the plan first anchors the audit on what was already found. Resist it.

Principals

Each is supposed to be limited as described. The audit question for every entry point is what each one can reach there.

PrincipalHow it authenticatesIntended limit
Anonymous, no token setnothing; SIOT_AUTH_TOKEN is empty by defaultnone: an instance with no token is open on every listener
Shared-token holderSIOT_AUTH_TOKEN on NATS, WebSocket, MQTT, HTTPnone; loopback only under SIOT_DEVICE_AUTH=required
Credentialed deviceNKey in a deviceCred node, or a device-signed JWTits own boundary inst.X.X.>, its own subtree over HTTP
Enrolling keyenrollment token plus an NKey that signs the noncepublish enroll.request, its own inbox
Browser useruser node ID plus sign-in JWTu.<anchor>.<user>.> and up.<anchor>.> for each group it is in
User replicated from a devicesame sign-in, on the upstreamthe device subtree
Fieldbus or LAN peernone: Modbus, serial, CAN, mDNS, a scraped endpointthe values it reports
Web page on another originnonenothing, unless the instance has no token

The question that has found the most: can this principal change the set it is checked against? A scope check that reads the tree is only as strong as the principal's inability to write the part of the tree it reads. Edges, user nodes, deviceCred nodes, and anything a device replicates upstream are all tree data.

The second: whose connection carries the write? Clients run in the server process and publish on its full-access connection, so a value in a point that names a target (a node ID, a URL, a file path, a recipient) is acted on with the server's authority, not the writer's.

The third: what happens when the value is absurd? No goroutine recovers from a panic, so a point or a frame that panics one client stops the process, and a stored point does so again at every start.

Where enforcement lives

  • server/auth.go: Check and the three permission builders (devicePermissions, userPermissions, enrollPermissions). Loopback rule in checkToken.
  • store/store.go: handleUserRequest is the only thing between a browser and the store's handlers. isUnder and UserAnchors in store/jetstream.go. userCheck decides who may sign in.
  • api/nodes.go: authenticate, then the routes. api/key.go for the JWT.
  • server/enroll.go: what an enrollment request may create.
  • server/device-key.go: the instance's own key.
  • api/server.go: the WebSocket proxy to ws://localhost, which makes every proxied connection arrive from loopback.
  • store/replica.go: what a downstream stream may write into the upstream tree.
  • client/manager.go and each client's Run: what point values reach tickers, allocations, file paths, os/exec, and outbound connections.
  • modbus/, client/serial*.go, client/mqtt*.go, client/sparkplug.go, client/metrics-prom*.go, client/shelly*.go: parsers of input from peers.
Show full SKILL.md (641 more words)Show less

Proving a finding

Write a test file named zz_audit_poc_test.go in client/ (package client_test, which has the sync helpers) or server/, run it, and delete it in the same command so it cannot be left behind.

Use your own ports and data directory. server.TestServerOptions and TestServerOptions2 use ports 8900 to 8914 and store data in /tmp/siot-test-<ID>, which a clean start deletes. Another session or a running test loop on the same checkout will collide with both. A development instance usually holds 4222, 4223, and 4224.

go
optsU := server.Options{NatsPort: 8950, HTTPPort: "8951", NatsMonitorPort: 8952,
	NatsWSPort: 8953, NatsServer: "nats://localhost:8950", ID: "auditU",
	AuthToken: "upstream-token", DataDir: "<scratchpad>/auditU"}
nc, root, stop, err := server.TestServerOpts(optsU)

nc is the server's full-access connection: use it to build the tree and to check results as the operator would see them. Connect separately as the principal under test.

go
// build a tree
client.SendNodeType(nc, client.Group{ID: "G", Parent: root.ID}, "test")
client.SendNodeType(nc, client.User{ID: "U", Parent: "G", Email: "u", Pass: "pw"}, "test")

// browser user: sign in the way the UI does, then connect with the JWT
nodes, _ := client.UserCheck(nc, "u", "pw") // the node of type data.NodeTypeJWT holds the token
user, _ := nats.Connect(uri, nats.UserInfo("U", jwt),
	nats.CustomInboxPrefix(client.InboxPrefix("U")), nats.NoReconnect())

// credentialed device, or an enrolling key
kp, _ := nkeys.FromSeed([]byte(seed))
dev, _ := nats.Connect(uri, nats.Nkey(pub, kp.Sign),
	nats.CustomInboxPrefix(client.InboxPrefix(pub)), nats.NoReconnect())

// points are built with constructors; data.Point has no exported Value or Text
pts := data.Points{
	data.NewPointFloat(data.PointTypeTombstone, "", 0),
	data.NewPointString(data.PointTypeNodeType, "", data.NodeTypeVariable),
}
// a write: an empty reply is success, anything else is the error text
reply, err := user.Request("u.G.U.ep.<child>.<parent>", pts.Encode(), 2*time.Second)

// a read: the reply is a node frame, and a refusal arrives as its error
reply, err = user.Request("u.G.U.nodes.all.<id>", nil, 2*time.Second)
nodes, err := data.DecodeNodes(reply.Data)

Helpers already in client/*_test.go: credUpstream, enrollDevice, startDeviceSync, makeEnrollToken, devicePubKey, waitFor. They use the shared test ports, so copy what they do with your own options when another test run may be active.

  • A permission violation on publish is asynchronous. Collect it with nats.ErrorHandler and wait a second; no error means the publish was allowed.
  • To test a loopback rule, connect to a non-loopback address of the same machine (ip -4 -o addr show scope global). Every listener binds all interfaces.
  • For HTTP, POST /v1/auth with form fields email and password returns the JWT; send it as Authorization: Bearer <jwt>.
  • Send the test output to a file in the scratchpad and grep it. The server log is long, and a crashed test process loses whatever was only on screen.
  • A proof that the process stops belongs in its own test, since it takes the other assertions down with it.

Check pgrep -af 'go test|\.test' and git status before starting. If another session is editing the tree, leave its files alone and say so in the report.

Tooling

sh
go run golang.org/x/vuln/cmd/govulncheck@latest ./...          # source: only called symbols count
govulncheck -mode binary <release binary>                      # what actually shipped, and with which Go
go version <release binary>
cd frontend && npm audit --omit=dev                            # what reaches the browser
cd frontend/lib && npm audit --omit=dev
rg -n 'recover\(\)|InsecureSkipVerify|math/rand|exec\.Command|sh -c' --glob '*.go'
git ls-files | xargs rg -l 'BEGIN .*PRIVATE KEY|\bS[UA][A-Z2-7]{56}\b'

Release binaries are built with the Go version go.mod names, which can differ from the one CI tests with; check both workflows in .github/workflows/.

Never read or print device.nkey or local.sh. They are local secrets and are gitignored.

Splitting the work

A full audit is too wide for one context. Reviewers that worked, run in parallel, each told to give file:line, the principal required, a concrete scenario, and what was checked and found sound:

  • store/, data/, and the user, auth, and admin clients: scope checks, binary decoding, sign-in, replication trust.
  • The rest of client/ plus modbus/, msg/, file/, network/: every place a point or a peer's bytes reach os/exec, a path, a URL, an allocation, a ticker, or a log line.
  • Frontend, dependencies, packaging, CI, repository hygiene, and the user docs compared with server/args.go.

Keep the HTTP API, the authorizer, and enrollment for yourself, and verify every reported finding in the code, and with a test where it matters, before it goes into a document. Reviewers are sometimes wrong about severity and about what is reachable.

Recording results

  • The plan gets each finding as a numbered item with Problem, Change, and Verify, marked proven when a test reproduced it, and a suggested order. Mark items complete there as they close.
  • docs/ref/security.md gets corrections to any statement a test contradicted, and a row in Known limitations pointing at the plan item. Keep the deployment checklist to what an operator can do today.
  • docs/user/ gets corrected where a documented default or guarantee does not match the code.
  • CHANGELOG.md gets one entry when the guidance to operators changes.
  • Write in the project's documentation tone: neutral, precise, no dramatic wording. Describe what a principal can do, and the change that closes it.
  • Do not add a vulnerability reporting contact or policy unless asked. Note its absence in the report instead.
  • A broader design review lives outside this repository at ../security.md. Mention where it has gone out of date; do not edit it without being asked.

Findings do not belong in this skill. If the harness, the principals, or the enforcement points change, update the sections above.

© simpleiot, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/siot-security-audit of simpleiot/simpleiot.

Open the folder on GitHubat commit 822524b

Compare with similar skills

Siot Security Audit next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Siot Security Audit compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Siot Security Audit this skillsimpleiot/simpleiot219—~3kAutomated safety check: PassApache-2.0
Deepsec Documentation Guidevercel-labs/deepsec8.1k—~956Automated safety check: PassApache-2.0
Kubernetes Network Security Auditkubeshark/kubeshark12k—~7.3kAutomated safety check: NotesApache-2.0
Agentlas Security Scanagentlas-ai/Agentlas-OS1.6k1 repos~822Automated safety check: PassApache-2.0
Native Dependency Updatemono/SkiaSharp5.6k—~4.1kAutomated safety check: PassMIT
Semgrep Security Scantrailofbits/skills7.4k—~3.7kAutomated safety check: NotesCC-BY-SA-4.0

Similar skills

  • Deepsec Documentation Guide

    vercel-labs/deepsec

    Official

    Points the agent at deepsec's own docs to answer questions about initializing, configuring, resuming, scanning with and extending the vulnerability scanner.

    8.1k GitHub stars~956 tokensUpdated 9 days ago
    SecurityAuto-check passed
  • Hunts for compromised workloads and malicious traffic in a Kubernetes cluster by sweeping network data through Kubeshark MCP, mapped to MITRE ATT&CK.

    12k GitHub stars~7.3k tokensUpdated yesterday
    SecurityAuto-check: notes
  • Agentlas Security Scan

    agentlas-ai/Agentlas-OS

    A skill your agent uses when an agent folder must pass the Agentlas Cloud 2-stage security scan (static rules + BYOK LLM judgment) before private sync or public publish, or when asked to…

    1.6k GitHub starsUsed in 1 repo~822 tokens
    SecurityAuto-check passed
  • Update native dependencies (libpng, libexpat, zlib, libwebp, harfbuzz, freetype, libjpeg-turbo, etc.) in SkiaSharp's Skia fork.

    5.6k GitHub stars~4.1k tokensUpdated yesterday
    SecurityAuto-check passed
  • Semgrep Security Scan

    trailofbits/skills

    Official

    Detects languages, proposes rulesets for approval, then runs the approved Semgrep scan across a codebase and merges the output into one SARIF file.

    7.4k GitHub stars~3.7k tokensUpdated yesterday
    SecurityAuto-check: notes
  • Skillward Audit

    Fangcun-AI/SkillWard

    Security-audit a third-party skill bundle (folder with SKILL.md, or .zip / .tar.gz archive) before installing it, using the SkillWard cloud scanner.

    143 GitHub stars~2.9k tokensUpdated 2 mo ago
    SecurityAuto-check passed

More from simpleiot/simpleiot

  • Siot Add Node

    simpleiot/simpleiot

    A skill your agent uses when adding or changing nodes in a Simple IoT instance — a Modbus bus, a signal generator, a database client, a rule, a user, a group, or any other node type.

    219 GitHub stars~2.5k tokensUpdated 17 days ago
    Auto-check passed
  • Siot Debug

    simpleiot/simpleiot

    A skill your agent uses when inspecting or troubleshooting a running Simple IoT instance — checking what a node's current values are, whether points are flowing, whether sync is replicating, or what…

    219 GitHub stars~3.5k tokensUpdated 17 days ago
    Auto-check passed

Categories

Questions about Siot Security Audit

What does Siot Security Audit do?

A skill your agent uses when auditing Simple IoT for security issues, reviewing a change that touches authentication, authorization, enrollment, sync, or a network-facing parser, or checking whether…. Siot Security Audit is an agent skill from simpleiot/simpleiot. Use when auditing Simple IoT for security issues, reviewing a change that touches authentication, authorization, enrollment, sync, or a network-facing parser, or checking whether an open item in the security cleanup plan still reproduces.

When should I use Siot Security Audit?

Siot Security Audit fits situations like: auditing Simple IoT for security issues; reviewing a change that touches authentication; A network-facing parser; checking whether an open item in the security cleanup plan still reproduces.

How do I install Siot Security Audit in Claude Code?

Run `npx skills add simpleiot/simpleiot --skill siot-security-audit -a claude-code`. Or copy the skill folder (.claude/skills/siot-security-audit in simpleiot/simpleiot) into .claude/skills/siot-security-audit in your project. Claude Code loads it when a task matches its description.

How do I install Siot Security Audit in Codex?

Run `npx skills add simpleiot/simpleiot --skill siot-security-audit -a codex`. Or copy the skill folder (.claude/skills/siot-security-audit in simpleiot/simpleiot) into .agents/skills/siot-security-audit in your project. Codex loads it when a task matches its description.

Can I use Siot Security Audit in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add simpleiot/simpleiot --skill siot-security-audit -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/siot-security-audit, .gemini/skills/siot-security-audit, .github/skills/siot-security-audit and .opencode/skills/siot-security-audit in your project.

What does Siot Security Audit need to run?

Going by SKILL.md and its folder, Siot Security Audit needs the command-line tools its instructions call (go, npm, git, rg and sh) and credentials named SIOT_AUTH_TOKEN. Our summary lists: A credential in SIOT_AUTH_TOKEN.

Does Siot Security Audit access the network?

SKILL.md contains no URLs. Its commands use npm and git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Siot Security Audit safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Siot Security Audit use?

Siot Security Audit is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Siot Security Audit use?

About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Siot Security Audit?

Skills that share tags, products or a category with Siot Security Audit: Deepsec Documentation Guide (vercel-labs/deepsec, 8.1k stars), Kubernetes Network Security Audit (kubeshark/kubeshark, 12k stars), Agentlas Security Scan (agentlas-ai/Agentlas-OS, 1.6k stars) and Native Dependency Update (mono/SkiaSharp, 5.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Siot Security Audit?

simpleiot (a GitHub organization) maintains it in simpleiot/simpleiot, which has 219 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on September 21, 2026.

Source: simpleiot/simpleiot on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.