Skip to main content

rein-openhands

A deterministic, no-LLM SecurityAnalyzer for OpenHands, backed by the rein engine.

OpenHands' built-in LLMSecurityAnalyzer asks the model to grade its own actions. This grades them with rein instead. Before an action runs, rein reviews the code or command it would write for leaked secrets, unsafe code, and slop, and returns a SecurityRisk that feeds OpenHands' ConfirmRisky policy. No model in the loop, so the same action gets the same verdict every time.

Install

pip install rein-openhands

It pulls in rein-engine and openhands-sdk.

Use

Security analyzers are configured on the conversation, with a confirmation policy:

from openhands.sdk import Conversation
from openhands.sdk.security import ConfirmRisky, SecurityRisk

from rein_openhands import ReinSecurityAnalyzer

conversation = Conversation(agent=agent, workspace=".")
conversation.set_security_analyzer(ReinSecurityAnalyzer())
conversation.set_confirmation_policy(ConfirmRisky(threshold=SecurityRisk.HIGH))

That is all. See the OpenHands docs for agent and conversation setup.

What it flags

rein judges the content of the action. It returns HIGH for, among others:

  • unsafe code execution: os.system, subprocess with shell=True, eval, exec
  • unsafe deserialization and loaders: pickle.loads, yaml.load, marshal.loads
  • unverified TLS context: ssl._create_unverified_context
  • hard-coded credentials: AWS, Stripe, GitLab, SendGrid, npm and similar keys

Some weaker risks map to MEDIUM, for example weak hashes (md5/sha1) and requests(..., verify=False). Lint, style, and slop map to MEDIUM/LOW. The exact rule set is rein's, so it grows with the engine.

Fail closed on unparseable code

If a .py action cannot be parsed, rein's AST-based security checks cannot run, so the code is unanalyzed rather than safe. In that case the analyzer returns HIGH instead of letting the result downgrade to the syntax error's own level. "Cannot analyze this code" must not read as "this code is safe." The rule is scoped to .py, so a non-Python command or a text file is left to its normal verdict.

Use alongside other analyzers

This is the code-content layer. It does not authorize actions or inspect shell command patterns. Run it together with OpenHands' action and shell-pattern checks for defense in depth; rein answers "is the code being written dangerous," the others answer "is this action allowed to run."

Policy as data (roadmap)

The rein engine already externalizes its decision rules as data: a .rein.toml declares the verdict policy (fail_at, per-category thresholds), rule disables, and custom regex rules, so a maintainer can declare what is blocked without writing code. This analyzer does not yet read that config (it maps rein's finding severities to SecurityRisk directly); honoring a repo's .rein.toml here so the policy governs the verdict is the next planned step. See the rein docs for the config format.

License

Apache-2.0. See LICENSE.

Metadata

Release files for rein-openhands 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for rein-openhands 0.3.0
File Size Uploaded Provenance Actions
rein_openhands-0.3.0.tar.gz 10.9 kB With provenance Details for rein_openhands-0.3.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for rein-openhands 0.3.0
File Interpreter ABI Platform Actions
rein_openhands-0.3.0-py3-none-any.whl Python 3 none any Details for rein_openhands-0.3.0-py3-none-any.whl

Total release size: 19.8 kB

Release files / rein_openhands-0.3.0.tar.gz

Download URL rein_openhands-0.3.0.tar.gz
Size 10.9 kB
Tags Source
SHA-256 checksum
How to use checksums
ac65cd3443aec23901e3b6e006a63e01d988e6cf6c7a12e7d5e88744c695f61d
BLAKE2b-256 checksum
How to use checksums
e63b77e094945cd50c3b3551b7c7783935564552c26ba5721dbb3e0cdb713aa1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 22, 2026.

Transparency log

Release files / rein_openhands-0.3.0-py3-none-any.whl

Download URL rein_openhands-0.3.0-py3-none-any.whl
Size 8.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
01250938a17ea68fe3481d5a46cb2881eeb7ccc3db6086d19ae9b5b29e604848
BLAKE2b-256 checksum
How to use checksums
2c945b98291f686d921cff9eedabae0c41e53cd82aff17b4f75f0de9a638a9a4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 22, 2026.

Transparency log

Security for rein-openhands 0.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for rein_openhands-0.3.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 22, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page