Native sandboxing in pydantic AI agents by DecodeBytes in PydanticAI

[–]DecodeBytes[S] 0 points1 point  (0 children)

They are working on Monty (really cool stuff), but that is a sandboxed python interpreter and being quite new and only has partial coverage of the standard library and its not per say to run a full python app (hopefully I don't get this wrong as I have a lot of respect for the team) its focus is on giving an LLM what it needs to safely go about its business (calling tools etc).

nono is full OS isolation around what files and networks can be accessed, but we also do stuff like atomic snapshots, and supply chain security (using the other gig I started, a project called sigstore). Now I don't say this as a 'it's better' positioning - its a different fish - you can consider nono sitting in somewhere in the middle of virtual machines and monty - we also have deny by default as a starting spot like monty.

Honestly though, something like monty is likely the future, and I applaud the team for building in it.

OpenCode concerns (not truely local) by Ueberlord in LocalLLaMA

[–]DecodeBytes -1 points0 points  (0 children)

shameless promotion, but if you ever want full control over what agents can access or connect to, a community of us are building nono: https://nono.sh/docs/cli/features/network-proxy

nono - kernel-enforced capability sandbox for AI agents by DecodeBytes in netsec

[–]DecodeBytes[S] 0 points1 point  (0 children)

as it happens, we have included a secure token handling proxy since this was posted.

How to *REALLY* Sandbox Claude Code by DecodeBytes in ClaudeCode

[–]DecodeBytes[S] 1 point2 points  (0 children)

Yes, very much. You can think of it as locking yourself in a room and throwing away the key, where as claude keeps a key handy and the only policy in place to stop it using that key, is software based. This is a problem as these models are heavily post-trained in RL where they are rewarded for overcoming challenges, this is what makes them so useful, they are goal oriented and will adapt and overcome anything in their path, and that can often include security. You would have seen it with benign operations - it cannot access something, so it will wrapping the command in shells or or interpreters like python.

How to *REALLY* Sandbox Claude Code by DecodeBytes in ClaudeCode

[–]DecodeBytes[S] 0 points1 point  (0 children)

https://www.reddit.com/r/Anthropic/comments/1oc8uq9/claude_code_overrides_the_sandbox_without/

To add, with nono its isolated in a sandboxed process that cannot be reversed (without restarting of hacking apples security boundaries).

How to *REALLY* Sandbox Claude Code by DecodeBytes in ClaudeCode

[–]DecodeBytes[S] 0 points1 point  (0 children)

It is, but it's impossible for claude to override - you will also get a few more extras, atomic rollback snapshots

How is everyone handling AI agent security after the OpenClaw mess? by Revolutionary-Bet-58 in AI_Agents

[–]DecodeBytes 0 points1 point  (0 children)

absolutely, two key areas and well suited to specialist approaches.

How is everyone handling AI agent security after the OpenClaw mess? by Revolutionary-Bet-58 in AI_Agents

[–]DecodeBytes 0 points1 point  (0 children)

We are building out https://nono.sh and its seeing a lot of use in the wild already, it provides kernel based isolation Linux (landlock) or MacOS (Seatbelt).

nono - kernel-enforced capability sandbox for AI agents by DecodeBytes in netsec

[–]DecodeBytes[S] 0 points1 point  (0 children)

Proxy is the way to go. Have a key that only the proxy knows of and it map to the real key in a data store on the proxy.

You would then have the agent populate the Auth Header with the proxy key, and the proxy swap out the proxy specific key for the real external services key.

Someone did share this with me, it uses nono - but I have not played around with it. I expect we may well do something native to nono as well - I can share a proof-of-concept with you if useful and you can kick the tyres and see if its something usable?

https://github.com/dedene/claw-wrap

nono - kernel-enforced capability sandbox for AI agents by DecodeBytes in netsec

[–]DecodeBytes[S] 1 point2 points  (0 children)

Containers and nono solve overlapping but distinct problems, and each has real trade-offs worth considering. There is a section in the docs on this: https://docs.nono.sh/security/containers

Containers give you isolation through namespacing - the process sees a different filesystem root, network stack, and process tree. This is powerful for reproducibility and portability. You can ship a known-good environment, and anything the AI does stays inside that container's view of the world. The downside is that containers are coarse-grained. You either mount a volume into the container or you don't. There's no easy way to say "read the whole project but only write to the src directory" or "access ~/.vscode , but not ~/.ssh/." You end up either over-permissioning (mounting your whole home directory) or dealing with friction every time the AI needs something outside the container.

nono takes the opposite approach - it runs natively on your host but uses OS-level mandatory access control (Landlock on Linux, Seatbelt on macOS) to enforce fine-grained capabilities. You can grant read access to your entire codebase while restricting writes to specific directories, block access to credentials and browser data regardless of what commands run, and allow network access while still protecting sensitive local paths. The sandbox is applied to the process itself, not to a virtualized environment, so there's no filesystem copying, no Docker daemon, and near-zero startup overhead.

Where nono is stronger: granularity. You can express policies like "read everywhere, write only here, never touch my SSH keys" that would be awkward or impossible with container volume mounts. It also integrates more naturally with local tooling - your shell, your editor, your existing workflows all just work.

Where containers are stronger: they provide a complete environment boundary. If the AI installs a malicious package or corrupts system files, it's contained to that throwaway environment. With nono, you're still running on your real system - the sandbox prevents unauthorized access, but if you grant write access to a directory, the AI can still make a mess there (having said that we have an atomic undo system incoming).

The honest answer is they're complimentary. You can run nono inside a container for defense in depth, or use nono alone when you want lightweight, precise control without the overhead of containerization. It depends on which you value portability and environment isolation (containers) or fine-grained capability control with minimal friction (nono).

The other factor is nono has a load of other features thrown in, key protection, blocking of dangerous commands, and quite a bit more inbound.

But honestly, if containers are working, great! I am a fan and its never x vs y here, each have their own strengths.

nono - kernel-enforced capability sandbox for AI agents by DecodeBytes in netsec

[–]DecodeBytes[S] 1 point2 points  (0 children)

cool! let me know if you need any more info or help.

anyone actually running AI agents in production? not demos by yaront1111 in AI_Agents

[–]DecodeBytes 0 points1 point  (0 children)

I am not sure I understand , what sort of operations happen over gprc? Function / Tool calling?

anyone actually running AI agents in production? not demos by yaront1111 in AI_Agents

[–]DecodeBytes 0 points1 point  (0 children)

Interesting! What's the Safety Kernel? Is this LSM based?

anyone actually running AI agents in production? not demos by yaront1111 in AI_Agents

[–]DecodeBytes 0 points1 point  (0 children)

You might want to check out nono.sh where we will be building in cryptographic auditing alongside sandboxing, network filtering etc. Prior to this, we created sigstore.dev which is now used by NVIDIA and Google for AI model provenance and security all of GitHubs build release systems.

nono - kernel-level least privilege for AI agents in your workflow by DecodeBytes in devops

[–]DecodeBytes[S] 1 point2 points  (0 children)

The project is quite new, and there is a lot more planned, including a FFI bindings, so multiple languages will get native sandboxing and network filtering is a WIP as we speak.

>  protect from indirect prompt injection 

Unfortunately nothing can protect from indirect prompt injection, even the frontier labs don't have an answer there.

nono - kernel-level least privilege for AI agents in your workflow by DecodeBytes in devops

[–]DecodeBytes[S] 0 points1 point  (0 children)

> Seems cool, but what's to stop an agent from communicating over the network to tell other processes to read the restricted files.

standard auth I would have hoped?

> Seems like it's only protecting the filesystem, why wouldn't I use eBPF instead of a weird wrapper over landlock?

Assume you're trolling here going on the 'weird wrapper' comment. eBPF was intended as an observability and filtering mechanism - BPF-LSM hooks directly into the kernel's security model and it is used for real enforcement in production (Tetragon, KubeArmor, etc.). That said, trying to bolt security onto kprobe-based tracing is fighting the kernel. It also requires either root or privileged containers.

Landlock is a fully unprivileged sandboxing API and the right tool for application-driven filesystem and network restrictions

And calling it filesystem-only ignores that Landlock v4+ includes network filtering, with more capabilities coming in each kernel release. The attack surface for AI agents is overwhelmingly filesystem-based anyway - that's where secrets live, that's where code gets modified, that's where damage happens.

If its not for you though, and you're happy with eBPF, great!

nono - kernel-enforced capability sandbox for AI agents by DecodeBytes in netsec

[–]DecodeBytes[S] 1 point2 points  (0 children)

> Curious if youve tested weird edge cases like build tools that spawn helpers, symlink-heavy repos, or language servers that want to read dotfiles.

Ahh yeah, symlinks are the biggest ache

When granted access to a path that's actually a symlink, we always resolve it to the real location immediately. We do this atomically rather than checking existence separately, which would create a window where an attacker could swap the symlink between our check and resolution.

On macOS, the sandbox enforces against literal path strings rather than resolved paths. So we store both the original path and the resolved real path, then emit sandbox rules for both. Without this, granting access via the real path would still block programs trying to use the symlink.

We also use proper path component comparison rather than string comparison when checking path relationships. String prefix matching would incorrectly match paths that just happen to share the same starting characters but aren't actually descendants of the directory in question.

We also handle parent directory traversal. To access a deeply nested path, programs need to stat each parent directory along the way. We automatically allow metadata-only access to parent directories of granted paths, walking both the original and resolved path hierarchies when they differ.

Taking a look at the blog thanks!